# Monitoring loop. Begins at Klipper start. [delayed_gcode CHECK_ALL_FANS] initial_duration: 1 gcode: HOTEND_FAN_CHECK UPDATE_DELAYED_GCODE ID=CHECK_ALL_FANS DURATION=3 # Change min_rpm and max_consecutive_stops to your desired values. [gcode_macro HOTEND_FAN_CHECK] variable_he_stop_count: 0 gcode: {% set min_rpm = 3000|float %} {% set max_consecutive_stops = 3 %} {% set rpm = printer['heater_fan hotend_fan'].rpm|float %} {% set he_target = printer[printer.toolhead.extruder].target|float %} {% set he_temp = printer[printer.toolhead.extruder].temperature|float %} {% set fan_on_temp = printer.configfile.settings['heater_fan hotend_fan'].heater_temp|float %} {% set he_stop_count = printer["gcode_macro HOTEND_FAN_CHECK"].he_stop_count|int %} {% if (he_target >= fan_on_temp) and (rpm < min_rpm) and (he_temp >= fan_on_temp) %} SET_GCODE_VARIABLE MACRO=HOTEND_FAN_CHECK VARIABLE=he_stop_count VALUE={he_stop_count + 1} RESPOND PREFIX="HOTEND FAN CHECK:" MSG="Hotend fan stoppage detected ({he_stop_count+1}/{max_consecutive_stops})." {% if printer["gcode_macro HOTEND_FAN_CHECK"].he_stop_count|int >= max_consecutive_stops-1 %} M400 FAN_STOPPAGE_ROUTINE {% endif %} {% else %} SET_GCODE_VARIABLE MACRO=HOTEND_FAN_CHECK VARIABLE=he_stop_count VALUE=0 {% endif %} # Insert the gcode that you want to run when a fan stoppage is detected. # This runs every ~3 seconds until the stop conditions are cleared. [gcode_macro FAN_STOPPAGE_ROUTINE] gcode: # If not already paused {% if printer['pause_resume'].is_paused|int == 0 %} M117 !!FAN STOPPAGE!! RESPOND PREFIX="FAN CHECK:" MSG="Fan stoppage detected. Pausing print." PAUSE SET_HEATER_TEMPERATURE HEATER=extruder TARGET=0 # Turn off the hotend. {% endif %}