Files
core/homeassistant/components/ozw/websocket_api.py
2020-07-29 22:35:26 +02:00

115 lines
3.9 KiB
Python

"""Web socket API for OpenZWave."""
import logging
import voluptuous as vol
from homeassistant.components import websocket_api
from homeassistant.core import callback
_LOGGER = logging.getLogger(__name__)
TYPE = "type"
ID = "id"
OZW_INSTANCE = "ozw_instance"
NODE_ID = "node_id"
class ZWaveWebsocketApi:
"""Class that holds our websocket api commands."""
def __init__(self, hass, manager):
"""Initialize with both hass and ozwmanager objects."""
self._hass = hass
self._manager = manager
@callback
def async_register_api(self):
"""Register all of our api endpoints."""
websocket_api.async_register_command(self._hass, self.websocket_network_status)
websocket_api.async_register_command(self._hass, self.websocket_node_status)
websocket_api.async_register_command(self._hass, self.websocket_node_statistics)
@websocket_api.websocket_command(
{
vol.Required(TYPE): "ozw/network_status",
vol.Optional(OZW_INSTANCE, default=1): vol.Coerce(int),
}
)
def websocket_network_status(self, hass, connection, msg):
"""Get Z-Wave network status."""
connection.send_result(
msg[ID],
{
"state": self._manager.get_instance(msg[OZW_INSTANCE])
.get_status()
.status,
OZW_INSTANCE: msg[OZW_INSTANCE],
},
)
@websocket_api.websocket_command(
{
vol.Required(TYPE): "ozw/node_status",
vol.Required(NODE_ID): vol.Coerce(int),
vol.Optional(OZW_INSTANCE, default=1): vol.Coerce(int),
}
)
def websocket_node_status(self, hass, connection, msg):
"""Get the status for a Z-Wave node."""
node = self._manager.get_instance(msg[OZW_INSTANCE]).get_node(msg[NODE_ID])
connection.send_result(
msg[ID],
{
"node_query_stage": node.node_query_stage,
"node_id": node.node_id,
"is_zwave_plus": node.is_zwave_plus,
"is_awake": node.is_awake,
"is_failed": node.is_failed,
"node_baud_rate": node.node_baud_rate,
"is_beaming": node.is_beaming,
"is_flirs": node.is_flirs,
"is_routing": node.is_routing,
"is_securityv1": node.is_securityv1,
"node_basic_string": node.node_basic_string,
"node_generic_string": node.node_generic_string,
"node_specific_string": node.node_specific_string,
OZW_INSTANCE: msg[OZW_INSTANCE],
},
)
@websocket_api.websocket_command(
{
vol.Required(TYPE): "ozw/node_statistics",
vol.Required(NODE_ID): vol.Coerce(int),
vol.Optional(OZW_INSTANCE, default=1): vol.Coerce(int),
}
)
def websocket_node_statistics(self, hass, connection, msg):
"""Get the statistics for a Z-Wave node."""
stats = (
self._manager.get_instance(msg[OZW_INSTANCE])
.get_node(msg[NODE_ID])
.get_statistics()
)
connection.send_result(
msg[ID],
{
"node_id": msg[NODE_ID],
"send_count": stats.send_count,
"sent_failed": stats.sent_failed,
"retries": stats.retries,
"last_request_rtt": stats.last_request_rtt,
"last_response_rtt": stats.last_response_rtt,
"average_request_rtt": stats.average_request_rtt,
"average_response_rtt": stats.average_response_rtt,
"received_packets": stats.received_packets,
"received_dup_packets": stats.received_dup_packets,
"received_unsolicited": stats.received_unsolicited,
OZW_INSTANCE: msg[OZW_INSTANCE],
},
)