Add ability to translate ENUM sensor states in Unifi integration (#131921)

This commit is contained in:
Maciej Bieniek 2024-12-18 14:02:44 +00:00 committed by GitHub
parent 943b1d9f08
commit 3132700492
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 113 additions and 97 deletions

View File

@ -50,17 +50,16 @@ DPI_SWITCH = "dpi"
OUTLET_SWITCH = "outlet" OUTLET_SWITCH = "outlet"
DEVICE_STATES = { DEVICE_STATES = {
DeviceState.DISCONNECTED: "Disconnected", DeviceState.DISCONNECTED: "disconnected",
DeviceState.CONNECTED: "Connected", DeviceState.CONNECTED: "connected",
DeviceState.PENDING: "Pending", DeviceState.PENDING: "pending",
DeviceState.FIRMWARE_MISMATCH: "Firmware Mismatch", DeviceState.FIRMWARE_MISMATCH: "firmware_mismatch",
DeviceState.UPGRADING: "Upgrading", DeviceState.UPGRADING: "upgrading",
DeviceState.PROVISIONING: "Provisioning", DeviceState.PROVISIONING: "provisioning",
DeviceState.HEARTBEAT_MISSED: "Heartbeat Missed", DeviceState.HEARTBEAT_MISSED: "heartbeat_missed",
DeviceState.ADOPTING: "Adopting", DeviceState.ADOPTING: "adopting",
DeviceState.DELETING: "Deleting", DeviceState.DELETING: "deleting",
DeviceState.INFORM_ERROR: "Inform Error", DeviceState.INFORM_ERROR: "inform_error",
DeviceState.ADOPTION_FALIED: "Adoption Failed", DeviceState.ADOPTION_FALIED: "adoption_failed",
DeviceState.ISOLATED: "Isolated", DeviceState.ISOLATED: "isolated",
DeviceState.UNKNOWN: "Unknown",
} }

View File

@ -205,9 +205,9 @@ def async_client_is_connected_fn(hub: UnifiHub, obj_id: str) -> bool:
@callback @callback
def async_device_state_value_fn(hub: UnifiHub, device: Device) -> str: def async_device_state_value_fn(hub: UnifiHub, device: Device) -> str | None:
"""Retrieve the state of the device.""" """Retrieve the state of the device."""
return DEVICE_STATES[device.state] return DEVICE_STATES.get(device.state)
@callback @callback

View File

@ -33,6 +33,26 @@
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
} }
}, },
"entity": {
"sensor": {
"device_state": {
"state": {
"disconnected": "[%key:common::state::disconnected%]",
"connected": "[%key:common::state::connected%]",
"pending": "Pending",
"firmware_mismatch": "Firmware mismatch",
"upgrading": "Upgrading",
"provisioning": "Provisioning",
"heartbeat_missed": "Heartbeat missed",
"adopting": "Adopting",
"deleting": "Deleting",
"inform_error": "Inform error",
"adoption_failed": "Adoption failed",
"isolated": "Isolated"
}
}
}
},
"options": { "options": {
"abort": { "abort": {
"integration_not_setup": "UniFi integration is not set up" "integration_not_setup": "UniFi integration is not set up"

View File

@ -55,19 +55,18 @@
'area_id': None, 'area_id': None,
'capabilities': dict({ 'capabilities': dict({
'options': list([ 'options': list([
'Disconnected', 'disconnected',
'Connected', 'connected',
'Pending', 'pending',
'Firmware Mismatch', 'firmware_mismatch',
'Upgrading', 'upgrading',
'Provisioning', 'provisioning',
'Heartbeat Missed', 'heartbeat_missed',
'Adopting', 'adopting',
'Deleting', 'deleting',
'Inform Error', 'inform_error',
'Adoption Failed', 'adoption_failed',
'Isolated', 'isolated',
'Unknown',
]), ]),
}), }),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
@ -103,19 +102,18 @@
'device_class': 'enum', 'device_class': 'enum',
'friendly_name': 'Device State', 'friendly_name': 'Device State',
'options': list([ 'options': list([
'Disconnected', 'disconnected',
'Connected', 'connected',
'Pending', 'pending',
'Firmware Mismatch', 'firmware_mismatch',
'Upgrading', 'upgrading',
'Provisioning', 'provisioning',
'Heartbeat Missed', 'heartbeat_missed',
'Adopting', 'adopting',
'Deleting', 'deleting',
'Inform Error', 'inform_error',
'Adoption Failed', 'adoption_failed',
'Isolated', 'isolated',
'Unknown',
]), ]),
}), }),
'context': <ANY>, 'context': <ANY>,
@ -123,7 +121,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': 'Connected', 'state': 'connected',
}) })
# --- # ---
# name: test_entity_and_device_data[wlan_payload0-device_payload0-client_payload0-config_entry_options0][sensor.device_temperature-entry] # name: test_entity_and_device_data[wlan_payload0-device_payload0-client_payload0-config_entry_options0][sensor.device_temperature-entry]
@ -536,19 +534,18 @@
'area_id': None, 'area_id': None,
'capabilities': dict({ 'capabilities': dict({
'options': list([ 'options': list([
'Disconnected', 'disconnected',
'Connected', 'connected',
'Pending', 'pending',
'Firmware Mismatch', 'firmware_mismatch',
'Upgrading', 'upgrading',
'Provisioning', 'provisioning',
'Heartbeat Missed', 'heartbeat_missed',
'Adopting', 'adopting',
'Deleting', 'deleting',
'Inform Error', 'inform_error',
'Adoption Failed', 'adoption_failed',
'Isolated', 'isolated',
'Unknown',
]), ]),
}), }),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
@ -584,19 +581,18 @@
'device_class': 'enum', 'device_class': 'enum',
'friendly_name': 'Dummy USP-PDU-Pro State', 'friendly_name': 'Dummy USP-PDU-Pro State',
'options': list([ 'options': list([
'Disconnected', 'disconnected',
'Connected', 'connected',
'Pending', 'pending',
'Firmware Mismatch', 'firmware_mismatch',
'Upgrading', 'upgrading',
'Provisioning', 'provisioning',
'Heartbeat Missed', 'heartbeat_missed',
'Adopting', 'adopting',
'Deleting', 'deleting',
'Inform Error', 'inform_error',
'Adoption Failed', 'adoption_failed',
'Isolated', 'isolated',
'Unknown',
]), ]),
}), }),
'context': <ANY>, 'context': <ANY>,
@ -604,7 +600,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': 'Connected', 'state': 'connected',
}) })
# --- # ---
# name: test_entity_and_device_data[wlan_payload0-device_payload0-client_payload0-config_entry_options0][sensor.dummy_usp_pdu_pro_uptime-entry] # name: test_entity_and_device_data[wlan_payload0-device_payload0-client_payload0-config_entry_options0][sensor.dummy_usp_pdu_pro_uptime-entry]
@ -1601,19 +1597,18 @@
'area_id': None, 'area_id': None,
'capabilities': dict({ 'capabilities': dict({
'options': list([ 'options': list([
'Disconnected', 'disconnected',
'Connected', 'connected',
'Pending', 'pending',
'Firmware Mismatch', 'firmware_mismatch',
'Upgrading', 'upgrading',
'Provisioning', 'provisioning',
'Heartbeat Missed', 'heartbeat_missed',
'Adopting', 'adopting',
'Deleting', 'deleting',
'Inform Error', 'inform_error',
'Adoption Failed', 'adoption_failed',
'Isolated', 'isolated',
'Unknown',
]), ]),
}), }),
'config_entry_id': <ANY>, 'config_entry_id': <ANY>,
@ -1649,19 +1644,18 @@
'device_class': 'enum', 'device_class': 'enum',
'friendly_name': 'mock-name State', 'friendly_name': 'mock-name State',
'options': list([ 'options': list([
'Disconnected', 'disconnected',
'Connected', 'connected',
'Pending', 'pending',
'Firmware Mismatch', 'firmware_mismatch',
'Upgrading', 'upgrading',
'Provisioning', 'provisioning',
'Heartbeat Missed', 'heartbeat_missed',
'Adopting', 'adopting',
'Deleting', 'deleting',
'Inform Error', 'inform_error',
'Adoption Failed', 'adoption_failed',
'Isolated', 'isolated',
'Unknown',
]), ]),
}), }),
'context': <ANY>, 'context': <ANY>,
@ -1669,7 +1663,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': 'Connected', 'state': 'connected',
}) })
# --- # ---
# name: test_entity_and_device_data[wlan_payload0-device_payload0-client_payload0-config_entry_options0][sensor.mock_name_uptime-entry] # name: test_entity_and_device_data[wlan_payload0-device_payload0-client_payload0-config_entry_options0][sensor.mock_name_uptime-entry]

View File

@ -30,6 +30,7 @@ from homeassistant.config_entries import RELOAD_AFTER_UPDATE_DELAY
from homeassistant.const import ( from homeassistant.const import (
ATTR_DEVICE_CLASS, ATTR_DEVICE_CLASS,
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN,
EntityCategory, EntityCategory,
Platform, Platform,
) )
@ -891,7 +892,9 @@ async def test_device_state(
for i in list(map(int, DeviceState)): for i in list(map(int, DeviceState)):
device["state"] = i device["state"] = i
mock_websocket_message(message=MessageKey.DEVICE, data=device) mock_websocket_message(message=MessageKey.DEVICE, data=device)
assert hass.states.get("sensor.device_state").state == DEVICE_STATES[i] assert hass.states.get("sensor.device_state").state == DEVICE_STATES.get(
i, STATE_UNKNOWN
)
@pytest.mark.parametrize( @pytest.mark.parametrize(