Handle None options in SmartThings (#140110)

* Handle None options in SmartThings

* Handle None options in SmartThings
This commit is contained in:
Joost Lekkerkerker 2025-03-08 14:59:10 +01:00 committed by GitHub
parent 81e6b93529
commit 105d9d5970
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 653 additions and 3 deletions

View File

@ -1031,8 +1031,11 @@ class SmartThingsSensor(SmartThingsEntity, SensorEntity):
def options(self) -> list[str] | None:
"""Return the options for this sensor."""
if self.entity_description.options_attribute:
options = self.get_attribute_value(
self.capability, self.entity_description.options_attribute
)
if (
options := self.get_attribute_value(
self.capability, self.entity_description.options_attribute
)
) is None:
return []
return [option.lower() for option in options]
return super().options

View File

@ -124,6 +124,7 @@ def mock_smartthings() -> Generator[AsyncMock]:
"heatit_ztrm3_thermostat",
"generic_ef00_v1",
"bosch_radiator_thermostat_ii",
"im_speaker_ai_0001",
]
)
def device_fixture(

View File

@ -0,0 +1,222 @@
{
"components": {
"main": {
"mediaPlayback": {
"supportedPlaybackCommands": {
"value": ["play", "pause", "stop"],
"timestamp": "2025-03-08T12:06:24.496Z"
},
"playbackStatus": {
"value": "stopped",
"timestamp": "2025-03-08T12:06:24.496Z"
}
},
"audioVolume": {
"volume": {
"value": 52,
"unit": "%",
"timestamp": "2025-03-08T12:08:00.153Z"
}
},
"mediaInputSource": {
"supportedInputSources": {
"value": null
},
"inputSource": {
"value": null
}
},
"audioTrackAddressing": {},
"samsungim.networkAudioGroupInfo": {
"groupName": {
"value": "",
"timestamp": "2025-03-08T12:06:24.628Z"
},
"role": {
"value": "",
"timestamp": "2025-03-08T12:06:24.628Z"
},
"channel": {
"value": "",
"timestamp": "2025-03-08T12:06:24.628Z"
},
"stereoType": {
"value": "A",
"timestamp": "2025-03-08T12:06:24.628Z"
},
"masterDi": {
"value": "",
"timestamp": "2025-03-08T12:06:24.628Z"
},
"acmMode": {
"value": "",
"timestamp": "2025-03-08T12:06:24.628Z"
},
"status": {
"value": "single",
"timestamp": "2025-03-08T12:06:24.628Z"
},
"masterName": {
"value": "",
"timestamp": "2025-03-08T12:06:24.628Z"
}
},
"refresh": {},
"audioNotification": {},
"execute": {
"data": {
"value": null
}
},
"samsungim.networkAudioMode": {
"mode": {
"value": "wifi",
"timestamp": "2025-03-08T12:06:24.573Z"
}
},
"mediaPlaybackRepeat": {
"playbackRepeatMode": {
"value": "off",
"timestamp": "2025-03-08T12:06:24.519Z"
}
},
"musicPlayer": {
"trackDescription": {
"value": null
},
"level": {
"value": null
},
"mute": {
"value": null
},
"trackData": {
"value": null
},
"status": {
"value": null
}
},
"ocf": {
"st": {
"value": null
},
"mndt": {
"value": null
},
"mnfv": {
"value": "V310XXU1AWK1",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"mnhw": {
"value": "1.0",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"di": {
"value": "c9276e43-fe3c-88c3-1dcc-2eb79e292b8c",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"mnsl": {
"value": null
},
"dmv": {
"value": "IoTivity1.2.1",
"timestamp": "2025-03-08T12:06:18.942Z"
},
"n": {
"value": "Galaxy Home Mini (MQVL)",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"mnmo": {
"value": "SM-V310",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"vid": {
"value": "IM-SPEAKER-AI-0001",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"mnmn": {
"value": "Samsung Electronics",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"mnml": {
"value": null
},
"mnpv": {
"value": "4.0.0.1",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"mnos": {
"value": "Tizen",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"pi": {
"value": "c9276e43-fe3c-88c3-1dcc-2eb79e292b8c",
"timestamp": "2025-03-08T12:06:18.931Z"
},
"icv": {
"value": "core0.0.1",
"timestamp": "2025-03-08T12:06:18.942Z"
}
},
"samsungim.announcement": {
"enableState": {
"value": null
},
"supportedCategories": {
"value": null
},
"supportedTypes": {
"value": null
},
"supportedMimes": {
"value": null
}
},
"samsungim.bixbyContent": {
"supportedModes": {
"value": ["news", "weather", "music", "search_all"],
"timestamp": "2025-03-08T12:06:24.817Z"
}
},
"mediaPlaybackShuffle": {
"playbackShuffle": {
"value": "disabled",
"timestamp": "2025-03-08T12:06:24.592Z"
}
},
"audioMute": {
"mute": {
"value": "unmuted",
"timestamp": "2025-03-08T12:06:24.478Z"
}
},
"mediaTrackControl": {
"supportedTrackControlCommands": {
"value": null
}
},
"speechSynthesis": {},
"samsungim.networkAudioTrackData": {
"appName": {
"value": null
},
"source": {
"value": "wifi",
"timestamp": "2025-03-08T12:06:24.540Z"
}
},
"audioTrackData": {
"totalTime": {
"value": null
},
"audioTrackData": {
"value": null
},
"elapsedTime": {
"value": null
}
}
}
}
}

View File

@ -0,0 +1,136 @@
{
"items": [
{
"deviceId": "c9276e43-fe3c-88c3-1dcc-2eb79e292b8c",
"name": "Galaxy Home Mini (MQVL)",
"label": "Galaxy Home Mini",
"manufacturerName": "Samsung Electronics",
"presentationId": "IM-SPEAKER-AI-0001",
"deviceManufacturerCode": "Samsung Electronics",
"locationId": "33db9e71-abe9-43a0-acd3-3f0927bbe5b7",
"ownerId": "9a1ee192-04ba-46ca-9c3d-196d8dbcf807",
"roomId": "445c006d-1796-4dd6-8308-1c3cd045e8ff",
"deviceTypeName": "Samsung OCF Network Audio Player",
"components": [
{
"id": "main",
"label": "main",
"capabilities": [
{
"id": "execute",
"version": 1
},
{
"id": "ocf",
"version": 1
},
{
"id": "refresh",
"version": 1
},
{
"id": "audioMute",
"version": 1
},
{
"id": "audioVolume",
"version": 1
},
{
"id": "mediaInputSource",
"version": 1
},
{
"id": "mediaPlaybackRepeat",
"version": 1
},
{
"id": "mediaPlaybackShuffle",
"version": 1
},
{
"id": "mediaPlayback",
"version": 1
},
{
"id": "mediaTrackControl",
"version": 1
},
{
"id": "audioTrackAddressing",
"version": 1
},
{
"id": "audioTrackData",
"version": 1
},
{
"id": "musicPlayer",
"version": 1
},
{
"id": "audioNotification",
"version": 1
},
{
"id": "speechSynthesis",
"version": 1
},
{
"id": "samsungim.bixbyContent",
"version": 1
},
{
"id": "samsungim.announcement",
"version": 1
},
{
"id": "samsungim.networkAudioMode",
"version": 1
},
{
"id": "samsungim.networkAudioGroupInfo",
"version": 1
},
{
"id": "samsungim.networkAudioTrackData",
"version": 1
}
],
"categories": [
{
"name": "NetworkAudio",
"categoryType": "manufacturer"
}
]
}
],
"createTime": "2025-03-08T12:06:18.865Z",
"profile": {
"id": "09df8e36-e94f-339c-9086-9639505e1fb2"
},
"ocf": {
"ocfDeviceType": "oic.d.networkaudio",
"name": "Galaxy Home Mini (MQVL)",
"specVersion": "core0.0.1",
"verticalDomainSpecVersion": "IoTivity1.2.1",
"manufacturerName": "Samsung Electronics",
"modelNumber": "SM-V310",
"platformVersion": "4.0.0.1",
"platformOS": "Tizen",
"hwVersion": "1.0",
"firmwareVersion": "V310XXU1AWK1",
"vendorId": "IM-SPEAKER-AI-0001",
"lastSignupTime": "2025-03-08T12:06:16.386696652Z",
"transferCandidate": false,
"additionalAuthCodeRequired": false
},
"type": "OCF",
"restrictionTier": 0,
"allowed": null,
"executionContext": "CLOUD",
"relationships": []
}
],
"_links": {}
}

View File

@ -860,6 +860,39 @@
'via_device_id': None,
})
# ---
# name: test_devices[im_speaker_ai_0001]
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': '1.0',
'id': <ANY>,
'identifiers': set({
tuple(
'smartthings',
'c9276e43-fe3c-88c3-1dcc-2eb79e292b8c',
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Samsung Electronics',
'model': 'SM-V310',
'model_id': None,
'name': 'Galaxy Home Mini',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'suggested_area': None,
'sw_version': 'V310XXU1AWK1',
'via_device_id': None,
})
# ---
# name: test_devices[iphone]
DeviceRegistryEntrySnapshot({
'area_id': None,

View File

@ -4935,6 +4935,261 @@
'state': '19.0',
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_media_input_source-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.galaxy_home_mini_media_input_source',
'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': 'Media input source',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'media_input_source',
'unique_id': 'c9276e43-fe3c-88c3-1dcc-2eb79e292b8c.inputSource',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_media_input_source-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Galaxy Home Mini Media input source',
}),
'context': <ANY>,
'entity_id': 'sensor.galaxy_home_mini_media_input_source',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_media_playback_repeat-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.galaxy_home_mini_media_playback_repeat',
'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': 'Media playback repeat',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'media_playback_repeat',
'unique_id': 'c9276e43-fe3c-88c3-1dcc-2eb79e292b8c.playbackRepeatMode',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_media_playback_repeat-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Galaxy Home Mini Media playback repeat',
}),
'context': <ANY>,
'entity_id': 'sensor.galaxy_home_mini_media_playback_repeat',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_media_playback_shuffle-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.galaxy_home_mini_media_playback_shuffle',
'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': 'Media playback shuffle',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'media_playback_shuffle',
'unique_id': 'c9276e43-fe3c-88c3-1dcc-2eb79e292b8c.playbackShuffle',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_media_playback_shuffle-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Galaxy Home Mini Media playback shuffle',
}),
'context': <ANY>,
'entity_id': 'sensor.galaxy_home_mini_media_playback_shuffle',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'disabled',
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_media_playback_status-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'paused',
'playing',
'stopped',
'fast_forwarding',
'rewinding',
'buffering',
]),
}),
'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.galaxy_home_mini_media_playback_status',
'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': 'Media playback status',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'media_playback_status',
'unique_id': 'c9276e43-fe3c-88c3-1dcc-2eb79e292b8c.playbackStatus',
'unit_of_measurement': None,
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_media_playback_status-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Galaxy Home Mini Media playback status',
'options': list([
'paused',
'playing',
'stopped',
'fast_forwarding',
'rewinding',
'buffering',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.galaxy_home_mini_media_playback_status',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'stopped',
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_volume-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.galaxy_home_mini_volume',
'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': 'Volume',
'platform': 'smartthings',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'audio_volume',
'unique_id': 'c9276e43-fe3c-88c3-1dcc-2eb79e292b8c.volume',
'unit_of_measurement': '%',
})
# ---
# name: test_all_entities[im_speaker_ai_0001][sensor.galaxy_home_mini_volume-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Galaxy Home Mini Volume',
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'sensor.galaxy_home_mini_volume',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '52',
})
# ---
# name: test_all_entities[multipurpose_sensor][sensor.deck_door_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': set({