feat: netwatch binary sensor

This commit is contained in:
Andrey Chalkin 2023-10-11 19:08:25 +02:00
parent 2cdd645274
commit 13e765c10a
No known key found for this signature in database
GPG key ID: 4564F1942FA13A00
9 changed files with 95 additions and 1 deletions

View file

@ -106,6 +106,11 @@ Track availability of all network devices. All devices visible to Mikrotik devic
![Host tracker](https://raw.githubusercontent.com/tomaae/homeassistant-mikrotik_router/master/docs/assets/images/ui/host_tracker.png) ![Host tracker](https://raw.githubusercontent.com/tomaae/homeassistant-mikrotik_router/master/docs/assets/images/ui/host_tracker.png)
## Netwatch Tracking
Track netwatch status.
![Netwatch](https://raw.githubusercontent.com/tomaae/homeassistant-mikrotik_router/master/docs/assets/images/ui/netwatch_tracker.png)
## Scripts ## Scripts
Execute Mikrotik Router scripts. Execute Mikrotik Router scripts.
You can execute scripts by automatically created switches or using services. You can execute scripts by automatically created switches or using services.

View file

@ -16,12 +16,15 @@ from .binary_sensor_types import (
DEVICE_ATTRIBUTES_IFACE_ETHER, DEVICE_ATTRIBUTES_IFACE_ETHER,
DEVICE_ATTRIBUTES_IFACE_SFP, DEVICE_ATTRIBUTES_IFACE_SFP,
DEVICE_ATTRIBUTES_IFACE_WIRELESS, DEVICE_ATTRIBUTES_IFACE_WIRELESS,
DEVICE_ATTRIBUTES_NETWATCH,
) )
from .const import ( from .const import (
CONF_SENSOR_PPP, CONF_SENSOR_PPP,
DEFAULT_SENSOR_PPP, DEFAULT_SENSOR_PPP,
CONF_SENSOR_PORT_TRACKER, CONF_SENSOR_PORT_TRACKER,
DEFAULT_SENSOR_PORT_TRACKER, DEFAULT_SENSOR_PORT_TRACKER,
CONF_SENSOR_NETWATCH_TRACKER,
DEFAULT_SENSOR_NETWATCH_TRACKER,
) )
from .entity import MikrotikEntity, async_add_entities from .entity import MikrotikEntity, async_add_entities
from .helper import format_attribute from .helper import format_attribute

View file

@ -108,6 +108,15 @@ DEVICE_ATTRIBUTES_UPS = [
"hid-self-test", "hid-self-test",
] ]
DEVICE_ATTRIBUTES_NETWATCH = [
"host",
"type",
"interval",
"port",
"http-codes",
"status",
"comment",
]
@dataclass @dataclass
class MikrotikBinarySensorEntityDescription(BinarySensorEntityDescription): class MikrotikBinarySensorEntityDescription(BinarySensorEntityDescription):
@ -177,6 +186,24 @@ SENSOR_TYPES: tuple[BinarySensorEntityDescription, ...] = (
data_attributes_list=DEVICE_ATTRIBUTES_IFACE, data_attributes_list=DEVICE_ATTRIBUTES_IFACE,
func="MikrotikPortBinarySensor", func="MikrotikPortBinarySensor",
), ),
MikrotikBinarySensorEntityDescription(
key="netwatch",
name="Netwatch",
icon_enabled="mdi:lan-connect",
icon_disabled="mdi:lan-pending",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
ha_group="Netwatch",
ha_connection=DOMAIN,
ha_connection_value="Netwatch",
data_path="netwatch",
data_attribute="status",
data_name="host",
data_name_comment=True,
data_uid="host",
data_reference="host",
data_attributes_list=DEVICE_ATTRIBUTES_NETWATCH,
func="MikrotikBinarySensor",
),
) )
SENSOR_SERVICES = {} SENSOR_SERVICES = {}

View file

@ -59,6 +59,8 @@ from .const import (
DEFAULT_PORT, DEFAULT_PORT,
DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_NAME,
DEFAULT_SSL, DEFAULT_SSL,
DEFAULT_SENSOR_NETWATCH_TRACKER,
CONF_SENSOR_NETWATCH_TRACKER,
) )
from .mikrotikapi import MikrotikAPI from .mikrotikapi import MikrotikAPI
@ -280,6 +282,12 @@ class MikrotikControllerOptionsFlowHandler(OptionsFlow):
CONF_SENSOR_KIDCONTROL, DEFAULT_SENSOR_KIDCONTROL CONF_SENSOR_KIDCONTROL, DEFAULT_SENSOR_KIDCONTROL
), ),
): bool, ): bool,
vol.Optional(
CONF_SENSOR_NETWATCH_TRACKER,
default=self.config_entry.options.get(
CONF_SENSOR_NETWATCH_TRACKER, DEFAULT_SENSOR_NETWATCH_TRACKER
),
): bool,
vol.Optional( vol.Optional(
CONF_SENSOR_PPP, CONF_SENSOR_PPP,
default=self.config_entry.options.get( default=self.config_entry.options.get(

View file

@ -58,6 +58,8 @@ CONF_SENSOR_SCRIPTS = "sensor_scripts"
DEFAULT_SENSOR_SCRIPTS = False DEFAULT_SENSOR_SCRIPTS = False
CONF_SENSOR_ENVIRONMENT = "sensor_environment" CONF_SENSOR_ENVIRONMENT = "sensor_environment"
DEFAULT_SENSOR_ENVIRONMENT = False DEFAULT_SENSOR_ENVIRONMENT = False
CONF_SENSOR_NETWATCH_TRACKER = "sensor_netwatch_tracker"
DEFAULT_SENSOR_NETWATCH_TRACKER = False
TO_REDACT = { TO_REDACT = {
"ip-address", "ip-address",

View file

@ -59,7 +59,7 @@ from .const import (
CONF_SENSOR_SCRIPTS, CONF_SENSOR_SCRIPTS,
DEFAULT_SENSOR_SCRIPTS, DEFAULT_SENSOR_SCRIPTS,
CONF_SENSOR_ENVIRONMENT, CONF_SENSOR_ENVIRONMENT,
DEFAULT_SENSOR_ENVIRONMENT, DEFAULT_SENSOR_ENVIRONMENT, CONF_SENSOR_NETWATCH_TRACKER, DEFAULT_SENSOR_NETWATCH_TRACKER,
) )
from .exceptions import ApiEntryNotFound from .exceptions import ApiEntryNotFound
from .apiparser import parse_api from .apiparser import parse_api
@ -258,6 +258,7 @@ class MikrotikCoordinator(DataUpdateCoordinator[None]):
"environment": {}, "environment": {},
"ups": {}, "ups": {},
"gps": {}, "gps": {},
"netwatch": {}
} }
self.notified_flags = [] self.notified_flags = []
@ -386,6 +387,14 @@ class MikrotikCoordinator(DataUpdateCoordinator[None]):
CONF_SENSOR_KIDCONTROL, DEFAULT_SENSOR_KIDCONTROL CONF_SENSOR_KIDCONTROL, DEFAULT_SENSOR_KIDCONTROL
) )
# ---------------------------
# option_sensor_netwatch
# ---------------------------
@property
def option_sensor_netwatch(self):
"""Config entry option to not track ARP."""
return self.config_entry.options.get(CONF_SENSOR_NETWATCH_TRACKER, DEFAULT_SENSOR_NETWATCH_TRACKER)
# --------------------------- # ---------------------------
# option_sensor_ppp # option_sensor_ppp
# --------------------------- # ---------------------------
@ -627,6 +636,9 @@ class MikrotikCoordinator(DataUpdateCoordinator[None]):
if self.api.connected() and self.option_sensor_filter: if self.api.connected() and self.option_sensor_filter:
await self.hass.async_add_executor_job(self.get_filter) await self.hass.async_add_executor_job(self.get_filter)
if self.api.connected() and self.option_sensor_netwatch:
await self.hass.async_add_executor_job(self.get_netwatch)
if self.api.connected() and self.support_ppp and self.option_sensor_ppp: if self.api.connected() and self.support_ppp and self.option_sensor_ppp:
await self.hass.async_add_executor_job(self.get_ppp) await self.hass.async_add_executor_job(self.get_ppp)
@ -1310,6 +1322,32 @@ class MikrotikCoordinator(DataUpdateCoordinator[None]):
self.ds["ppp_secret"][uid]["address"] = "not connected" self.ds["ppp_secret"][uid]["address"] = "not connected"
self.ds["ppp_secret"][uid]["encoding"] = "not connected" self.ds["ppp_secret"][uid]["encoding"] = "not connected"
# ---------------------------
# get_netwatch
# ---------------------------
def get_netwatch(self) -> None:
"""Get netwatch data from Mikrotik"""
self.ds["netwatch"] = parse_api(
data=self.ds["netwatch"],
source=self.api.query("/tool/netwatch"),
key="host",
vals=[
{"name": "host"},
{"name": "type"},
{"name": "interval"},
{"name": "port"},
{"name": "http-codes"},
{"name": "status", "type": "bool", "default": "unknown"},
{"name": "comment"},
{
"name": "enabled",
"source": "disabled",
"type": "bool",
"reverse": True,
},
],
)
# --------------------------- # ---------------------------
# get_system_routerboard # get_system_routerboard
# --------------------------- # ---------------------------

View file

@ -26,6 +26,8 @@ from .const import (
DEFAULT_TRACK_HOSTS, DEFAULT_TRACK_HOSTS,
CONF_SENSOR_PORT_TRACKER, CONF_SENSOR_PORT_TRACKER,
DEFAULT_SENSOR_PORT_TRACKER, DEFAULT_SENSOR_PORT_TRACKER,
CONF_SENSOR_NETWATCH_TRACKER,
DEFAULT_SENSOR_NETWATCH_TRACKER,
) )
from .coordinator import MikrotikCoordinator, MikrotikTrackerCoordinator from .coordinator import MikrotikCoordinator, MikrotikTrackerCoordinator
from .helper import format_attribute from .helper import format_attribute
@ -70,6 +72,14 @@ def _skip_sensor(config_entry, entity_description, data, uid) -> bool:
): ):
return True return True
if (
entity_description.data_path == "netwatch"
and not config_entry.options.get(
CONF_SENSOR_NETWATCH_TRACKER, DEFAULT_SENSOR_NETWATCH_TRACKER
)
):
return True
# Device Tracker # Device Tracker
if ( if (
# Skip if host tracking is disabled # Skip if host tracking is disabled

View file

@ -39,6 +39,7 @@
"data": { "data": {
"track_network_hosts": "Track network devices", "track_network_hosts": "Track network devices",
"sensor_port_tracker": "Port tracker sensors", "sensor_port_tracker": "Port tracker sensors",
"sensor_netwatch_tracker": "Netwatch tracker sensors",
"sensor_port_traffic": "Port traffic sensors", "sensor_port_traffic": "Port traffic sensors",
"sensor_client_traffic": "Client traffic sensors", "sensor_client_traffic": "Client traffic sensors",
"sensor_client_captive": "Captive portal data", "sensor_client_captive": "Captive portal data",

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB