Add lock ultra and lock lite for switchbot integration (#145373)

This commit is contained in:
Retha Runolfsson 2025-05-21 18:37:47 +08:00 committed by GitHub
parent 3ada93b293
commit 630c438834
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 83 additions and 5 deletions

View File

@ -80,6 +80,16 @@ PLATFORMS_BY_TYPE = {
SupportedModels.K10_PRO_VACUUM.value: [Platform.VACUUM, Platform.SENSOR], SupportedModels.K10_PRO_VACUUM.value: [Platform.VACUUM, Platform.SENSOR],
SupportedModels.K10_PRO_COMBO_VACUUM.value: [Platform.VACUUM, Platform.SENSOR], SupportedModels.K10_PRO_COMBO_VACUUM.value: [Platform.VACUUM, Platform.SENSOR],
SupportedModels.HUB3.value: [Platform.SENSOR, Platform.BINARY_SENSOR], SupportedModels.HUB3.value: [Platform.SENSOR, Platform.BINARY_SENSOR],
SupportedModels.LOCK_LITE.value: [
Platform.BINARY_SENSOR,
Platform.LOCK,
Platform.SENSOR,
],
SupportedModels.LOCK_ULTRA.value: [
Platform.BINARY_SENSOR,
Platform.LOCK,
Platform.SENSOR,
],
} }
CLASS_BY_DEVICE = { CLASS_BY_DEVICE = {
SupportedModels.CEILING_LIGHT.value: switchbot.SwitchbotCeilingLight, SupportedModels.CEILING_LIGHT.value: switchbot.SwitchbotCeilingLight,
@ -101,6 +111,8 @@ CLASS_BY_DEVICE = {
SupportedModels.K10_VACUUM.value: switchbot.SwitchbotVacuum, SupportedModels.K10_VACUUM.value: switchbot.SwitchbotVacuum,
SupportedModels.K10_PRO_VACUUM.value: switchbot.SwitchbotVacuum, SupportedModels.K10_PRO_VACUUM.value: switchbot.SwitchbotVacuum,
SupportedModels.K10_PRO_COMBO_VACUUM.value: switchbot.SwitchbotVacuum, SupportedModels.K10_PRO_COMBO_VACUUM.value: switchbot.SwitchbotVacuum,
SupportedModels.LOCK_LITE.value: switchbot.SwitchbotLock,
SupportedModels.LOCK_ULTRA.value: switchbot.SwitchbotLock,
} }

View File

@ -44,6 +44,8 @@ class SupportedModels(StrEnum):
K10_PRO_VACUUM = "k10_pro_vacuum" K10_PRO_VACUUM = "k10_pro_vacuum"
K10_PRO_COMBO_VACUUM = "k10_pro_combo_vacumm" K10_PRO_COMBO_VACUUM = "k10_pro_combo_vacumm"
HUB3 = "hub3" HUB3 = "hub3"
LOCK_LITE = "lock_lite"
LOCK_ULTRA = "lock_ultra"
CONNECTABLE_SUPPORTED_MODEL_TYPES = { CONNECTABLE_SUPPORTED_MODEL_TYPES = {
@ -67,6 +69,8 @@ CONNECTABLE_SUPPORTED_MODEL_TYPES = {
SwitchbotModel.K10_VACUUM: SupportedModels.K10_VACUUM, SwitchbotModel.K10_VACUUM: SupportedModels.K10_VACUUM,
SwitchbotModel.K10_PRO_VACUUM: SupportedModels.K10_PRO_VACUUM, SwitchbotModel.K10_PRO_VACUUM: SupportedModels.K10_PRO_VACUUM,
SwitchbotModel.K10_PRO_COMBO_VACUUM: SupportedModels.K10_PRO_COMBO_VACUUM, SwitchbotModel.K10_PRO_COMBO_VACUUM: SupportedModels.K10_PRO_COMBO_VACUUM,
SwitchbotModel.LOCK_LITE: SupportedModels.LOCK_LITE,
SwitchbotModel.LOCK_ULTRA: SupportedModels.LOCK_ULTRA,
} }
NON_CONNECTABLE_SUPPORTED_MODEL_TYPES = { NON_CONNECTABLE_SUPPORTED_MODEL_TYPES = {
@ -91,6 +95,8 @@ ENCRYPTED_MODELS = {
SwitchbotModel.RELAY_SWITCH_1PM, SwitchbotModel.RELAY_SWITCH_1PM,
SwitchbotModel.LOCK, SwitchbotModel.LOCK,
SwitchbotModel.LOCK_PRO, SwitchbotModel.LOCK_PRO,
SwitchbotModel.LOCK_LITE,
SwitchbotModel.LOCK_ULTRA,
} }
ENCRYPTED_SWITCHBOT_MODEL_TO_CLASS: dict[ ENCRYPTED_SWITCHBOT_MODEL_TO_CLASS: dict[
@ -100,6 +106,8 @@ ENCRYPTED_SWITCHBOT_MODEL_TO_CLASS: dict[
SwitchbotModel.LOCK_PRO: switchbot.SwitchbotLock, SwitchbotModel.LOCK_PRO: switchbot.SwitchbotLock,
SwitchbotModel.RELAY_SWITCH_1PM: switchbot.SwitchbotRelaySwitch, SwitchbotModel.RELAY_SWITCH_1PM: switchbot.SwitchbotRelaySwitch,
SwitchbotModel.RELAY_SWITCH_1: switchbot.SwitchbotRelaySwitch, SwitchbotModel.RELAY_SWITCH_1: switchbot.SwitchbotRelaySwitch,
SwitchbotModel.LOCK_LITE: switchbot.SwitchbotLock,
SwitchbotModel.LOCK_ULTRA: switchbot.SwitchbotLock,
} }
HASS_SENSOR_TYPE_TO_SWITCHBOT_MODEL = { HASS_SENSOR_TYPE_TO_SWITCHBOT_MODEL = {

View File

@ -715,3 +715,47 @@ HUB3_SERVICE_INFO = BluetoothServiceInfoBleak(
connectable=True, connectable=True,
tx_power=-127, tx_power=-127,
) )
LOCK_LITE_SERVICE_INFO = BluetoothServiceInfoBleak(
name="Lock Lite",
manufacturer_data={2409: b"\xe9\xd5\x11\xb2kS\x17\x93\x08 "},
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"-\x80d"},
service_uuids=["cba20d00-224d-11e6-9fb8-0002a5d5c51b"],
address="AA:BB:CC:DD:EE:FF",
rssi=-60,
source="local",
advertisement=generate_advertisement_data(
local_name="Lock Lite",
manufacturer_data={2409: b"\xe9\xd5\x11\xb2kS\x17\x93\x08 "},
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"-\x80d"},
service_uuids=["cba20d00-224d-11e6-9fb8-0002a5d5c51b"],
),
device=generate_ble_device("AA:BB:CC:DD:EE:FF", "Lock Lite"),
time=0,
connectable=True,
tx_power=-127,
)
LOCK_ULTRA_SERVICE_INFO = BluetoothServiceInfoBleak(
name="Lock Ultra",
manufacturer_data={2409: b"\xb0\xe9\xfe\xb6j=%\x8204\x00\x04"},
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"\x00\x804\x00\x10\xa5\xb8"},
service_uuids=["cba20d00-224d-11e6-9fb8-0002a5d5c51b"],
address="AA:BB:CC:DD:EE:FF",
rssi=-60,
source="local",
advertisement=generate_advertisement_data(
local_name="Lock Ultra",
manufacturer_data={2409: b"\xb0\xe9\xfe\xb6j=%\x8204\x00\x04"},
service_data={
"0000fd3d-0000-1000-8000-00805f9b34fb": b"\x00\x804\x00\x10\xa5\xb8"
},
service_uuids=["cba20d00-224d-11e6-9fb8-0002a5d5c51b"],
),
device=generate_ble_device("AA:BB:CC:DD:EE:FF", "Lock Ultra"),
time=0,
connectable=True,
tx_power=-127,
)

View File

@ -17,7 +17,12 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from . import LOCK_SERVICE_INFO, WOLOCKPRO_SERVICE_INFO from . import (
LOCK_LITE_SERVICE_INFO,
LOCK_SERVICE_INFO,
LOCK_ULTRA_SERVICE_INFO,
WOLOCKPRO_SERVICE_INFO,
)
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
from tests.components.bluetooth import inject_bluetooth_service_info from tests.components.bluetooth import inject_bluetooth_service_info
@ -25,7 +30,12 @@ from tests.components.bluetooth import inject_bluetooth_service_info
@pytest.mark.parametrize( @pytest.mark.parametrize(
("sensor_type", "service_info"), ("sensor_type", "service_info"),
[("lock_pro", WOLOCKPRO_SERVICE_INFO), ("lock", LOCK_SERVICE_INFO)], [
("lock_pro", WOLOCKPRO_SERVICE_INFO),
("lock", LOCK_SERVICE_INFO),
("lock_lite", LOCK_LITE_SERVICE_INFO),
("lock_ultra", LOCK_ULTRA_SERVICE_INFO),
],
) )
@pytest.mark.parametrize( @pytest.mark.parametrize(
("service", "mock_method"), ("service", "mock_method"),
@ -44,8 +54,8 @@ async def test_lock_services(
entry = mock_entry_encrypted_factory(sensor_type=sensor_type) entry = mock_entry_encrypted_factory(sensor_type=sensor_type)
entry.add_to_hass(hass) entry.add_to_hass(hass)
mocked_instance = AsyncMock(return_value=True) mocked_instance = AsyncMock(return_value=True)
with patch.multiple( with patch.multiple(
"homeassistant.components.switchbot.lock.switchbot.SwitchbotLock", "homeassistant.components.switchbot.lock.switchbot.SwitchbotLock",
update=AsyncMock(return_value=None), update=AsyncMock(return_value=None),
@ -68,7 +78,12 @@ async def test_lock_services(
@pytest.mark.parametrize( @pytest.mark.parametrize(
("sensor_type", "service_info"), ("sensor_type", "service_info"),
[("lock_pro", WOLOCKPRO_SERVICE_INFO), ("lock", LOCK_SERVICE_INFO)], [
("lock_pro", WOLOCKPRO_SERVICE_INFO),
("lock", LOCK_SERVICE_INFO),
("lock_lite", LOCK_LITE_SERVICE_INFO),
("lock_ultra", LOCK_ULTRA_SERVICE_INFO),
],
) )
@pytest.mark.parametrize( @pytest.mark.parametrize(
("service", "mock_method"), ("service", "mock_method"),
@ -87,7 +102,6 @@ async def test_lock_services_with_night_latch_enabled(
entry = mock_entry_encrypted_factory(sensor_type=sensor_type) entry = mock_entry_encrypted_factory(sensor_type=sensor_type)
entry.add_to_hass(hass) entry.add_to_hass(hass)
mocked_instance = AsyncMock(return_value=True) mocked_instance = AsyncMock(return_value=True)
with patch.multiple( with patch.multiple(