Fix SmartThings machine operating state with no options (#144390)

This commit is contained in:
Joost Lekkerkerker 2025-05-07 12:37:53 +02:00 committed by GitHub
parent 0b1875de14
commit d6e85eef48
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 626 additions and 2 deletions

View File

@ -26,6 +26,7 @@ class SmartThingsSelectDescription(SelectEntityDescription):
options_attribute: Attribute
status_attribute: Attribute
command: Command
default_options: list[str] | None = None
CAPABILITIES_TO_SELECT: dict[Capability | str, SmartThingsSelectDescription] = {
@ -46,6 +47,7 @@ CAPABILITIES_TO_SELECT: dict[Capability | str, SmartThingsSelectDescription] = {
options_attribute=Attribute.SUPPORTED_MACHINE_STATES,
status_attribute=Attribute.MACHINE_STATE,
command=Command.SET_MACHINE_STATE,
default_options=["run", "pause", "stop"],
),
Capability.WASHER_OPERATING_STATE: SmartThingsSelectDescription(
key=Capability.WASHER_OPERATING_STATE,
@ -55,6 +57,7 @@ CAPABILITIES_TO_SELECT: dict[Capability | str, SmartThingsSelectDescription] = {
options_attribute=Attribute.SUPPORTED_MACHINE_STATES,
status_attribute=Attribute.MACHINE_STATE,
command=Command.SET_MACHINE_STATE,
default_options=["run", "pause", "stop"],
),
Capability.SAMSUNG_CE_AUTO_DISPENSE_DETERGENT: SmartThingsSelectDescription(
key=Capability.SAMSUNG_CE_AUTO_DISPENSE_DETERGENT,
@ -114,8 +117,12 @@ class SmartThingsSelectEntity(SmartThingsEntity, SelectEntity):
@property
def options(self) -> list[str]:
"""Return the list of options."""
return self.get_attribute_value(
self.entity_description.key, self.entity_description.options_attribute
return (
self.get_attribute_value(
self.entity_description.key, self.entity_description.options_attribute
)
or self.entity_description.default_options
or []
)
@property

View File

@ -122,6 +122,7 @@ def mock_smartthings() -> Generator[AsyncMock]:
"da_wm_wd_000001",
"da_wm_wd_000001_1",
"da_wm_wm_01011",
"da_wm_wm_100001",
"da_wm_wm_000001",
"da_wm_wm_000001_1",
"da_wm_sc_000001",

View File

@ -0,0 +1,154 @@
{
"components": {
"main": {
"ocf": {
"st": {
"value": null,
"timestamp": "2020-10-06T23:01:03.011Z"
},
"mndt": {
"value": null,
"timestamp": "2021-01-28T11:54:37.203Z"
},
"mnfv": {
"value": null,
"timestamp": "2020-12-20T14:21:43.766Z"
},
"mnhw": {
"value": null,
"timestamp": "2021-01-25T22:57:01.985Z"
},
"di": {
"value": "C0972771-01D0-0000-0000-000000000000",
"timestamp": "2019-08-10T18:37:20.487Z"
},
"mnsl": {
"value": null,
"timestamp": "2020-12-20T14:21:31.219Z"
},
"dmv": {
"value": "res.1.1.0,sh.1.1.0",
"timestamp": "2019-08-10T18:37:20.514Z"
},
"n": {
"value": "Washer",
"timestamp": "2019-08-10T18:37:20.555Z"
},
"mnmo": {
"value": "TP6X_WA54M8750AV|20183944|20000101001111000100000000000000",
"timestamp": "2019-08-10T18:37:20.409Z"
},
"vid": {
"value": "DA-WM-WM-100001",
"timestamp": "2019-08-10T18:37:20.381Z"
},
"mnmn": {
"value": "Samsung Electronics",
"timestamp": "2019-08-10T18:37:20.436Z"
},
"mnml": {
"value": null,
"timestamp": "2021-01-28T11:54:37.092Z"
},
"mnpv": {
"value": null,
"timestamp": "2021-01-26T20:55:28.663Z"
},
"mnos": {
"value": null,
"timestamp": "2021-01-26T20:55:28.411Z"
},
"pi": {
"value": "shp",
"timestamp": "2019-08-10T18:37:20.457Z"
},
"icv": {
"value": "core.1.1.0",
"timestamp": "2019-08-10T18:37:20.534Z"
}
},
"remoteControlStatus": {
"remoteControlEnabled": {
"value": "false",
"timestamp": "2025-04-06T17:30:05.372Z"
}
},
"samsungce.driverVersion": {
"versionNumber": {
"value": 22100103,
"timestamp": "2022-11-01T11:53:01.255Z"
}
},
"refresh": {},
"samsungce.washerOperatingState": {
"washerJobState": {
"value": "none",
"timestamp": "2025-04-18T13:17:00.432Z"
},
"operatingState": {
"value": "ready",
"timestamp": "2025-04-18T13:17:00.432Z"
},
"supportedOperatingStates": {
"value": ["ready", "running", "paused"],
"timestamp": "2022-11-01T11:53:01.255Z"
},
"scheduledJobs": {
"value": null
},
"scheduledPhases": {
"value": null
},
"progress": {
"value": null
},
"remainingTimeStr": {
"value": "00:57",
"timestamp": "2025-04-18T13:17:00.432Z"
},
"washerJobPhase": {
"value": null
},
"operationTime": {
"value": null
},
"remainingTime": {
"value": 57,
"unit": "min",
"timestamp": "2025-04-18T13:17:00.432Z"
}
},
"execute": {
"data": {
"value": null,
"data": {},
"timestamp": "2020-10-05T02:10:50.602Z"
}
},
"washerOperatingState": {
"completionTime": {
"value": "2025-04-18T14:14:00Z",
"timestamp": "2025-04-18T13:17:00.432Z"
},
"machineState": {
"value": "stop",
"timestamp": "2025-04-18T13:17:00.432Z"
},
"washerJobState": {
"value": "none",
"timestamp": "2025-04-18T13:17:00.432Z"
},
"supportedMachineStates": {
"value": null,
"timestamp": "2020-08-14T14:25:00.803Z"
}
},
"switch": {
"switch": {
"value": null,
"timestamp": "2020-09-13T18:32:28.637Z"
}
}
}
}
}

View File

@ -0,0 +1,84 @@
{
"items": [
{
"deviceId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"name": "Washer",
"label": "Washer",
"manufacturerName": "Samsung Electronics",
"presentationId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"deviceManufacturerCode": "Samsung Electronics",
"locationId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"ownerId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"deviceTypeName": "Samsung OCF Washer",
"components": [
{
"id": "main",
"label": "Washer",
"capabilities": [
{
"id": "ocf",
"version": 1
},
{
"id": "execute",
"version": 1
},
{
"id": "refresh",
"version": 1
},
{
"id": "switch",
"version": 1
},
{
"id": "remoteControlStatus",
"version": 1
},
{
"id": "washerOperatingState",
"version": 1
},
{
"id": "samsungce.driverVersion",
"version": 1
},
{
"id": "samsungce.washerOperatingState",
"version": 1
}
],
"categories": [
{
"name": "Washer",
"categoryType": "manufacturer"
}
],
"optional": false
}
],
"createTime": "2019-08-10T18:37:20Z",
"profile": {
"id": "REDACTED"
},
"ocf": {
"ocfDeviceType": "oic.d.washer",
"name": "Washer",
"specVersion": "core.1.1.0",
"verticalDomainSpecVersion": "res.1.1.0,sh.1.1.0",
"manufacturerName": "Samsung Electronics",
"modelNumber": "TP6X_WA54M8750AV|20183944|20000101001111000100000000000000",
"vendorId": "DA-WM-WM-100001",
"lastSignupTime": "2021-01-16T06:29:39.379382Z",
"transferCandidate": false,
"additionalAuthCodeRequired": false
},
"type": "OCF",
"restrictionTier": 0,
"allowed": null,
"executionContext": "CLOUD",
"relationships": []
}
],
"_links": {}
}

View File

@ -2089,6 +2089,101 @@
'state': 'on',
})
# ---
# name: test_all_entities[da_wm_wm_100001][binary_sensor.washer_power-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'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.washer_power',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <BinarySensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Power',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee_main_switch_switch_switch',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[da_wm_wm_100001][binary_sensor.washer_power-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Washer Power',
}),
'context': <ANY>,
'entity_id': 'binary_sensor.washer_power',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_all_entities[da_wm_wm_100001][binary_sensor.washer_remote_control-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'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.washer_remote_control',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Remote control',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'remote_control',
'unique_id': 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee_main_remoteControlStatus_remoteControlEnabled_remoteControlEnabled',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[da_wm_wm_100001][binary_sensor.washer_remote_control-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Washer Remote control',
}),
'context': <ANY>,
'entity_id': 'binary_sensor.washer_remote_control',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_all_entities[ecobee_sensor][binary_sensor.child_bedroom_motion-entry]
EntityRegistryEntrySnapshot({
'aliases': set({

View File

@ -992,6 +992,39 @@
'via_device_id': None,
})
# ---
# name: test_devices[da_wm_wm_100001]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': 'https://account.smartthings.com',
'connections': set({
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'smartthings',
'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee',
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Samsung Electronics',
'model': 'TP6X_WA54M8750AV',
'model_id': None,
'name': 'Washer',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'suggested_area': None,
'sw_version': None,
'via_device_id': None,
})
# ---
# name: test_devices[ecobee_sensor]
DeviceRegistryEntrySnapshot({
'area_id': None,

View File

@ -525,3 +525,61 @@
'state': 'standard',
})
# ---
# name: test_all_entities[da_wm_wm_100001][select.washer-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'run',
'pause',
'stop',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'select',
'entity_category': None,
'entity_id': 'select.washer',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': None,
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'operating_state',
'unique_id': 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee_main_washerOperatingState_machineState_machineState',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[da_wm_wm_100001][select.washer-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Washer',
'options': list([
'run',
'pause',
'stop',
]),
}),
'context': <ANY>,
'entity_id': 'select.washer',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'stop',
})
# ---

View File

@ -8546,6 +8546,198 @@
'state': '1642.2',
})
# ---
# name: test_all_entities[da_wm_wm_100001][sensor.washer_completion_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'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.washer_completion_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.TIMESTAMP: 'timestamp'>,
'original_icon': None,
'original_name': 'Completion time',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'completion_time',
'unique_id': 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee_main_washerOperatingState_completionTime_completionTime',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[da_wm_wm_100001][sensor.washer_completion_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'timestamp',
'friendly_name': 'Washer Completion time',
}),
'context': <ANY>,
'entity_id': 'sensor.washer_completion_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '2025-04-18T14:14:00+00:00',
})
# ---
# name: test_all_entities[da_wm_wm_100001][sensor.washer_job_state-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'air_wash',
'ai_rinse',
'ai_spin',
'ai_wash',
'cooling',
'delay_wash',
'drying',
'finish',
'none',
'pre_wash',
'rinse',
'spin',
'wash',
'weight_sensing',
'wrinkle_prevent',
'freeze_protection',
]),
}),
'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.washer_job_state',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Job state',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'washer_job_state',
'unique_id': 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee_main_washerOperatingState_washerJobState_washerJobState',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[da_wm_wm_100001][sensor.washer_job_state-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Washer Job state',
'options': list([
'air_wash',
'ai_rinse',
'ai_spin',
'ai_wash',
'cooling',
'delay_wash',
'drying',
'finish',
'none',
'pre_wash',
'rinse',
'spin',
'wash',
'weight_sensing',
'wrinkle_prevent',
'freeze_protection',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.washer_job_state',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'none',
})
# ---
# name: test_all_entities[da_wm_wm_100001][sensor.washer_machine_state-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'pause',
'run',
'stop',
]),
}),
'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.washer_machine_state',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Machine state',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'washer_machine_state',
'unique_id': 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee_main_washerOperatingState_machineState_machineState',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[da_wm_wm_100001][sensor.washer_machine_state-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Washer Machine state',
'options': list([
'pause',
'run',
'stop',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.washer_machine_state',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'stop',
})
# ---
# name: test_all_entities[ecobee_sensor][sensor.child_bedroom_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({