Add Mikrotik WifiWave2 (#89711)
* Add support for wifiwave2 * Add test for wifiwave2
This commit is contained in:
parent
b399e5c8b7
commit
8807878529
4 changed files with 67 additions and 0 deletions
|
@ -24,8 +24,11 @@ ARP: Final = "arp"
|
||||||
CAPSMAN: Final = "capsman"
|
CAPSMAN: Final = "capsman"
|
||||||
DHCP: Final = "dhcp"
|
DHCP: Final = "dhcp"
|
||||||
WIRELESS: Final = "wireless"
|
WIRELESS: Final = "wireless"
|
||||||
|
WIFIWAVE2: Final = "wifiwave2"
|
||||||
IS_WIRELESS: Final = "is_wireless"
|
IS_WIRELESS: Final = "is_wireless"
|
||||||
IS_CAPSMAN: Final = "is_capsman"
|
IS_CAPSMAN: Final = "is_capsman"
|
||||||
|
IS_WIFIWAVE2: Final = "is_wifiwave2"
|
||||||
|
|
||||||
|
|
||||||
MIKROTIK_SERVICES: Final = {
|
MIKROTIK_SERVICES: Final = {
|
||||||
ARP: "/ip/arp/getall",
|
ARP: "/ip/arp/getall",
|
||||||
|
@ -34,8 +37,10 @@ MIKROTIK_SERVICES: Final = {
|
||||||
IDENTITY: "/system/identity/getall",
|
IDENTITY: "/system/identity/getall",
|
||||||
INFO: "/system/routerboard/getall",
|
INFO: "/system/routerboard/getall",
|
||||||
WIRELESS: "/interface/wireless/registration-table/getall",
|
WIRELESS: "/interface/wireless/registration-table/getall",
|
||||||
|
WIFIWAVE2: "/interface/wifiwave2/registration-table/print",
|
||||||
IS_WIRELESS: "/interface/wireless/print",
|
IS_WIRELESS: "/interface/wireless/print",
|
||||||
IS_CAPSMAN: "/caps-man/interface/print",
|
IS_CAPSMAN: "/caps-man/interface/print",
|
||||||
|
IS_WIFIWAVE2: "/interface/wifiwave2/print",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,9 +31,11 @@ from .const import (
|
||||||
IDENTITY,
|
IDENTITY,
|
||||||
INFO,
|
INFO,
|
||||||
IS_CAPSMAN,
|
IS_CAPSMAN,
|
||||||
|
IS_WIFIWAVE2,
|
||||||
IS_WIRELESS,
|
IS_WIRELESS,
|
||||||
MIKROTIK_SERVICES,
|
MIKROTIK_SERVICES,
|
||||||
NAME,
|
NAME,
|
||||||
|
WIFIWAVE2,
|
||||||
WIRELESS,
|
WIRELESS,
|
||||||
)
|
)
|
||||||
from .device import Device
|
from .device import Device
|
||||||
|
@ -57,6 +59,7 @@ class MikrotikData:
|
||||||
self.devices: dict[str, Device] = {}
|
self.devices: dict[str, Device] = {}
|
||||||
self.support_capsman: bool = False
|
self.support_capsman: bool = False
|
||||||
self.support_wireless: bool = False
|
self.support_wireless: bool = False
|
||||||
|
self.support_wifiwave2: bool = False
|
||||||
self.hostname: str = ""
|
self.hostname: str = ""
|
||||||
self.model: str = ""
|
self.model: str = ""
|
||||||
self.firmware: str = ""
|
self.firmware: str = ""
|
||||||
|
@ -97,6 +100,7 @@ class MikrotikData:
|
||||||
self.serial_number = self.get_info(ATTR_SERIAL_NUMBER)
|
self.serial_number = self.get_info(ATTR_SERIAL_NUMBER)
|
||||||
self.support_capsman = bool(self.command(MIKROTIK_SERVICES[IS_CAPSMAN]))
|
self.support_capsman = bool(self.command(MIKROTIK_SERVICES[IS_CAPSMAN]))
|
||||||
self.support_wireless = bool(self.command(MIKROTIK_SERVICES[IS_WIRELESS]))
|
self.support_wireless = bool(self.command(MIKROTIK_SERVICES[IS_WIRELESS]))
|
||||||
|
self.support_wifiwave2 = bool(self.command(MIKROTIK_SERVICES[IS_WIFIWAVE2]))
|
||||||
|
|
||||||
def get_list_from_interface(self, interface: str) -> dict[str, dict[str, Any]]:
|
def get_list_from_interface(self, interface: str) -> dict[str, dict[str, Any]]:
|
||||||
"""Get devices from interface."""
|
"""Get devices from interface."""
|
||||||
|
@ -121,6 +125,9 @@ class MikrotikData:
|
||||||
elif self.support_wireless:
|
elif self.support_wireless:
|
||||||
_LOGGER.debug("Hub supports wireless Interface")
|
_LOGGER.debug("Hub supports wireless Interface")
|
||||||
device_list = wireless_devices = self.get_list_from_interface(WIRELESS)
|
device_list = wireless_devices = self.get_list_from_interface(WIRELESS)
|
||||||
|
elif self.support_wifiwave2:
|
||||||
|
_LOGGER.debug("Hub supports wifiwave2 Interface")
|
||||||
|
device_list = wireless_devices = self.get_list_from_interface(WIFIWAVE2)
|
||||||
|
|
||||||
if not device_list or self.force_dhcp:
|
if not device_list or self.force_dhcp:
|
||||||
device_list = self.all_devices
|
device_list = self.all_devices
|
||||||
|
|
|
@ -62,6 +62,14 @@ DEVICE_3_DHCP_NUMERIC_NAME = {
|
||||||
"host-name": 123,
|
"host-name": 123,
|
||||||
"comment": "Mobile",
|
"comment": "Mobile",
|
||||||
}
|
}
|
||||||
|
DEVICE_4_DHCP = {
|
||||||
|
".id": "*F7",
|
||||||
|
"address": "0.0.0.4",
|
||||||
|
"mac-address": "00:00:00:00:00:04",
|
||||||
|
"active-address": "0.0.0.4",
|
||||||
|
"host-name": "Device_4",
|
||||||
|
"comment": "Wifiwave2 device",
|
||||||
|
}
|
||||||
DEVICE_1_WIRELESS = {
|
DEVICE_1_WIRELESS = {
|
||||||
".id": "*264",
|
".id": "*264",
|
||||||
"interface": "wlan1",
|
"interface": "wlan1",
|
||||||
|
@ -109,9 +117,27 @@ DEVICE_3_WIRELESS = {
|
||||||
"mac-address": "00:00:00:00:00:03",
|
"mac-address": "00:00:00:00:00:03",
|
||||||
"last-ip": "0.0.0.3",
|
"last-ip": "0.0.0.3",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEVICE_4_WIFIWAVE2 = {
|
||||||
|
".id": "*F7",
|
||||||
|
"interface": "wifi1",
|
||||||
|
"ssid": "test-ssid",
|
||||||
|
"mac-address": "00:00:00:00:00:04",
|
||||||
|
"uptime": "2d15h28m27s",
|
||||||
|
"signal": -47,
|
||||||
|
"tx-rate": 54000000,
|
||||||
|
"rx-rate": 54000000,
|
||||||
|
"packets": "17748,18516",
|
||||||
|
"bytes": "1851474,2037295",
|
||||||
|
"tx-bits-per-second": 0,
|
||||||
|
"rx-bits-per-second": 0,
|
||||||
|
"authorized": True,
|
||||||
|
}
|
||||||
|
|
||||||
DHCP_DATA = [DEVICE_1_DHCP, DEVICE_2_DHCP]
|
DHCP_DATA = [DEVICE_1_DHCP, DEVICE_2_DHCP]
|
||||||
|
|
||||||
WIRELESS_DATA = [DEVICE_1_WIRELESS]
|
WIRELESS_DATA = [DEVICE_1_WIRELESS]
|
||||||
|
WIFIWAVE2_DATA = [DEVICE_4_WIFIWAVE2]
|
||||||
|
|
||||||
ARP_DATA = [
|
ARP_DATA = [
|
||||||
{
|
{
|
||||||
|
@ -144,16 +170,22 @@ ARP_DATA = [
|
||||||
async def setup_mikrotik_entry(hass: HomeAssistant, **kwargs: Any) -> None:
|
async def setup_mikrotik_entry(hass: HomeAssistant, **kwargs: Any) -> None:
|
||||||
"""Set up Mikrotik integration successfully."""
|
"""Set up Mikrotik integration successfully."""
|
||||||
support_wireless: bool = kwargs.get("support_wireless", True)
|
support_wireless: bool = kwargs.get("support_wireless", True)
|
||||||
|
support_wifiwave2: bool = kwargs.get("support_wifiwave2", False)
|
||||||
dhcp_data: list[dict[str, Any]] = kwargs.get("dhcp_data", DHCP_DATA)
|
dhcp_data: list[dict[str, Any]] = kwargs.get("dhcp_data", DHCP_DATA)
|
||||||
wireless_data: list[dict[str, Any]] = kwargs.get("wireless_data", WIRELESS_DATA)
|
wireless_data: list[dict[str, Any]] = kwargs.get("wireless_data", WIRELESS_DATA)
|
||||||
|
wifiwave2_data: list[dict[str, Any]] = kwargs.get("wifiwave2_data", WIFIWAVE2_DATA)
|
||||||
|
|
||||||
def mock_command(self, cmd: str, params: dict[str, Any] | None = None) -> Any:
|
def mock_command(self, cmd: str, params: dict[str, Any] | None = None) -> Any:
|
||||||
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.IS_WIRELESS]:
|
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.IS_WIRELESS]:
|
||||||
return support_wireless
|
return support_wireless
|
||||||
|
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.IS_WIFIWAVE2]:
|
||||||
|
return support_wifiwave2
|
||||||
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.DHCP]:
|
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.DHCP]:
|
||||||
return dhcp_data
|
return dhcp_data
|
||||||
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.WIRELESS]:
|
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.WIRELESS]:
|
||||||
return wireless_data
|
return wireless_data
|
||||||
|
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.WIFIWAVE2]:
|
||||||
|
return wifiwave2_data
|
||||||
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.ARP]:
|
if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.ARP]:
|
||||||
return ARP_DATA
|
return ARP_DATA
|
||||||
return {}
|
return {}
|
||||||
|
|
|
@ -18,6 +18,8 @@ from . import (
|
||||||
DEVICE_2_WIRELESS,
|
DEVICE_2_WIRELESS,
|
||||||
DEVICE_3_DHCP_NUMERIC_NAME,
|
DEVICE_3_DHCP_NUMERIC_NAME,
|
||||||
DEVICE_3_WIRELESS,
|
DEVICE_3_WIRELESS,
|
||||||
|
DEVICE_4_DHCP,
|
||||||
|
DEVICE_4_WIFIWAVE2,
|
||||||
DHCP_DATA,
|
DHCP_DATA,
|
||||||
MOCK_DATA,
|
MOCK_DATA,
|
||||||
MOCK_OPTIONS,
|
MOCK_OPTIONS,
|
||||||
|
@ -39,6 +41,7 @@ def mock_device_registry_devices(hass: HomeAssistant) -> None:
|
||||||
"00:00:00:00:00:01",
|
"00:00:00:00:00:01",
|
||||||
"00:00:00:00:00:02",
|
"00:00:00:00:00:02",
|
||||||
"00:00:00:00:00:03",
|
"00:00:00:00:00:03",
|
||||||
|
"00:00:00:00:00:04",
|
||||||
)
|
)
|
||||||
):
|
):
|
||||||
dev_reg.async_get_or_create(
|
dev_reg.async_get_or_create(
|
||||||
|
@ -184,6 +187,26 @@ async def test_device_trackers_numerical_name(
|
||||||
assert device_3.attributes["host_name"] == "123"
|
assert device_3.attributes["host_name"] == "123"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_hub_wifiwave2(hass: HomeAssistant, mock_device_registry_devices) -> None:
|
||||||
|
"""Test device_trackers created when hub supports wifiwave2."""
|
||||||
|
|
||||||
|
await setup_mikrotik_entry(
|
||||||
|
hass,
|
||||||
|
dhcp_data=[DEVICE_4_DHCP],
|
||||||
|
wifiwave2_data=[DEVICE_4_WIFIWAVE2],
|
||||||
|
support_wireless=False,
|
||||||
|
support_wifiwave2=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
device_4 = hass.states.get("device_tracker.device_4")
|
||||||
|
assert device_4
|
||||||
|
assert device_4.state == "home"
|
||||||
|
assert device_4.attributes["friendly_name"] == "Device_4"
|
||||||
|
assert device_4.attributes["ip"] == "0.0.0.4"
|
||||||
|
assert device_4.attributes["mac"] == "00:00:00:00:00:04"
|
||||||
|
assert device_4.attributes["host_name"] == "Device_4"
|
||||||
|
|
||||||
|
|
||||||
async def test_restoring_devices(hass: HomeAssistant) -> None:
|
async def test_restoring_devices(hass: HomeAssistant) -> None:
|
||||||
"""Test restoring existing device_tracker entities if not detected on startup."""
|
"""Test restoring existing device_tracker entities if not detected on startup."""
|
||||||
config_entry = MockConfigEntry(
|
config_entry = MockConfigEntry(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue