diff --git a/homeassistant/components/zwave_js/sensor.py b/homeassistant/components/zwave_js/sensor.py index 944c6979298..7da7ba9ab9b 100644 --- a/homeassistant/components/zwave_js/sensor.py +++ b/homeassistant/components/zwave_js/sensor.py @@ -8,7 +8,7 @@ from typing import cast import voluptuous as vol from zwave_js_server.client import Client as ZwaveClient -from zwave_js_server.const import CommandClass, ConfigurationValueType +from zwave_js_server.const import CommandClass, ConfigurationValueType, NodeStatus from zwave_js_server.const.command_class.meter import ( RESET_METER_OPTION_TARGET_VALUE, RESET_METER_OPTION_TYPE, @@ -80,6 +80,14 @@ from .helpers import get_device_id LOGGER = logging.getLogger(__name__) +STATUS_ICON: dict[NodeStatus, str] = { + NodeStatus.ALIVE: "mdi:heart-pulse", + NodeStatus.ASLEEP: "mdi:sleep", + NodeStatus.AWAKE: "mdi:eye", + NodeStatus.DEAD: "mdi:robot-dead", + NodeStatus.UNKNOWN: "mdi:help-rhombus", +} + @dataclass class ZwaveSensorEntityDescription(SensorEntityDescription): @@ -480,6 +488,11 @@ class ZWaveNodeStatusSensor(SensorEntity): self._attr_native_value = self.node.status.name.lower() self.async_write_ha_state() + @property + def icon(self) -> str | None: + """Icon of the entity.""" + return STATUS_ICON[self.node.status] + async def async_added_to_hass(self) -> None: """Call when entity is added.""" # Add value_changed callbacks. diff --git a/tests/components/zwave_js/test_sensor.py b/tests/components/zwave_js/test_sensor.py index fe17b071175..a18bead36c2 100644 --- a/tests/components/zwave_js/test_sensor.py +++ b/tests/components/zwave_js/test_sensor.py @@ -20,6 +20,7 @@ from homeassistant.components.zwave_js.const import ( from homeassistant.const import ( ATTR_DEVICE_CLASS, ATTR_ENTITY_ID, + ATTR_ICON, DEVICE_CLASS_CURRENT, DEVICE_CLASS_ENERGY, DEVICE_CLASS_HUMIDITY, @@ -168,24 +169,30 @@ async def test_node_status_sensor(hass, client, lock_id_lock_as_id150, integrati ) node.receive_event(event) assert hass.states.get(NODE_STATUS_ENTITY).state == "dead" + assert hass.states.get(NODE_STATUS_ENTITY).attributes[ATTR_ICON] == "mdi:robot-dead" event = Event( "wake up", data={"source": "node", "event": "wake up", "nodeId": node.node_id} ) node.receive_event(event) assert hass.states.get(NODE_STATUS_ENTITY).state == "awake" + assert hass.states.get(NODE_STATUS_ENTITY).attributes[ATTR_ICON] == "mdi:eye" event = Event( "sleep", data={"source": "node", "event": "sleep", "nodeId": node.node_id} ) node.receive_event(event) assert hass.states.get(NODE_STATUS_ENTITY).state == "asleep" + assert hass.states.get(NODE_STATUS_ENTITY).attributes[ATTR_ICON] == "mdi:sleep" event = Event( "alive", data={"source": "node", "event": "alive", "nodeId": node.node_id} ) node.receive_event(event) assert hass.states.get(NODE_STATUS_ENTITY).state == "alive" + assert ( + hass.states.get(NODE_STATUS_ENTITY).attributes[ATTR_ICON] == "mdi:heart-pulse" + ) # Disconnect the client and make sure the entity is still available await client.disconnect()