2019-05-28 21:16:50 +02:00
|
|
|
This document provides information on implementing G-Code command
|
|
|
|
sequences in gcode_macro (and similar) config sections.
|
|
|
|
|
2020-01-06 16:59:40 +01:00
|
|
|
### G-Code Macro Naming
|
2020-01-08 01:06:55 +01:00
|
|
|
|
|
|
|
Case is not important for the G-Code macro name - MY_MACRO and
|
2020-01-06 16:59:40 +01:00
|
|
|
my_macro will evaluate the same and may be called in either upper or
|
2020-01-08 02:58:39 +01:00
|
|
|
lower case. If any numbers are used in the macro name then they must
|
|
|
|
all be at the end of the name (eg, TEST_MACRO25 is valid, but
|
|
|
|
MACRO25_TEST3 is not).
|
2020-01-06 16:59:40 +01:00
|
|
|
|
2019-05-28 21:16:50 +02:00
|
|
|
### Formatting of G-Code in the config
|
|
|
|
|
|
|
|
Indentation is important when defining a macro in the config file. To
|
|
|
|
specify a multi-line G-Code sequence it is important for each line to
|
|
|
|
have proper indentation. For example:
|
|
|
|
|
|
|
|
```
|
|
|
|
[gcode_macro blink_led]
|
|
|
|
gcode:
|
|
|
|
SET_PIN PIN=my_led VALUE=1
|
|
|
|
G4 P2000
|
|
|
|
SET_PIN PIN=my_led VALUE=0
|
|
|
|
```
|
|
|
|
|
|
|
|
Note how the `gcode:` config option always starts at the beginning of
|
|
|
|
the line and subsequent lines in the G-Code macro never start at the
|
|
|
|
beginning.
|
|
|
|
|
|
|
|
### Save/Restore state for G-Code moves
|
|
|
|
|
|
|
|
Unfortunately, the G-Code command language can be challenging to use.
|
|
|
|
The standard mechanism to move the toolhead is via the `G1` command
|
|
|
|
(the `G0` command is an alias for `G1` and it can be used
|
|
|
|
interchangeably with it). However, this command relies on the "G-Code
|
|
|
|
parsing state" setup by `M82`, `M83`, `G90`, `G91`, `G92`, and
|
|
|
|
previous `G1` commands. When creating a G-Code macro it is a good
|
|
|
|
idea to always explicitly set the G-Code parsing state prior to
|
|
|
|
issuing a `G1` command. (Otherwise, there is a risk the `G1` command
|
|
|
|
will make an undesirable request.)
|
|
|
|
|
|
|
|
A common way to accomplish that is to wrap the `G1` moves in
|
|
|
|
`SAVE_GCODE_STATE`, `G91`, and `RESTORE_GCODE_STATE`. For example:
|
|
|
|
|
|
|
|
```
|
|
|
|
[gcode_macro MOVE_UP]
|
|
|
|
gcode:
|
|
|
|
SAVE_GCODE_STATE NAME=my_move_up_state
|
|
|
|
G91
|
|
|
|
G1 Z10 F300
|
|
|
|
RESTORE_GCODE_STATE NAME=my_move_up_state
|
|
|
|
```
|
|
|
|
|
|
|
|
The `G91` command places the G-Code parsing state into "relative move
|
|
|
|
mode" and the `RESTORE_GCODE_STATE` command restores the state to what
|
|
|
|
it was prior to entering the macro. Be sure to specify an explicit
|
|
|
|
speed (via the `F` parameter) on the first `G1` command.
|
|
|
|
|
|
|
|
### Template expansion
|
2019-06-04 16:31:03 +02:00
|
|
|
<!-- {% raw %} -->
|
2019-05-28 21:16:50 +02:00
|
|
|
|
|
|
|
The gcode_macro `gcode:` config section is evaluated using the Jinja2
|
|
|
|
template language. One can evaluate expressions at run-time by
|
|
|
|
wrapping them in `{ }` characters or use conditional statements
|
|
|
|
wrapped in `{% %}`. See the
|
|
|
|
[Jinja2 documentation](http://jinja.pocoo.org/docs/2.10/templates/)
|
|
|
|
for further information on the syntax.
|
|
|
|
|
|
|
|
This is most often used to inspect parameters passed to the macro when
|
|
|
|
it is called. These parameters are available via the `params`
|
|
|
|
pseudo-variable. For example, if the macro:
|
|
|
|
|
|
|
|
```
|
|
|
|
[gcode_macro SET_PERCENT]
|
|
|
|
gcode:
|
|
|
|
M117 Now at { params.VALUE|float * 100 }%
|
|
|
|
```
|
|
|
|
|
|
|
|
were invoked as `SET_PERCENT VALUE=.2` it would evaluate to `M117 Now
|
|
|
|
at 20%`. Note that parameter names are always in upper-case when
|
|
|
|
evaluated in the macro and are always passed as strings. If performing
|
|
|
|
math then they must be explicitly converted to integers or floats.
|
|
|
|
|
|
|
|
An example of a complex macro:
|
|
|
|
```
|
|
|
|
[gcode_macro clean_nozzle]
|
|
|
|
gcode:
|
|
|
|
SAVE_GCODE_STATE NAME=clean_nozzle_state
|
|
|
|
G90
|
|
|
|
G0 Z15 F300
|
|
|
|
{% for wipe in range(8) %}
|
|
|
|
{% for coordinate in [(275,4),(235,4)] %}
|
|
|
|
G0 X{coordinate[0]} Y{coordinate[1] + 0.25 * wipe} Z9.7 F12000
|
|
|
|
{% endfor %}
|
|
|
|
{% endfor %}
|
|
|
|
RESTORE_GCODE_STATE NAME=clean_nozzle_state
|
|
|
|
```
|
2019-06-04 16:31:03 +02:00
|
|
|
<!-- {% endraw %} -->
|
2019-05-28 21:16:50 +02:00
|
|
|
|
|
|
|
#### The "printer" Variable
|
|
|
|
|
|
|
|
It is possible to inspect (and alter) the current state of the printer
|
|
|
|
via the `printer` pseudo-variable. For example:
|
|
|
|
|
|
|
|
```
|
|
|
|
[gcode_macro slow_fan]
|
|
|
|
gcode:
|
|
|
|
M106 S{ printer.fan.speed * 0.9 * 255}
|
|
|
|
```
|
|
|
|
|
|
|
|
Important! Macros are first evaluated in entirety and only then are
|
|
|
|
the resulting commands executed. If a macro issues a command that
|
|
|
|
alters the state of the printer, the results of that state change will
|
|
|
|
not be visible during the evaluation of the macro. This can also
|
|
|
|
result in subtle behavior when a macro generates commands that call
|
|
|
|
other macros, as the called macro is evaluated when it is invoked
|
|
|
|
(which is after the entire evaluation of the calling macro).
|
|
|
|
|
|
|
|
By convention, the name immediately following `printer` is the name of
|
|
|
|
a config section. So, for example, `printer.fan` refers to the fan
|
|
|
|
object created by the `[fan]` config section. There are some
|
2020-08-15 23:55:24 +02:00
|
|
|
exceptions to this rule - notably the `gcode_move` and `toolhead`
|
|
|
|
objects. If the config section contains spaces in it, then one can
|
|
|
|
access it via the `[ ]` accessor - for example:
|
2019-05-28 21:16:50 +02:00
|
|
|
`printer["generic_heater my_chamber_heater"].temperature`.
|
|
|
|
|
|
|
|
The following are common printer attributes:
|
|
|
|
- `printer.fan.speed`: The fan speed as a float between 0.0 and 1.0.
|
2020-10-15 19:29:50 +02:00
|
|
|
This is also available on "heater_fan" and "fan_generic" config
|
|
|
|
sections (eg, `printer["fan_generic my_fan"].speed`).
|
2020-08-15 23:55:24 +02:00
|
|
|
- `printer.gcode_move.gcode_position`: The current position of the
|
|
|
|
toolhead relative to the current G-Code origin. That is, positions
|
|
|
|
that one might directly send to a `G1` command. It is possible to
|
|
|
|
access the x, y, z, and e components of this position (eg,
|
|
|
|
`printer.gcode_move.gcode_position.x`).
|
|
|
|
- `printer.gcode_move.position`: The last commanded position of the
|
|
|
|
toolhead using the coordinate system specified in the config
|
|
|
|
file. It is possible to access the x, y, z, and e components of this
|
|
|
|
position (eg, `printer.gcode_move.position.x`).
|
|
|
|
- `printer.gcode_move.homing_origin`: The origin of the gcode
|
|
|
|
coordinate system (relative to the coordinate system specified in
|
|
|
|
the config file) to use after a `G28` command. The
|
|
|
|
`SET_GCODE_OFFSET` command can alter this position. It is possible
|
|
|
|
to access the x, y, and z components of this position (eg,
|
|
|
|
`printer.gcode_move.homing_origin.x`).
|
|
|
|
- `printer.gcode_move.speed`: The last speed set in a `G1` command (in
|
|
|
|
mm/s).
|
|
|
|
- `printer.gcode_move.speed_factor`: The "speed factor override" as
|
|
|
|
set by an `M220` command. This is a floating point value such
|
|
|
|
that 1.0 means no override and, for example, 2.0 would double
|
|
|
|
requested speed.
|
|
|
|
- `printer.gcode_move.extrude_factor`: The "extrude factor override"
|
|
|
|
as set by an `M221` command. This is a floating point value such
|
|
|
|
that 1.0 means no override and, for example, 2.0 would double
|
|
|
|
requested extrusions.
|
|
|
|
- `printer.gcode_move.absolute_coordinates`: This returns True if in
|
|
|
|
`G90` absolute coordinate mode or False if in `G91` relative mode.
|
|
|
|
- `printer.gcode_move.absolute_extrude`: This returns True if in `M82`
|
|
|
|
absolute extrude mode or False if in `M83` relative mode.
|
2019-05-28 21:16:50 +02:00
|
|
|
- `printer["gcode_macro <macro_name>"].<variable>`: The current value
|
|
|
|
of a gcode_macro variable.
|
|
|
|
- `printer.<heater>.temperature`: The last reported temperature (in
|
2019-11-25 01:02:49 +01:00
|
|
|
Celsius as a float) for the given heater. Example heaters are:
|
|
|
|
`extruder`, `extruder1`, `heater_bed`, `heater_generic
|
|
|
|
<config_name>`.
|
2019-05-28 21:16:50 +02:00
|
|
|
- `printer.<heater>.target`: The current target temperature (in
|
|
|
|
Celsius as a float) for the given heater.
|
2020-08-16 20:24:23 +02:00
|
|
|
- `printer.idle_timeout.state`: The current state of the printer as
|
|
|
|
tracked by the idle_timeout module. It is one of the following
|
|
|
|
strings: "Idle", "Printing", "Ready".
|
|
|
|
- `printer.idle_timeout.printing_time`: The amount of time (in
|
|
|
|
seconds) the printer has been in the "Printing" state (as tracked by
|
|
|
|
the idle_timeout module).
|
2019-05-28 21:16:50 +02:00
|
|
|
- `printer.pause_resume.is_paused`: Returns true if a PAUSE command
|
|
|
|
has been executed without a corresponding RESUME.
|
|
|
|
- `printer.toolhead.position`: The last commanded position of the
|
|
|
|
toolhead relative to the coordinate system specified in the config
|
|
|
|
file. It is possible to access the x, y, z, and e components of this
|
|
|
|
position (eg, `printer.toolhead.position.x`).
|
2019-11-25 01:02:49 +01:00
|
|
|
- `printer.toolhead.extruder`: The name of the currently active
|
|
|
|
extruder. For example, one could use
|
|
|
|
`printer[printer.toolhead.extruder].target` to get the target
|
|
|
|
temperature of the current extruder.
|
2019-11-25 01:16:21 +01:00
|
|
|
- `printer.toolhead.homed_axes`: The current cartesian axes considered
|
|
|
|
to be in a "homed" state. This is a string containing one or more of
|
|
|
|
"x", "y", "z".
|
2020-10-15 19:29:50 +02:00
|
|
|
- `printer.toolhead.max_velocity`, `printer.toolhead.max_accel`,
|
|
|
|
`printer.toolhead.max_accel_to_decel`,
|
|
|
|
`printer.toolhead.square_corner_velocity`: The current printing
|
|
|
|
limits that are in effect. This may differ from the config file
|
|
|
|
settings if a `SET_VELOCITY_LIMIT` (or `M204`) command alters them
|
|
|
|
at run-time.
|
2020-04-26 23:30:57 +02:00
|
|
|
- `printer.heaters.available_heaters`: Returns a list of all currently
|
2019-12-12 13:33:23 +01:00
|
|
|
available heaters by their full config section names,
|
|
|
|
e.g. `["extruder", "heater_bed", "heater_generic my_custom_heater"]`.
|
2020-04-26 23:30:57 +02:00
|
|
|
- `printer.heaters.available_sensors`: Returns a list of all currently
|
2019-12-12 13:33:23 +01:00
|
|
|
available temperature sensors by their full config section names,
|
|
|
|
e.g. `["extruder", "heater_bed", "heater_generic my_custom_heater",
|
|
|
|
"temperature_sensor electronics_temp"]`.
|
2020-02-13 01:11:40 +01:00
|
|
|
- `printer.query_endstops.last_query["<endstop>"]`: Returns True if
|
|
|
|
the given endstop was reported as "triggered" during the last
|
|
|
|
QUERY_ENDSTOP command. Note, due to the order of template expansion
|
2020-09-10 05:11:24 +02:00
|
|
|
(see above), the QUERY_ENDSTOP command must be run prior to the
|
|
|
|
macro containing this reference.
|
2020-09-10 05:10:35 +02:00
|
|
|
- `printer.probe.last_query`: Returns True if the probe was reported
|
|
|
|
as "triggered" during the last QUERY_PROBE command. Note, due to the
|
2020-09-10 05:11:24 +02:00
|
|
|
order of template expansion (see above), the QUERY_PROBE command
|
2020-09-10 05:10:35 +02:00
|
|
|
must be run prior to the macro containing this reference.
|
2020-02-14 03:57:41 +01:00
|
|
|
- `printer.configfile.config["<section>"]["<option>"]`: Returns the
|
|
|
|
given config file setting as read by Klipper during the last
|
|
|
|
software start or restart. (Any settings changed at run-time will
|
|
|
|
not be reflected here.) All values are returned as strings (if math
|
|
|
|
is to be performed on the value then it must be converted to a
|
|
|
|
Python number).
|
2020-10-15 19:29:50 +02:00
|
|
|
- `printer["gcode_macro <macro_name>"].<variable>`: The current value
|
|
|
|
of a [gcode_macro variable](#variables).
|
|
|
|
- `printer.webhooks.state`: Returns a string indicating the current
|
|
|
|
Klipper state. Possible values are: "ready", "startup", "shutdown",
|
|
|
|
"error".
|
|
|
|
- `printer.webhooks.state_message`: A human readable string giving
|
|
|
|
additional context on the current Klipper state.
|
|
|
|
- `printer.display_status.progress`: The progress value of the last
|
|
|
|
`M73` G-Code command (or `printer.virtual_sdcard.progress` if no
|
|
|
|
recent `M73` received).
|
|
|
|
- `printer.display_status.message`: The message contained in the last
|
|
|
|
`M117` G-Code command.
|
|
|
|
- `printer["filament_switch_sensor <config_name>"].enabled`: Returns
|
|
|
|
True if the switch sensor is currently enabled.
|
|
|
|
- `printer["filament_switch_sensor <config_name>"].filament_detected`:
|
|
|
|
Returns True if the sensor is in a triggered state.
|
|
|
|
- `printer.virtual_sdcard.is_active`: Returns True if a print from
|
|
|
|
file is currently active.
|
|
|
|
- `printer.virtual_sdcard.progress`: An estimate of the current print
|
|
|
|
progress (based of file size and file position).
|
|
|
|
- `printer.virtual_sdcard.file_position`: The current position (in
|
|
|
|
bytes) of an active print.
|
|
|
|
- `printer.print_stats.filename`,
|
|
|
|
`printer.print_stats.total_duration`,
|
|
|
|
`printer.print_stats.print_duration`,
|
|
|
|
`printer.print_stats.filament_used`, `printer.print_stats.state`,
|
|
|
|
`printer.print_stats.message`: Estimated information about the
|
|
|
|
current print when a virtual_sdcard print is active.
|
|
|
|
- `printer.firmware_retraction.retract_length`,
|
|
|
|
`printer.firmware_retraction.retract_speed`,
|
|
|
|
`printer.firmware_retraction.unretract_extra_length`,
|
|
|
|
`printer.firmware_retraction.unretract_speed`: The current settings
|
|
|
|
for the firmware_retraction module. These settings may differ from
|
|
|
|
the config file if a `SET_RETRACTION` command alters them.
|
|
|
|
- `printer["bme280 <sensor_name>"].temperature`,
|
|
|
|
`printer["bme280 <sensor_name>"].humidity`,
|
|
|
|
`printer["bme280 <sensor_name>"].pressure`: The last read values
|
|
|
|
from the sensor.
|
|
|
|
- `printer["htu21d <sensor_name>"].temperature`,
|
|
|
|
`printer["htu21d <sensor_name>"].humidity`: The last read values
|
|
|
|
from the sensor.
|
|
|
|
- `printer["lm75 <sensor_name>"].temperature`: The last read
|
|
|
|
temperature from the sensor.
|
|
|
|
- `printer["temperature_sensor <config_name>"].temperature`: The last read
|
|
|
|
temperature from the sensor.
|
|
|
|
- `printer["temperature_sensor <config_name>"].measured_min_temp`,
|
|
|
|
`printer["temperature_sensor <config_name>"].measured_max_temp`: The
|
|
|
|
lowest and highest temperature seen by the sensor since the Klipper
|
|
|
|
host software was last restarted.
|
|
|
|
- `printer["temperature_fan <config_name>"].temperature`: The last read
|
|
|
|
temperature from the sensor.
|
|
|
|
- `printer["temperature_fan <config_name>"].target`: The target
|
|
|
|
temperature for the fan.
|
|
|
|
- `printer["output_pin <config_name>"].value`: The "value" of the pin,
|
|
|
|
as set by a `SET_PIN` command.
|
|
|
|
- `printer["servo <config_name>"].value`: The last setting of the PWM
|
|
|
|
pin (a value between 0.0 and 1.0) associated with the servo.
|
|
|
|
- `printer.bed_mesh.profile_name`, `printer.bed_mesh.mesh_min`,
|
|
|
|
`printer.bed_mesh.mesh_max`, `printer.bed_mesh.probed_matrix`,
|
|
|
|
`printer.bed_mesh.mesh_matrix`: Information on the currently active
|
|
|
|
bed_mesh.
|
|
|
|
- `printer.hall_filament_width_sensor.is_active`: Returns True if the
|
|
|
|
sensor is currently active.
|
|
|
|
- `printer.hall_filament_width_sensor.Diameter`,
|
|
|
|
`printer.hall_filament_width_sensor.Raw`: The last read values from
|
|
|
|
the sensor.
|
2019-05-28 21:16:50 +02:00
|
|
|
|
|
|
|
The above list is subject to change - if using an attribute be sure to
|
2019-06-04 16:39:43 +02:00
|
|
|
review the [Config Changes document](Config_Changes.md) when upgrading
|
|
|
|
the Klipper software. The above list is not exhaustive. Other
|
|
|
|
attributes may be available (via `get_status()` methods defined in the
|
2019-05-28 21:16:50 +02:00
|
|
|
software). However, undocumented attributes may change without notice
|
|
|
|
in future Klipper releases.
|
|
|
|
|
2020-08-16 21:39:30 +02:00
|
|
|
### Actions
|
|
|
|
|
|
|
|
There are some commands available that can alter the state of the
|
|
|
|
printer. For example, `{ action_emergency_stop() }` would cause the
|
|
|
|
printer to go into a shutdown state. Note that these actions are taken
|
|
|
|
at the time that the macro is evaluated, which may be a significant
|
|
|
|
amount of time before the generated g-code commands are executed.
|
|
|
|
|
|
|
|
Available "action" commands:
|
|
|
|
- `action_respond_info(msg)`: Write the given `msg` to the
|
|
|
|
/tmp/printer pseudo-terminal. Each line of `msg` will be sent with a
|
|
|
|
"// " prefix.
|
|
|
|
- `action_raise_error(msg)`: Abort the current macro (and any calling
|
|
|
|
macros) and write the given `msg` to the /tmp/printer
|
|
|
|
pseudo-terminal. The first line of `msg` will be sent with a "!! "
|
|
|
|
prefix and subsequent lines will have a "// " prefix.
|
|
|
|
- `action_emergency_stop(msg)`: Transition the printer to a shutdown
|
|
|
|
state. The `msg` parameter is optional, it may be useful to describe
|
|
|
|
the reason for the shutdown.
|
2020-10-27 20:29:46 +01:00
|
|
|
- `action_call_remote_method(method_name)`: Calls a method registered
|
|
|
|
by a remote client. If the method takes parameters they should
|
|
|
|
be provided via keyword arguments, ie:
|
|
|
|
`action_call_remote_method("print_stuff", my_arg="hello_world")`
|
2020-08-16 21:39:30 +02:00
|
|
|
|
2019-05-28 21:16:50 +02:00
|
|
|
### Variables
|
|
|
|
|
|
|
|
The SET_GCODE_VARIABLE command may be useful for saving state between
|
2020-01-06 16:59:40 +01:00
|
|
|
macro calls. Variable names may not contain any upper case characters.
|
|
|
|
For example:
|
2019-05-28 21:16:50 +02:00
|
|
|
|
|
|
|
```
|
|
|
|
[gcode_macro start_probe]
|
|
|
|
variable_bed_temp: 0
|
|
|
|
gcode:
|
|
|
|
# Save target temperature to bed_temp variable
|
|
|
|
SET_GCODE_VARIABLE MACRO=start_probe VARIABLE=bed_temp VALUE={printer.heater_bed.target}
|
|
|
|
# Disable bed heater
|
|
|
|
M140
|
|
|
|
# Perform probe
|
|
|
|
PROBE
|
|
|
|
# Call finish_probe macro at completion of probe
|
|
|
|
finish_probe
|
|
|
|
|
|
|
|
[gcode_macro finish_probe]
|
|
|
|
gcode:
|
|
|
|
# Restore temperature
|
|
|
|
M140 S{printer["gcode_macro start_probe"].bed_temp}
|
|
|
|
```
|
|
|
|
|
|
|
|
Be sure to take the timing of macro evaluation and command execution
|
|
|
|
into account when using SET_GCODE_VARIABLE.
|
2019-06-29 23:13:35 +02:00
|
|
|
|
|
|
|
### Delayed Gcodes
|
|
|
|
|
|
|
|
The [delayed_gcode] configuration option can be used to execute a delayed
|
|
|
|
gcode sequence:
|
|
|
|
|
|
|
|
```
|
|
|
|
[delayed_gcode clear_display]
|
|
|
|
gcode:
|
|
|
|
M117
|
|
|
|
|
|
|
|
[gcode_macro load_filament]
|
|
|
|
gcode:
|
|
|
|
G91
|
|
|
|
G1 E50
|
|
|
|
G90
|
|
|
|
M400
|
|
|
|
M117 Load Complete!
|
|
|
|
UPDATE_DELAYED_GCODE ID=clear_display DURATION=10
|
|
|
|
```
|
|
|
|
|
|
|
|
When the `load_filament` macro above executes, it will display a
|
|
|
|
"Load Complete!" message after the extrusion is finished. The
|
|
|
|
last line of gcode enables the "clear_display" delayed_gcode, set
|
|
|
|
to execute in 10 seconds.
|
|
|
|
|
|
|
|
The `initial_duration` config option can be set to execute the
|
|
|
|
delayed_gcode on printer startup. The countdown begins when the
|
|
|
|
printer enters the "ready" state. For example, the below delayed_gcode
|
|
|
|
will execute 5 seconds after the printer is ready, initializing
|
|
|
|
the display with a "Welcome!" message:
|
|
|
|
|
|
|
|
```
|
|
|
|
[delayed_gcode welcome]
|
|
|
|
initial_duration: 5.
|
|
|
|
gcode:
|
|
|
|
M117 Welcome!
|
|
|
|
```
|
|
|
|
|
|
|
|
Its possible for a delayed gcode to repeat by updating itself in
|
|
|
|
the gcode option:
|
|
|
|
|
|
|
|
```
|
|
|
|
[delayed_gcode report_temp]
|
|
|
|
initial_duration: 2.
|
|
|
|
gcode:
|
2020-08-16 21:39:30 +02:00
|
|
|
{action_respond_info("Extruder Temp: %.1f" % (printer.extruder0.temperature))}
|
2019-06-29 23:13:35 +02:00
|
|
|
UPDATE_DELAYED_GCODE ID=report_temp DURATION=2
|
|
|
|
```
|
|
|
|
|
|
|
|
The above delayed_gcode will send "// Extruder Temp: [ex0_temp]" to
|
|
|
|
Octoprint every 2 seconds. This can be canceled with the following
|
|
|
|
gcode:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
UPDATE_DELAYED_GCODE ID=report_temp DURATION=0
|
|
|
|
```
|