The motion timeout switched the nozzle LEDs off during prints, motion switched them off when idle or paused, the timeout counted from the first movement, and every _status_* macro stopped the nozzle light. - _LIGHTS sets case light and nozzle LEDs from presence, print state and CASELIGHT MODE=AUTO|ON|OFF; the timeout (60 s) starts at the sensor release - _STATUS STATE=... replaces the _status_* macros; logo effects only cover the logo LEDs and use REPLACE=1 - heater gauge while heating, print progress, paused, error flash from _ERROR, part ready once the bed is cool, dim night mode when idle and nobody near, cleaning during BLOBIFIER_CLEAN - removed unused effects and macros, 12 fps for the toolhead effects Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
109 lines
4.2 KiB
INI
109 lines
4.2 KiB
INI
# PIR motion sensor (AM312): case light and nozzle LEDs while someone is near
|
|
#
|
|
# The AM312 keeps its output on as long as it sees movement: press = motion,
|
|
# release = no more motion. The timeout starts at the release, so the lights
|
|
# stay on while someone works at the printer.
|
|
#
|
|
# someone near: case light near_value, nozzle LEDs white
|
|
# nobody near, print/pause: case light print_value, nozzle LEDs off
|
|
# nobody near, idle: case light idle_value, nozzle LEDs off,
|
|
# logo and Box Turtle logo dim (_STATUS ready)
|
|
#
|
|
# CASELIGHT MODE=ON [VALUE=0.5] | OFF | AUTO overrides the sensor until the
|
|
# next Klipper restart. Setting the case light in Mainsail only lasts until
|
|
# the next motion.
|
|
|
|
[gcode_button am312]
|
|
pin: !PC0
|
|
press_gcode:
|
|
_MOTION_START
|
|
release_gcode:
|
|
_MOTION_END
|
|
|
|
[gcode_macro _LIGHTS]
|
|
description: Set the case light and nozzle LEDs from motion, print state and CASELIGHT mode
|
|
variable_timeout: 60 # s without motion before the lights dim or turn off
|
|
variable_near_value: 1.0 # case light while someone is near
|
|
variable_print_value: 0.1 # case light while printing or paused, nobody near
|
|
variable_idle_value: 0.0 # case light while idle, nobody near
|
|
variable_on_value: 1.0 # case light for CASELIGHT MODE=ON
|
|
variable_mode: 'auto' # auto (motion sensor), on, off: set by CASELIGHT
|
|
variable_present: False # someone near: set by the motion sensor
|
|
variable_near: False # lights on (present or MODE=ON): read by _STATUS
|
|
variable_debug: False # True: report every change in the console
|
|
gcode:
|
|
{% set busy = printer.print_stats.state in ['printing', 'paused'] %}
|
|
{% if mode == 'on' %}
|
|
{% set lit = True %}
|
|
{% set value = on_value %}
|
|
{% elif mode == 'off' %}
|
|
{% set lit = False %}
|
|
{% set value = 0.0 %}
|
|
{% else %}
|
|
{% set lit = present %}
|
|
{% set value = near_value if present else (print_value if busy else idle_value) %}
|
|
{% endif %}
|
|
{% if debug %}
|
|
RESPOND MSG="Lights: mode={mode} present={present} print={printer.print_stats.state}: case light {value}, nozzle {'on' if lit else 'off'}"
|
|
{% endif %}
|
|
{% if printer['output_pin caselight'].value != value %}
|
|
SET_PIN PIN=caselight VALUE={value}
|
|
{% endif %}
|
|
{% if printer['led_effect sb_nozzle_light'].enabled != lit %}
|
|
SET_LED_EFFECT EFFECT=sb_nozzle_light {'' if lit else 'STOP=1'} FADETIME={printer['gcode_macro _STATUS'].fade_time}
|
|
{% endif %}
|
|
{% if near != lit %}
|
|
SET_GCODE_VARIABLE MACRO=_LIGHTS VARIABLE=near VALUE={lit}
|
|
# Night mode of the logo when idle
|
|
_STATUS
|
|
{% endif %}
|
|
|
|
[gcode_macro _MOTION_START]
|
|
description: Motion sensor: someone is near
|
|
gcode:
|
|
UPDATE_DELAYED_GCODE ID=_motion_timeout DURATION=0
|
|
{% if not printer['gcode_macro _LIGHTS'].present %}
|
|
SET_GCODE_VARIABLE MACRO=_LIGHTS VARIABLE=present VALUE=True
|
|
_LIGHTS
|
|
{% endif %}
|
|
|
|
[gcode_macro _MOTION_END]
|
|
description: Motion sensor: no more motion, lights off after the timeout
|
|
gcode:
|
|
UPDATE_DELAYED_GCODE ID=_motion_timeout DURATION={printer['gcode_macro _LIGHTS'].timeout}
|
|
|
|
[delayed_gcode _motion_timeout]
|
|
gcode:
|
|
SET_GCODE_VARIABLE MACRO=_LIGHTS VARIABLE=present VALUE=False
|
|
_LIGHTS
|
|
|
|
[gcode_macro _LIGHTS_ON]
|
|
description: Lights on as if someone walked by (print start and end, startup)
|
|
gcode:
|
|
_MOTION_START
|
|
{% if printer['gcode_button am312'].state == 'RELEASED' %}
|
|
_MOTION_END
|
|
{% endif %}
|
|
|
|
[delayed_gcode _lights_startup]
|
|
initial_duration: 2
|
|
gcode:
|
|
_LIGHTS_ON
|
|
|
|
[gcode_macro CASELIGHT]
|
|
description: Case light and nozzle LEDs: MODE=AUTO (motion sensor), ON [VALUE=0-1] or OFF; no MODE: show the mode
|
|
gcode:
|
|
{% set l = printer['gcode_macro _LIGHTS'] %}
|
|
{% set mode = params.MODE|default('')|lower %}
|
|
{% if mode == '' %}
|
|
RESPOND MSG="Case light: mode {l.mode}, {'someone near' if l.present else 'nobody near'}, value {printer['output_pin caselight'].value}"
|
|
{% elif mode not in ['auto', 'on', 'off'] %}
|
|
_ERROR MSG="CASELIGHT: MODE must be AUTO, ON or OFF"
|
|
{% else %}
|
|
{% if 'VALUE' in params %}
|
|
SET_GCODE_VARIABLE MACRO=_LIGHTS VARIABLE=on_value VALUE={[[params.VALUE|float, 0.0]|max, 1.0]|min}
|
|
{% endif %}
|
|
SET_GCODE_VARIABLE MACRO=_LIGHTS VARIABLE=mode VALUE="'{mode}'"
|
|
_LIGHTS
|
|
{% endif %}
|