Switchbot Cloud: Add new supported devices[Lock Ultra Max] (#180486)

This commit is contained in:
Samuel Xiao
2026-08-30 17:43:27 +02:00
committed by GitHub
parent a0345b758c
commit 95cbf74185
7 changed files with 477 additions and 0 deletions
@@ -92,6 +92,10 @@ BINARY_SENSOR_DESCRIPTIONS_BY_DEVICE_TYPES = {
CALIBRATION_DESCRIPTION,
DOOR_OPEN_DESCRIPTION,
),
"Smart Lock Ultra Max": (
CALIBRATION_DESCRIPTION,
DOOR_OPEN_DESCRIPTION,
),
"Smart Lock Vision": (
CALIBRATION_DESCRIPTION,
DOOR_OPEN_DESCRIPTION,
@@ -94,6 +94,9 @@ DEVICE_SUPPORT_MAP: Final[dict[str, SwitchbotCloudDeviceConfig]] = {
"Smart Lock Ultra": SwitchbotCloudDeviceConfig(
True, entity_config=(Platform.SENSOR, Platform.BINARY_SENSOR, Platform.LOCK)
),
"Smart Lock Ultra Max": SwitchbotCloudDeviceConfig(
True, entity_config=(Platform.SENSOR, Platform.BINARY_SENSOR, Platform.LOCK)
),
"Smart Lock Vision": SwitchbotCloudDeviceConfig(
True, entity_config=(Platform.SENSOR, Platform.BINARY_SENSOR, Platform.LOCK)
),
@@ -245,6 +245,10 @@ SENSOR_DESCRIPTIONS_BY_DEVICE_TYPES = {
BATTERY_DESCRIPTION,
LOCK_SENSOR_TYPE_LOCK_STATE_DESCRIPTION,
),
"Smart Lock Ultra Max": (
BATTERY_DESCRIPTION,
LOCK_SENSOR_TYPE_LOCK_STATE_DESCRIPTION,
),
"Smart Lock Vision": (BATTERY_DESCRIPTION,),
"Smart Lock Vision Pro": (BATTERY_DESCRIPTION,),
"Lock Vision": (BATTERY_DESCRIPTION,),
@@ -209,6 +209,16 @@
"doorState": "open",
"calibrate": true
},
{
"deviceId": "7E50C3AEE222",
"deviceType": "Smart Lock Ultra Max",
"hubDeviceId": "FFFFFFFEEFF",
"battery": 100,
"version": "V6.3",
"lockState": "unlock",
"doorState": "open",
"calibrate": true
},
{
"deviceId": "6D4F9C2A0E8B",
"deviceType": "Lock Vision",
@@ -1223,6 +1223,108 @@
'state': 'off',
})
# ---
# name: test_coordinator_data[Smart Lock Ultra Max][binary_sensor.test_device_name_1_calibration-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'binary_sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'binary_sensor.test_device_name_1_calibration',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Calibration',
'options': dict({
}),
'original_device_class': <BinarySensorDeviceClass.PROBLEM: 'problem'>,
'original_icon': None,
'original_name': 'Calibration',
'platform': 'switchbot_cloud',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'calibration',
'unique_id': 'test-device-id-1_calibrate',
'unit_of_measurement': None,
})
# ---
# name: test_coordinator_data[Smart Lock Ultra Max][binary_sensor.test_device_name_1_calibration-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'problem',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'test-device-name-1 Calibration',
}),
'context': <ANY>,
'entity_id': 'binary_sensor.test_device_name_1_calibration',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_coordinator_data[Smart Lock Ultra Max][binary_sensor.test_device_name_1_door-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'binary_sensor',
'entity_category': None,
'entity_id': 'binary_sensor.test_device_name_1_door',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Door',
'options': dict({
}),
'original_device_class': <BinarySensorDeviceClass.DOOR: 'door'>,
'original_icon': None,
'original_name': 'Door',
'platform': 'switchbot_cloud',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'test-device-id-1_doorState',
'unit_of_measurement': None,
})
# ---
# name: test_coordinator_data[Smart Lock Ultra Max][binary_sensor.test_device_name_1_door-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'door',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'test-device-name-1 Door',
}),
'context': <ANY>,
'entity_id': 'binary_sensor.test_device_name_1_door',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_coordinator_data[Smart Lock Ultra][binary_sensor.test_device_name_1_calibration-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -2906,6 +3008,108 @@
'state': 'unknown',
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra Max][binary_sensor.test_device_name_1_calibration-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'binary_sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'binary_sensor.test_device_name_1_calibration',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Calibration',
'options': dict({
}),
'original_device_class': <BinarySensorDeviceClass.PROBLEM: 'problem'>,
'original_icon': None,
'original_name': 'Calibration',
'platform': 'switchbot_cloud',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'calibration',
'unique_id': 'test-device-id-1_calibrate',
'unit_of_measurement': None,
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra Max][binary_sensor.test_device_name_1_calibration-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'problem',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'test-device-name-1 Calibration',
}),
'context': <ANY>,
'entity_id': 'binary_sensor.test_device_name_1_calibration',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra Max][binary_sensor.test_device_name_1_door-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'binary_sensor',
'entity_category': None,
'entity_id': 'binary_sensor.test_device_name_1_door',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Door',
'options': dict({
}),
'original_device_class': <BinarySensorDeviceClass.DOOR: 'door'>,
'original_icon': None,
'original_name': 'Door',
'platform': 'switchbot_cloud',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'test-device-id-1_doorState',
'unit_of_measurement': None,
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra Max][binary_sensor.test_device_name_1_door-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'door',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'test-device-name-1 Door',
}),
'context': <ANY>,
'entity_id': 'binary_sensor.test_device_name_1_door',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra][binary_sensor.test_device_name_1_calibration-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -2976,6 +2976,131 @@
'state': '100',
})
# ---
# name: test_coordinator_data[Smart Lock Ultra Max][sensor.test_device_name_1_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': dict({
<SensorEntityCapabilityAttribute.STATE_CLASS: 'state_class'>: <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_device_name_1_battery',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Battery',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.BATTERY: 'battery'>,
'original_icon': None,
'original_name': 'Battery',
'platform': 'switchbot_cloud',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'test-device-id-1_battery',
'unit_of_measurement': <UnitOfRatio.PERCENTAGE: '%'>,
})
# ---
# name: test_coordinator_data[Smart Lock Ultra Max][sensor.test_device_name_1_battery-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'battery',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'test-device-name-1 Battery',
<SensorEntityCapabilityAttribute.STATE_CLASS: 'state_class'>: <SensorStateClass.MEASUREMENT: 'measurement'>,
<EntityStateAttribute.UNIT_OF_MEASUREMENT: 'unit_of_measurement'>: <UnitOfRatio.PERCENTAGE: '%'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_device_name_1_battery',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '100',
})
# ---
# name: test_coordinator_data[Smart Lock Ultra Max][sensor.test_device_name_1_lock_state-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': dict({
<SensorEntityCapabilityAttribute.OPTIONS: 'options'>: list([
'locked',
'unlocked',
'locking',
'unlocking',
'jammed',
'latch_bolt_locked',
'half_locked',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_device_name_1_lock_state',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Lock state',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Lock state',
'platform': 'switchbot_cloud',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'lock_state',
'unique_id': 'test-device-id-1_lockState',
'unit_of_measurement': None,
})
# ---
# name: test_coordinator_data[Smart Lock Ultra Max][sensor.test_device_name_1_lock_state-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'enum',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'test-device-name-1 Lock state',
<SensorEntityCapabilityAttribute.OPTIONS: 'options'>: list([
'locked',
'unlocked',
'locking',
'unlocking',
'jammed',
'latch_bolt_locked',
'half_locked',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.test_device_name_1_lock_state',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_coordinator_data[Smart Lock Ultra][sensor.test_device_name_1_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -7214,6 +7339,131 @@
'state': 'unknown',
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra Max][sensor.test_device_name_1_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': dict({
<SensorEntityCapabilityAttribute.STATE_CLASS: 'state_class'>: <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_device_name_1_battery',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Battery',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.BATTERY: 'battery'>,
'original_icon': None,
'original_name': 'Battery',
'platform': 'switchbot_cloud',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'test-device-id-1_battery',
'unit_of_measurement': <UnitOfRatio.PERCENTAGE: '%'>,
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra Max][sensor.test_device_name_1_battery-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'battery',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'test-device-name-1 Battery',
<SensorEntityCapabilityAttribute.STATE_CLASS: 'state_class'>: <SensorStateClass.MEASUREMENT: 'measurement'>,
<EntityStateAttribute.UNIT_OF_MEASUREMENT: 'unit_of_measurement'>: <UnitOfRatio.PERCENTAGE: '%'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_device_name_1_battery',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra Max][sensor.test_device_name_1_lock_state-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'area_id': None,
'capabilities': dict({
<SensorEntityCapabilityAttribute.OPTIONS: 'options'>: list([
'locked',
'unlocked',
'locking',
'unlocking',
'jammed',
'latch_bolt_locked',
'half_locked',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.test_device_name_1_lock_state',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Lock state',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Lock state',
'platform': 'switchbot_cloud',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'lock_state',
'unique_id': 'test-device-id-1_lockState',
'unit_of_measurement': None,
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra Max][sensor.test_device_name_1_lock_state-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'enum',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'test-device-name-1 Lock state',
<SensorEntityCapabilityAttribute.OPTIONS: 'options'>: list([
'locked',
'unlocked',
'locking',
'unlocking',
'jammed',
'latch_bolt_locked',
'half_locked',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.test_device_name_1_lock_state',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_no_coordinator_data[Smart Lock Ultra][sensor.test_device_name_1_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -30,6 +30,7 @@ from . import configure_integration
("Lock Vision", 4),
("Lock Vision Pro", 5),
("Smart Lock Pro Wifi", 6),
("Smart Lock Ultra Max", 7),
],
)
async def test_lock(
@@ -74,6 +75,7 @@ async def test_lock(
("Smart Lock", 0),
("Smart Lock Pro", 1),
("Smart Lock Ultra", 2),
("Smart Lock Ultra Max", 3),
("Smart Lock Pro Wifi", 5),
],
)