Make zwave_js last seen sensor enabled by default (#109191)
* Make zwave_js last seen sensor enabled by default * Add test * Fix test * improve tests
This commit is contained in:
parent
08f8f84f61
commit
2b525ed2e9
5 changed files with 48 additions and 19 deletions
|
@ -343,6 +343,7 @@ class ZWaveJSStatisticsSensorEntityDescription(SensorEntityDescription):
|
||||||
convert: Callable[
|
convert: Callable[
|
||||||
[ControllerStatisticsDataType | NodeStatisticsDataType, str], Any
|
[ControllerStatisticsDataType | NodeStatisticsDataType, str], Any
|
||||||
] = lambda statistics, key: statistics.get(key)
|
] = lambda statistics, key: statistics.get(key)
|
||||||
|
entity_registry_enabled_default: bool = False
|
||||||
|
|
||||||
|
|
||||||
# Controller statistics descriptions
|
# Controller statistics descriptions
|
||||||
|
@ -487,6 +488,7 @@ ENTITY_DESCRIPTION_NODE_STATISTICS_LIST = [
|
||||||
else None
|
else None
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
entity_registry_enabled_default=True,
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -930,7 +932,6 @@ class ZWaveStatisticsSensor(SensorEntity):
|
||||||
entity_description: ZWaveJSStatisticsSensorEntityDescription
|
entity_description: ZWaveJSStatisticsSensorEntityDescription
|
||||||
_attr_should_poll = False
|
_attr_should_poll = False
|
||||||
_attr_entity_category = EntityCategory.DIAGNOSTIC
|
_attr_entity_category = EntityCategory.DIAGNOSTIC
|
||||||
_attr_entity_registry_enabled_default = False
|
|
||||||
_attr_has_entity_name = True
|
_attr_has_entity_name = True
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
|
|
|
@ -694,7 +694,8 @@
|
||||||
"commandsRX": 0,
|
"commandsRX": 0,
|
||||||
"commandsDroppedRX": 0,
|
"commandsDroppedRX": 0,
|
||||||
"commandsDroppedTX": 0,
|
"commandsDroppedTX": 0,
|
||||||
"timeoutResponse": 0
|
"timeoutResponse": 0,
|
||||||
|
"lastSeen": "2024-01-01T12:00:00+00"
|
||||||
},
|
},
|
||||||
"highestSecurityClass": -1,
|
"highestSecurityClass": -1,
|
||||||
"isControllerNode": false
|
"isControllerNode": false
|
||||||
|
|
|
@ -22,9 +22,10 @@ from homeassistant.components.zwave_js.discovery import (
|
||||||
from homeassistant.components.zwave_js.discovery_data_template import (
|
from homeassistant.components.zwave_js.discovery_data_template import (
|
||||||
DynamicCurrentTempClimateDataTemplate,
|
DynamicCurrentTempClimateDataTemplate,
|
||||||
)
|
)
|
||||||
|
from homeassistant.components.zwave_js.helpers import get_device_id
|
||||||
from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_UNKNOWN, EntityCategory
|
from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_UNKNOWN, EntityCategory
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers import entity_registry as er
|
from homeassistant.helpers import device_registry as dr, entity_registry as er
|
||||||
|
|
||||||
|
|
||||||
async def test_iblinds_v2(hass: HomeAssistant, client, iblinds_v2, integration) -> None:
|
async def test_iblinds_v2(hass: HomeAssistant, client, iblinds_v2, integration) -> None:
|
||||||
|
@ -224,14 +225,21 @@ async def test_indicator_test(
|
||||||
|
|
||||||
This test covers indicators that we don't already have device fixtures for.
|
This test covers indicators that we don't already have device fixtures for.
|
||||||
"""
|
"""
|
||||||
|
device = dr.async_get(hass).async_get_device(
|
||||||
|
identifiers={get_device_id(client.driver, indicator_test)}
|
||||||
|
)
|
||||||
|
assert device
|
||||||
ent_reg = er.async_get(hass)
|
ent_reg = er.async_get(hass)
|
||||||
assert len(hass.states.async_entity_ids(NUMBER_DOMAIN)) == 0
|
entities = er.async_entries_for_device(ent_reg, device.id)
|
||||||
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 1 # only ping
|
|
||||||
assert len(hass.states.async_entity_ids(BINARY_SENSOR_DOMAIN)) == 1
|
def len_domain(domain):
|
||||||
assert (
|
return len([entity for entity in entities if entity.domain == domain])
|
||||||
len(hass.states.async_entity_ids(SENSOR_DOMAIN)) == 3
|
|
||||||
) # include node + controller status
|
assert len_domain(NUMBER_DOMAIN) == 0
|
||||||
assert len(hass.states.async_entity_ids(SWITCH_DOMAIN)) == 1
|
assert len_domain(BUTTON_DOMAIN) == 1 # only ping
|
||||||
|
assert len_domain(BINARY_SENSOR_DOMAIN) == 1
|
||||||
|
assert len_domain(SENSOR_DOMAIN) == 3 # include node status + last seen
|
||||||
|
assert len_domain(SWITCH_DOMAIN) == 1
|
||||||
|
|
||||||
entity_id = "binary_sensor.this_is_a_fake_device_binary_sensor"
|
entity_id = "binary_sensor.this_is_a_fake_device_binary_sensor"
|
||||||
entry = ent_reg.async_get(entity_id)
|
entry = ent_reg.async_get(entity_id)
|
||||||
|
|
|
@ -227,14 +227,16 @@ async def test_on_node_added_not_ready(
|
||||||
client.driver.receive_event(event)
|
client.driver.receive_event(event)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
# the only entities are the node status sensor and ping button
|
|
||||||
assert len(hass.states.async_all()) == 3
|
|
||||||
|
|
||||||
device = dev_reg.async_get_device(identifiers={(DOMAIN, device_id)})
|
device = dev_reg.async_get_device(identifiers={(DOMAIN, device_id)})
|
||||||
assert device
|
assert device
|
||||||
# no extended device identifier yet
|
# no extended device identifier yet
|
||||||
assert len(device.identifiers) == 1
|
assert len(device.identifiers) == 1
|
||||||
|
|
||||||
|
ent_reg = er.async_get(hass)
|
||||||
|
entities = er.async_entries_for_device(ent_reg, device.id)
|
||||||
|
# the only entities are the node status sensor, last_seen sensor, and ping button
|
||||||
|
assert len(entities) == 3
|
||||||
|
|
||||||
|
|
||||||
async def test_existing_node_ready(
|
async def test_existing_node_ready(
|
||||||
hass: HomeAssistant, client, multisensor_6, integration
|
hass: HomeAssistant, client, multisensor_6, integration
|
||||||
|
@ -329,14 +331,16 @@ async def test_existing_node_not_ready(
|
||||||
assert not device.model
|
assert not device.model
|
||||||
assert not device.sw_version
|
assert not device.sw_version
|
||||||
|
|
||||||
# the only entities are the node status sensor and ping button
|
|
||||||
assert len(hass.states.async_all()) == 3
|
|
||||||
|
|
||||||
device = dev_reg.async_get_device(identifiers={(DOMAIN, device_id)})
|
device = dev_reg.async_get_device(identifiers={(DOMAIN, device_id)})
|
||||||
assert device
|
assert device
|
||||||
# no extended device identifier yet
|
# no extended device identifier yet
|
||||||
assert len(device.identifiers) == 1
|
assert len(device.identifiers) == 1
|
||||||
|
|
||||||
|
ent_reg = er.async_get(hass)
|
||||||
|
entities = er.async_entries_for_device(ent_reg, device.id)
|
||||||
|
# the only entities are the node status sensor, last_seen sensor, and ping button
|
||||||
|
assert len(entities) == 3
|
||||||
|
|
||||||
|
|
||||||
async def test_existing_node_not_replaced_when_not_ready(
|
async def test_existing_node_not_replaced_when_not_ready(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
|
|
|
@ -731,14 +731,13 @@ NODE_STATISTICS_SUFFIXES = {
|
||||||
NODE_STATISTICS_SUFFIXES_UNKNOWN = {
|
NODE_STATISTICS_SUFFIXES_UNKNOWN = {
|
||||||
"round_trip_time": 6,
|
"round_trip_time": 6,
|
||||||
"rssi": 7,
|
"rssi": 7,
|
||||||
"last_seen": "2024-01-01T00:00:00+00:00",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_statistics_sensors(
|
async def test_statistics_sensors_no_last_seen(
|
||||||
hass: HomeAssistant, zp3111, client, integration, caplog: pytest.LogCaptureFixture
|
hass: HomeAssistant, zp3111, client, integration, caplog: pytest.LogCaptureFixture
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test statistics sensors."""
|
"""Test all statistics sensors but last seen which is enabled by default."""
|
||||||
ent_reg = er.async_get(hass)
|
ent_reg = er.async_get(hass)
|
||||||
|
|
||||||
for prefix, suffixes in (
|
for prefix, suffixes in (
|
||||||
|
@ -880,6 +879,22 @@ async def test_statistics_sensors(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_last_seen_statistics_sensors(
|
||||||
|
hass: HomeAssistant, zp3111, client, integration
|
||||||
|
) -> None:
|
||||||
|
"""Test last_seen statistics sensors."""
|
||||||
|
ent_reg = er.async_get(hass)
|
||||||
|
|
||||||
|
entity_id = f"{NODE_STATISTICS_ENTITY_PREFIX}last_seen"
|
||||||
|
entry = ent_reg.async_get(entity_id)
|
||||||
|
assert entry
|
||||||
|
assert not entry.disabled
|
||||||
|
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state
|
||||||
|
assert state.state == "2024-01-01T12:00:00+00:00"
|
||||||
|
|
||||||
|
|
||||||
ENERGY_PRODUCTION_ENTITY_MAP = {
|
ENERGY_PRODUCTION_ENTITY_MAP = {
|
||||||
"energy_production_power": {
|
"energy_production_power": {
|
||||||
"state": 1.23,
|
"state": 1.23,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue