V3DP Posté(e) Mai 7 Posté(e) Mai 7 (modifié) Bonjour à tous J'ai libéré mes X Max 3 et tourne sur Klipper 0.12 actuellement J'essaye d'améliorer mes macros PAUSE RESUME (déjà non standard) pour couper les ventilateurs lors de la mise en pause et les redémarrer à la vitesse définie lors de l'arrêt à la reprise. Donc passage par une variable définie lors de la macro PAUSE et récupération lors de la macro RESUME, comme c'est déjà le cas pour la température de la buse. Voici la macro PAUSE [gcode_macro PAUSE] description: Pause the actual running print rename_existing: PAUSE_BASE gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set idle_timeout = client.idle_timeout|default(0) %} {% set temp = printer[printer.toolhead.extruder].target if printer.toolhead.extruder != '' else 0 %} {% set restore = False if printer.toolhead.extruder == '' else True if params.RESTORE|default(1)|int == 1 else False %} {% set partfan_speed = printer.partfan if printer.partfan != '' else 0 %} {% set filterfan_speed = printer.filterfan if printer.filterfan != '' else 0 %} {% set sidefan_speed = printer.sidefan if printer.sidefan != '' else 0 %} ##### end of definitions ##### SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE={temp} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_restore VALUE={restore} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_partfan_speed VALUE={partfan_speed} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_filterfan_speed VALUE={filterfan_speed} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_sidefan_speed VALUE={sidefan_speed} # set a new idle_timeout value {% if idle_timeout > 0 %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=restore_idle_timeout VALUE={printer.configfile.settings.idle_timeout.timeout} SET_IDLE_TIMEOUT TIMEOUT={idle_timeout} {% endif %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=True M104 S0 M106 S0 M106 P2 S0 M106 P3 S0 SFS_DISABLE PAUSE_BASE {client.user_pause_macro|default("")} _TOOLHEAD_PARK_PAUSE_CANCEL {rawparams} Et la partie de la macro RESUME [gcode_macro RESUME] description: Resume the actual running print rename_existing: RESUME_BASE variable_last_extruder_temp: 0 variable_last_extruder_restore: False variable_last_partfan_speed: 0 variable_last_filterfan_speed: 0 variable_last_sidefan_speed: 0 variable_restore_idle_timeout: 0 variable_idle_state: False gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} {% set sp_move = client.speed_move|default(velocity) %} {% set runout_resume = True if client.runout_sensor|default("") == "" # no runout else True if not printer[client.runout_sensor].enabled # sensor is disabled else printer[client.runout_sensor].filament_detected %} # sensor status {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder {% set do_resume = False %} {% set prompt_txt = [] %} ##### end of definitions ##### #### Printer comming from timeout idle state #### {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False {% if last_extruder_restore %} # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp) }' M109 S{last_extruder_temp} M106 S{last_partfan_speed} M106 P2 S{last_sidefan_speed} M106 P3 S{last_filterfan_speed} {% set do_resume = True %} {% elif can_extrude %} {% set do_resume = True %} {% else %} En lançant la macro PAUSE, j'obtiens une erreur lors de l'évaluation de la variable partant_speed !! Unable to parse '' as a literal: invalid syntax (, line 0) Donc à priori c'est que la variable qui doit être un décimal n'est pas du bon format. Si je spécifie que c'est la valeur de objet set partfan_speed = printer.partfan.value, j'obtiens une erreur bloquante lors du démarrage de Klipper !! Error evaluating 'gcode_macro PAUSE:gcode': jinja2.exceptions.UndefinedError: 'extras.gcode_macro.GetStatusWrapper object' has no attribute 'partfan' Pourtant dans le guide de référence des états output_pin¶ Les informations suivantes sont disponibles dans les objets output_pin nom_de_la_sortie : value : la "valeur" de la broche, telle que définie par une commande SET_PIN. Et le printer.cfg définit les ventilateurs de la X Max 3 comme des output_pin et non pas des fan. J'ai essayé avec la syntaxe complète : printer[printer.partfan].value sans succès. Impossible de récupérer la valeur numérique de la sortie du ventilateur. Si quelqu'un a une idée .... Modifié (le) Mai 7 par V3DP
fran6p Posté(e) Mai 7 Posté(e) Mai 7 Salut, Pas vraiment d'idées , d'autant plus que mes ventilateurs ne sont pas déclarés en [output_pin …], mais en [fan_generic …] ################################################# # Fans # ################################################# ############### Side fan (auxiliary) ############ #[output_pin fan2] # => auxiliary_cooling_fan #pin: PA8 #pwm: True #cycle_time: 0.0100 #hardware_pwm: false #value: 0.00 #scale: 255 #shutdown_value: 0.0 [fan_generic auxiliary_cooling_fan] pin: PA8 shutdown_speed: 0.0 cycle_time: 0.0100 hardware_pwm: false kick_start_time: 0.100 off_below: 0.0 # # use via SET_FAN_SPEED FAN=auxilary_fan SPEED=value ################### Chamber fan ################ ## Ventilateur extraction air interne via filtre à charbon actif #[output_pin fan3] # => chamber_circulation_fan #pin:PC9 #pwm: True #cycle_time: 0.0100 #hardware_pwm: false #value: 0.0 #scale: 255 #shutdown_value: 0.0 [fan_generic chamber_circulation_fan] pin: PC9 shutdown_speed: 0.0 cycle_time: 0.0100 hardware_pwm: false kick_start_time: 0.100 off_below: 0.0 # # use via SET_FAN_SPEED FAN=exhaust_fan SPEED=valeur ################### Parts fan ################## ## FAN0 refroidissement filament (buse) #[output_pin fan0] #pin: MKS_THR:gpio2 #pwm: True #cycle_time: 0.0100 #hardware_pwm: false #value: 0 #scale: 255 #shutdown_value: 0.0 [fan_generic cooling_fan] pin: MKS_THR:gpio2 max_power: 1.0 shutdown_speed: 0.0 cycle_time: 0.0100 hardware_pwm: false kick_start_time: 0.100 off_below: 0.0 # use via SET_FAN_SPEED FAN=cooling_fan SPEED=value @Savate, une idée ?
V3DP Posté(e) Mai 7 Auteur Posté(e) Mai 7 il y a une heure, fran6p a dit : Salut, Pas vraiment d'idées , d'autant plus que mes ventilateurs ne sont pas déclarés en [output_pin …], mais en [fan_generic …] Merci @fran6p Oui, c'est plus simple dans ce cas, car la propriété speed est décrite. Un printer.fan.speed remonte la valeur Par contre je ne sais pas si cela continuerait à fonctionner avec l'écran d'origine flashé avec FreeDi. J'ai suivi le GitHub de Phil1988 pour la configuration du printer.cfg pour que ça fonctionne avec l'écran flashé
fran6p Posté(e) Mai 8 Posté(e) Mai 8 Il y a 14 heures, V3DP a dit : Par contre je ne sais pas si cela continuerait à fonctionner avec l'écran d'origine flashé avec FreeDi. Effectivement, pas sûr du tout. Il faudrait tester avec les mêmes noms de ventilateurs (partfan, filterfan, sidefan) dans les sections [fan_generic …], idem avec la macro M106 différente (fortement basée sur celle de la Q1 Pro) : Citation # Macro M106 used by Qidi Q1 Pro # Use names instead of values # - cooling_fan => fan0 # - auxiliary_cooling_fan => fan2 # - chamber_circulation_fan => fan3 # Use "SET_FAN_SPEED FAN= SPEED= " # => [fan_generic "name"_fan] # name={cooling, auxiliary, chamber_circulation} # Old used "SET_PIN PIN= VALUE= " # => [output_pin fanX] # X={0, 2, 3} # [gcode_macro M106] gcode: {% set p = params.P|default(0)|int %} {% if p == 2 %} {% if params.S is defined %} SET_FAN_SPEED FAN=auxiliary_cooling_fan SPEED={(params.S|float / 255.0)} {% else %} SET_FAN_SPEED FAN=auxiliary_cooling_fan SPEED=1 {% endif %} {% endif %} {% if p == 0 %} {% if params.S is defined %} SET_FAN_SPEED FAN=cooling_fan SPEED={(params.S|float / 255.0)} {% else %} SET_FAN_SPEED FAN=cooling_fan SPEED=1 {% endif %} {% endif %} {% if p == 3 %} {% if params.S is defined %} SET_FAN_SPEED FAN=chamber_circulation_fan SPEED={(params.S|float / 255.0)} {% else %} SET_FAN_SPEED FAN=chamber_circulation_fan SPEED=1 {% endif %} {% endif %} [gcode_macro M107] gcode: SET_FAN_SPEED FAN=cooling_fan SPEED=0 # SET_FAN_SPEED FAN=auxiliary_fan SPEED=0 #fan2 # SET_FAN_SPEED FAN=chamber_circulation_fan SPEED=0 #fan3 1
pommeverte Posté(e) Mai 8 Posté(e) Mai 8 Salut, Il y a peut-être une solution pas très élégante qui consiste à redéfinir la macro M106 pour sauvegarder la valeur dans une variable en fonction de la sortie (P2 ou P3).
V3DP Posté(e) Mai 8 Auteur Posté(e) Mai 8 il y a 16 minutes, fran6p a dit : Effectivement, pas sûr du tout. Il faudrait tester avec les mêmes noms de ventilateurs (partfan, filterfan, sidefan) dans les sections [fan_generic …], idem avec la macro M106 différente (fortement basée sur celle de la Q1 Pro) : Test fait, si on définit le ventilateur auxiliaire en fan_generic, cela ne fonctionne plus avec l'écran flashé FreeDi La macro M106 a bien été redéfinie pour gérer la notion d'outil (Px) pour fonctionner avec FreeDi (c'est bien décrit dans son GitHub) il y a 10 minutes, pommeverte a dit : Salut, Il y a peut-être une solution pas très élégante qui consiste à redéfinir la macro M106 pour sauvegarder la valeur dans une variable en fonction de la sortie (P2 ou P3). @pommeverte Merci pour l'idée. A défaut d'être élégante, j'ai peur que ça ne marche pas si simplement que ça : si on passe une variable (3 en fait) pour définir le dernier état des ventilateurs au niveau de la macro M106, comme la macro PAUSE va appeler la macro M106 pour arrêter les ventilos, les variables vont être remises à 0. Une idée serait de sauvegarder ces valeurs dans une nouvelle variable juste avant le changement d'état des ventilateurs par la macro PAUSE et passer ces variables à la macro RESUME. En fait ca reviendrait à faire ce que Klipper fait théoriquement nativement, sauf que la propriété native .value pour l'objet output_pin ne renvoie pas l'attendu. Si je ne trouve pas comment fonctionner avec la mécanique native de Klipper c'est ce que je ferais.
pommeverte Posté(e) Mai 8 Posté(e) Mai 8 (modifié) Comme tu redéfinis la macro M106, rien ne t'empêche d'ajouter un paramètre (NO_SAVE par exemple) qui te prévient de ne pas sauvegarder la valeur. Dans ta macro PAUSE, tu aurais donc M106 P2 S0 NO_SAVE=1, M106... Modifié (le) Mai 8 par pommeverte 1
fran6p Posté(e) Mai 8 Posté(e) Mai 8 (modifié) Ça commence à devenir une usine à gaz . Le problème vient surtout de l'écran qui n'est pas Klipperscreen compatible. Il est géré par son propre firmware développé par un seul utilisateur pas toujours prêt à accepter des modifications à son joujou. Raison pour laquelle dès le début, j'ai préféré me tourner vers une solution standard (Klipperscreen) en remplaçant l'écran par un BTT HDMI 5" et en ajoutant un RPi0v2 pour sa gestion. il y a 31 minutes, V3DP a dit : La macro M106 a bien été redéfinie pour gérer la notion d'outil (Px) pour fonctionner avec FreeDi (c'est bien décrit dans son GitHub) Y compris les modifications à faire : Citation Utiliser "SET_FAN_SPEED FAN= SPEED= " avec une section [fan_generic "name"_fan] au lieu de "SET_PIN PIN= VALUE= " utilisé avec une section [output_pin …] Modifié (le) Mai 8 par fran6p
V3DP Posté(e) Mai 8 Auteur Posté(e) Mai 8 il y a 7 minutes, fran6p a dit : Y compris les modifications à faire : Ben non, car c'est la macro qui fonctionne pour FreeDi, donc avec des sections output_pin et non pas fan_generic... 1
pommeverte Posté(e) Mai 8 Posté(e) Mai 8 (modifié) J'ai trouvé un exemple ici, tiré de la Creality K1 max visiblement. La syntaxe serait donc: VALUE={printer['output_pin partfan'].value} Modifié (le) Mai 8 par pommeverte 1
V3DP Posté(e) Mai 8 Auteur Posté(e) Mai 8 à l’instant, pommeverte a dit : J'ai trouvé un exemple ici. La syntaxe serait donc: VALUE={printer['output_pin partfan'].value} Merci. J'ai trouvé aussi ça pendant qu'on échangeait. Je n'ai plus de message d'erreur sur mes macros. Pour autant ça ne fonctionne pas lors du RESUME. Je pense à un problème de format de la valeur obtenue. il y a 11 minutes, fran6p a dit : Donc, avec Freedi, seule solution => bidouille Pas sur .... le sujet avance proprement pour l'instant, mais il reste ce dernier point à traiter
pommeverte Posté(e) Mai 8 Posté(e) Mai 8 Est-ce que tu peux fournir ton fichier printer.cfg complet et compressé (zippé) ?
V3DP Posté(e) Mai 8 Auteur Posté(e) Mai 8 il y a 2 minutes, pommeverte a dit : Est-ce que tu peux fournir ton fichier printer.cfg complet et compressé (zippé) ? Voici printer.cfg.zip
pommeverte Posté(e) Mai 8 Posté(e) Mai 8 est-ce que tu peux ajouter les fichiers: macros_pause_resume.cfg mainsail.cfg save_variables.cfg voire le klippy.log
V3DP Posté(e) Mai 8 Auteur Posté(e) Mai 8 @pommeverte @fran6p Merci pour votre aide et les pistes. J'ai trouvé le problème.... donc on peut faire propre en utilisant les méthodes fournies par Klipper. En fait la valeur renvoyée par printer['output_pin partfan'].value est un décimal entre 0 et 1. Et la commande M106 attend une valeur entre 0 et 255, qui peut être décimale également. Donc en faisant une petite multiplication ça fonctionne. Voici les deux macros fonctionnelles [gcode_macro PAUSE] description: Pause the actual running print rename_existing: PAUSE_BASE gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set idle_timeout = client.idle_timeout|default(0) %} {% set temp = printer[printer.toolhead.extruder].target if printer.toolhead.extruder != '' else 0 %} {% set restore = False if printer.toolhead.extruder == '' else True if params.RESTORE|default(1)|int == 1 else False %} {% set partfan_speed = printer["output_pin partfan"].value %} {% set filterfan_speed = printer["output_pin filterfan"].value %} {% set sidefan_speed = printer["output_pin sidefan"].value %} ##### end of definitions ##### SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE={temp} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_restore VALUE={restore} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_partfan_speed VALUE={partfan_speed} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_filterfan_speed VALUE={filterfan_speed} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_sidefan_speed VALUE={sidefan_speed} # set a new idle_timeout value {% if idle_timeout > 0 %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=restore_idle_timeout VALUE={printer.configfile.settings.idle_timeout.timeout} SET_IDLE_TIMEOUT TIMEOUT={idle_timeout} {% endif %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=True M104 S0 M106 S0 M106 P2 S0 M106 P3 S0 SFS_DISABLE PAUSE_BASE {client.user_pause_macro|default("")} _TOOLHEAD_PARK_PAUSE_CANCEL {rawparams} [gcode_macro RESUME] description: Resume the actual running print rename_existing: RESUME_BASE variable_last_extruder_temp: 0 variable_last_extruder_restore: False variable_last_partfan_speed: 0 variable_last_filterfan_speed: 0 variable_last_sidefan_speed: 0 variable_restore_idle_timeout: 0 variable_idle_state: False gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} {% set sp_move = client.speed_move|default(velocity) %} {% set runout_resume = True if client.runout_sensor|default("") == "" # no runout else True if not printer[client.runout_sensor].enabled # sensor is disabled else printer[client.runout_sensor].filament_detected %} # sensor status {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder {% set do_resume = False %} {% set prompt_txt = [] %} ##### end of definitions ##### #### Printer comming from timeout idle state #### {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False {% if last_extruder_restore %} # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp) }' M109 S{last_extruder_temp} M106 S{last_partfan_speed * 255} M106 P2 S{last_sidefan_speed * 255} M106 P3 S{last_filterfan_speed * 255} {% set do_resume = True %} {% elif can_extrude %} {% set do_resume = True %} {% else %} RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} {% endif %} #### Printer comming out of regular PAUSE state #### {% elif can_extrude %} {% set do_resume = True %} {% else %} RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} {% endif %} {% if runout_resume %} {% if do_resume %} {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time {client.user_resume_macro|default("")} _CLIENT_EXTRUDE SFS_ENABLE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} {% endif %} {% else %} RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]}' {% set _d = prompt_txt.append("\"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]) %} {% endif %} ##### Generate User Information box in case of abort ##### {% if not (runout_resume and do_resume) %} RESPOND TYPE=command MSG="action:prompt_begin RESUME aborted !!!" {% for element in prompt_txt %} RESPOND TYPE=command MSG='{"action:prompt_text %s" % element}' {% endfor %} RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end|info" RESPOND TYPE=command MSG="action:prompt_show" {% endif %} Merci encore pour l'aide 1
fran6p Posté(e) Mai 8 Posté(e) Mai 8 il y a 23 minutes, pommeverte a dit : voire le klippy.log C'est habituellement le plus simple car il contient toute la configuration (printer.cfg + inclusions) 1
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant