Skip to content

Commit 7839a67

Browse files
committed
feat: option flow support network detect config
1 parent 0afb145 commit 7839a67

File tree

14 files changed

+556
-201
lines changed

14 files changed

+556
-201
lines changed

custom_components/xiaomi_home/config_flow.py

+303-132
Large diffs are not rendered by default.

custom_components/xiaomi_home/miot/miot_client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1870,7 +1870,7 @@ async def get_miot_instance_async(
18701870
if not network:
18711871
network = MIoTNetwork(
18721872
ip_addr_list=network_detect_addr.get('ip', []),
1873-
http_addr_list=network_detect_addr.get('http', []),
1873+
url_addr_list=network_detect_addr.get('url', []),
18741874
refresh_interval=NETWORK_REFRESH_INTERVAL,
18751875
loop=loop)
18761876
hass.data[DOMAIN]['miot_network'] = network

custom_components/xiaomi_home/miot/miot_network.py

+30-23
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class MIoTNetwork:
8383
'8.8.8.8', # Google Public DNS
8484
'9.9.9.9' # Quad9
8585
]
86-
_HTTP_ADDRESS_LIST: list[str] = [
86+
_URL_ADDRESS_LIST: list[str] = [
8787
'https://www.bing.com',
8888
'https://www.google.com',
8989
'https://www.baidu.com'
@@ -94,7 +94,7 @@ class MIoTNetwork:
9494
_main_loop: asyncio.AbstractEventLoop
9595

9696
_ip_addr_map: dict[str, float]
97-
_http_addr_list: dict[str, float]
97+
_url_addr_list: dict[str, float]
9898
_http_session: aiohttp.ClientSession
9999

100100
_refresh_interval: int
@@ -113,7 +113,7 @@ class MIoTNetwork:
113113
def __init__(
114114
self,
115115
ip_addr_list: Optional[list[str]] = None,
116-
http_addr_list: Optional[list[str]] = None,
116+
url_addr_list: Optional[list[str]] = None,
117117
refresh_interval: Optional[int] = None,
118118
loop: Optional[asyncio.AbstractEventLoop] = None
119119
) -> None:
@@ -122,8 +122,8 @@ def __init__(
122122
ip: self._DETECT_TIMEOUT for ip in
123123
ip_addr_list or self._IP_ADDRESS_LIST}
124124
self._http_addr_map = {
125-
http: self._DETECT_TIMEOUT for http in
126-
http_addr_list or self._HTTP_ADDRESS_LIST}
125+
url: self._DETECT_TIMEOUT for url in
126+
url_addr_list or self._URL_ADDRESS_LIST}
127127
self._http_session = aiohttp.ClientSession()
128128
self._refresh_interval = refresh_interval or self._REFRESH_INTERVAL
129129

@@ -171,14 +171,22 @@ def network_info(self) -> dict[str, NetworkInfo]:
171171
async def update_addr_list_async(
172172
self,
173173
ip_addr_list: Optional[list[str]] = None,
174-
http_addr_list: Optional[list[str]] = None,
174+
url_addr_list: Optional[list[str]] = None,
175175
) -> None:
176-
if ip_addr_list:
177-
self._ip_addr_map = {
178-
ip: self._DETECT_TIMEOUT for ip in ip_addr_list}
179-
if http_addr_list:
180-
self._http_addr_map = {
181-
http: self._DETECT_TIMEOUT for http in http_addr_list}
176+
new_ip_map: dict = {}
177+
for ip in ip_addr_list or self._IP_ADDRESS_LIST:
178+
if ip in self._ip_addr_map:
179+
new_ip_map[ip] = self._ip_addr_map[ip]
180+
else:
181+
new_ip_map[ip] = self._DETECT_TIMEOUT
182+
self._ip_addr_map = new_ip_map
183+
new_url_map: dict = {}
184+
for url in url_addr_list or self._URL_ADDRESS_LIST:
185+
if url in self._http_addr_map:
186+
new_url_map[url] = self._http_addr_map[url]
187+
else:
188+
new_url_map[url] = self._DETECT_TIMEOUT
189+
self._http_addr_map = new_url_map
182190

183191
def sub_network_status(
184192
self, key: str, handler: Callable[[bool], Coroutine]
@@ -210,18 +218,18 @@ async def get_network_status_async(self) -> bool:
210218
ip_ts = ts
211219
if (
212220
ip_ts < self._DETECT_TIMEOUT
213-
and self.ping_multi_async(ip_list=[ip_addr])
221+
and await self.ping_multi_async(ip_list=[ip_addr])
214222
):
215223
return True
216-
http_addr: str = ''
217-
http_ts: float = self._DETECT_TIMEOUT
224+
url_addr: str = ''
225+
url_ts: float = self._DETECT_TIMEOUT
218226
for http, ts in self._http_addr_map.items():
219-
if ts < http_ts:
220-
http_addr = http
221-
http_ts = ts
227+
if ts < url_ts:
228+
url_addr = http
229+
url_ts = ts
222230
if (
223-
http_ts < self._DETECT_TIMEOUT
224-
and await self.http_multi_async(url_list=[http_addr])
231+
url_ts < self._DETECT_TIMEOUT
232+
and await self.http_multi_async(url_list=[url_addr])
225233
):
226234
return True
227235
# Detect all addresses
@@ -293,9 +301,8 @@ async def __http_async(self, url: str) -> float:
293301
start_ts: float = self._main_loop.time()
294302
try:
295303
async with self._http_session.get(
296-
url, timeout=self._DETECT_TIMEOUT) as response:
297-
if response.status == 200:
298-
return self._main_loop.time() - start_ts
304+
url, timeout=self._DETECT_TIMEOUT):
305+
return self._main_loop.time() - start_ts
299306
except Exception: # pylint: disable=broad-exception-caught
300307
pass
301308
return self._DETECT_TIMEOUT

custom_components/xiaomi_home/translations/de.json

+20-4
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@
1111
},
1212
"auth_config": {
1313
"title": "Grundkonfiguration",
14-
"description": "### Anmeldegebiet\r\nWählen Sie das Gebiet, in dem sich Ihr Xiaomi Home-Konto befindet. Sie können es in der Xiaomi Home App unter `Mein (unten im Menü) > Weitere Einstellungen > Über Xiaomi Home` überprüfen.\r\n### Sprache\r\nWählen Sie die Sprache, in der Geräte und Entitätsnamen angezeigt werden. Teile von Sätzen, die nicht übersetzt sind, werden in Englisch angezeigt.\r\n### OAuth2-Authentifizierungs-Umleitungs-URL\r\nDie Umleitungs-URL für die OAuth2-Authentifizierung lautet **[http://homeassistant.local:8123](http://homeassistant.local:8123)**. Home Assistant muss im selben lokalen Netzwerk wie das aktuelle Betriebsterminal (z. B. ein persönlicher Computer) und das Betriebsterminal muss über diese Adresse auf die Home Assistant-Homepage zugreifen können. Andernfalls kann die Anmeldeauthentifizierung fehlschlagen.\r\n### Hinweis\r\n- Für Benutzer mit Hunderten oder mehr Mi Home-Geräten wird das erste Hinzufügen der Integration einige Zeit in Anspruch nehmen. Bitte haben Sie Geduld.\r\n- Wenn Home Assistant in einer Docker-Umgebung läuft, stellen Sie bitte sicher, dass der Docker-Netzwerkmodus auf host eingestellt ist, da sonst die lokale Steuerungsfunktion möglicherweise nicht richtig funktioniert.\r\n- Die lokale Steuerungsfunktion der Integration hat einige Abhängigkeiten. Bitte lesen Sie das README sorgfältig.",
14+
"description": "### Anmeldegebiet\r\nWählen Sie das Gebiet, in dem sich Ihr Xiaomi Home-Konto befindet. Sie können es in der Xiaomi Home App unter `Mein (unten im Menü) > Weitere Einstellungen > Über Xiaomi Home` überprüfen.\r\n### Sprache\r\nWählen Sie die Sprache, in der Geräte und Entitätsnamen angezeigt werden. Teile von Sätzen, die nicht übersetzt sind, werden in Englisch angezeigt.\r\n### OAuth2-Authentifizierungs-Umleitungs-URL\r\nDie Umleitungs-URL für die OAuth2-Authentifizierung lautet **[http://homeassistant.local:8123](http://homeassistant.local:8123)**. Home Assistant muss im selben lokalen Netzwerk wie das aktuelle Betriebsterminal (z. B. ein persönlicher Computer) und das Betriebsterminal muss über diese Adresse auf die Home Assistant-Homepage zugreifen können. Andernfalls kann die Anmeldeauthentifizierung fehlschlagen.\r\n### Netzwerkerkennungsadresse\r\nWird verwendet, um zu überprüfen, ob das Netzwerk normal funktioniert. Wenn nicht festgelegt, wird die Standardadresse des Systems verwendet. Wenn die Standardadressprüfung fehlschlägt, können Sie versuchen, eine benutzerdefinierte Adresse einzugeben.\r\n- Sie können mehrere Erkennungsadressen eingeben, getrennt durch ein Komma, z. B. `8.8.8.8,https://www.bing.com`\r\n- Wenn es sich um eine IP-Adresse handelt, wird die Erkennung durch Ping durchgeführt. Wenn es sich um eine HTTP(s)-Adresse handelt, wird die Erkennung durch einen HTTP GET-Aufruf durchgeführt.\r\n- **Diese Konfiguration ist global und Änderungen wirken sich auf andere Integrationsinstanzen aus. Bitte ändern Sie sie mit Vorsicht.**\r\n### Hinweis\r\n- Für Benutzer mit Hunderten oder mehr Mi Home-Geräten wird das erste Hinzufügen der Integration einige Zeit in Anspruch nehmen. Bitte haben Sie Geduld.\r\n- Wenn Home Assistant in einer Docker-Umgebung läuft, stellen Sie bitte sicher, dass der Docker-Netzwerkmodus auf host eingestellt ist, da sonst die lokale Steuerungsfunktion möglicherweise nicht richtig funktioniert.\r\n- Die lokale Steuerungsfunktion der Integration hat einige Abhängigkeiten. Bitte lesen Sie das README sorgfältig.",
1515
"data": {
1616
"cloud_server": "Anmeldegebiet",
1717
"integration_language": "Sprache",
18-
"oauth_redirect_url": "OAuth2-Authentifizierungs-Umleitungs-URL"
18+
"oauth_redirect_url": "OAuth2-Authentifizierungs-Umleitungs-URL",
19+
"network_detect_addr": "Netzwerkerkennungsadresse"
1920
}
2021
},
2122
"oauth_error": {
@@ -70,7 +71,11 @@
7071
"no_family_selected": "Keine Familie ausgewählt.",
7172
"no_devices": "Im ausgewählten Haushalt sind keine Geräte vorhanden. Bitte wählen Sie einen Haushalt mit Geräten aus und fahren Sie fort.",
7273
"no_filter_devices": "Gefilterte Geräte sind leer. Bitte wählen Sie gültige Filterkriterien aus und fahren Sie fort.",
73-
"no_central_device": "Im Modus \"Xiaomi Central Hub Gateway\" muss ein verfügbares Xiaomi Central Hub Gateway im lokalen Netzwerk von Home Assistant vorhanden sein. Stellen Sie sicher, dass die ausgewählte Familie diese Anforderungen erfüllt."
74+
"no_central_device": "Im Modus \"Xiaomi Central Hub Gateway\" muss ein verfügbares Xiaomi Central Hub Gateway im lokalen Netzwerk von Home Assistant vorhanden sein. Stellen Sie sicher, dass die ausgewählte Familie diese Anforderungen erfüllt.",
75+
"invalid_network_addr": "Ungültige IP-Adresse oder HTTP-Adresse vorhanden, bitte geben Sie eine gültige Adresse ein.",
76+
"invalid_ip_addr": "Unzugängliche IP-Adresse vorhanden, bitte geben Sie eine gültige IP-Adresse ein.",
77+
"invalid_http_addr": "Unzugängliche HTTP-Adresse vorhanden, bitte geben Sie eine gültige HTTP-Adresse ein.",
78+
"invalid_default_addr": "Die Standard-Netzwerkerkennungsadresse ist nicht erreichbar, bitte überprüfen Sie die Netzwerkkonfiguration oder verwenden Sie eine benutzerdefinierte Netzwerkerkennungsadresse."
7479
},
7580
"abort": {
7681
"network_connect_error": "Konfiguration fehlgeschlagen. Netzwerkverbindung fehlgeschlagen. Überprüfen Sie die Netzwerkkonfiguration des Geräts.",
@@ -152,6 +157,13 @@
152157
"enable_subscribe": "LAN-Abonnement aktivieren"
153158
}
154159
},
160+
"network_detect_config": {
161+
"title": "Netzwerkerkennungs-Konfiguration",
162+
"description": "## Gebrauchsanweisung\r\n### Netzwerk-Erkennungsadresse\r\nWird verwendet, um zu überprüfen, ob das Netzwerk normal funktioniert. Wenn nicht festgelegt, wird die Standardadresse des Systems verwendet. Wenn die Standardadressprüfung fehlschlägt, können Sie versuchen, eine benutzerdefinierte Adresse einzugeben.\r\n- Sie können mehrere Erkennungsadressen eingeben, getrennt durch ein Komma, z. B. `8.8.8.8,https://www.bing.com`\r\n- Wenn es sich um eine IP-Adresse handelt, wird die Erkennung durch Ping durchgeführt. Wenn es sich um eine HTTP(s)-Adresse handelt, wird die Erkennung durch einen HTTP GET-Aufruf durchgeführt.\r\n- **Diese Konfiguration ist global und Änderungen wirken sich auf andere Integrationsinstanzen aus. Bitte ändern Sie sie mit Vorsicht.**",
163+
"data": {
164+
"network_detect_addr": "Netzwerkerkennungsadresse"
165+
}
166+
},
155167
"config_confirm": {
156168
"title": "Bestätigen Sie die Konfiguration",
157169
"description": "**{nick_name}**, bitte bestätigen Sie die neuesten Konfigurationsinformationen und klicken Sie dann auf \"Senden\". Die Integration wird mit den aktualisierten Konfigurationen erneut geladen.\r\n\r\nIntegrationsprache:\t{lang_new}\r\nBenutzername:\t{nick_name_new}\r\nAction-Debug-Modus:\t{action_debug}\r\nVerstecke Nicht-Standard-Entitäten:\t{hide_non_standard_entities}\r\nGerätestatusänderungen anzeigen:\t{display_devices_changed_notify}\r\nGeräteänderungen:\t{devices_add} neue Geräte hinzufügen, {devices_remove} Geräte entfernen\r\nKonvertierungsregeländerungen:\tInsgesamt {trans_rules_count} Regeln, aktualisiert {trans_rules_count_success} Regeln",
@@ -174,7 +186,11 @@
174186
"no_central_device": "Der Modus \"Zentral Gateway\" erfordert ein verfügbares Xiaomi-Zentral-Gateway im lokalen Netzwerk, in dem Home Assistant installiert ist. Überprüfen Sie, ob die ausgewählte Familie diese Anforderung erfüllt.",
175187
"mdns_discovery_error": "Lokaler Geräteerkennungsdienstfehler.",
176188
"update_config_error": "Fehler beim Aktualisieren der Konfigurationsinformationen.",
177-
"not_confirm": "Änderungen wurden nicht bestätigt. Bitte bestätigen Sie die Auswahl, bevor Sie sie einreichen."
189+
"not_confirm": "Änderungen wurden nicht bestätigt. Bitte bestätigen Sie die Auswahl, bevor Sie sie einreichen.",
190+
"invalid_network_addr": "Ungültige IP-Adresse oder HTTP-Adresse vorhanden, bitte geben Sie eine gültige Adresse ein.",
191+
"invalid_ip_addr": "Unzugängliche IP-Adresse vorhanden, bitte geben Sie eine gültige IP-Adresse ein.",
192+
"invalid_http_addr": "Unzugängliche HTTP-Adresse vorhanden, bitte geben Sie eine gültige HTTP-Adresse ein.",
193+
"invalid_default_addr": "Die Standard-Netzwerkerkennungsadresse ist nicht erreichbar, bitte überprüfen Sie die Netzwerkkonfiguration oder verwenden Sie eine benutzerdefinierte Netzwerkerkennungsadresse."
178194
},
179195
"abort": {
180196
"network_connect_error": "Konfiguration fehlgeschlagen. Netzwerkverbindungsfehler. Überprüfen Sie die Netzwerkkonfiguration des Geräts.",

0 commit comments

Comments
 (0)