mirror of
https://github.com/home-assistant/core.git
synced 2025-07-18 18:57:06 +00:00
Add additional data to zwave_js device statistics WS API (#72520)
* Add additional data to zwave_js device statistics WS API * Rename variables * fix logic * correct typehint * Update homeassistant/components/zwave_js/api.py Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * black Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
parent
d8295e2fad
commit
5e52b11050
@ -71,6 +71,7 @@ from .const import (
|
|||||||
from .helpers import (
|
from .helpers import (
|
||||||
async_enable_statistics,
|
async_enable_statistics,
|
||||||
async_get_node_from_device_id,
|
async_get_node_from_device_id,
|
||||||
|
get_device_id,
|
||||||
update_data_collection_preference,
|
update_data_collection_preference,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -2107,15 +2108,42 @@ async def websocket_subscribe_controller_statistics(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _get_node_statistics_dict(statistics: NodeStatistics) -> dict[str, int]:
|
def _get_node_statistics_dict(
|
||||||
|
hass: HomeAssistant, statistics: NodeStatistics
|
||||||
|
) -> dict[str, Any]:
|
||||||
"""Get dictionary of node statistics."""
|
"""Get dictionary of node statistics."""
|
||||||
return {
|
dev_reg = dr.async_get(hass)
|
||||||
|
|
||||||
|
def _convert_node_to_device_id(node: Node) -> str:
|
||||||
|
"""Convert a node to a device id."""
|
||||||
|
driver = node.client.driver
|
||||||
|
assert driver
|
||||||
|
device = dev_reg.async_get_device({get_device_id(driver, node)})
|
||||||
|
assert device
|
||||||
|
return device.id
|
||||||
|
|
||||||
|
data: dict = {
|
||||||
"commands_tx": statistics.commands_tx,
|
"commands_tx": statistics.commands_tx,
|
||||||
"commands_rx": statistics.commands_rx,
|
"commands_rx": statistics.commands_rx,
|
||||||
"commands_dropped_tx": statistics.commands_dropped_tx,
|
"commands_dropped_tx": statistics.commands_dropped_tx,
|
||||||
"commands_dropped_rx": statistics.commands_dropped_rx,
|
"commands_dropped_rx": statistics.commands_dropped_rx,
|
||||||
"timeout_response": statistics.timeout_response,
|
"timeout_response": statistics.timeout_response,
|
||||||
|
"rtt": statistics.rtt,
|
||||||
|
"rssi": statistics.rssi,
|
||||||
|
"lwr": statistics.lwr.as_dict() if statistics.lwr else None,
|
||||||
|
"nlwr": statistics.nlwr.as_dict() if statistics.nlwr else None,
|
||||||
}
|
}
|
||||||
|
for key in ("lwr", "nlwr"):
|
||||||
|
if not data[key]:
|
||||||
|
continue
|
||||||
|
for key_2 in ("repeaters", "route_failed_between"):
|
||||||
|
if not data[key][key_2]:
|
||||||
|
continue
|
||||||
|
data[key][key_2] = [
|
||||||
|
_convert_node_to_device_id(node) for node in data[key][key_2]
|
||||||
|
]
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
@websocket_api.require_admin
|
@websocket_api.require_admin
|
||||||
@ -2151,7 +2179,7 @@ async def websocket_subscribe_node_statistics(
|
|||||||
"event": event["event"],
|
"event": event["event"],
|
||||||
"source": "node",
|
"source": "node",
|
||||||
"node_id": node.node_id,
|
"node_id": node.node_id,
|
||||||
**_get_node_statistics_dict(statistics),
|
**_get_node_statistics_dict(hass, statistics),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -2167,7 +2195,7 @@ async def websocket_subscribe_node_statistics(
|
|||||||
"event": "statistics updated",
|
"event": "statistics updated",
|
||||||
"source": "node",
|
"source": "node",
|
||||||
"nodeId": node.node_id,
|
"nodeId": node.node_id,
|
||||||
**_get_node_statistics_dict(node.statistics),
|
**_get_node_statistics_dict(hass, node.statistics),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -3768,18 +3768,26 @@ async def test_subscribe_controller_statistics(
|
|||||||
|
|
||||||
|
|
||||||
async def test_subscribe_node_statistics(
|
async def test_subscribe_node_statistics(
|
||||||
hass, multisensor_6, integration, client, hass_ws_client
|
hass,
|
||||||
|
multisensor_6,
|
||||||
|
wallmote_central_scene,
|
||||||
|
zen_31,
|
||||||
|
integration,
|
||||||
|
client,
|
||||||
|
hass_ws_client,
|
||||||
):
|
):
|
||||||
"""Test the subscribe_node_statistics command."""
|
"""Test the subscribe_node_statistics command."""
|
||||||
entry = integration
|
entry = integration
|
||||||
ws_client = await hass_ws_client(hass)
|
ws_client = await hass_ws_client(hass)
|
||||||
device = get_device(hass, multisensor_6)
|
multisensor_6_device = get_device(hass, multisensor_6)
|
||||||
|
zen_31_device = get_device(hass, zen_31)
|
||||||
|
wallmote_central_scene_device = get_device(hass, wallmote_central_scene)
|
||||||
|
|
||||||
await ws_client.send_json(
|
await ws_client.send_json(
|
||||||
{
|
{
|
||||||
ID: 1,
|
ID: 1,
|
||||||
TYPE: "zwave_js/subscribe_node_statistics",
|
TYPE: "zwave_js/subscribe_node_statistics",
|
||||||
DEVICE_ID: device.id,
|
DEVICE_ID: multisensor_6_device.id,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -3797,6 +3805,10 @@ async def test_subscribe_node_statistics(
|
|||||||
"commands_dropped_tx": 0,
|
"commands_dropped_tx": 0,
|
||||||
"commands_dropped_rx": 0,
|
"commands_dropped_rx": 0,
|
||||||
"timeout_response": 0,
|
"timeout_response": 0,
|
||||||
|
"rtt": None,
|
||||||
|
"rssi": None,
|
||||||
|
"lwr": None,
|
||||||
|
"nlwr": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
# Fire statistics updated
|
# Fire statistics updated
|
||||||
@ -3808,10 +3820,32 @@ async def test_subscribe_node_statistics(
|
|||||||
"nodeId": multisensor_6.node_id,
|
"nodeId": multisensor_6.node_id,
|
||||||
"statistics": {
|
"statistics": {
|
||||||
"commandsTX": 1,
|
"commandsTX": 1,
|
||||||
"commandsRX": 1,
|
"commandsRX": 2,
|
||||||
"commandsDroppedTX": 1,
|
"commandsDroppedTX": 3,
|
||||||
"commandsDroppedRX": 1,
|
"commandsDroppedRX": 4,
|
||||||
"timeoutResponse": 1,
|
"timeoutResponse": 5,
|
||||||
|
"rtt": 6,
|
||||||
|
"rssi": 7,
|
||||||
|
"lwr": {
|
||||||
|
"protocolDataRate": 1,
|
||||||
|
"rssi": 1,
|
||||||
|
"repeaters": [wallmote_central_scene.node_id],
|
||||||
|
"repeaterRSSI": [1],
|
||||||
|
"routeFailedBetween": [
|
||||||
|
zen_31.node_id,
|
||||||
|
multisensor_6.node_id,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"nlwr": {
|
||||||
|
"protocolDataRate": 2,
|
||||||
|
"rssi": 2,
|
||||||
|
"repeaters": [],
|
||||||
|
"repeaterRSSI": [127],
|
||||||
|
"routeFailedBetween": [
|
||||||
|
multisensor_6.node_id,
|
||||||
|
zen_31.node_id,
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@ -3822,10 +3856,32 @@ async def test_subscribe_node_statistics(
|
|||||||
"source": "node",
|
"source": "node",
|
||||||
"node_id": multisensor_6.node_id,
|
"node_id": multisensor_6.node_id,
|
||||||
"commands_tx": 1,
|
"commands_tx": 1,
|
||||||
"commands_rx": 1,
|
"commands_rx": 2,
|
||||||
"commands_dropped_tx": 1,
|
"commands_dropped_tx": 3,
|
||||||
"commands_dropped_rx": 1,
|
"commands_dropped_rx": 4,
|
||||||
"timeout_response": 1,
|
"timeout_response": 5,
|
||||||
|
"rtt": 6,
|
||||||
|
"rssi": 7,
|
||||||
|
"lwr": {
|
||||||
|
"protocol_data_rate": 1,
|
||||||
|
"rssi": 1,
|
||||||
|
"repeaters": [wallmote_central_scene_device.id],
|
||||||
|
"repeater_rssi": [1],
|
||||||
|
"route_failed_between": [
|
||||||
|
zen_31_device.id,
|
||||||
|
multisensor_6_device.id,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"nlwr": {
|
||||||
|
"protocol_data_rate": 2,
|
||||||
|
"rssi": 2,
|
||||||
|
"repeaters": [],
|
||||||
|
"repeater_rssi": [127],
|
||||||
|
"route_failed_between": [
|
||||||
|
multisensor_6_device.id,
|
||||||
|
zen_31_device.id,
|
||||||
|
],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
# Test sending command with improper entry ID fails
|
# Test sending command with improper entry ID fails
|
||||||
@ -3849,7 +3905,7 @@ async def test_subscribe_node_statistics(
|
|||||||
{
|
{
|
||||||
ID: 4,
|
ID: 4,
|
||||||
TYPE: "zwave_js/subscribe_node_statistics",
|
TYPE: "zwave_js/subscribe_node_statistics",
|
||||||
DEVICE_ID: device.id,
|
DEVICE_ID: multisensor_6_device.id,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
msg = await ws_client.receive_json()
|
msg = await ws_client.receive_json()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user