aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras/temperature_host.py
diff options
context:
space:
mode:
Diffstat (limited to 'klippy/extras/temperature_host.py')
-rw-r--r--klippy/extras/temperature_host.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/klippy/extras/temperature_host.py b/klippy/extras/temperature_host.py
new file mode 100644
index 00000000..98f29a87
--- /dev/null
+++ b/klippy/extras/temperature_host.py
@@ -0,0 +1,82 @@
+# Support for Raspberry Pi temperature sensor
+#
+# Copyright (C) 2020 Al Crate <al3ph@users.noreply.github.com>
+#
+# This file may be distributed under the terms of the GNU GPLv3 license.
+
+import logging
+
+HOST_REPORT_TIME = 1.0
+RPI_PROC_TEMP_FILE = "/sys/class/thermal/thermal_zone0/temp"
+
+class Temperature_HOST:
+ def __init__(self, config):
+ self.printer = config.get_printer()
+ self.reactor = self.printer.get_reactor()
+ self.name = config.get_name().split()[-1]
+ self.path = config.get("path", RPI_PROC_TEMP_FILE)
+
+ self.temp = self.min_temp = self.max_temp = 0.0
+
+ self.printer.add_object("rpi_temperature " + self.name, self) # XXX
+ self.printer.add_object("temperature_host " + self.name, self)
+ if self.printer.get_start_args().get('debugoutput') is not None:
+ return
+ self.sample_timer = self.reactor.register_timer(
+ self._sample_pi_temperature)
+ try:
+ self.file_handle = open(self.path, "r")
+ except:
+ raise config.error("Unable to open temperature file '%s'"
+ % (self.path,))
+
+ self.printer.register_event_handler("klippy:connect",
+ self.handle_connect)
+
+ def handle_connect(self):
+ self.reactor.update_timer(self.sample_timer, self.reactor.NOW)
+
+ def setup_minmax(self, min_temp, max_temp):
+ self.min_temp = min_temp
+ self.max_temp = max_temp
+
+ def setup_callback(self, cb):
+ self._callback = cb
+
+ def get_report_time_delta(self):
+ return HOST_REPORT_TIME
+
+ def _sample_pi_temperature(self, eventtime):
+ try:
+ self.file_handle.seek(0)
+ self.temp = float(self.file_handle.read())/1000.0
+ except Exception:
+ logging.exception("temperature_host: Error reading data")
+ self.temp = 0.0
+ return self.reactor.NEVER
+
+ if self.temp < self.min_temp:
+ self.printer.invoke_shutdown(
+ "HOST temperature %0.1f below minimum temperature of %0.1f."
+ % (self.temp, self.min_temp,))
+ if self.temp > self.max_temp:
+ self.printer.invoke_shutdown(
+ "HOST temperature %0.1f above maximum temperature of %0.1f."
+ % (self.temp, self.max_temp,))
+
+ mcu = self.printer.lookup_object('mcu')
+ measured_time = self.reactor.monotonic()
+ self._callback(mcu.estimated_print_time(measured_time), self.temp)
+ return measured_time + HOST_REPORT_TIME
+
+ def get_status(self, eventtime):
+ return {
+ 'temperature': self.temp,
+ }
+
+
+def load_config(config):
+ # Register sensor
+ pheaters = config.get_printer().load_object(config, "heaters")
+ pheaters.add_sensor_factory("temperature_host", Temperature_HOST)
+ pheaters.add_sensor_factory("rpi_temperature", Temperature_HOST) # XXX