Add zwave_js WS API commands to replace and remove failed nodes (#51018)
* Add zwave_js WS API commands to replace and remove failed nodes * no need to manually add node to driver in test
This commit is contained in:
parent
6a7968593d
commit
ebf6e3d985
3 changed files with 386 additions and 12 deletions
|
@ -51,6 +51,7 @@ TYPE = "type"
|
|||
PROPERTY = "property"
|
||||
PROPERTY_KEY = "property_key"
|
||||
VALUE = "value"
|
||||
SECURE = "secure"
|
||||
|
||||
# constants for log config commands
|
||||
CONFIG = "config"
|
||||
|
@ -129,6 +130,8 @@ def async_register_api(hass: HomeAssistant) -> None:
|
|||
websocket_api.async_register_command(hass, websocket_add_node)
|
||||
websocket_api.async_register_command(hass, websocket_stop_inclusion)
|
||||
websocket_api.async_register_command(hass, websocket_remove_node)
|
||||
websocket_api.async_register_command(hass, websocket_remove_failed_node)
|
||||
websocket_api.async_register_command(hass, websocket_replace_failed_node)
|
||||
websocket_api.async_register_command(hass, websocket_stop_exclusion)
|
||||
websocket_api.async_register_command(hass, websocket_refresh_node_info)
|
||||
websocket_api.async_register_command(hass, websocket_refresh_node_values)
|
||||
|
@ -211,7 +214,7 @@ async def websocket_node_status(
|
|||
{
|
||||
vol.Required(TYPE): "zwave_js/add_node",
|
||||
vol.Required(ENTRY_ID): str,
|
||||
vol.Optional("secure", default=False): bool,
|
||||
vol.Optional(SECURE, default=False): bool,
|
||||
}
|
||||
)
|
||||
@websocket_api.async_response
|
||||
|
@ -225,7 +228,7 @@ async def websocket_add_node(
|
|||
) -> None:
|
||||
"""Add a node to the Z-Wave network."""
|
||||
controller = client.driver.controller
|
||||
include_non_secure = not msg["secure"]
|
||||
include_non_secure = not msg[SECURE]
|
||||
|
||||
@callback
|
||||
def async_cleanup() -> None:
|
||||
|
@ -409,6 +412,165 @@ async def websocket_remove_node(
|
|||
)
|
||||
|
||||
|
||||
@websocket_api.require_admin
|
||||
@websocket_api.websocket_command(
|
||||
{
|
||||
vol.Required(TYPE): "zwave_js/replace_failed_node",
|
||||
vol.Required(ENTRY_ID): str,
|
||||
vol.Required(NODE_ID): int,
|
||||
vol.Optional(SECURE, default=False): bool,
|
||||
}
|
||||
)
|
||||
@websocket_api.async_response
|
||||
@async_get_entry
|
||||
async def websocket_replace_failed_node(
|
||||
hass: HomeAssistant,
|
||||
connection: ActiveConnection,
|
||||
msg: dict,
|
||||
entry: ConfigEntry,
|
||||
client: Client,
|
||||
) -> None:
|
||||
"""Replace a failed node with a new node."""
|
||||
controller = client.driver.controller
|
||||
include_non_secure = not msg[SECURE]
|
||||
node_id = msg[NODE_ID]
|
||||
|
||||
@callback
|
||||
def async_cleanup() -> None:
|
||||
"""Remove signal listeners."""
|
||||
for unsub in unsubs:
|
||||
unsub()
|
||||
|
||||
@callback
|
||||
def forward_event(event: dict) -> None:
|
||||
connection.send_message(
|
||||
websocket_api.event_message(msg[ID], {"event": event["event"]})
|
||||
)
|
||||
|
||||
@callback
|
||||
def forward_stage(event: dict) -> None:
|
||||
connection.send_message(
|
||||
websocket_api.event_message(
|
||||
msg[ID], {"event": event["event"], "stage": event["stageName"]}
|
||||
)
|
||||
)
|
||||
|
||||
@callback
|
||||
def node_added(event: dict) -> None:
|
||||
node = event["node"]
|
||||
interview_unsubs = [
|
||||
node.on("interview started", forward_event),
|
||||
node.on("interview completed", forward_event),
|
||||
node.on("interview stage completed", forward_stage),
|
||||
node.on("interview failed", forward_event),
|
||||
]
|
||||
unsubs.extend(interview_unsubs)
|
||||
node_details = {
|
||||
"node_id": node.node_id,
|
||||
"status": node.status,
|
||||
"ready": node.ready,
|
||||
}
|
||||
connection.send_message(
|
||||
websocket_api.event_message(
|
||||
msg[ID], {"event": "node added", "node": node_details}
|
||||
)
|
||||
)
|
||||
|
||||
@callback
|
||||
def node_removed(event: dict) -> None:
|
||||
node = event["node"]
|
||||
node_details = {
|
||||
"node_id": node.node_id,
|
||||
}
|
||||
|
||||
connection.send_message(
|
||||
websocket_api.event_message(
|
||||
msg[ID], {"event": "node removed", "node": node_details}
|
||||
)
|
||||
)
|
||||
|
||||
@callback
|
||||
def device_registered(device: DeviceEntry) -> None:
|
||||
device_details = {
|
||||
"name": device.name,
|
||||
"id": device.id,
|
||||
"manufacturer": device.manufacturer,
|
||||
"model": device.model,
|
||||
}
|
||||
connection.send_message(
|
||||
websocket_api.event_message(
|
||||
msg[ID], {"event": "device registered", "device": device_details}
|
||||
)
|
||||
)
|
||||
|
||||
connection.subscriptions[msg["id"]] = async_cleanup
|
||||
unsubs = [
|
||||
controller.on("inclusion started", forward_event),
|
||||
controller.on("inclusion failed", forward_event),
|
||||
controller.on("inclusion stopped", forward_event),
|
||||
controller.on("node removed", node_removed),
|
||||
controller.on("node added", node_added),
|
||||
async_dispatcher_connect(
|
||||
hass, EVENT_DEVICE_ADDED_TO_REGISTRY, device_registered
|
||||
),
|
||||
]
|
||||
|
||||
result = await controller.async_replace_failed_node(node_id, include_non_secure)
|
||||
connection.send_result(
|
||||
msg[ID],
|
||||
result,
|
||||
)
|
||||
|
||||
|
||||
@websocket_api.require_admin
|
||||
@websocket_api.websocket_command(
|
||||
{
|
||||
vol.Required(TYPE): "zwave_js/remove_failed_node",
|
||||
vol.Required(ENTRY_ID): str,
|
||||
vol.Required(NODE_ID): int,
|
||||
}
|
||||
)
|
||||
@websocket_api.async_response
|
||||
@async_get_entry
|
||||
async def websocket_remove_failed_node(
|
||||
hass: HomeAssistant,
|
||||
connection: ActiveConnection,
|
||||
msg: dict,
|
||||
entry: ConfigEntry,
|
||||
client: Client,
|
||||
) -> None:
|
||||
"""Remove a failed node from the Z-Wave network."""
|
||||
controller = client.driver.controller
|
||||
node_id = msg[NODE_ID]
|
||||
|
||||
@callback
|
||||
def async_cleanup() -> None:
|
||||
"""Remove signal listeners."""
|
||||
unsub()
|
||||
|
||||
@callback
|
||||
def node_removed(event: dict) -> None:
|
||||
node = event["node"]
|
||||
node_details = {
|
||||
"node_id": node.node_id,
|
||||
}
|
||||
|
||||
connection.send_message(
|
||||
websocket_api.event_message(
|
||||
msg[ID], {"event": "node removed", "node": node_details}
|
||||
)
|
||||
)
|
||||
|
||||
connection.subscriptions[msg["id"]] = async_cleanup
|
||||
unsub = controller.on("node removed", node_removed)
|
||||
|
||||
result = await controller.async_remove_failed_node(node_id)
|
||||
connection.send_result(
|
||||
msg[ID],
|
||||
result,
|
||||
)
|
||||
|
||||
|
||||
@websocket_api.require_admin
|
||||
@websocket_api.websocket_command(
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue