From 5c2300ecf33f7671f96daf20aeb3687b7175effc Mon Sep 17 00:00:00 2001 From: Peeter Normak Date: Tue, 22 Feb 2022 14:41:01 +0200 Subject: [PATCH] Add error, link error, panel lock and initialized attributes for devices --- maxcube/cube.py | 23 +++++++++++++++++++++-- maxcube/device.py | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/maxcube/cube.py b/maxcube/cube.py index 5734e92..19e833a 100644 --- a/maxcube/cube.py +++ b/maxcube/cube.py @@ -232,16 +232,19 @@ def parse_l_message(self, message): device_rf_address = self.parse_rf_address(data[pos + 1 : pos + 4]) device = self.device_by_rf(device_rf_address) + bits1, bits2 = struct.unpack("BB", bytearray(data[pos + 5 : pos + 7])) if device: - bits1, bits2 = struct.unpack("BB", bytearray(data[pos + 5 : pos + 7])) device.battery = self.resolve_device_battery(bits2) + device.link_error = self.resolve_device_link_error(bits2) + device.initialized = self.resolve_device_initialized(bits1) + device.error = self.resolve_device_error(bits1) # Thermostat or Wall Thermostat if device and (device.is_thermostat() or device.is_wallthermostat()): device.target_temperature = (data[pos + 8] & 0x7F) / 2.0 - bits1, bits2 = struct.unpack("BB", bytearray(data[pos + 5 : pos + 7])) device.mode = self.resolve_device_mode(bits2) + device.panel_locked = self.resolve_device_panel_locked(bits2) # Thermostat if device and device.is_thermostat(): @@ -365,10 +368,26 @@ def set_programmes_from_config(self, config_file): def resolve_device_mode(cls, bits): return bits & 3 + @classmethod + def resolve_device_panel_locked(cls, bits): + return 1 if bits & 0b00100000 else 0 + + @classmethod + def resolve_device_link_error(cls, bits): + return 1 if bits & 0b01000000 else 0 + @classmethod def resolve_device_battery(cls, bits): return bits >> 7 + @classmethod + def resolve_device_initialized(cls, bits): + return 1 if bits & 0b00000010 else 0 + + @classmethod + def resolve_device_error(cls, bits): + return 1 if bits & 0b00001000 else 0 + @classmethod def parse_rf_address(cls, address): return "".join("{:02X}".format(x) for x in address) diff --git a/maxcube/device.py b/maxcube/device.py index 4796eab..496696f 100644 --- a/maxcube/device.py +++ b/maxcube/device.py @@ -15,6 +15,18 @@ MAX_DEVICE_BATTERY_OK = 0 MAX_DEVICE_BATTERY_LOW = 1 +MAX_DEVICE_PANEL_UNLOCKED = 0 +MAX_DEVICE_PANEL_LOCKED = 1 + +MAX_DEVICE_LINK_STATUS_OK = 0 +MAX_DEVICE_LINK_STATUS_ERROR = 1 + +MAX_DEVICE_STATUS_NOT_INITIALIZED = 0 +MAX_DEVICE_STATUS_INITIALIZED = 1 + +MAX_DEVICE_ERROR_NO = 0 +MAX_DEVICE_ERROR_YES = 1 + MODE_NAMES = { MAX_DEVICE_MODE_AUTOMATIC: "auto", MAX_DEVICE_MODE_MANUAL: "manual", @@ -30,6 +42,10 @@ def __init__(self): self.room_id = None self.name = None self.serial = None + self.panel_locked = None + self.link_status = None + self.status_inited = None + self.error = None self.battery = None self.programme = None @@ -49,6 +65,14 @@ def describe(self, kind: str, *args: Tuple[str]): state = "".join("," + s for s in args if s) if self.battery == MAX_DEVICE_BATTERY_LOW: state = ",LOW_BATT" + state + if self.error == MAX_DEVICE_ERROR_YES: + state = ",ERROR" + state + if self.link_status == MAX_DEVICE_LINK_STATUS_ERROR: + state = ",LINK_ERROR" + state + if self.panel_locked == MAX_DEVICE_PANEL_LOCKED: + state = ",LOCKED" + state + if self.status_inited == MAX_DEVICE_STATUS_NOT_INITIALIZED: + state = ",NOT_INITIALIZED" + state return f"{kind} sn={self.serial},rf={self.rf_address},name={self.name}" + state def __str__(self):