diff --git a/homeassistant/components/mikrotik/const.py b/homeassistant/components/mikrotik/const.py index 911d348365e0c061943c35eb7a48e16a01201bbc..4354b9b06bda551ecde5dff77852192bea3d8797 100644 --- a/homeassistant/components/mikrotik/const.py +++ b/homeassistant/components/mikrotik/const.py @@ -24,8 +24,11 @@ ARP: Final = "arp" CAPSMAN: Final = "capsman" DHCP: Final = "dhcp" WIRELESS: Final = "wireless" +WIFIWAVE2: Final = "wifiwave2" IS_WIRELESS: Final = "is_wireless" IS_CAPSMAN: Final = "is_capsman" +IS_WIFIWAVE2: Final = "is_wifiwave2" + MIKROTIK_SERVICES: Final = { ARP: "/ip/arp/getall", @@ -34,8 +37,10 @@ MIKROTIK_SERVICES: Final = { IDENTITY: "/system/identity/getall", INFO: "/system/routerboard/getall", WIRELESS: "/interface/wireless/registration-table/getall", + WIFIWAVE2: "/interface/wifiwave2/registration-table/print", IS_WIRELESS: "/interface/wireless/print", IS_CAPSMAN: "/caps-man/interface/print", + IS_WIFIWAVE2: "/interface/wifiwave2/print", } diff --git a/homeassistant/components/mikrotik/hub.py b/homeassistant/components/mikrotik/hub.py index 26a589486206e64fb798901d6f2a915cea7a0da1..9e0a610c7701b6739a9074ec2c344ab1d0bc47b4 100644 --- a/homeassistant/components/mikrotik/hub.py +++ b/homeassistant/components/mikrotik/hub.py @@ -31,9 +31,11 @@ from .const import ( IDENTITY, INFO, IS_CAPSMAN, + IS_WIFIWAVE2, IS_WIRELESS, MIKROTIK_SERVICES, NAME, + WIFIWAVE2, WIRELESS, ) from .device import Device @@ -57,6 +59,7 @@ class MikrotikData: self.devices: dict[str, Device] = {} self.support_capsman: bool = False self.support_wireless: bool = False + self.support_wifiwave2: bool = False self.hostname: str = "" self.model: str = "" self.firmware: str = "" @@ -97,6 +100,7 @@ class MikrotikData: self.serial_number = self.get_info(ATTR_SERIAL_NUMBER) self.support_capsman = bool(self.command(MIKROTIK_SERVICES[IS_CAPSMAN])) 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]]: """Get devices from interface.""" @@ -121,6 +125,9 @@ class MikrotikData: elif self.support_wireless: _LOGGER.debug("Hub supports wireless Interface") 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: device_list = self.all_devices diff --git a/tests/components/mikrotik/__init__.py b/tests/components/mikrotik/__init__.py index b7f79f8ea51184ac00698007b27229536f426062..158f86fe452d8e5146836f85da11d34da2680769 100644 --- a/tests/components/mikrotik/__init__.py +++ b/tests/components/mikrotik/__init__.py @@ -62,6 +62,14 @@ DEVICE_3_DHCP_NUMERIC_NAME = { "host-name": 123, "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 = { ".id": "*264", "interface": "wlan1", @@ -109,9 +117,27 @@ DEVICE_3_WIRELESS = { "mac-address": "00:00:00:00:00:03", "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] WIRELESS_DATA = [DEVICE_1_WIRELESS] +WIFIWAVE2_DATA = [DEVICE_4_WIFIWAVE2] ARP_DATA = [ { @@ -144,16 +170,22 @@ ARP_DATA = [ async def setup_mikrotik_entry(hass: HomeAssistant, **kwargs: Any) -> None: """Set up Mikrotik integration successfully.""" 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) 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: if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.IS_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]: return dhcp_data if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.WIRELESS]: return wireless_data + if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.WIFIWAVE2]: + return wifiwave2_data if cmd == mikrotik.const.MIKROTIK_SERVICES[mikrotik.const.ARP]: return ARP_DATA return {} diff --git a/tests/components/mikrotik/test_device_tracker.py b/tests/components/mikrotik/test_device_tracker.py index bd921320d7915c8b36062145b4cad16b9f89605f..323c958eb22d9673a70c5e086a3175213fb678ca 100644 --- a/tests/components/mikrotik/test_device_tracker.py +++ b/tests/components/mikrotik/test_device_tracker.py @@ -18,6 +18,8 @@ from . import ( DEVICE_2_WIRELESS, DEVICE_3_DHCP_NUMERIC_NAME, DEVICE_3_WIRELESS, + DEVICE_4_DHCP, + DEVICE_4_WIFIWAVE2, DHCP_DATA, MOCK_DATA, 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:02", "00:00:00:00:00:03", + "00:00:00:00:00:04", ) ): dev_reg.async_get_or_create( @@ -184,6 +187,26 @@ async def test_device_trackers_numerical_name( 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: """Test restoring existing device_tracker entities if not detected on startup.""" config_entry = MockConfigEntry(