diff --git a/homeassistant/components/deconz/binary_sensor.py b/homeassistant/components/deconz/binary_sensor.py index 1e6edbbe415..cda743f0893 100644 --- a/homeassistant/components/deconz/binary_sensor.py +++ b/homeassistant/components/deconz/binary_sensor.py @@ -119,6 +119,15 @@ BINARY_SENSOR_DESCRIPTIONS = [ device_class=BinarySensorDeviceClass.BATTERY, entity_category=EntityCategory.DIAGNOSTIC, ), + DeconzBinarySensorDescription( + key="in_test_mode", + required_attr="in_test_mode", + value_fn=lambda device: device.in_test_mode, + suffix="Test Mode", + update_key="test", + device_class=BinarySensorDeviceClass.SMOKE, + entity_category=EntityCategory.DIAGNOSTIC, + ), ] diff --git a/homeassistant/components/deconz/manifest.json b/homeassistant/components/deconz/manifest.json index 68b89b70b9c..94356f95eaf 100644 --- a/homeassistant/components/deconz/manifest.json +++ b/homeassistant/components/deconz/manifest.json @@ -4,7 +4,7 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/deconz", "requirements": [ - "pydeconz==85" + "pydeconz==86" ], "ssdp": [ { diff --git a/requirements_all.txt b/requirements_all.txt index 4640175336d..991fe762c02 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1464,7 +1464,7 @@ pydaikin==2.7.0 pydanfossair==0.1.0 # homeassistant.components.deconz -pydeconz==85 +pydeconz==86 # homeassistant.components.delijn pydelijn==0.6.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 78e8213db5e..6bd90858479 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -908,7 +908,7 @@ pycoolmasternet-async==0.1.2 pydaikin==2.7.0 # homeassistant.components.deconz -pydeconz==85 +pydeconz==86 # homeassistant.components.dexcom pydexcom==0.2.2 diff --git a/tests/components/deconz/test_binary_sensor.py b/tests/components/deconz/test_binary_sensor.py index 04c5335ffd5..11f9483e277 100644 --- a/tests/components/deconz/test_binary_sensor.py +++ b/tests/components/deconz/test_binary_sensor.py @@ -183,6 +183,58 @@ async def test_tampering_sensor(hass, aioclient_mock, mock_deconz_websocket): assert len(hass.states.async_all()) == 0 +async def test_fire_sensor(hass, aioclient_mock, mock_deconz_websocket): + """Verify smoke alarm sensor works.""" + data = { + "sensors": { + "1": { + "name": "Fire alarm", + "type": "ZHAFire", + "state": {"fire": False, "test": False}, + "config": {"on": True, "reachable": True}, + "uniqueid": "00:00:00:00:00:00:00:00-00", + }, + } + } + with patch.dict(DECONZ_WEB_REQUEST, data): + config_entry = await setup_deconz_integration(hass, aioclient_mock) + + ent_reg = er.async_get(hass) + + assert len(hass.states.async_all()) == 2 + assert hass.states.get("binary_sensor.fire_alarm").state == STATE_OFF + assert ent_reg.async_get("binary_sensor.fire_alarm").entity_category is None + + assert hass.states.get("binary_sensor.fire_alarm_test_mode").state == STATE_OFF + assert ( + ent_reg.async_get("binary_sensor.fire_alarm_test_mode").entity_category + is EntityCategory.DIAGNOSTIC + ) + + event_changed_sensor = { + "t": "event", + "e": "changed", + "r": "sensors", + "id": "1", + "state": {"fire": True, "test": True}, + } + await mock_deconz_websocket(data=event_changed_sensor) + await hass.async_block_till_done() + + assert hass.states.get("binary_sensor.fire_alarm").state == STATE_ON + assert hass.states.get("binary_sensor.fire_alarm_test_mode").state == STATE_ON + + await hass.config_entries.async_unload(config_entry.entry_id) + assert hass.states.get("binary_sensor.fire_alarm").state == STATE_UNAVAILABLE + assert ( + hass.states.get("binary_sensor.fire_alarm_test_mode").state == STATE_UNAVAILABLE + ) + + await hass.config_entries.async_remove(config_entry.entry_id) + await hass.async_block_till_done() + assert len(hass.states.async_all()) == 0 + + async def test_allow_clip_sensor(hass, aioclient_mock): """Test that CLIP sensors can be allowed.""" data = {