Browse Source

Update the sensor data processing logic

zerzhang 3 weeks ago
parent
commit
a424a32813
2 changed files with 16 additions and 9 deletions
  1. 14 7
      switchbot/devices/relay_switch.py
  2. 2 2
      tests/test_relay_switch.py

+ 14 - 7
switchbot/devices/relay_switch.py

@@ -94,13 +94,20 @@ class SwitchbotRelaySwitch(SwitchbotSequenceDevice, SwitchbotEncryptedDevice):
 
 
     def _parse_user_data(self, raw_data: bytes) -> dict[str, Any]:
     def _parse_user_data(self, raw_data: bytes) -> dict[str, Any]:
         """Parse user-specific data from raw bytes."""
         """Parse user-specific data from raw bytes."""
+        _energy = int.from_bytes(raw_data[1:4], "big") / 60000
+        _energy_usage_yesterday = int.from_bytes(raw_data[4:7], "big") / 60000
+        _use_time = int.from_bytes(raw_data[7:9], "big") / 60.0
+        _voltage = int.from_bytes(raw_data[9:11], "big") / 10.0
+        _current = int.from_bytes(raw_data[11:13], "big") / 1000.0
+        _power = int.from_bytes(raw_data[13:15], "big") / 10.0
+
         return {
         return {
-            "energy": round(int.from_bytes(raw_data[1:4], "big") / 60000, 2),
-            "energy usage yesterday": round(int.from_bytes(raw_data[4:7], "big") / 60000, 2),
-            "use_time": round(int.from_bytes(raw_data[7:9], "big") / 60, 2),
-            "voltage": int.from_bytes(raw_data[9:11], "big") / 10.0,
-            "current": int.from_bytes(raw_data[11:13], "big"),
-            "power": int.from_bytes(raw_data[13:15], "big") / 10.0,
+            "energy": 0.01 if 0 < _energy <= 0.01 else round(_energy, 2),
+            "energy usage yesterday": 0.01 if 0 < _energy_usage_yesterday <= 0.01 else round(_energy_usage_yesterday, 2),
+            "use_time": round(_use_time, 1),
+            "voltage": 0.1 if 0 < _voltage <= 0.1 else round(_voltage),
+            "current": 0.1 if 0 < _current <= 0.1 else round(_current, 1),
+            "power": 0.1 if 0 < _power <= 0.1 else round(_power, 1),
         }
         }
 
 
     def update_from_advertisement(self, advertisement: SwitchBotAdvertisement) -> None:
     def update_from_advertisement(self, advertisement: SwitchBotAdvertisement) -> None:
@@ -157,7 +164,7 @@ class SwitchbotRelaySwitch(SwitchbotSequenceDevice, SwitchbotEncryptedDevice):
         if not common_data["isOn"]:
         if not common_data["isOn"]:
             self._reset_power_data(user_data)
             self._reset_power_data(user_data)
 
 
-        garage_door_opener_data = {"door_open": not bool(_data[7] & 0b00100000)}
+        garage_door_opener_data = {"door_open": not bool(_data[2] & 0b00100000)}
 
 
         _LOGGER.debug("common_data: %s, user_data: %s", common_data, user_data)
         _LOGGER.debug("common_data: %s, user_data: %s", common_data, user_data)
 
 

+ 2 - 2
tests/test_relay_switch.py

@@ -185,7 +185,7 @@ async def test_get_switch_mode_2PM(common_parametrize_2pm):
                 "channel1_info": b'\x01\x00\x00\x00\x00\x00\x00\x02\x99\x00\xe9\x00\x03\x00\x00',
                 "channel1_info": b'\x01\x00\x00\x00\x00\x00\x00\x02\x99\x00\xe9\x00\x03\x00\x00',
                 "channel2_info": b"\x01\x00\x055\x00'<\x02\x9f\x00\xe9\x01,\x00F",
                 "channel2_info": b"\x01\x00\x055\x00'<\x02\x9f\x00\xe9\x01,\x00F",
             },
             },
-            [False, 0, 0, 0, 0, True, 0.02, 23.3, 300, 7.0],
+            [False, 0, 0, 0, 0, True, 0.02, 23, 0.3, 7.0],
         ),
         ),
         (
         (
             {
             {
@@ -193,7 +193,7 @@ async def test_get_switch_mode_2PM(common_parametrize_2pm):
                 "channel1_info": b'\x01\x00\x00\x00\x00\x00\x00\x02\x99\x00\xe9\x00\x03\x00\x00',
                 "channel1_info": b'\x01\x00\x00\x00\x00\x00\x00\x02\x99\x00\xe9\x00\x03\x00\x00',
                 "channel2_info": b"\x01\x00\x05\xbc\x00'<\x02\xb1\x00\xea\x01-\x00F",
                 "channel2_info": b"\x01\x00\x05\xbc\x00'<\x02\xb1\x00\xea\x01-\x00F",
             },
             },
-            [True, 0, 23.3, 3, 0.0, False, 0.02, 0, 0, 0],
+            [True, 0, 23, 0.1, 0.0, False, 0.02, 0, 0, 0],
         )
         )
     ],
     ],
 )
 )