mirror of
https://github.com/tomaae/homeassistant-mikrotik_router.git
synced 2025-07-08 16:34:28 +02:00
feat: netwatch binary sensor
This commit is contained in:
parent
2cdd645274
commit
13e765c10a
9 changed files with 95 additions and 1 deletions
|
@ -106,6 +106,11 @@ Track availability of all network devices. All devices visible to Mikrotik devic
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
## Netwatch Tracking
|
||||||
|
Track netwatch status.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## 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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 = {}
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
# ---------------------------
|
# ---------------------------
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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",
|
||||||
|
|
BIN
docs/assets/images/ui/netwatch_tracker.png
Normal file
BIN
docs/assets/images/ui/netwatch_tracker.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
Loading…
Add table
Add a link
Reference in a new issue