Browse Source

fix: add power adv parser for 1pm (#380)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: J. Nick Koston <nick+github@koston.org>
Retha Runolfsson 2 months ago
parent
commit
645ff8f65f
3 changed files with 27 additions and 1 deletions
  1. 2 1
      switchbot/adv_parser.py
  2. 17 0
      switchbot/adv_parsers/relay_switch.py
  3. 8 0
      tests/test_adv_parser.py

+ 2 - 1
switchbot/adv_parser.py

@@ -36,6 +36,7 @@ from .adv_parsers.motion import process_wopresence
 from .adv_parsers.plug import process_woplugmini
 from .adv_parsers.plug import process_woplugmini
 from .adv_parsers.relay_switch import (
 from .adv_parsers.relay_switch import (
     process_garage_door_opener,
     process_garage_door_opener,
+    process_relay_switch_1pm,
     process_relay_switch_2pm,
     process_relay_switch_2pm,
     process_relay_switch_common_data,
     process_relay_switch_common_data,
 )
 )
@@ -213,7 +214,7 @@ SUPPORTED_TYPES: dict[str | bytes, SwitchbotSupportedType] = {
     "<": {
     "<": {
         "modelName": SwitchbotModel.RELAY_SWITCH_1PM,
         "modelName": SwitchbotModel.RELAY_SWITCH_1PM,
         "modelFriendlyName": "Relay Switch 1PM",
         "modelFriendlyName": "Relay Switch 1PM",
-        "func": process_relay_switch_common_data,
+        "func": process_relay_switch_1pm,
         "manufacturer_id": 2409,
         "manufacturer_id": 2409,
     },
     },
     ";": {
     ";": {

+ 17 - 0
switchbot/adv_parsers/relay_switch.py

@@ -4,6 +4,8 @@ from __future__ import annotations
 
 
 from typing import Any
 from typing import Any
 
 
+from ..helpers import parse_power_data
+
 
 
 def process_relay_switch_common_data(
 def process_relay_switch_common_data(
     data: bytes | None, mfr_data: bytes | None
     data: bytes | None, mfr_data: bytes | None
@@ -18,6 +20,18 @@ def process_relay_switch_common_data(
     }
     }
 
 
 
 
+def process_relay_switch_1pm(
+    data: bytes | None, mfr_data: bytes | None
+) -> dict[str, Any]:
+    """Process Relay Switch 1PM services data."""
+    if mfr_data is None:
+        return {}
+
+    common_data = process_relay_switch_common_data(data, mfr_data)
+    common_data["power"] = parse_power_data(mfr_data, 10)
+    return common_data
+
+
 def process_garage_door_opener(
 def process_garage_door_opener(
     data: bytes | None, mfr_data: bytes | None
     data: bytes | None, mfr_data: bytes | None
 ) -> dict[str, Any]:
 ) -> dict[str, Any]:
@@ -39,10 +53,13 @@ def process_relay_switch_2pm(
     return {
     return {
         1: {
         1: {
             **process_relay_switch_common_data(data, mfr_data),
             **process_relay_switch_common_data(data, mfr_data),
+            "power": parse_power_data(mfr_data, 10),
         },
         },
         2: {
         2: {
             "switchMode": True,  # for compatibility, useless
             "switchMode": True,  # for compatibility, useless
             "sequence_number": mfr_data[6],
             "sequence_number": mfr_data[6],
             "isOn": bool(mfr_data[7] & 0b01000000),
             "isOn": bool(mfr_data[7] & 0b01000000),
+            "power": parse_power_data(mfr_data, 12),
         },
         },
+        "sequence_number": mfr_data[6],
     }
     }

+ 8 - 0
tests/test_adv_parser.py

@@ -3236,12 +3236,15 @@ def test_humidifer_with_empty_data() -> None:
                     "isOn": True,
                     "isOn": True,
                     "sequence_number": 138,
                     "sequence_number": 138,
                     "switchMode": True,
                     "switchMode": True,
+                    "power": 0.0,
                 },
                 },
                 2: {
                 2: {
                     "isOn": True,
                     "isOn": True,
                     "sequence_number": 138,
                     "sequence_number": 138,
                     "switchMode": True,
                     "switchMode": True,
+                    "power": 70.0,
                 },
                 },
+                "sequence_number": 138,
             },
             },
             "=",
             "=",
             "Relay Switch 2PM",
             "Relay Switch 2PM",
@@ -3266,6 +3269,7 @@ def test_humidifer_with_empty_data() -> None:
                 "isOn": True,
                 "isOn": True,
                 "sequence_number": 71,
                 "sequence_number": 71,
                 "switchMode": True,
                 "switchMode": True,
+                "power": 49.0,
             },
             },
             "<",
             "<",
             "Relay Switch 1PM",
             "Relay Switch 1PM",
@@ -3400,12 +3404,15 @@ def test_adv_active(test_case: AdvTestCase) -> None:
                     "isOn": True,
                     "isOn": True,
                     "sequence_number": 138,
                     "sequence_number": 138,
                     "switchMode": True,
                     "switchMode": True,
+                    "power": 0.0,
                 },
                 },
                 2: {
                 2: {
                     "isOn": True,
                     "isOn": True,
                     "sequence_number": 138,
                     "sequence_number": 138,
                     "switchMode": True,
                     "switchMode": True,
+                    "power": 70.0,
                 },
                 },
+                "sequence_number": 138,
             },
             },
             "=",
             "=",
             "Relay Switch 2PM",
             "Relay Switch 2PM",
@@ -3430,6 +3437,7 @@ def test_adv_active(test_case: AdvTestCase) -> None:
                 "isOn": True,
                 "isOn": True,
                 "sequence_number": 71,
                 "sequence_number": 71,
                 "switchMode": True,
                 "switchMode": True,
+                "power": 49.0,
             },
             },
             "<",
             "<",
             "Relay Switch 1PM",
             "Relay Switch 1PM",