Fix zwave_js adding not fully interviewed nodes (#45162)

* fix situation were nodes are being added or not fully interviewed

* adjust test

* lint
This commit is contained in:
Marcel van der Veldt 2021-01-15 01:09:03 +01:00 committed by GitHub
parent 7fada806af
commit a276f2d19e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 14 deletions

View file

@ -39,9 +39,9 @@ def register_node_in_dev_reg(
config_entry_id=entry.entry_id, config_entry_id=entry.entry_id,
identifiers={(DOMAIN, f"{client.driver.controller.home_id}-{node.node_id}")}, identifiers={(DOMAIN, f"{client.driver.controller.home_id}-{node.node_id}")},
sw_version=node.firmware_version, sw_version=node.firmware_version,
name=node.name or node.device_config.description, name=node.name or node.device_config.description or f"Node {node.node_id}",
model=node.device_config.label or str(node.product_type), model=node.device_config.label,
manufacturer=node.device_config.manufacturer or str(node.manufacturer_id), manufacturer=node.device_config.manufacturer,
) )
@ -84,13 +84,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
@callback @callback
def async_on_node_added(node: ZwaveNode) -> None: def async_on_node_added(node: ZwaveNode) -> None:
"""Handle node added event.""" """Handle node added event."""
LOGGER.debug("Node added: %s - waiting for it to become ready.", node.node_id)
# we only want to run discovery when the node has reached ready state, # we only want to run discovery when the node has reached ready state,
# otherwise we'll have all kinds of missing info issues. # otherwise we'll have all kinds of missing info issues.
if node.ready: if node.ready:
async_on_node_ready(node) async_on_node_ready(node)
return return
# if node is not yet ready, register one-time callback for ready state # if node is not yet ready, register one-time callback for ready state
LOGGER.debug("Node added: %s - waiting for it to become ready.", node.node_id)
node.once( node.once(
"ready", "ready",
lambda event: async_on_node_ready(event["node"]), lambda event: async_on_node_ready(event["node"]),
@ -139,14 +139,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
# run discovery on all ready nodes # run discovery on all ready nodes
for node in client.driver.controller.nodes.values(): for node in client.driver.controller.nodes.values():
if node.ready: async_on_node_added(node)
async_on_node_ready(node)
continue
# if node is not yet ready, register one-time callback for ready state
node.once(
"ready",
lambda event: async_on_node_ready(event["node"]),
)
# listen for new nodes being added to the mesh # listen for new nodes being added to the mesh
client.driver.controller.on( client.driver.controller.on(
"node added", lambda event: async_on_node_added(event["node"]) "node added", lambda event: async_on_node_added(event["node"])

View file

@ -194,8 +194,8 @@ async def test_existing_node_not_ready(hass, client, multisensor_6, device_regis
state = hass.states.get(AIR_TEMPERATURE_SENSOR) state = hass.states.get(AIR_TEMPERATURE_SENSOR)
assert not state # entity and device not yet added assert not state # entity not yet added
assert not device_registry.async_get_device( assert device_registry.async_get_device( # device should be added
identifiers={(DOMAIN, air_temperature_device_id)} identifiers={(DOMAIN, air_temperature_device_id)}
) )