Ver código fonte

chore(pre-commit.ci): auto fixes

pre-commit-ci[bot] 1 mês atrás
pai
commit
926f06992a

+ 1 - 2
switchbot/adv_parser.py

@@ -324,8 +324,7 @@ SUPPORTED_TYPES: dict[str | bytes, SwitchbotSupportedType] = {
         "modelFriendlyName": "Relay Switch 2PM",
         "func": process_relay_switch_2pm,
         "manufacturer_id": 2409,
-    }
-
+    },
 }
 
 _SWITCHBOT_MODEL_TO_CHAR = {

+ 11 - 7
switchbot/adv_parsers/relay_switch.py

@@ -5,7 +5,9 @@ from __future__ import annotations
 from typing import Any
 
 
-def process_relay_switch_common_data(data: bytes | None, mfr_data: bytes | None) -> dict[str, Any]:
+def process_relay_switch_common_data(
+    data: bytes | None, mfr_data: bytes | None
+) -> dict[str, Any]:
     """Process relay switch 1 and 1PM common data."""
     if mfr_data is None:
         return {}
@@ -15,7 +17,10 @@ def process_relay_switch_common_data(data: bytes | None, mfr_data: bytes | None)
         "isOn": bool(mfr_data[7] & 0b10000000),
     }
 
-def process_garage_door_opener(data: bytes | None, mfr_data: bytes | None) -> dict[str, Any]:
+
+def process_garage_door_opener(
+    data: bytes | None, mfr_data: bytes | None
+) -> dict[str, Any]:
     """Process garage door opener services data."""
     if mfr_data is None:
         return {}
@@ -23,7 +28,10 @@ def process_garage_door_opener(data: bytes | None, mfr_data: bytes | None) -> di
     common_data["door_open"] = not bool(mfr_data[7] & 0b00100000)
     return common_data
 
-def process_relay_switch_2pm(data: bytes | None, mfr_data: bytes | None) -> dict[int, dict[str, Any]]:
+
+def process_relay_switch_2pm(
+    data: bytes | None, mfr_data: bytes | None
+) -> dict[int, dict[str, Any]]:
     """Process Relay Switch 2PM services data."""
     if mfr_data is None:
         return {}
@@ -38,7 +46,3 @@ def process_relay_switch_2pm(data: bytes | None, mfr_data: bytes | None) -> dict
             "isOn": bool(mfr_data[7] & 0b01000000),
         },
     }
-
-
-
-

+ 4 - 4
switchbot/devices/device.py

@@ -587,11 +587,11 @@ class SwitchbotBaseDevice:
 
         return self._sb_adv_data
 
-    async def _get_basic_info(self, cmd: str = DEVICE_GET_BASIC_SETTINGS_KEY) -> bytes | None:
+    async def _get_basic_info(
+        self, cmd: str = DEVICE_GET_BASIC_SETTINGS_KEY
+    ) -> bytes | None:
         """Return basic info of device."""
-        _data = await self._send_command(
-            key=cmd, retry=self._retry_count
-        )
+        _data = await self._send_command(key=cmd, retry=self._retry_count)
 
         if _data in (b"\x07", b"\x00"):
             _LOGGER.error("Unsuccessful, please try again")

+ 41 - 13
switchbot/devices/relay_switch.py

@@ -103,7 +103,9 @@ class SwitchbotRelaySwitch(SwitchbotSequenceDevice, SwitchbotEncryptedDevice):
 
         return {
             "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),
+            "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),
@@ -133,7 +135,6 @@ class SwitchbotRelaySwitch(SwitchbotSequenceDevice, SwitchbotEncryptedDevice):
                     adv_data[i]["energy"] = self._get_adv_value("energy", i) or 0
         super().update_from_advertisement(advertisement)
 
-
     def get_current_time_and_start_time(self) -> int:
         """Get current time in seconds since epoch."""
         current_time = int(time.time())
@@ -145,19 +146,32 @@ class SwitchbotRelaySwitch(SwitchbotSequenceDevice, SwitchbotEncryptedDevice):
 
     async def get_basic_info(self) -> dict[str, Any] | None:
         """Get device basic settings."""
-        current_time_hex, current_day_start_time_hex = self.get_current_time_and_start_time()
+        current_time_hex, current_day_start_time_hex = (
+            self.get_current_time_and_start_time()
+        )
 
         if not (_data := await self._get_basic_info(COMMAND_GET_BASIC_INFO)):
             return None
-        if not (_channel1_data := await self._get_basic_info(COMMAND_GET_CHANNEL1_INFO.format(current_time_hex, current_day_start_time_hex))):
+        if not (
+            _channel1_data := await self._get_basic_info(
+                COMMAND_GET_CHANNEL1_INFO.format(
+                    current_time_hex, current_day_start_time_hex
+                )
+            )
+        ):
             return None
 
-        _LOGGER.debug("on-off hex: %s, channel1_hex_data: %s", _data.hex(), _channel1_data.hex())
+        _LOGGER.debug(
+            "on-off hex: %s, channel1_hex_data: %s", _data.hex(), _channel1_data.hex()
+        )
 
         common_data = self._parse_common_data(_data)
         user_data = self._parse_user_data(_channel1_data)
 
-        if self._model in (SwitchbotModel.RELAY_SWITCH_1, SwitchbotModel.GARAGE_DOOR_OPENER):
+        if self._model in (
+            SwitchbotModel.RELAY_SWITCH_1,
+            SwitchbotModel.GARAGE_DOOR_OPENER,
+        ):
             for key in ["voltage", "current", "power", "energy"]:
                 user_data.pop(key, None)
 
@@ -220,12 +234,18 @@ class SwitchbotRelaySwitch2PM(SwitchbotRelaySwitch):
         return data.get(channel, {})
 
     async def get_basic_info(self):
-        current_time_hex, current_day_start_time_hex = self.get_current_time_and_start_time()
+        current_time_hex, current_day_start_time_hex = (
+            self.get_current_time_and_start_time()
+        )
         if not (common_data := await super().get_basic_info()):
             return None
         if not (
-                _channel2_data := await self._get_basic_info(COMMAND_GET_CHANNEL2_INFO.format(current_time_hex, current_day_start_time_hex))
-            ):
+            _channel2_data := await self._get_basic_info(
+                COMMAND_GET_CHANNEL2_INFO.format(
+                    current_time_hex, current_day_start_time_hex
+                )
+            )
+        ):
             return None
 
         _LOGGER.debug("channel2_hex_data: %s", _channel2_data.hex())
@@ -236,25 +256,33 @@ class SwitchbotRelaySwitch2PM(SwitchbotRelaySwitch):
         if not channel2_data["isOn"]:
             self._reset_power_data(channel2_data)
 
-        _LOGGER.debug("channel1_data: %s, channel2_data: %s", common_data, channel2_data)
+        _LOGGER.debug(
+            "channel1_data: %s, channel2_data: %s", common_data, channel2_data
+        )
         return {1: common_data, 2: channel2_data}
 
     @update_after_operation
     async def turn_on(self, channel: int) -> bool:
         """Turn device on."""
-        result = await self._send_command(MULTI_CHANNEL_COMMANDS_TURN_ON[self._model][channel])
+        result = await self._send_command(
+            MULTI_CHANNEL_COMMANDS_TURN_ON[self._model][channel]
+        )
         return self._check_command_result(result, 0, {1})
 
     @update_after_operation
     async def turn_off(self, channel: int) -> bool:
         """Turn device off."""
-        result = await self._send_command(MULTI_CHANNEL_COMMANDS_TURN_OFF[self._model][channel])
+        result = await self._send_command(
+            MULTI_CHANNEL_COMMANDS_TURN_OFF[self._model][channel]
+        )
         return self._check_command_result(result, 0, {1})
 
     @update_after_operation
     async def async_toggle(self, channel: int) -> bool:
         """Toggle device."""
-        result = await self._send_command(MULTI_CHANNEL_COMMANDS_TOGGLE[self._model][channel])
+        result = await self._send_command(
+            MULTI_CHANNEL_COMMANDS_TOGGLE[self._model][channel]
+        )
         return self._check_command_result(result, 0, {1})
 
     def is_on(self, channel: int) -> bool | None:

+ 84 - 86
tests/test_adv_parser.py

@@ -3028,62 +3028,61 @@ def test_blind_tilt_with_empty_data() -> None:
     "test_case",
     [
         AdvTestCase(
-            b'\xc0N0\xdd\xb9\xf2\x8a\xc1\x00\x00\x00\x00\x00F\x00\x00',
-            b'=\x00\x00\x00',
+            b"\xc0N0\xdd\xb9\xf2\x8a\xc1\x00\x00\x00\x00\x00F\x00\x00",
+            b"=\x00\x00\x00",
             {
                 1: {
-                    'isOn': True,
-                    'sequence_number': 138,
-                    'switchMode': True,
+                    "isOn": True,
+                    "sequence_number": 138,
+                    "switchMode": True,
                 },
                 2: {
-                    'isOn': True,
-                    'sequence_number': 138,
-                    'switchMode': True,
+                    "isOn": True,
+                    "sequence_number": 138,
+                    "switchMode": True,
                 },
             },
-            '=',
-            'Relay Switch 2PM',
+            "=",
+            "Relay Switch 2PM",
             SwitchbotModel.RELAY_SWITCH_2PM,
         ),
         AdvTestCase(
             b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00",
             b";\x00\x00\x00",
             {
-                'isOn': True,
+                "isOn": True,
                 "sequence_number": 71,
-                'switchMode': True,
+                "switchMode": True,
             },
-            ';',
-            'Relay Switch 1',
+            ";",
+            "Relay Switch 1",
             SwitchbotModel.RELAY_SWITCH_1,
         ),
         AdvTestCase(
             b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00",
             b"<\x00\x00\x00",
             {
-                'isOn': True,
-                'sequence_number': 71,
-                'switchMode': True,
+                "isOn": True,
+                "sequence_number": 71,
+                "switchMode": True,
             },
-            '<',
-            'Relay Switch 1PM',
+            "<",
+            "Relay Switch 1PM",
             SwitchbotModel.RELAY_SWITCH_1PM,
         ),
         AdvTestCase(
-            b'$X|\x05BN\x0f\x00\x00\x03\x00\x00\x00\x00\x00\x00',
-            b'>\x00\x00\x00',
+            b"$X|\x05BN\x0f\x00\x00\x03\x00\x00\x00\x00\x00\x00",
+            b">\x00\x00\x00",
             {
-                'door_open': True,
-                'isOn': False,
-                'sequence_number': 15,
-                'switchMode': True,
+                "door_open": True,
+                "isOn": False,
+                "sequence_number": 15,
+                "switchMode": True,
             },
-            '>',
-            'Garage Door Opener',
+            ">",
+            "Garage Door Opener",
             SwitchbotModel.GARAGE_DOOR_OPENER,
         ),
-
     ],
 )
 def test_adv_active(test_case: AdvTestCase) -> None:
@@ -3115,62 +3114,61 @@ def test_adv_active(test_case: AdvTestCase) -> None:
     "test_case",
     [
         AdvTestCase(
-            b'\xc0N0\xdd\xb9\xf2\x8a\xc1\x00\x00\x00\x00\x00F\x00\x00',
-            b'=\x00\x00\x00',
+            b"\xc0N0\xdd\xb9\xf2\x8a\xc1\x00\x00\x00\x00\x00F\x00\x00",
+            b"=\x00\x00\x00",
             {
                 1: {
-                    'isOn': True,
-                    'sequence_number': 138,
-                    'switchMode': True,
+                    "isOn": True,
+                    "sequence_number": 138,
+                    "switchMode": True,
                 },
                 2: {
-                    'isOn': True,
-                    'sequence_number': 138,
-                    'switchMode': True,
+                    "isOn": True,
+                    "sequence_number": 138,
+                    "switchMode": True,
                 },
             },
-            '=',
-            'Relay Switch 2PM',
+            "=",
+            "Relay Switch 2PM",
             SwitchbotModel.RELAY_SWITCH_2PM,
         ),
         AdvTestCase(
             b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00",
             b";\x00\x00\x00",
             {
-                'isOn': True,
+                "isOn": True,
                 "sequence_number": 71,
-                'switchMode': True,
+                "switchMode": True,
             },
-            ';',
-            'Relay Switch 1',
+            ";",
+            "Relay Switch 1",
             SwitchbotModel.RELAY_SWITCH_1,
         ),
         AdvTestCase(
             b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00",
             b"<\x00\x00\x00",
             {
-                'isOn': True,
-                'sequence_number': 71,
-                'switchMode': True,
+                "isOn": True,
+                "sequence_number": 71,
+                "switchMode": True,
             },
-            '<',
-            'Relay Switch 1PM',
+            "<",
+            "Relay Switch 1PM",
             SwitchbotModel.RELAY_SWITCH_1PM,
         ),
         AdvTestCase(
-            b'$X|\x05BN\x0f\x00\x00\x03\x00\x00\x00\x00\x00\x00',
-            b'>\x00\x00\x00',
+            b"$X|\x05BN\x0f\x00\x00\x03\x00\x00\x00\x00\x00\x00",
+            b">\x00\x00\x00",
             {
-                'door_open': True,
-                'isOn': False,
-                'sequence_number': 15,
-                'switchMode': True,
+                "door_open": True,
+                "isOn": False,
+                "sequence_number": 15,
+                "switchMode": True,
             },
-            '>',
-            'Garage Door Opener',
+            ">",
+            "Garage Door Opener",
             SwitchbotModel.GARAGE_DOOR_OPENER,
         ),
-
     ],
 )
 def test_adv_passive(test_case: AdvTestCase) -> None:
@@ -3196,69 +3194,69 @@ def test_adv_passive(test_case: AdvTestCase) -> None:
         active=False,
     )
 
+
 @pytest.mark.parametrize(
     "test_case",
     [
         AdvTestCase(
             None,
-            b'=\x00\x00\x00',
+            b"=\x00\x00\x00",
             {
                 1: {
-                    'isOn': True,
-                    'power': 0.0,
-                    'sequence_number': 138,
-                    'switchMode': True,
+                    "isOn": True,
+                    "power": 0.0,
+                    "sequence_number": 138,
+                    "switchMode": True,
                 },
                 2: {
-                    'isOn': True,
-                    'power': 7.0,
-                    'sequence_number': 138,
-                    'switchMode': True,
+                    "isOn": True,
+                    "power": 7.0,
+                    "sequence_number": 138,
+                    "switchMode": True,
                 },
             },
-            '=',
-            'Relay Switch 2PM',
+            "=",
+            "Relay Switch 2PM",
             SwitchbotModel.RELAY_SWITCH_2PM,
         ),
         AdvTestCase(
             None,
             b";\x00\x00\x00",
             {
-                'isOn': True,
+                "isOn": True,
                 "sequence_number": 71,
-                'switchMode': True,
+                "switchMode": True,
             },
-            ';',
-            'Relay Switch 1',
+            ";",
+            "Relay Switch 1",
             SwitchbotModel.RELAY_SWITCH_1,
         ),
         AdvTestCase(
             None,
             b"<\x00\x00\x00",
             {
-                'isOn': True,
-                'power': 4.9,
-                'sequence_number': 71,
-                'switchMode': True,
+                "isOn": True,
+                "power": 4.9,
+                "sequence_number": 71,
+                "switchMode": True,
             },
-            '<',
-            'Relay Switch 1PM',
+            "<",
+            "Relay Switch 1PM",
             SwitchbotModel.RELAY_SWITCH_1PM,
         ),
         AdvTestCase(
             None,
-            b'>\x00\x00\x00',
+            b">\x00\x00\x00",
             {
-                'door_open': True,
-                'isOn': False,
-                'sequence_number': 15,
-                'switchMode': True,
+                "door_open": True,
+                "isOn": False,
+                "sequence_number": 15,
+                "switchMode": True,
             },
-            '>',
-            'Garage Door Opener',
+            ">",
+            "Garage Door Opener",
             SwitchbotModel.GARAGE_DOOR_OPENER,
         ),
-
     ],
 )
 def test_adv_with_empty_data(test_case: AdvTestCase) -> None:
@@ -3281,4 +3279,4 @@ def test_adv_with_empty_data(test_case: AdvTestCase) -> None:
         device=ble_device,
         rssi=-97,
         active=True,
-    )
+    )

+ 62 - 37
tests/test_relay_switch.py

@@ -11,7 +11,7 @@ from .test_adv_parser import generate_ble_device
 common_params = [
     (b";\x00\x00\x00", SwitchbotModel.RELAY_SWITCH_1),
     (b"<\x00\x00\x00", SwitchbotModel.RELAY_SWITCH_1PM),
-    (b'>\x00\x00\x00', SwitchbotModel.GARAGE_DOOR_OPENER),
+    (b">\x00\x00\x00", SwitchbotModel.GARAGE_DOOR_OPENER),
 ]
 
 
@@ -25,7 +25,8 @@ def common_parametrize_2pm():
 
 
 def create_device_for_command_testing(
-    rawAdvData: bytes, model: str, init_data: dict | None = None):
+    rawAdvData: bytes, model: str, init_data: dict | None = None
+):
     """Create a device for command testing."""
     ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
     device_class = (
@@ -44,6 +45,7 @@ def create_device_for_command_testing(
     device.update = AsyncMock()
     return device
 
+
 def make_advertisement_data(
     ble_device: BLEDevice, rawAdvData: bytes, model: str, init_data: dict | None = None
 ):
@@ -84,7 +86,8 @@ def make_advertisement_data(
                     "sequence_number": 96,
                     "isOn": True,
                     "door_open": False,
-                } | init_data,
+                }
+                | init_data,
                 "isEncrypted": False,
             },
             device=ble_device,
@@ -108,6 +111,7 @@ def make_advertisement_data(
         active=True,
     )
 
+
 @pytest.mark.asyncio
 @pytest.mark.parametrize(
     "init_data",
@@ -117,7 +121,9 @@ def make_advertisement_data(
 )
 async def test_turn_on_2PM(common_parametrize_2pm, init_data):
     """Test turn on command."""
-    device = create_device_for_command_testing(common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"], init_data)
+    device = create_device_for_command_testing(
+        common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"], init_data
+    )
     await device.turn_on(1)
     device._send_command.assert_called_with(
         relay_switch.MULTI_CHANNEL_COMMANDS_TURN_ON[common_parametrize_2pm["model"]][1]
@@ -130,6 +136,7 @@ async def test_turn_on_2PM(common_parametrize_2pm, init_data):
     )
     assert device.is_on(2) is True
 
+
 @pytest.mark.asyncio
 @pytest.mark.parametrize(
     "init_data",
@@ -139,7 +146,9 @@ async def test_turn_on_2PM(common_parametrize_2pm, init_data):
 )
 async def test_turn_off_2PM(common_parametrize_2pm, init_data):
     """Test turn off command."""
-    device = create_device_for_command_testing(common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"], init_data)
+    device = create_device_for_command_testing(
+        common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"], init_data
+    )
     await device.turn_off(1)
     device._send_command.assert_called_with(
         relay_switch.MULTI_CHANNEL_COMMANDS_TURN_OFF[common_parametrize_2pm["model"]][1]
@@ -152,10 +161,13 @@ async def test_turn_off_2PM(common_parametrize_2pm, init_data):
     )
     assert device.is_on(2) is False
 
+
 @pytest.mark.asyncio
 async def test_turn_toggle_2PM(common_parametrize_2pm):
     """Test toggle command."""
-    device = create_device_for_command_testing(common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"])
+    device = create_device_for_command_testing(
+        common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"]
+    )
     await device.async_toggle(1)
     device._send_command.assert_called_with(
         relay_switch.MULTI_CHANNEL_COMMANDS_TOGGLE[common_parametrize_2pm["model"]][1]
@@ -168,42 +180,50 @@ async def test_turn_toggle_2PM(common_parametrize_2pm):
     )
     assert device.is_on(2) is False
 
+
 @pytest.mark.asyncio
 async def test_get_switch_mode_2PM(common_parametrize_2pm):
     """Test get switch mode."""
-    device = create_device_for_command_testing(common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"])
+    device = create_device_for_command_testing(
+        common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"]
+    )
     assert device.switch_mode(1) is True
     assert device.switch_mode(2) is True
 
+
 @pytest.mark.asyncio
 @pytest.mark.parametrize(
     ("info_data", "result"),
     [
         (
             {
-                "basic_info": b'\x01\x98A\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10',
-                "channel1_info": b'\x01\x00\x00\x00\x00\x00\x00\x02\x99\x00\xe9\x00\x03\x00\x00',
+                "basic_info": b"\x01\x98A\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10",
+                "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",
             },
             [False, 0, 0, 0, 0, True, 0.02, 23, 0.3, 7.0],
         ),
         (
             {
-                "basic_info": b'\x01\x9e\x81\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10',
-                "channel1_info": b'\x01\x00\x00\x00\x00\x00\x00\x02\x99\x00\xe9\x00\x03\x00\x00',
+                "basic_info": b"\x01\x9e\x81\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10",
+                "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",
             },
             [True, 0, 23, 0.1, 0.0, False, 0.02, 0, 0, 0],
-        )
+        ),
     ],
 )
 async def test_get_basic_info_2PM(common_parametrize_2pm, info_data, result):
     """Test get_basic_info for 2PM devices."""
-    device = create_device_for_command_testing(common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"])
+    device = create_device_for_command_testing(
+        common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"]
+    )
 
     assert device.channel == 2
 
-    device.get_current_time_and_start_time = MagicMock(return_value=("683074d6", "682fba80"))
+    device.get_current_time_and_start_time = MagicMock(
+        return_value=("683074d6", "682fba80")
+    )
 
     async def mock_get_basic_info(arg):
         if arg == relay_switch.COMMAND_GET_BASIC_INFO:
@@ -241,26 +261,30 @@ async def test_get_basic_info_2PM(common_parametrize_2pm, info_data, result):
     [
         {
             "basic_info": None,
-            "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",
         },
         {
-            "basic_info": b'\x01\x98A\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10',
+            "basic_info": b"\x01\x98A\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10",
             "channel1_info": None,
             "channel2_info": b"\x01\x00\x055\x00'<\x02\x9f\x00\xe9\x01,\x00F",
         },
         {
-            "basic_info": b'\x01\x98A\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10',
-            "channel1_info": b'\x01\x00\x00\x00\x00\x00\x00\x02\x99\x00\xe9\x00\x03\x00\x00',
+            "basic_info": b"\x01\x98A\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10",
+            "channel1_info": b"\x01\x00\x00\x00\x00\x00\x00\x02\x99\x00\xe9\x00\x03\x00\x00",
             "channel2_info": None,
         },
     ],
 )
 async def test_basic_info_exceptions_2PM(common_parametrize_2pm, info_data):
     """Test get_basic_info exceptions."""
-    device = create_device_for_command_testing(common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"])
+    device = create_device_for_command_testing(
+        common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"]
+    )
 
-    device.get_current_time_and_start_time = MagicMock(return_value=("683074d6", "682fba80"))
+    device.get_current_time_and_start_time = MagicMock(
+        return_value=("683074d6", "682fba80")
+    )
 
     async def mock_get_basic_info(arg):
         if arg == relay_switch.COMMAND_GET_BASIC_INFO:
@@ -281,7 +305,9 @@ async def test_basic_info_exceptions_2PM(common_parametrize_2pm, info_data):
 @pytest.mark.asyncio
 async def test_get_parsed_data_2PM(common_parametrize_2pm):
     """Test get_parsed_data for 2PM devices."""
-    device = create_device_for_command_testing(common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"])
+    device = create_device_for_command_testing(
+        common_parametrize_2pm["rawAdvData"], common_parametrize_2pm["model"]
+    )
 
     info = device.get_parsed_data(1)
     assert info["isOn"] is True
@@ -299,11 +325,10 @@ async def test_turn_on(rawAdvData, model):
     """Test turn on command."""
     device = create_device_for_command_testing(rawAdvData, model)
     await device.turn_on()
-    device._send_command.assert_awaited_once_with(
-        relay_switch.COMMAND_TURN_ON
-    )
+    device._send_command.assert_awaited_once_with(relay_switch.COMMAND_TURN_ON)
     assert device.is_on() is True
 
+
 @pytest.mark.asyncio
 @pytest.mark.parametrize(
     ("rawAdvData", "model"),
@@ -313,11 +338,10 @@ async def test_turn_off(rawAdvData, model):
     """Test turn off command."""
     device = create_device_for_command_testing(rawAdvData, model, {"isOn": False})
     await device.turn_off()
-    device._send_command.assert_awaited_once_with(
-        relay_switch.COMMAND_TURN_OFF
-    )
+    device._send_command.assert_awaited_once_with(relay_switch.COMMAND_TURN_OFF)
     assert device.is_on() is False
 
+
 @pytest.mark.asyncio
 @pytest.mark.parametrize(
     ("rawAdvData", "model"),
@@ -327,35 +351,38 @@ async def test_toggle(rawAdvData, model):
     """Test toggle command."""
     device = create_device_for_command_testing(rawAdvData, model)
     await device.async_toggle()
-    device._send_command.assert_awaited_once_with(
-        relay_switch.COMMAND_TOGGLE
-    )
+    device._send_command.assert_awaited_once_with(relay_switch.COMMAND_TOGGLE)
     assert device.is_on() is True
 
+
 @pytest.mark.asyncio
 @pytest.mark.parametrize(
     ("rawAdvData", "model", "info_data"),
     [
         (
-            b'>\x00\x00\x00',
+            b">\x00\x00\x00",
             SwitchbotModel.GARAGE_DOOR_OPENER,
             {
-                "basic_info": b'\x01>\x80\x0c\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x10',
-                "channel1_info": b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+                "basic_info": b"\x01>\x80\x0c\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x10",
+                "channel1_info": b"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
             },
         )
-    ]
+    ],
 )
 async def test_get_basic_info_garage_door_opener(rawAdvData, model, info_data):
     """Test get_basic_info for garage door opener."""
     device = create_device_for_command_testing(rawAdvData, model)
-    device.get_current_time_and_start_time = MagicMock(return_value=("683074d6", "682fba80"))
+    device.get_current_time_and_start_time = MagicMock(
+        return_value=("683074d6", "682fba80")
+    )
+
     async def mock_get_basic_info(arg):
         if arg == relay_switch.COMMAND_GET_BASIC_INFO:
             return info_data["basic_info"]
         if arg == relay_switch.COMMAND_GET_CHANNEL1_INFO.format("683074d6", "682fba80"):
             return info_data["channel1_info"]
         return None
+
     device._get_basic_info = AsyncMock(side_effect=mock_get_basic_info)
     info = await device.get_basic_info()
     assert info is not None
@@ -363,8 +390,6 @@ async def test_get_basic_info_garage_door_opener(rawAdvData, model, info_data):
     assert info["door_open"] is True
 
 
-
-
 @pytest.mark.asyncio
 @pytest.mark.parametrize(
     "model",