diff --git a/homeassistant/components/fritz/const.py b/homeassistant/components/fritz/const.py index 0a4e9fd6cd84fb759b9a1f59c7a377c2fe210929..635460db15fb0aa8b2793959a23f59e03451f7a3 100644 --- a/homeassistant/components/fritz/const.py +++ b/homeassistant/components/fritz/const.py @@ -64,3 +64,5 @@ FRITZ_EXCEPTIONS = ( FritzServiceError, FritzLookUpError, ) + +WIFI_STANDARD = {1: "2.4Ghz", 2: "5Ghz", 3: "5Ghz", 4: "Guest"} diff --git a/homeassistant/components/fritz/switch.py b/homeassistant/components/fritz/switch.py index d168878c5da66f0601a9fd876ebd0b6753d81e3d..07eb2eb437f8c41ef4583d2e3726274bb809181e 100644 --- a/homeassistant/components/fritz/switch.py +++ b/homeassistant/components/fritz/switch.py @@ -31,6 +31,7 @@ from .const import ( SWITCH_TYPE_DEFLECTION, SWITCH_TYPE_PORTFORWARD, SWITCH_TYPE_WIFINETWORK, + WIFI_STANDARD, MeshRoles, ) @@ -141,31 +142,43 @@ def wifi_entities_list( ) -> list[FritzBoxWifiSwitch]: """Get list of wifi entities.""" _LOGGER.debug("Setting up %s switches", SWITCH_TYPE_WIFINETWORK) - std_table = {"ax": "Wifi6", "ac": "5Ghz", "n": "2.4Ghz"} - if avm_wrapper.model == "FRITZ!Box 7390": - std_table = {"n": "5Ghz"} + # + # https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf + # + wifi_count = len( + [ + s + for s in avm_wrapper.connection.services + if s.startswith("WLANConfiguration") + ] + ) + _LOGGER.debug("WiFi networks count: %s", wifi_count) networks: dict = {} - for i in range(4): - if not ("WLANConfiguration" + str(i)) in avm_wrapper.connection.services: - continue - - network_info = avm_wrapper.get_wlan_configuration(i) - if network_info: - ssid = network_info["NewSSID"] - _LOGGER.debug("SSID from device: <%s>", ssid) - if slugify( - ssid, - ) in [slugify(v) for v in networks.values()]: - _LOGGER.debug("SSID duplicated, adding suffix") - networks[i] = f'{ssid} {std_table[network_info["NewStandard"]]}' - else: - networks[i] = ssid - _LOGGER.debug("SSID normalized: <%s>", networks[i]) - + for i in range(1, wifi_count + 1): + network_info = avm_wrapper.connection.call_action( + f"WLANConfiguration{i}", "GetInfo" + ) + # Devices with 4 WLAN services, use the 2nd for internal communications + if not (wifi_count == 4 and i == 2): + networks[i] = { + "ssid": network_info["NewSSID"], + "bssid": network_info["NewBSSID"], + "standard": network_info["NewStandard"], + "enabled": network_info["NewEnable"], + "status": network_info["NewStatus"], + } + for i, network in networks.copy().items(): + networks[i]["switch_name"] = network["ssid"] + if len([j for j, n in networks.items() if n["ssid"] == network["ssid"]]) > 1: + networks[i]["switch_name"] += f" ({WIFI_STANDARD[i]})" + + _LOGGER.debug("WiFi networks list: %s", networks) return [ - FritzBoxWifiSwitch(avm_wrapper, device_friendly_name, net, network_name) - for net, network_name in networks.items() + FritzBoxWifiSwitch( + avm_wrapper, device_friendly_name, index, data["switch_name"] + ) + for index, data in networks.items() ]