aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl <aleph@al3ph.org>2020-12-03 17:35:37 +0000
committerGitHub <noreply@github.com>2020-12-03 12:35:37 -0500
commitb911db4c0de10245fd008a6a236d6af23b93e8fe (patch)
treee961be2b455814699810d5306203a6bcd7608a49
parenta1ae54876662e097094f4434a69eca79cb5af9ae (diff)
downloadkutter-b911db4c0de10245fd008a6a236d6af23b93e8fe.tar.gz
kutter-b911db4c0de10245fd008a6a236d6af23b93e8fe.tar.xz
kutter-b911db4c0de10245fd008a6a236d6af23b93e8fe.zip
rpi_temperature: New module to monitor RPi temperature (#3587)
Module to monitor RPi cpu temperature Signed-off-by: Al Crate <aleph@al3ph.org>
-rw-r--r--docs/Command_Templates.md2
-rw-r--r--docs/Config_Reference.md21
-rw-r--r--klippy/extras/heaters.py2
-rw-r--r--klippy/extras/rpi_temperature.py88
4 files changed, 112 insertions, 1 deletions
diff --git a/docs/Command_Templates.md b/docs/Command_Templates.md
index 37e59fb8..e577decb 100644
--- a/docs/Command_Templates.md
+++ b/docs/Command_Templates.md
@@ -256,6 +256,8 @@ The following are common printer attributes:
from the sensor.
- `printer["lm75 <sensor_name>"].temperature`: The last read
temperature from the sensor.
+- `printer["rpi_temperature <sensor_name>"].temperature`: The last read
+ temperature from the sensor.
- `printer["temperature_sensor <config_name>"].temperature`: The last read
temperature from the sensor.
- `printer["temperature_sensor <config_name>"].measured_min_temp`,
diff --git a/docs/Config_Reference.md b/docs/Config_Reference.md
index 5b0a8b54..cb9e3a6e 100644
--- a/docs/Config_Reference.md
+++ b/docs/Config_Reference.md
@@ -2058,6 +2058,27 @@ but this mode is not used here.
# 0.5.
```
+## RPi temperature sensor
+
+CPU temperature from Raspberry Pi.
+
+```
+#[temperature_sensor my_sensor]
+# See the "temperature_sensor" section for a description of its
+# parameters. The parameters below describe the Raspberry Pi sensor
+# parameters.
+#sensor_type:
+# Must be "rpi_temperature".
+min_temp: -40
+max_temp: 85
+# The maximum safe range of temperatures (in Celsius) that the
+# RPi must remain within. This controls a safety feature
+# implemented in the micro-controller code - should the measured
+# temperature ever fall outside this range then the micro-controller
+# will go into a shutdown state. Set this range just wide
+# enough so that reasonable temperatures do not result in an error.
+```
+
## [heater_generic]
Generic heaters (one may define any number of sections with a
diff --git a/klippy/extras/heaters.py b/klippy/extras/heaters.py
index 59172090..d549a61d 100644
--- a/klippy/extras/heaters.py
+++ b/klippy/extras/heaters.py
@@ -263,7 +263,7 @@ class PrinterHeaters:
return self.heaters[heater_name]
def setup_sensor(self, config):
modules = ["thermistor", "adc_temperature", "spi_temperature",
- "bme280", "htu21d", "lm75"]
+ "bme280", "htu21d", "lm75", "rpi_temperature"]
for module_name in modules:
self.printer.load_object(config, module_name)
sensor_type = config.get('sensor_type')
diff --git a/klippy/extras/rpi_temperature.py b/klippy/extras/rpi_temperature.py
new file mode 100644
index 00000000..c741d51d
--- /dev/null
+++ b/klippy/extras/rpi_temperature.py
@@ -0,0 +1,88 @@
+# 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
+
+RPI_REPORT_TIME = 1.0
+KELVIN_TO_CELSIUS = -273.15
+PROC_TEMP_FILE = "/sys/class/thermal/thermal_zone0/temp"
+
+class RPiTemperature:
+ def __init__(self, config):
+ self.printer = config.get_printer()
+ self.reactor = self.printer.get_reactor()
+ self.name = config.get_name().split()[-1]
+
+ self.temp = 0.0
+ self.file_handle = None
+
+ self.min_temp = config.getfloat('min_temp', -40,
+ minval=KELVIN_TO_CELSIUS)
+ self.max_temp = config.getfloat('max_temp', 85,
+ above=self.min_temp)
+
+ self.printer.add_object("rpi_temperature " + self.name, self)
+ self.sample_timer = self.reactor.register_timer(
+ self._sample_pi_temperature
+ )
+ try:
+ self.file_handle = open(PROC_TEMP_FILE, "r")
+ except:
+ raise config.error(
+ "Unable to open temperature file '%s'" % (PROC_TEMP_FILE)
+ )
+
+ 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):
+ pass
+
+ def setup_callback(self, cb):
+ self._callback = cb
+
+ 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("rpi_temperature: Error reading data")
+ self.temp = 0.0
+ return self.reactor.NEVER
+
+ if self.temp < self.min_temp:
+ self.printer.invoke_shutdown(
+ "RPi temperature %0.1f below minimum"
+ " temperature of %0.1f." % (self.temp, self.min_temp,)
+ )
+ if self.temp > self.max_temp:
+ self.printer.invoke_shutdown(
+ "RPi temperature %0.1f above maximum"
+ " temperature of %0.1f." % (self.temp, self.max_temp,)
+ )
+
+ measured_time = self.reactor.monotonic()
+ self._callback(measured_time, self.temp)
+ return measured_time + RPI_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(
+ "rpi_temperature", RPiTemperature
+ )