temperature: Support specific preheat items close #428

This commit is contained in:
alfrix 2022-07-27 16:22:58 -03:00 committed by Alfredo Monclus
parent af158a4279
commit e8e4555d46
3 changed files with 65 additions and 65 deletions

View File

@ -108,14 +108,16 @@ use_dpms: True
## Preheat Options
```py
[preheat my_temp_setting]
# Temperature for the heated bed
bed: 40
# Temperature for the tools
extruder: 195
# Temperature for generic heaters
heater_generic: 40
# Temperature controlled fans (temperature_fan in klipper config)
extruder1: 60
heater_bed: 40
# Use the name
chamber: 60
# or the full name
heater_generic chamber: 60
# or for example apply the same temp to devices of the same type
temperature_fan: 40
heater_generic: 60
# optional GCode to run when the option is selected
gcode: MY_HEATSOAK_MACRO
```

View File

@ -309,9 +309,15 @@ class KlipperScreenConfig:
def get_preheat_options(self):
index = "preheat "
items = [i[len(index):] for i in self.config.sections() if i.startswith(index)]
return {item: self._build_preheat_item(index + item) for item in items}
def _build_preheat_item(self, name):
if name not in self.config:
return False
cfg = self.config[name]
return {opt: cfg.get("gcode", None) if opt == "gcode" else cfg.getint(opt, None) for opt in cfg}
def get_printer_config(self, name):
if not name.startswith("printer "):
name = f"printer {name}"
@ -425,15 +431,3 @@ class KlipperScreenConfig:
item["params"] = {}
return {name[(len(menu) + 6):]: item}
def _build_preheat_item(self, name):
if name not in self.config:
return False
cfg = self.config[name]
return {
"extruder": cfg.getint("extruder", None),
"bed": cfg.getint("bed", None),
"heater_generic": cfg.getint("heater_generic", None),
"temperature_fan": cfg.getint("temperature_fan", None),
"gcode": cfg.get("gcode", None)
}

View File

@ -1,5 +1,6 @@
import gi
import logging
import contextlib
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Pango
@ -199,65 +200,68 @@ class TemperaturePanel(ScreenPanel):
self.active_heaters.pop(self.active_heaters.index(device))
self.devices[device]['name'].get_style_context().remove_class("button_active")
self.devices[device]['select'].set_label(_("Select"))
logging.info(f"Deselecting {device}")
return
self.active_heaters.append(device)
self.devices[device]['name'].get_style_context().add_class("button_active")
self.devices[device]['select'].set_label(_("Deselect"))
logging.info(f"Seselecting {device}")
return
def set_temperature(self, widget, setting):
if len(self.active_heaters) == 0:
self._screen.show_popup_message(_("Nothing selected"))
else:
if setting == "cooldown":
for heater in self.active_heaters:
if heater.startswith('extruder'):
self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(heater), 0)
elif heater.startswith('heater_bed'):
self._screen._ws.klippy.set_bed_temp(0)
elif heater.startswith('heater_generic '):
self._screen._ws.klippy.set_heater_temp(" ".join(heater.split(" ")[1:]), 0)
logging.info(f"Setting {heater} to 0")
self._printer.set_dev_stat(heater, "target", 0)
else:
target = None
for heater in self.active_heaters:
max_temp = int(float(self._printer.get_config_section(heater)['max_temp']))
if heater.startswith('extruder'):
target = self.preheat_options[setting]["extruder"]
if target is not None and 0 <= target <= max_temp:
self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(heater), target)
elif heater.startswith('heater_bed'):
target = self.preheat_options[setting]["bed"]
if target is not None and 0 <= target <= max_temp:
self._screen._ws.klippy.set_bed_temp(target)
elif heater.startswith('heater_generic '):
target = self.preheat_options[setting]["heater_generic"]
if target is not None and 0 <= target <= max_temp:
self._screen._ws.klippy.set_heater_temp(" ".join(heater.split(" ")[1:]), target)
elif heater.startswith('temperature_fan '):
target = self.preheat_options[setting]["temperature_fan"]
if target is not None and 0 <= target <= max_temp:
self._screen._ws.klippy.set_temp_fan_temp(" ".join(heater.split(" ")[1:]), target)
else:
logging.info(f"Unknown heater: {heater}")
self._screen.show_popup_message(_("Unknown Heater") + " " + heater)
target = 0 if setting == "cooldown" else None
for heater in self.active_heaters:
max_temp = float(self._printer.get_config_section(heater)['max_temp'])
name = heater.split()[1] if len(heater.split()) > 1 else heater
if target is None:
for i in self.preheat_options[setting]:
logging.info(f"{self.preheat_options[setting]}")
if i == name:
# Assign the specific target if available
target = self.preheat_options[setting][name]
elif i == heater:
target = self.preheat_options[setting][heater]
if heater.startswith('extruder'):
if self.validate(heater, target, max_temp):
self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(heater), target)
elif heater.startswith('heater_bed'):
if target is None:
continue
if target <= max_temp:
if target >= 0:
self._printer.set_dev_stat(heater, "target", target)
logging.info(f"Setting {heater} to {target}")
else:
self._screen.show_popup_message(_("Can't set above the maximum:") + f' {max_temp}')
if setting in self.preheat_options and self.preheat_options[setting]['gcode']:
# This small delay is needed to properly update the target if the user configured something above
# and then changed the target again using preheat gcode
GLib.timeout_add(250, self.preheat_gcode, setting)
with contextlib.suppress(KeyError):
target = self.preheat_options[setting]["bed"]
if self.validate(heater, target, max_temp):
self._screen._ws.klippy.set_bed_temp(target)
elif heater.startswith('heater_generic '):
if target is None:
with contextlib.suppress(KeyError):
target = self.preheat_options[setting]["heater_generic"]
if self.validate(heater, target, max_temp):
self._screen._ws.klippy.set_heater_temp(name, target)
elif heater.startswith('temperature_fan '):
if target is None:
with contextlib.suppress(KeyError):
target = self.preheat_options[setting]["temperature_fan"]
if self.validate(heater, target, max_temp):
self._screen._ws.klippy.set_temp_fan_temp(name, target)
# This small delay is needed to properly update the target if the user configured something above
# and then changed the target again using preheat gcode
GLib.timeout_add(250, self.preheat_gcode, setting)
def validate(self, heater, target=None, max_temp=None):
if target is not None and max_temp is not None:
if 0 <= target <= max_temp:
self._printer.set_dev_stat(heater, "target", target)
return True
elif target > max_temp:
self._screen.show_popup_message(_("Can't set above the maximum:") + f' {max_temp}')
return False
return False
def preheat_gcode(self, setting):
self._screen._ws.klippy.gcode_script(self.preheat_options[setting]['gcode'])
with contextlib.suppress(KeyError):
self._screen._ws.klippy.gcode_script(self.preheat_options[setting]['gcode'])
return False
def add_device(self, device):