From 960cf5b300784d26b170cd649a75a0239b1d8309 Mon Sep 17 00:00:00 2001 From: Charles Miller Date: Mon, 20 Apr 2020 15:12:39 +0100 Subject: [PATCH 1/3] Add AM2320.py Adds support and UI options for the AM2320 i2c sensor --- octoprint_enclosure/AM2320.py | 84 +++++++++++++++++++ octoprint_enclosure/__init__.py | 23 +++++ octoprint_enclosure/static/js/enclosure.js | 2 +- .../templates/enclosure_settings.jinja2 | 5 +- 4 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 octoprint_enclosure/AM2320.py diff --git a/octoprint_enclosure/AM2320.py b/octoprint_enclosure/AM2320.py new file mode 100644 index 0000000..67eff87 --- /dev/null +++ b/octoprint_enclosure/AM2320.py @@ -0,0 +1,84 @@ +import smbus +import time + +try: + import struct +except ImportError: + import ustruct as struct + +class AM2320Exception(Exception): + """ Base class for exception """ + +class AM2320DeviceNotFound(AM2320Exception, ValueError): + """ Device not found """ + +class AM2320ReadError(AM2320Exception, RuntimeError): + """ Read error or CRC mismatch """ + +def _crc16(data): + crc = 0xFFFF + for byte in data: + crc ^= byte + for _ in range(8): + if crc & 0x0001: + crc >>= 1 + crc ^= 0xA001 + else: + crc >>= 1 + return crc + + +sensor = smbus.SMBus(1) + +def getTemp(bus): + for _ in range(3): + try: + bus.write_byte(0x5C, 0x00) + except: + pass + #raise AM2320DeviceNotFound("Sensor not found") + + bus.write_i2c_block_data(0x5C, 0x03, [0x02, 2]) + time.sleep(0.001) + result = bytearray(bus.read_i2c_block_data(0x5C, 0x00, 6)) + if result[0] != 0x3 or result[1] != 2: + raise AM2320ReadError("Command does not match returned data") + temp = struct.unpack(">H", result[2:-2])[0] + crc1 = struct.unpack("= 32768: + temp = 32768 - temp + return (temp / 10.0) + +def getHumi(bus): + for _ in range(3): + try: + bus.write_byte(0x5C, 0x00) + except: + pass + + bus.write_i2c_block_data(0x5C, 0x03, [0x00, 2]) + time.sleep(0.001) + result = bytearray(bus.read_i2c_block_data(0x5C, 0x00, 6)) + if result[0] != 0x3 or result[1] != 2: + raise AM2320ReadError("Command does not match returned data") + humi = struct.unpack(">H", result[2:-2])[0] + crc1 = struct.unpack("= 0){ + if (['11', '22', '2302', 'bme280', 'am2320', 'si7021'].indexOf(sensor) >= 0){ return true; } return false; diff --git a/octoprint_enclosure/templates/enclosure_settings.jinja2 b/octoprint_enclosure/templates/enclosure_settings.jinja2 index 29bdc5f..45a2b8a 100644 --- a/octoprint_enclosure/templates/enclosure_settings.jinja2 +++ b/octoprint_enclosure/templates/enclosure_settings.jinja2 @@ -536,6 +536,7 @@ + @@ -563,7 +564,7 @@ - +
@@ -605,7 +606,7 @@
- +
From cf3934c2feaa5e66b4a0ef4492bcb4853df57f60 Mon Sep 17 00:00:00 2001 From: Charles Miller Date: Mon, 20 Apr 2020 15:14:53 +0100 Subject: [PATCH 2/3] formatting: AM2320.py --- octoprint_enclosure/AM2320.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/octoprint_enclosure/AM2320.py b/octoprint_enclosure/AM2320.py index 67eff87..245bf01 100644 --- a/octoprint_enclosure/AM2320.py +++ b/octoprint_enclosure/AM2320.py @@ -81,4 +81,4 @@ def main(): print('-1 | -1') if __name__ == "__main__": - main() \ No newline at end of file + main() From 72faf58dfa7688981842cb7a5f5471a7ce6e9a25 Mon Sep 17 00:00:00 2001 From: Charles Miller Date: Mon, 20 Apr 2020 15:17:57 +0100 Subject: [PATCH 3/3] update AM2320.py --- octoprint_enclosure/AM2320.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/octoprint_enclosure/AM2320.py b/octoprint_enclosure/AM2320.py index 245bf01..d55811e 100644 --- a/octoprint_enclosure/AM2320.py +++ b/octoprint_enclosure/AM2320.py @@ -36,7 +36,6 @@ def getTemp(bus): bus.write_byte(0x5C, 0x00) except: pass - #raise AM2320DeviceNotFound("Sensor not found") bus.write_i2c_block_data(0x5C, 0x03, [0x02, 2]) time.sleep(0.001) @@ -69,7 +68,6 @@ def getHumi(bus): crc2 = _crc16(result[0:-2]) if crc1 != crc2: raise AM2320ReadError("CRC Mismatch") - return return (humi / 10.0) def main():