diff --git a/homeassistant/components/zwave_js/sensor.py b/homeassistant/components/zwave_js/sensor.py index 5c8ed8633f1..40159b383a6 100644 --- a/homeassistant/components/zwave_js/sensor.py +++ b/homeassistant/components/zwave_js/sensor.py @@ -462,6 +462,7 @@ class ZWaveNodeStatusSensor(SensorEntity): """Poll a value.""" raise ValueError("There is no value to poll for this entity") + @callback def _status_changed(self, _: dict) -> None: """Call when status event is received.""" self._attr_native_value = self.node.status.name.lower() @@ -480,8 +481,3 @@ class ZWaveNodeStatusSensor(SensorEntity): ) ) self.async_write_ha_state() - - @property - def available(self) -> bool: - """Return entity availability.""" - return self.client.connected and bool(self.node.ready) diff --git a/tests/components/zwave_js/conftest.py b/tests/components/zwave_js/conftest.py index 900a7937539..6634fdf759d 100644 --- a/tests/components/zwave_js/conftest.py +++ b/tests/components/zwave_js/conftest.py @@ -769,6 +769,16 @@ def lock_id_lock_as_id150(client, lock_id_lock_as_id150_state): return node +@pytest.fixture(name="lock_id_lock_as_id150_not_ready") +def node_not_ready(client, lock_id_lock_as_id150_state): + """Mock an id lock id-150 lock node that's not ready.""" + state = copy.deepcopy(lock_id_lock_as_id150_state) + state["ready"] = False + node = Node(client, state) + client.driver.controller.nodes[node.node_id] = node + return node + + @pytest.fixture(name="climate_radio_thermostat_ct101_multiple_temp_units") def climate_radio_thermostat_ct101_multiple_temp_units_fixture( client, climate_radio_thermostat_ct101_multiple_temp_units_state diff --git a/tests/components/zwave_js/test_sensor.py b/tests/components/zwave_js/test_sensor.py index 6d64f6f92dd..b595b6462b3 100644 --- a/tests/components/zwave_js/test_sensor.py +++ b/tests/components/zwave_js/test_sensor.py @@ -23,6 +23,7 @@ from homeassistant.const import ( ELECTRIC_POTENTIAL_VOLT, ENERGY_KILO_WATT_HOUR, POWER_WATT, + STATE_UNAVAILABLE, TEMP_CELSIUS, ) from homeassistant.helpers import entity_registry as er @@ -136,7 +137,7 @@ async def test_config_parameter_sensor(hass, lock_id_lock_as_id150, integration) assert entity_entry.disabled -async def test_node_status_sensor(hass, lock_id_lock_as_id150, integration): +async def test_node_status_sensor(hass, client, lock_id_lock_as_id150, integration): """Test node status sensor is created and gets updated on node state changes.""" NODE_STATUS_ENTITY = "sensor.z_wave_module_for_id_lock_150_and_101_node_status" node = lock_id_lock_as_id150 @@ -179,6 +180,44 @@ async def test_node_status_sensor(hass, lock_id_lock_as_id150, integration): node.receive_event(event) assert hass.states.get(NODE_STATUS_ENTITY).state == "alive" + # Disconnect the client and make sure the entity is still available + await client.disconnect() + assert hass.states.get(NODE_STATUS_ENTITY).state != STATE_UNAVAILABLE + + +async def test_node_status_sensor_not_ready( + hass, + client, + lock_id_lock_as_id150_not_ready, + lock_id_lock_as_id150_state, + integration, +): + """Test node status sensor is created and available if node is not ready.""" + NODE_STATUS_ENTITY = "sensor.z_wave_module_for_id_lock_150_and_101_node_status" + node = lock_id_lock_as_id150_not_ready + assert not node.ready + ent_reg = er.async_get(hass) + entity_entry = ent_reg.async_get(NODE_STATUS_ENTITY) + assert entity_entry.disabled + assert entity_entry.disabled_by == er.DISABLED_INTEGRATION + updated_entry = ent_reg.async_update_entity( + entity_entry.entity_id, **{"disabled_by": None} + ) + + await hass.config_entries.async_reload(integration.entry_id) + await hass.async_block_till_done() + + assert not updated_entry.disabled + assert hass.states.get(NODE_STATUS_ENTITY) + assert hass.states.get(NODE_STATUS_ENTITY).state == "alive" + + # Mark node as ready + event = Event("ready", {"nodeState": lock_id_lock_as_id150_state}) + node.receive_event(event) + assert node.ready + assert hass.states.get(NODE_STATUS_ENTITY) + assert hass.states.get(NODE_STATUS_ENTITY).state == "alive" + async def test_reset_meter( hass,