Files
mangavalkandClaude Opus 5.5 e5be65834e LEDs: nozzle light follows the motion sensor, new logo status macro
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>
2026-10-17 19:32:42 +02:00

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 %}