diff options
Diffstat (limited to 'klippy/extras/sht3x.py')
-rw-r--r-- | klippy/extras/sht3x.py | 108 |
1 files changed, 54 insertions, 54 deletions
diff --git a/klippy/extras/sht3x.py b/klippy/extras/sht3x.py index c76ceb76..d6acd987 100644 --- a/klippy/extras/sht3x.py +++ b/klippy/extras/sht3x.py @@ -15,55 +15,57 @@ from . import bus SHT3X_I2C_ADDR = 0x44 SHT3X_CMD = { - 'MEASURE': { - 'STRETCH_ENABLED': { - 'HIGH_REP': [0x2c, 0x06], # High (15ms) repeatability measurement - 'MED_REP': [0x2c, 0x0D], # Medium (6ms) repeatability measurement - 'LOW_REP': [0x2c, 0x10], # Low (4ms) repeatability measurement + "MEASURE": { + "STRETCH_ENABLED": { + "HIGH_REP": [0x2C, 0x06], # High (15ms) repeatability measurement + "MED_REP": [0x2C, 0x0D], # Medium (6ms) repeatability measurement + "LOW_REP": [0x2C, 0x10], # Low (4ms) repeatability measurement }, - 'STRETCH_DISABLED' : { - 'HIGH_REP': [0x24, 0x00], - 'MED_REP': [0x24, 0x0B], - 'LOW_REP': [0x24, 0x16], + "STRETCH_DISABLED": { + "HIGH_REP": [0x24, 0x00], + "MED_REP": [0x24, 0x0B], + "LOW_REP": [0x24, 0x16], }, }, - 'PERIODIC': { - '2HZ': { - 'HIGH_REP': [0x22, 0x36], - 'MED_REP': [0x22, 0x20], - 'LOW_REP': [0x22, 0x2B], + "PERIODIC": { + "2HZ": { + "HIGH_REP": [0x22, 0x36], + "MED_REP": [0x22, 0x20], + "LOW_REP": [0x22, 0x2B], }, }, - 'OTHER': { - 'STATUS': { - 'READ': [0xF3, 0x2D], - 'CLEAN': [0x30, 0x41], + "OTHER": { + "STATUS": { + "READ": [0xF3, 0x2D], + "CLEAN": [0x30, 0x41], }, - 'SOFTRESET': [0x30, 0xA2], # Soft reset - 'HEATER': { + "SOFTRESET": [0x30, 0xA2], # Soft reset + "HEATER": { "ENABLE": [0x30, 0x6D], "DISABLE": [0x30, 0x66], }, - 'FETCH': [0xE0, 0x00], - 'BREAK': [0x30, 0x93], - } + "FETCH": [0xE0, 0x00], + "BREAK": [0x30, 0x93], + }, } + class SHT3X: def __init__(self, config): self.printer = config.get_printer() self.name = config.get_name().split()[-1] self.reactor = self.printer.get_reactor() self.i2c = bus.MCU_I2C_from_config( - config, default_addr=SHT3X_I2C_ADDR, default_speed=100000) + config, default_addr=SHT3X_I2C_ADDR, default_speed=100000 + ) self._error = self.i2c.get_mcu().error - self.report_time = config.getint('sht3x_report_time', 1, minval=1) - self.deviceId = config.get('sensor_type') - self.temp = self.min_temp = self.max_temp = self.humidity = 0. + self.report_time = config.getint("sht3x_report_time", 1, minval=1) + self.deviceId = config.get("sensor_type") + self.temp = self.min_temp = self.max_temp = self.humidity = 0.0 self.sample_timer = self.reactor.register_timer(self._sample_sht3x) self.printer.add_object("sht3x " + self.name, self) - self.printer.register_event_handler("klippy:connect", - self.handle_connect) + self.printer.register_event_handler("klippy:connect", self.handle_connect) + def handle_connect(self): self._init_sht3x() self.reactor.update_timer(self.sample_timer, self.reactor.NOW) @@ -80,15 +82,15 @@ class SHT3X: def _init_sht3x(self): # Device Soft Reset - self.i2c.i2c_write_wait_ack(SHT3X_CMD['OTHER']['BREAK']) + self.i2c.i2c_write_wait_ack(SHT3X_CMD["OTHER"]["BREAK"]) # Break takes ~ 1ms - self.reactor.pause(self.reactor.monotonic() + .0015) - self.i2c.i2c_write_wait_ack(SHT3X_CMD['OTHER']['SOFTRESET']) + self.reactor.pause(self.reactor.monotonic() + 0.0015) + self.i2c.i2c_write_wait_ack(SHT3X_CMD["OTHER"]["SOFTRESET"]) # Wait <=1.5ms after reset - self.reactor.pause(self.reactor.monotonic() + .0015) + self.reactor.pause(self.reactor.monotonic() + 0.0015) - status = self.i2c.i2c_read(SHT3X_CMD['OTHER']['STATUS']['READ'], 3) - response = bytearray(status['response']) + status = self.i2c.i2c_read(SHT3X_CMD["OTHER"]["STATUS"]["READ"], 3) + response = bytearray(status["response"]) status = response[0] << 8 status |= response[1] checksum = response[2] @@ -97,11 +99,9 @@ class SHT3X: logging.warning("sht3x: Reading status - checksum error!") # Enable periodic mode - self.i2c.i2c_write_wait_ack( - SHT3X_CMD['PERIODIC']['2HZ']['HIGH_REP'] - ) + self.i2c.i2c_write_wait_ack(SHT3X_CMD["PERIODIC"]["2HZ"]["HIGH_REP"]) # Wait <=15.5ms for first measurement - self.reactor.pause(self.reactor.monotonic() + .0155) + self.reactor.pause(self.reactor.monotonic() + 0.0155) def _sample_sht3x(self, eventtime): try: @@ -112,27 +112,25 @@ class SHT3X: while retries > 0 and params is None: try: params = self.i2c.i2c_read( - SHT3X_CMD['OTHER']['FETCH'], 6, retry=False + SHT3X_CMD["OTHER"]["FETCH"], 6, retry=False ) except self._error as e: error = e - self.reactor.pause(self.reactor.monotonic() + .5) + self.reactor.pause(self.reactor.monotonic() + 0.5) retries -= 1 if params is None: raise error - response = bytearray(params['response']) - rtemp = response[0] << 8 + response = bytearray(params["response"]) + rtemp = response[0] << 8 rtemp |= response[1] if self._crc8(rtemp) != response[2]: - logging.warning( - "sht3x: Checksum error on Temperature reading!" - ) + logging.warning("sht3x: Checksum error on Temperature reading!") else: self.temp = -45 + (175 * rtemp / 65535) logging.debug("sht3x: Temperature %.2f " % self.temp) - rhumid = response[3] << 8 + rhumid = response[3] << 8 rhumid |= response[4] if self._crc8(rhumid) != response[5]: logging.warning("sht3x: Checksum error on Humidity reading!") @@ -142,13 +140,14 @@ class SHT3X: except Exception: logging.exception("sht3x: Error reading data") - self.temp = self.humidity = .0 + self.temp = self.humidity = 0.0 return self.reactor.NEVER if self.temp < self.min_temp or self.temp > self.max_temp: self.printer.invoke_shutdown( "sht3x: temperature %0.1f outside range of %0.1f:%.01f" - % (self.temp, self.min_temp, self.max_temp)) + % (self.temp, self.min_temp, self.max_temp) + ) measured_time = self.reactor.monotonic() print_time = self.i2c.get_mcu().estimated_print_time(measured_time) @@ -158,13 +157,13 @@ class SHT3X: def _split_bytes(self, data): bytes = [] for i in range((data.bit_length() + 7) // 8): - bytes.append((data >> i*8) & 0xFF) + bytes.append((data >> i * 8) & 0xFF) bytes.reverse() return bytes def _crc8(self, data): - #crc8 polynomial for 16bit value, CRC8 -> x^8 + x^5 + x^4 + 1 - SHT3X_CRC8_POLYNOMINAL= 0x31 + # crc8 polynomial for 16bit value, CRC8 -> x^8 + x^5 + x^4 + 1 + SHT3X_CRC8_POLYNOMINAL = 0x31 crc = 0xFF data_bytes = self._split_bytes(data) for byte in data_bytes: @@ -178,10 +177,11 @@ class SHT3X: def get_status(self, eventtime): return { - 'temperature': round(self.temp, 2), - 'humidity': round(self.humidity, 1), + "temperature": round(self.temp, 2), + "humidity": round(self.humidity, 1), } + def load_config(config): # Register sensor pheater = config.get_printer().lookup_object("heaters") |