From 4f2be58fe4bdaa0a39b25e7300920ec91d4e8761 Mon Sep 17 00:00:00 2001 From: Simone Chemelli <simone.chemelli@gmail.com> Date: Fri, 18 Feb 2022 09:13:36 +0100 Subject: [PATCH] Fix wifi switches name for Fritz (#66529) --- homeassistant/components/fritz/const.py | 2 + homeassistant/components/fritz/switch.py | 57 +++++++++++++++--------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/homeassistant/components/fritz/const.py b/homeassistant/components/fritz/const.py index 0a4e9fd6cd8..635460db15f 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 d168878c5da..07eb2eb437f 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() ] -- GitLab