Probe value use in macro

Jinja has really weird scoping rules which make loops tricky. It can be done though, google “jinja while loop” for some solutions

[gcode_macro SetBaseLine]
BaseLine: 0
gcode:
{% set BaseLine = printer.gcode_move.position.z%}

[gcode_macro TestPoint]
InTolerance: False
gcode:
{% if printer.gcode_move.position.z>printer[“gcode_macro SetBaseLine”].BaseLine-(printer[“gcode_macro ScrewAdjust”].Tolerance)/2 and printer.gcode_move.position.z<printer[“gcode_macro SetBaseLine”].BaseLine+(printer[“gcode_macro ScrewAdjust”].Tolerance)/2%}
{action_respond_info(“Perfect”)}
{% set InTolerance = True %}
{% endif %}
{% if printer.gcode_move.position.z>printer[“gcode_macro SetBaseLine”].BaseLine %}
{action_respond_info(“Lower”)}
{% endif %}
{% if printer.gcode_move.position.z<printer[“gcode_macro SetBaseLine”].BaseLine %}
{action_respond_info(“Higher”)}
{% endif %}

[gcode_macro ScrewAdjust]
Tolerance: 0.01
ScrewPitch: 0.5
counter: 1
gcode:
G28
G1 X{43.71} Y{67.96} F6000
PROBE
SetBaseLine
G1 X{279.91} Y{67.96} F6000
{% for _ in range(counter, 999999999) %}
PROBE
TestPoint
{%if printer[“gcode_macro TestPoint”].InTolerance != True %}
{%set counter = 9999999999%}
{% endif %}
{% endfor %}

Something with the variables seems to cause problems:

Option ‘baseline’ is not valid in section ‘gcode_macro setbaseline’

Something I noticed is that variables need to be in all lower case, so try “baseline” rather than “BaseLine” and see how that works

[gcode_macro SetBaseLine]
baseline: 0
gcode:
{% set baseline = printer.gcode_move.position.z%}

[gcode_macro TestPoint]
intolerance: False
gcode:
{% if printer.gcode_move.position.z>printer[“gcode_macro SetBaseLine”].baseline-(printer[“gcode_macro ScrewAdjust”].tolerance)/2 and printer.gcode_move.position.z<printer[“gcode_macro SetBaseLine”].baseline+(printer[“gcode_macro ScrewAdjust”].tolerance)/2%}
{action_respond_info(“Perfect”)}
{% set intolerance = True %}
{% endif %}
{% if printer.gcode_move.position.z>printer[“gcode_macro SetBaseLine”].baseline %}
{action_respond_info(“Lower”)}
{% endif %}
{% if printer.gcode_move.position.z<printer[“gcode_macro SetBaseLine”].baseline %}
{action_respond_info(“Higher”)}
{% endif %}

[gcode_macro ScrewAdjust]
tolerance: 0.01
screwPitch: 0.5
counter: 1
gcode:
G28
G1 X{43.71} Y{67.96} F6000
PROBE
SetBaseLine
G1 X{279.91} Y{67.96} F6000
{% for _ in range(counter, 999999999) %}
PROBE
TestPoint
{%if printer[“gcode_macro TestPoint”].intolerance != True %}
{%set counter = 9999999999%}
{% endif %}
{% endfor %}

Did that but still getting this issue: Klipper reports: ERROR

Option ‘baseline’ is not valid in section ‘gcode_macro setbaseline’

Here a picture so u can see better.

Try this:

[gcode_macro SetBaseLine]
variable_baseline: 0
gcode:
    {% set baseline = printer.gcode_move.position.z %}

So I got no error when restarting and using the macro worked (the one u send me). Should I now put a variable_ infront of every variable? Thx btw

1 Like

I have seen macros where the variables have been declared as you had, but it never worked for me, I really don’t know why, maybe that’s how it was done in an earlier verion. But i’ve always prefixed variable declarations with “variable_”, and it works for me. So, in short, yes :slight_smile:

1 Like

So restarting after changing the variabels to variable_ helped. But if I start the macro it just keeps looking like this (don’t even homes, directly after entering the macro):
image
Won’t do other things like homing when writing G28 in the console. Even Emergency Stop doesn’t work. I need to completly REBOOT.

The code:

[gcode_macro TestPoint]
variable_intolerance: False
gcode:
{% if printer.gcode_move.position.z>printer[“gcode_macro SetBaseLine”].baseline-(printer[“gcode_macro ScrewAdjust”].tolerance)/2 and printer.gcode_move.position.z<printer[“gcode_macro SetBaseLine”].baseline+(printer[“gcode_macro ScrewAdjust”].tolerance)/2%}
{action_respond_info(“Perfect”)}
{% set intolerance = True %}
{% endif %}
{% if printer.gcode_move.position.z>printer[“gcode_macro SetBaseLine”].baseline %}
{action_respond_info(“Lower”)}
{% endif %}
{% if printer.gcode_move.position.z<printer[“gcode_macro SetBaseLine”].baseline %}
{action_respond_info(“Higher”)}
{% endif %}

[gcode_macro ScrewAdjust]
variable_tolerance: 0.01
variable_screwPitch: 0.5
variable_counter: 1
gcode:
G28
G1 X{43.71} Y{67.96} F6000
PROBE
SetBaseLine
G1 X{279.91} Y{67.96} F6000
{% for _ in range(counter, 999999999) %}
PROBE
TestPoint
{%if printer[“gcode_macro TestPoint”].intolerance != True %}
{%set counter = 9999999999%}
{% endif %}
{% endfor %}

I’ve got a long print running at the moment, but if I get time tomorrow I will load up your macros and see if I can figure out what is going on

BTW: You can use
Format
This for show code as code with no format loss, like this:

2 Likes

OK, I think I have found a problem. This has to do with the Jinja scoping rules that I mentioned earlier. This line:

{%set counter = 9999999999%}

Won’t alter the variable “counter” outside of the if statement, and so the for loop will always go from 1 to 999999999999. I don’t know if this is causing your problem, but it’s a problem nonetheless

1 Like

(post deleted by author)

But eachtime the loop runs it should use the command PROBE and my macro right?

That’s why I said “I don’t know if this is causing your problem, but it’s a problem nonetheless” :slight_smile:

OK, I got past the hanging error that you were experiencing. The number 99999999999999999999999 was too high, I just set it to 99 and it worked. No doubt that a higher value than 99 will work too, but this will help you get testing. The next problem I had is that no matter how much I adjusted the bed screw, it kept saying “Lower”, I didn’t try to debug that but it seems straight forward.

There were a couple of other changes I made: Firstly, I renamed all gcode macro names to be uppercase separated with underscores, just to keep with convention (ie SetBaseLine => SET_BASE_LINE)

lastly, I changed the line

{% set baseline = printer.gcode_move.position.z %}

to

{% set baseline = printer.probe.last_z_result %}

This means that if you have your probe command set to probe multiple readings and take the average as I do, it will still work.

EDIT: There was one more thing I changed, and that is how I broke out of the for loop. I’m not sure if it will work or not as I wasn’t able to test it, but it seemed a neater way to do it:

[gcode_macro MY_SCREW_ADJUST]
variable_tolerance: 0.01
variable_screwPitch: 0.5
variable_test_range: 99
gcode:
  G28
  G1 X{43.71} Y{67.96} F6000
  PROBE
  SET_BASE_LINE

  G1 X{279.91} Y{67.96} F6000
  {% for i in range(1, test_range) %}
    PROBE
    TEST_POINT
    {% if printer["gcode_macro TEST_POINT"].intolerance != True %}
      {% set i = test_range + 1 %}
    {% endif %}
  {% endfor %}

Please keep me posted with how you go, I’m kinda invested in this now :slight_smile:

1 Like

Could you please also post the code you used that always returned “Lower”? Thanks for your help!

Here’s everything I used. I had to add a few lines to get it to work with my probe (euclid).

[gcode_macro SET_BASE_LINE]
variable_baseline: 0
gcode:
    {% set baseline = printer.probe.last_z_result %}
    MESSAGE MSG="Baseline set to {baseline}"


[gcode_macro TEST_POINT]
variable_intolerance: False
gcode:
  {% if printer.gcode_move.position.z>printer["gcode_macro SET_BASE_LINE"].baseline-(printer["gcode_macro MY_SCREW_ADJUST"].tolerance)/2 and printer.gcode_move.position.z<printer["gcode_macro SET_BASE_LINE"].baseline+(printer["gcode_macro MY_SCREW_ADJUST"].tolerance)/2 %}
    {action_respond_info("Perfect")}
    {% set intolerance = True %}
  {% endif %}

  {% if printer.gcode_move.position.z>printer["gcode_macro SET_BASE_LINE"].baseline %}
    {action_respond_info("Lower")}
  {% endif %}

  {% if printer.gcode_move.position.z<printer["gcode_macro SET_BASE_LINE"].baseline %}
    {action_respond_info("Higher")}
  {% endif %}
  MESSAGE MSG="End of TEST_POINT"


[gcode_macro MY_SCREW_ADJUST]
variable_tolerance: 0.01
variable_screwPitch: 0.5
variable_test_range: 99
gcode:
  G28
  EUCLID_PROBE_BEGIN_BATCH
  DEPLOY_PROBE
  G1 X{43.71} Y{67.96} F6000
  PROBE
  SET_BASE_LINE

  G1 X{279.91} Y{67.96} F6000
  {% for i in range(1, test_range) %}
    PROBE
    TEST_POINT
    {% if printer["gcode_macro TEST_POINT"].intolerance != True %}
      {% set i = test_range + 1 %}
    {% endif %}
  {% endfor %}
  EUCLID_PROBE_END_BATCH
1 Like