From 711a00225fa7126be75b4571f9b42782568a55ce Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Tue, 16 Nov 2021 12:40:54 +0100 Subject: [PATCH 01/13] Use source list property instead of the attribute in Denon AVR integration (#59768) --- homeassistant/components/denonavr/media_player.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/denonavr/media_player.py b/homeassistant/components/denonavr/media_player.py index 39186680e09..c3106a98c72 100644 --- a/homeassistant/components/denonavr/media_player.py +++ b/homeassistant/components/denonavr/media_player.py @@ -155,7 +155,6 @@ class DenonDevice(MediaPlayerEntity): name=config_entry.title, ) self._attr_sound_mode_list = receiver.sound_mode_list - self._attr_source_list = receiver.input_func_list self._receiver = receiver self._update_audyssey = update_audyssey @@ -246,6 +245,11 @@ class DenonDevice(MediaPlayerEntity): """Return the state of the device.""" return self._receiver.state + @property + def source_list(self): + """Return a list of available input sources.""" + return self._receiver.input_func_list + @property def is_volume_muted(self): """Return boolean if volume is currently muted.""" From 7316e0555b87d23d6288fd603415b7c0a8116297 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Tue, 16 Nov 2021 19:30:50 +0100 Subject: [PATCH 02/13] Fix typo in attribute for Fritz (#59791) --- homeassistant/components/fritz/binary_sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/fritz/binary_sensor.py b/homeassistant/components/fritz/binary_sensor.py index 994c7ff656e..594c1721be4 100644 --- a/homeassistant/components/fritz/binary_sensor.py +++ b/homeassistant/components/fritz/binary_sensor.py @@ -92,5 +92,5 @@ class FritzBoxBinarySensor(FritzBoxBaseEntity, BinarySensorEntity): self._attr_is_on = self._fritzbox_tools.update_available self._attr_extra_state_attributes = { "installed_version": self._fritzbox_tools.current_firmware, - "latest_available_version:": self._fritzbox_tools.latest_firmware, + "latest_available_version": self._fritzbox_tools.latest_firmware, } From 85abc4034d328ddbabde32a5daa4d631087214b7 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Wed, 17 Nov 2021 11:49:12 +0100 Subject: [PATCH 03/13] Fix Netgear init error on orbi models (#59799) * fix Netgear init error on orbi models * Update sensor.py --- homeassistant/components/netgear/router.py | 2 ++ homeassistant/components/netgear/sensor.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/netgear/router.py b/homeassistant/components/netgear/router.py index 3c2497f2131..8a9a4b3ef85 100644 --- a/homeassistant/components/netgear/router.py +++ b/homeassistant/components/netgear/router.py @@ -173,6 +173,8 @@ class NetgearRouter: "link_rate": None, "signal": None, "ip": None, + "ssid": None, + "conn_ap_mac": None, } await self.async_update_device_trackers() diff --git a/homeassistant/components/netgear/sensor.py b/homeassistant/components/netgear/sensor.py index 57ffe6f98f2..4e9b55d3227 100644 --- a/homeassistant/components/netgear/sensor.py +++ b/homeassistant/components/netgear/sensor.py @@ -66,7 +66,7 @@ class NetgearSensorEntity(NetgearDeviceEntity, SensorEntity): self.entity_description = SENSOR_TYPES[self._attribute] self._name = f"{self.get_device_name()} {self.entity_description.name}" self._unique_id = f"{self._mac}-{self._attribute}" - self._state = self._device[self._attribute] + self._state = self._device.get(self._attribute) @property def native_value(self): @@ -78,7 +78,7 @@ class NetgearSensorEntity(NetgearDeviceEntity, SensorEntity): """Update the Netgear device.""" self._device = self._router.devices[self._mac] self._active = self._device["active"] - if self._device[self._attribute] is not None: + if self._device.get(self._attribute) is not None: self._state = self._device[self._attribute] self.async_write_ha_state() From 845f75868d9cdf9fe679670161760204e70bf3a1 Mon Sep 17 00:00:00 2001 From: Maikel Punie Date: Wed, 17 Nov 2021 10:15:19 +0100 Subject: [PATCH 04/13] Bump velbusaio to 2021.11.7 (#59817) --- homeassistant/components/velbus/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/velbus/manifest.json b/homeassistant/components/velbus/manifest.json index 5fb3c58c3c7..63d74536378 100644 --- a/homeassistant/components/velbus/manifest.json +++ b/homeassistant/components/velbus/manifest.json @@ -2,7 +2,7 @@ "domain": "velbus", "name": "Velbus", "documentation": "https://www.home-assistant.io/integrations/velbus", - "requirements": ["velbus-aio==2021.11.6"], + "requirements": ["velbus-aio==2021.11.7"], "config_flow": true, "codeowners": ["@Cereal2nd", "@brefra"], "iot_class": "local_push" diff --git a/requirements_all.txt b/requirements_all.txt index ab04da80a84..89496ea700d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2360,7 +2360,7 @@ uvcclient==0.11.0 vallox-websocket-api==2.8.1 # homeassistant.components.velbus -velbus-aio==2021.11.6 +velbus-aio==2021.11.7 # homeassistant.components.venstar venstarcolortouch==0.14 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 0c693ec61df..af0f2452ea9 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1364,7 +1364,7 @@ url-normalize==1.4.1 uvcclient==0.11.0 # homeassistant.components.velbus -velbus-aio==2021.11.6 +velbus-aio==2021.11.7 # homeassistant.components.venstar venstarcolortouch==0.14 From 0d44328f42460ce9c269060beb19eb2a63609474 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Wed, 17 Nov 2021 16:05:50 +0100 Subject: [PATCH 05/13] Fix invalid string syntax in OwnTracks config flow translations (#59838) --- homeassistant/components/owntracks/translations/hu.json | 2 +- homeassistant/components/owntracks/translations/lb.json | 2 +- homeassistant/components/owntracks/translations/nl.json | 2 +- homeassistant/components/owntracks/translations/pl.json | 2 +- homeassistant/components/owntracks/translations/ru.json | 2 +- homeassistant/components/owntracks/translations/sv.json | 2 +- homeassistant/components/owntracks/translations/uk.json | 2 +- homeassistant/components/owntracks/translations/zh-Hans.json | 2 +- homeassistant/components/owntracks/translations/zh-Hant.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/owntracks/translations/hu.json b/homeassistant/components/owntracks/translations/hu.json index 84a40a1a593..e99b11a9e7e 100644 --- a/homeassistant/components/owntracks/translations/hu.json +++ b/homeassistant/components/owntracks/translations/hu.json @@ -4,7 +4,7 @@ "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." }, "create_entry": { - "default": "\n\nAndroidon, nyissa meg [az OwnTracks appot]({android_url}), majd v\u00e1lassza ki a Preferences -> Connection men\u00fct. V\u00e1ltoztassa meg az al\u00e1bbi be\u00e1ll\u00edt\u00e1sokat:\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: ``\n - Device ID: ``\n\niOS-en, nyissa meg [az OwnTracks appot]({ios_url}), kattintson az (i) ikonra bal oldalon fel\u00fcl -> settings. V\u00e1ltoztassa meg az al\u00e1bbi be\u00e1ll\u00edt\u00e1sokat:\n - Mode: HTTP\n - URL: {webhook_url}\n - Turn on authentication\n - UserID: ``\n\n{secret}\n\nN\u00e9zze meg [a dokument\u00e1ci\u00f3t]({docs_url}) tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt." + "default": "\n\nAndroidon, nyissa meg [az OwnTracks appot]({android_url}), majd v\u00e1lassza ki a Preferences -> Connection men\u00fct. V\u00e1ltoztassa meg az al\u00e1bbi be\u00e1ll\u00edt\u00e1sokat:\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: `''`\n - Device ID: `''`\n\niOS-en, nyissa meg [az OwnTracks appot]({ios_url}), kattintson az (i) ikonra bal oldalon fel\u00fcl -> settings. V\u00e1ltoztassa meg az al\u00e1bbi be\u00e1ll\u00edt\u00e1sokat:\n - Mode: HTTP\n - URL: {webhook_url}\n - Turn on authentication\n - UserID: `''`\n\n{secret}\n\nN\u00e9zze meg [a dokument\u00e1ci\u00f3t]({docs_url}) tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt." }, "step": { "user": { diff --git a/homeassistant/components/owntracks/translations/lb.json b/homeassistant/components/owntracks/translations/lb.json index f2e9ea664d3..a5fa4ddc2f7 100644 --- a/homeassistant/components/owntracks/translations/lb.json +++ b/homeassistant/components/owntracks/translations/lb.json @@ -4,7 +4,7 @@ "single_instance_allowed": "Scho konfigur\u00e9iert. N\u00ebmmen eng eenzeg Konfiguratioun ass m\u00e9iglech." }, "create_entry": { - "default": "\n\nOp Android, an [der OwnTracks App]({android_url}), g\u00e9i an Preferences -> Connection. \u00c4nnert folgend Astellungen:\n- Mode: Private HTTP\n- Host {webhook_url}\n- Identification:\n - Username: ``\n - Device ID: ``\n\nOp IOS, an [der OwnTracks App]({ios_url}), klick op (i) Ikon uewen l\u00e9nks -> Settings. \u00c4nnert folgend Astellungen:\n- Mode: HTTP\n- URL: {webhook_url}\n- Turn on authentication:\n- UserID: ``\n\n{secret}\n\nKuck w.e.g. [Dokumentatioun]({docs_url}) fir m\u00e9i Informatiounen." + "default": "\n\nOp Android, an [der OwnTracks App]({android_url}), g\u00e9i an Preferences -> Connection. \u00c4nnert folgend Astellungen:\n- Mode: Private HTTP\n- Host {webhook_url}\n- Identification:\n - Username: `''`\n - Device ID: `''`\n\nOp IOS, an [der OwnTracks App]({ios_url}), klick op (i) Ikon uewen l\u00e9nks -> Settings. \u00c4nnert folgend Astellungen:\n- Mode: HTTP\n- URL: {webhook_url}\n- Turn on authentication:\n- UserID: `''`\n\n{secret}\n\nKuck w.e.g. [Dokumentatioun]({docs_url}) fir m\u00e9i Informatiounen." }, "step": { "user": { diff --git a/homeassistant/components/owntracks/translations/nl.json b/homeassistant/components/owntracks/translations/nl.json index 2d97724661c..ff6cadcbf25 100644 --- a/homeassistant/components/owntracks/translations/nl.json +++ b/homeassistant/components/owntracks/translations/nl.json @@ -4,7 +4,7 @@ "single_instance_allowed": "Al geconfigureerd. Slechts \u00e9\u00e9n configuratie mogelijk." }, "create_entry": { - "default": "\n\nOp Android, open [the OwnTracks app]({android_url}), ga naar 'preferences' -> 'connection'. Verander de volgende instellingen:\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: ``\n - Device ID: ``\n\nOp iOS, open [the OwnTracks app]({ios_url}), tik op het (i) icoon links boven -> 'settings'. Verander de volgende instellingen:\n - Mode: HTTP\n - URL: {webhook_url}\n - zet 'authentication' aan\n - UserID: ``\n\n{secret}\n\nZie [the documentation]({docs_url}) voor meer informatie." + "default": "\n\nOp Android, open [the OwnTracks app]({android_url}), ga naar 'preferences' -> 'connection'. Verander de volgende instellingen:\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: `''`\n - Device ID: `''`\n\nOp iOS, open [the OwnTracks app]({ios_url}), tik op het (i) icoon links boven -> 'settings'. Verander de volgende instellingen:\n - Mode: HTTP\n - URL: {webhook_url}\n - zet 'authentication' aan\n - UserID: `''`\n\n{secret}\n\nZie [the documentation]({docs_url}) voor meer informatie." }, "step": { "user": { diff --git a/homeassistant/components/owntracks/translations/pl.json b/homeassistant/components/owntracks/translations/pl.json index c4499800eda..98c8779fe1f 100644 --- a/homeassistant/components/owntracks/translations/pl.json +++ b/homeassistant/components/owntracks/translations/pl.json @@ -4,7 +4,7 @@ "single_instance_allowed": "Ju\u017c skonfigurowano. Mo\u017cliwa jest tylko jedna konfiguracja." }, "create_entry": { - "default": "\n\nNa Androidzie, otw\u00f3rz [aplikacj\u0119 OwnTracks]({android_url}), id\u017a do: ustawienia -> po\u0142\u0105czenia. Zmie\u0144 nast\u0119puj\u0105ce ustawienia:\n - Tryb: Private HTTP\n - Host: {webhook_url}\n - Identyfikacja:\n - Nazwa u\u017cytkownika: ``\n - ID urz\u0105dzenia: ``\n\nNa iOS, otw\u00f3rz [aplikacj\u0119 OwnTracks]({ios_url}), naci\u015bnij ikon\u0119 (i) w lewym g\u00f3rnym rogu -> ustawienia. Zmie\u0144 nast\u0119puj\u0105ce ustawienia:\n - Tryb: HTTP\n - URL: {webhook_url}\n - W\u0142\u0105cz uwierzytelnianie\n - ID u\u017cytkownika: ``\n\n{secret}\n\nZapoznaj si\u0119 z [dokumentacj\u0105]({docs_url}), by pozna\u0107 szczeg\u00f3\u0142y." + "default": "\n\nNa Androidzie, otw\u00f3rz [aplikacj\u0119 OwnTracks]({android_url}), id\u017a do: ustawienia -> po\u0142\u0105czenia. Zmie\u0144 nast\u0119puj\u0105ce ustawienia:\n - Tryb: Private HTTP\n - Host: {webhook_url}\n - Identyfikacja:\n - Nazwa u\u017cytkownika: `''`\n - ID urz\u0105dzenia: `''`\n\nNa iOS, otw\u00f3rz [aplikacj\u0119 OwnTracks]({ios_url}), naci\u015bnij ikon\u0119 (i) w lewym g\u00f3rnym rogu -> ustawienia. Zmie\u0144 nast\u0119puj\u0105ce ustawienia:\n - Tryb: HTTP\n - URL: {webhook_url}\n - W\u0142\u0105cz uwierzytelnianie\n - ID u\u017cytkownika: `''`\n\n{secret}\n\nZapoznaj si\u0119 z [dokumentacj\u0105]({docs_url}), by pozna\u0107 szczeg\u00f3\u0142y." }, "step": { "user": { diff --git a/homeassistant/components/owntracks/translations/ru.json b/homeassistant/components/owntracks/translations/ru.json index 09fdba77266..ed1e084090d 100644 --- a/homeassistant/components/owntracks/translations/ru.json +++ b/homeassistant/components/owntracks/translations/ru.json @@ -4,7 +4,7 @@ "single_instance_allowed": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e." }, "create_entry": { - "default": "\u0415\u0441\u043b\u0438 \u0412\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Android, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 [OwnTracks]({android_url}), \u0437\u0430\u0442\u0435\u043c preferences -> connection. \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u043a, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435:\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: ``\n - Device ID: ``\n\n\u0415\u0441\u043b\u0438 \u0412\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 iOS, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 [OwnTracks]({ios_url}), \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u0437\u043d\u0430\u0447\u043e\u043a (i) \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 -> settings. \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u043a, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435:\n - Mode: HTTP\n - URL: {webhook_url}\n - Turn on authentication\n - UserID: ``\n\n{secret}\n\n\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439]({docs_url}) \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438." + "default": "\u0415\u0441\u043b\u0438 \u0412\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Android, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 [OwnTracks]({android_url}), \u0437\u0430\u0442\u0435\u043c preferences -> connection. \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u043a, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435:\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: `''`\n - Device ID: `''`\n\n\u0415\u0441\u043b\u0438 \u0412\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 iOS, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 [OwnTracks]({ios_url}), \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u0437\u043d\u0430\u0447\u043e\u043a (i) \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 -> settings. \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u043a, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435:\n - Mode: HTTP\n - URL: {webhook_url}\n - Turn on authentication\n - UserID: `''`\n\n{secret}\n\n\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439]({docs_url}) \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438." }, "step": { "user": { diff --git a/homeassistant/components/owntracks/translations/sv.json b/homeassistant/components/owntracks/translations/sv.json index fd2162f153b..8642a32f889 100644 --- a/homeassistant/components/owntracks/translations/sv.json +++ b/homeassistant/components/owntracks/translations/sv.json @@ -1,7 +1,7 @@ { "config": { "create_entry": { - "default": "\n\n P\u00e5 Android, \u00f6ppna [OwnTracks-appen]({android_url}), g\u00e5 till inst\u00e4llningar -> anslutning. \u00c4ndra f\u00f6ljande inst\u00e4llningar: \n - L\u00e4ge: Privat HTTP \n - V\u00e4rden: {webhook_url}\n - Identifiering: \n - Anv\u00e4ndarnamn: ``\n - Enhets-ID: `` \n\n P\u00e5 IOS, \u00f6ppna [OwnTracks-appen]({ios_url}), tryck p\u00e5 (i) ikonen i \u00f6vre v\u00e4nstra h\u00f6rnet -> inst\u00e4llningarna. \u00c4ndra f\u00f6ljande inst\u00e4llningar: \n - L\u00e4ge: HTTP \n - URL: {webhook_url}\n - Sl\u00e5 p\u00e5 autentisering \n - UserID: `` \n\n {secret} \n \n Se [dokumentationen]({docs_url}) f\u00f6r mer information." + "default": "\n\n P\u00e5 Android, \u00f6ppna [OwnTracks-appen]({android_url}), g\u00e5 till inst\u00e4llningar -> anslutning. \u00c4ndra f\u00f6ljande inst\u00e4llningar: \n - L\u00e4ge: Privat HTTP \n - V\u00e4rden: {webhook_url}\n - Identifiering: \n - Anv\u00e4ndarnamn: `''`\n - Enhets-ID: `''` \n\n P\u00e5 IOS, \u00f6ppna [OwnTracks-appen]({ios_url}), tryck p\u00e5 (i) ikonen i \u00f6vre v\u00e4nstra h\u00f6rnet -> inst\u00e4llningarna. \u00c4ndra f\u00f6ljande inst\u00e4llningar: \n - L\u00e4ge: HTTP \n - URL: {webhook_url}\n - Sl\u00e5 p\u00e5 autentisering \n - UserID: `''` \n\n {secret} \n \n Se [dokumentationen]({docs_url}) f\u00f6r mer information." }, "step": { "user": { diff --git a/homeassistant/components/owntracks/translations/uk.json b/homeassistant/components/owntracks/translations/uk.json index e6a6fc26068..c355b745d1d 100644 --- a/homeassistant/components/owntracks/translations/uk.json +++ b/homeassistant/components/owntracks/translations/uk.json @@ -4,7 +4,7 @@ "single_instance_allowed": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0432\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e. \u041c\u043e\u0436\u043d\u0430 \u0434\u043e\u0434\u0430\u0442\u0438 \u043b\u0438\u0448\u0435 \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044e." }, "create_entry": { - "default": "\u042f\u043a\u0449\u043e \u0412\u0430\u0448 \u043f\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u043f\u0440\u0430\u0446\u044e\u0454 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0456\u0439\u043d\u0456\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0456 Android, \u0432\u0456\u0434\u043a\u0440\u0438\u0439\u0442\u0435 \u0434\u043e\u0434\u0430\u0442\u043e\u043a [OwnTracks]({android_url}), \u043f\u043e\u0442\u0456\u043c preferences - > connection. \u0417\u043c\u0456\u043d\u0456\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0442\u0430\u043a, \u044f\u043a \u0437\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u043d\u0438\u0436\u0447\u0435:\n- Mode: Private HTTP\n- Host: {webhook_url}\n- Identification:\n- Username: ``\n- Device ID: `` \n\n\u042f\u043a\u0449\u043e \u0412\u0430\u0448 \u043f\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u043f\u0440\u0430\u0446\u044e\u0454 \u043d\u0430 iOS, \u0432\u0456\u0434\u043a\u0440\u0438\u0439\u0442\u0435 \u0434\u043e\u0434\u0430\u0442\u043e\u043a [OwnTracks]({ios_url}), \u043d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043d\u0430 \u0437\u043d\u0430\u0447\u043e\u043a (i) \u0432 \u043b\u0456\u0432\u043e\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u044c\u043e\u043c\u0443 \u043a\u0443\u0442\u043a\u0443 - > settings. \u0417\u043c\u0456\u043d\u0456\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0442\u0430\u043a, \u044f\u043a \u0437\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u043d\u0438\u0436\u0447\u0435:\n- Mode: HTTP\n- URL: {webhook_url}\n- Turn on authentication\n- UserID: ``\n\n{secret}\n\n\u041e\u0437\u043d\u0430\u0439\u043e\u043c\u0442\u0435\u0441\u044f \u0437 [\u0456\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0456\u044f\u043c\u0438]({docs_url}) \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u0431\u0456\u043b\u044c\u0448 \u0434\u043e\u043a\u043b\u0430\u0434\u043d\u043e\u0457 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u0457." + "default": "\u042f\u043a\u0449\u043e \u0412\u0430\u0448 \u043f\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u043f\u0440\u0430\u0446\u044e\u0454 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0456\u0439\u043d\u0456\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0456 Android, \u0432\u0456\u0434\u043a\u0440\u0438\u0439\u0442\u0435 \u0434\u043e\u0434\u0430\u0442\u043e\u043a [OwnTracks]({android_url}), \u043f\u043e\u0442\u0456\u043c preferences - > connection. \u0417\u043c\u0456\u043d\u0456\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0442\u0430\u043a, \u044f\u043a \u0437\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u043d\u0438\u0436\u0447\u0435:\n- Mode: Private HTTP\n- Host: {webhook_url}\n- Identification:\n- Username: `''`\n- Device ID: `''` \n\n\u042f\u043a\u0449\u043e \u0412\u0430\u0448 \u043f\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u043f\u0440\u0430\u0446\u044e\u0454 \u043d\u0430 iOS, \u0432\u0456\u0434\u043a\u0440\u0438\u0439\u0442\u0435 \u0434\u043e\u0434\u0430\u0442\u043e\u043a [OwnTracks]({ios_url}), \u043d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043d\u0430 \u0437\u043d\u0430\u0447\u043e\u043a (i) \u0432 \u043b\u0456\u0432\u043e\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u044c\u043e\u043c\u0443 \u043a\u0443\u0442\u043a\u0443 - > settings. \u0417\u043c\u0456\u043d\u0456\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0442\u0430\u043a, \u044f\u043a \u0437\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u043d\u0438\u0436\u0447\u0435:\n- Mode: HTTP\n- URL: {webhook_url}\n- Turn on authentication\n- UserID: `''`\n\n{secret}\n\n\u041e\u0437\u043d\u0430\u0439\u043e\u043c\u0442\u0435\u0441\u044f \u0437 [\u0456\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0456\u044f\u043c\u0438]({docs_url}) \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u0431\u0456\u043b\u044c\u0448 \u0434\u043e\u043a\u043b\u0430\u0434\u043d\u043e\u0457 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u0457." }, "step": { "user": { diff --git a/homeassistant/components/owntracks/translations/zh-Hans.json b/homeassistant/components/owntracks/translations/zh-Hans.json index 6954b838d04..a6c01626c76 100644 --- a/homeassistant/components/owntracks/translations/zh-Hans.json +++ b/homeassistant/components/owntracks/translations/zh-Hans.json @@ -1,7 +1,7 @@ { "config": { "create_entry": { - "default": "\n\n\u5728 Android \u8bbe\u5907\u4e0a\uff0c\u6253\u5f00 [OwnTracks APP]({android_url})\uff0c\u524d\u5f80 Preferences -> Connection\u3002\u4fee\u6539\u4ee5\u4e0b\u8bbe\u5b9a\uff1a\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: ``\n - Device ID: ``\n\n\u5728 iOS \u8bbe\u5907\u4e0a\uff0c\u6253\u5f00 [OwnTracks APP]({ios_url})\uff0c\u70b9\u51fb\u5de6\u4e0a\u89d2\u7684 (i) \u56fe\u6807-> Settings\u3002\u4fee\u6539\u4ee5\u4e0b\u8bbe\u5b9a\uff1a\n - Mode: HTTP\n - URL: {webhook_url}\n - Turn on authentication\n - UserID: ``\n\n{secret}\n\n\u8bf7\u53c2\u9605[\u6587\u6863]({docs_url})\u4ee5\u4e86\u89e3\u66f4\u591a\u4fe1\u606f\u3002" + "default": "\n\n\u5728 Android \u8bbe\u5907\u4e0a\uff0c\u6253\u5f00 [OwnTracks APP]({android_url})\uff0c\u524d\u5f80 Preferences -> Connection\u3002\u4fee\u6539\u4ee5\u4e0b\u8bbe\u5b9a\uff1a\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: `''`\n - Device ID: `''`\n\n\u5728 iOS \u8bbe\u5907\u4e0a\uff0c\u6253\u5f00 [OwnTracks APP]({ios_url})\uff0c\u70b9\u51fb\u5de6\u4e0a\u89d2\u7684 (i) \u56fe\u6807-> Settings\u3002\u4fee\u6539\u4ee5\u4e0b\u8bbe\u5b9a\uff1a\n - Mode: HTTP\n - URL: {webhook_url}\n - Turn on authentication\n - UserID: `''`\n\n{secret}\n\n\u8bf7\u53c2\u9605[\u6587\u6863]({docs_url})\u4ee5\u4e86\u89e3\u66f4\u591a\u4fe1\u606f\u3002" }, "step": { "user": { diff --git a/homeassistant/components/owntracks/translations/zh-Hant.json b/homeassistant/components/owntracks/translations/zh-Hant.json index 6c92b557797..2803182629a 100644 --- a/homeassistant/components/owntracks/translations/zh-Hant.json +++ b/homeassistant/components/owntracks/translations/zh-Hant.json @@ -4,7 +4,7 @@ "single_instance_allowed": "\u50c5\u80fd\u8a2d\u5b9a\u4e00\u7d44\u88dd\u7f6e\u3002" }, "create_entry": { - "default": "\n\n\u65bc Android \u8a2d\u5099\uff0c\u6253\u958b [OwnTracks app]({android_url})\u3001\u9ede\u9078\u8a2d\u5b9a\uff08preferences\uff09 -> \u9023\u7dda\uff08connection\uff09\u3002\u8b8a\u66f4\u4ee5\u4e0b\u8a2d\u5b9a\uff1a\n - \u6a21\u5f0f\uff08Mode\uff09\uff1aPrivate HTTP\n - \u4e3b\u6a5f\u7aef\uff08Host\uff09\uff1a{webhook_url}\n - Identification\uff1a\n - Username\uff1a ``\n - Device ID\uff1a``\n\n\u65bc iOS \u8a2d\u5099\uff0c\u6253\u958b [OwnTracks app]({ios_url})\u3001\u9ede\u9078\u5de6\u4e0a\u65b9\u7684 (i) \u5716\u793a -> \u8a2d\u5b9a\uff08settings\uff09\u3002\u8b8a\u66f4\u4ee5\u4e0b\u8a2d\u5b9a\uff1a\n - \u6a21\u5f0f\uff08Mode\uff09\uff1aHTTP\n - URL: {webhook_url}\n - \u958b\u555f authentication\n - UserID: ``\n\n{secret}\n\n\u8acb\u53c3\u95b1 [\u6587\u4ef6]({docs_url})\u4ee5\u4e86\u89e3\u66f4\u8a73\u7d30\u8cc7\u6599\u3002" + "default": "\n\n\u65bc Android \u8a2d\u5099\uff0c\u6253\u958b [OwnTracks app]({android_url})\u3001\u9ede\u9078\u8a2d\u5b9a\uff08preferences\uff09 -> \u9023\u7dda\uff08connection\uff09\u3002\u8b8a\u66f4\u4ee5\u4e0b\u8a2d\u5b9a\uff1a\n - \u6a21\u5f0f\uff08Mode\uff09\uff1aPrivate HTTP\n - \u4e3b\u6a5f\u7aef\uff08Host\uff09\uff1a{webhook_url}\n - Identification\uff1a\n - Username\uff1a `''`\n - Device ID\uff1a`''`\n\n\u65bc iOS \u8a2d\u5099\uff0c\u6253\u958b [OwnTracks app]({ios_url})\u3001\u9ede\u9078\u5de6\u4e0a\u65b9\u7684 (i) \u5716\u793a -> \u8a2d\u5b9a\uff08settings\uff09\u3002\u8b8a\u66f4\u4ee5\u4e0b\u8a2d\u5b9a\uff1a\n - \u6a21\u5f0f\uff08Mode\uff09\uff1aHTTP\n - URL: {webhook_url}\n - \u958b\u555f authentication\n - UserID: `''`\n\n{secret}\n\n\u8acb\u53c3\u95b1 [\u6587\u4ef6]({docs_url})\u4ee5\u4e86\u89e3\u66f4\u8a73\u7d30\u8cc7\u6599\u3002" }, "step": { "user": { From 684efd3fe5df64ad5de5addb6f35ce0fc0cc4d7e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 18 Nov 2021 17:21:51 -0600 Subject: [PATCH 06/13] Strip out deleted entities when configuring homekit (#59844) --- .../components/homekit/config_flow.py | 29 +++++--- tests/components/homekit/test_config_flow.py | 73 ++++++++++++++++++- 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/homekit/config_flow.py b/homeassistant/components/homekit/config_flow.py index a79db949ab0..79a0e71f969 100644 --- a/homeassistant/components/homekit/config_flow.py +++ b/homeassistant/components/homekit/config_flow.py @@ -330,13 +330,19 @@ class OptionsFlowHandler(config_entries.OptionsFlow): return self.async_create_entry(title="", data=self.hk_options) all_supported_devices = await _async_get_supported_devices(self.hass) + # Strip out devices that no longer exist to prevent error in the UI + devices = [ + device_id + for device_id in self.hk_options.get(CONF_DEVICES, []) + if device_id in all_supported_devices + ] return self.async_show_form( step_id="advanced", data_schema=vol.Schema( { - vol.Optional( - CONF_DEVICES, default=self.hk_options.get(CONF_DEVICES, []) - ): cv.multi_select(all_supported_devices) + vol.Optional(CONF_DEVICES, default=devices): cv.multi_select( + all_supported_devices + ) } ), ) @@ -445,13 +451,16 @@ class OptionsFlowHandler(config_entries.OptionsFlow): ) data_schema = {} - entities = entity_filter.get(CONF_INCLUDE_ENTITIES, []) - if self.hk_options[CONF_HOMEKIT_MODE] == HOMEKIT_MODE_ACCESSORY: - entity_schema = vol.In - else: - if entities: - include_exclude_mode = MODE_INCLUDE - else: + entity_schema = vol.In + # Strip out entities that no longer exist to prevent error in the UI + entities = [ + entity_id + for entity_id in entity_filter.get(CONF_INCLUDE_ENTITIES, []) + if entity_id in all_supported_entities + ] + if self.hk_options[CONF_HOMEKIT_MODE] != HOMEKIT_MODE_ACCESSORY: + include_exclude_mode = MODE_INCLUDE + if not entities: include_exclude_mode = MODE_EXCLUDE entities = entity_filter.get(CONF_EXCLUDE_ENTITIES, []) data_schema[ diff --git a/tests/components/homekit/test_config_flow.py b/tests/components/homekit/test_config_flow.py index e5d395a1f29..f1564f9e3ae 100644 --- a/tests/components/homekit/test_config_flow.py +++ b/tests/components/homekit/test_config_flow.py @@ -365,7 +365,24 @@ async def test_options_flow_devices( mock_hap, hass, demo_cleanup, device_reg, entity_reg, mock_get_source_ip ): """Test devices can be bridged.""" - config_entry = _mock_config_entry_with_options_populated() + config_entry = MockConfigEntry( + domain=DOMAIN, + data={CONF_NAME: "mock_name", CONF_PORT: 12345}, + options={ + "devices": ["notexist"], + "filter": { + "include_domains": [ + "fan", + "humidifier", + "vacuum", + "media_player", + "climate", + "alarm_control_panel", + ], + "exclude_entities": ["climate.front_gate"], + }, + }, + ) config_entry.add_to_hass(hass) demo_config_entry = MockConfigEntry(domain="domain") @@ -491,6 +508,60 @@ async def test_options_flow_devices_preserved_when_advanced_off( } +async def test_options_flow_with_non_existant_entity(hass, mock_get_source_ip): + """Test config flow options in include mode.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + data={CONF_NAME: "mock_name", CONF_PORT: 12345}, + options={ + "filter": { + "include_entities": ["climate.not_exist", "climate.front_gate"], + }, + }, + ) + config_entry.add_to_hass(hass) + hass.states.async_set("climate.front_gate", "off") + hass.states.async_set("climate.new", "off") + + await hass.async_block_till_done() + + result = await hass.config_entries.options.async_init( + config_entry.entry_id, context={"show_advanced_options": False} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "init" + + result = await hass.config_entries.options.async_configure( + result["flow_id"], + user_input={"domains": ["fan", "vacuum", "climate"]}, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "include_exclude" + + entities = result["data_schema"]({})["entities"] + assert "climate.not_exist" not in entities + + result2 = await hass.config_entries.options.async_configure( + result["flow_id"], + user_input={ + "entities": ["climate.new", "climate.front_gate"], + "include_exclude_mode": "include", + }, + ) + assert result2["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert config_entry.options == { + "mode": "bridge", + "filter": { + "exclude_domains": [], + "exclude_entities": [], + "include_domains": ["fan", "vacuum"], + "include_entities": ["climate.new", "climate.front_gate"], + }, + } + + async def test_options_flow_include_mode_basic(hass, mock_get_source_ip): """Test config flow options in include mode.""" From 7b6d55bd8856e95897dd36973f737fe4698e2a0e Mon Sep 17 00:00:00 2001 From: PlusPlus-ua Date: Thu, 18 Nov 2021 17:53:34 +0200 Subject: [PATCH 07/13] Bugfix in Tuya Number value scaling (#59903) --- homeassistant/components/tuya/base.py | 4 ++++ homeassistant/components/tuya/number.py | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/tuya/base.py b/homeassistant/components/tuya/base.py index d61c83b17ad..f4bc0dc561f 100644 --- a/homeassistant/components/tuya/base.py +++ b/homeassistant/components/tuya/base.py @@ -46,6 +46,10 @@ class IntegerTypeData: """Scale a value.""" return value * 1.0 / (10 ** self.scale) + def scale_value_back(self, value: float | int) -> int: + """Return raw value for scaled.""" + return int(value * (10 ** self.scale)) + def remap_value_to( self, value: float, diff --git a/homeassistant/components/tuya/number.py b/homeassistant/components/tuya/number.py index c724f6e79a3..8db2e4debd5 100644 --- a/homeassistant/components/tuya/number.py +++ b/homeassistant/components/tuya/number.py @@ -259,9 +259,9 @@ class TuyaNumberEntity(TuyaEntity, NumberEntity): # and determine unit of measurement if self._status_range.type == "Integer": self._type_data = IntegerTypeData.from_json(self._status_range.values) - self._attr_max_value = self._type_data.max - self._attr_min_value = self._type_data.min - self._attr_step = self._type_data.step + self._attr_max_value = self._type_data.max_scaled + self._attr_min_value = self._type_data.min_scaled + self._attr_step = self._type_data.step_scaled if description.unit_of_measurement is None: self._attr_unit_of_measurement = self._type_data.unit @@ -290,7 +290,7 @@ class TuyaNumberEntity(TuyaEntity, NumberEntity): [ { "code": self.entity_description.key, - "value": self._type_data.scale_value(value), + "value": self._type_data.scale_value_back(value), } ] ) From 6bed1a88002fe353f16a85119f33d25497bb9cd4 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 19 Nov 2021 00:21:27 +0100 Subject: [PATCH 08/13] Fix Tuya back scaling in Climate and Humidifer entities (#59909) --- homeassistant/components/tuya/climate.py | 6 ++++-- homeassistant/components/tuya/humidifier.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/tuya/climate.py b/homeassistant/components/tuya/climate.py index b26ff34bc6d..cb70fc5515a 100644 --- a/homeassistant/components/tuya/climate.py +++ b/homeassistant/components/tuya/climate.py @@ -322,7 +322,7 @@ class TuyaClimateEntity(TuyaEntity, ClimateEntity): [ { "code": self._set_humidity_dpcode, - "value": self._set_humidity_type.scale_value(humidity), + "value": self._set_humidity_type.scale_value_back(humidity), } ] ) @@ -364,7 +364,9 @@ class TuyaClimateEntity(TuyaEntity, ClimateEntity): { "code": self._set_temperature_dpcode, "value": round( - self._set_temperature_type.scale_value(kwargs["temperature"]) + self._set_temperature_type.scale_value_back( + kwargs["temperature"] + ) ), } ] diff --git a/homeassistant/components/tuya/humidifier.py b/homeassistant/components/tuya/humidifier.py index b9fc10790e3..3169000fcba 100644 --- a/homeassistant/components/tuya/humidifier.py +++ b/homeassistant/components/tuya/humidifier.py @@ -165,7 +165,7 @@ class TuyaHumidifierEntity(TuyaEntity, HumidifierEntity): [ { "code": self.entity_description.humidity, - "value": self._set_humidity_type.scale_value(humidity), + "value": self._set_humidity_type.scale_value_back(humidity), } ] ) From ca74d3c79edbfb201348fe04931d635436e7e579 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 18 Nov 2021 15:56:22 -0800 Subject: [PATCH 09/13] Store: copy pending data (#59934) --- homeassistant/helpers/storage.py | 5 ++++ tests/components/unifi/test_controller.py | 2 +- tests/components/unifi/test_device_tracker.py | 2 +- tests/components/unifi/test_init.py | 3 ++- tests/components/unifi/test_switch.py | 5 ++-- .../trace/automation_saved_traces.json | 1 + tests/fixtures/trace/script_saved_traces.json | 1 + tests/helpers/test_storage.py | 27 ++++++++++++++++--- 8 files changed, 38 insertions(+), 8 deletions(-) diff --git a/homeassistant/helpers/storage.py b/homeassistant/helpers/storage.py index 116c9186149..9de54682d67 100644 --- a/homeassistant/helpers/storage.py +++ b/homeassistant/helpers/storage.py @@ -4,6 +4,7 @@ from __future__ import annotations import asyncio from collections.abc import Callable from contextlib import suppress +from copy import deepcopy from json import JSONEncoder import logging import os @@ -130,6 +131,10 @@ class Store: # If we didn't generate data yet, do it now. if "data_func" in data: data["data"] = data.pop("data_func")() + + # We make a copy because code might assume it's safe to mutate loaded data + # and we don't want that to mess with what we're trying to store. + data = deepcopy(data) else: data = await self.hass.async_add_executor_job( json_util.load_json, self.path diff --git a/tests/components/unifi/test_controller.py b/tests/components/unifi/test_controller.py index 41864f5dc3e..0f3447b3dd9 100644 --- a/tests/components/unifi/test_controller.py +++ b/tests/components/unifi/test_controller.py @@ -49,7 +49,7 @@ import homeassistant.util.dt as dt_util from tests.common import MockConfigEntry, async_fire_time_changed -DEFAULT_CONFIG_ENTRY_ID = 1 +DEFAULT_CONFIG_ENTRY_ID = "1" DEFAULT_HOST = "1.2.3.4" DEFAULT_SITE = "site_id" diff --git a/tests/components/unifi/test_device_tracker.py b/tests/components/unifi/test_device_tracker.py index 5ab61ce21a7..384db693f1c 100644 --- a/tests/components/unifi/test_device_tracker.py +++ b/tests/components/unifi/test_device_tracker.py @@ -1089,7 +1089,7 @@ async def test_restoring_client(hass, aioclient_mock): data=ENTRY_CONFIG, source="test", options={}, - entry_id=1, + entry_id="1", ) registry = er.async_get(hass) diff --git a/tests/components/unifi/test_init.py b/tests/components/unifi/test_init.py index 1d1fcad9cbe..85733d6d686 100644 --- a/tests/components/unifi/test_init.py +++ b/tests/components/unifi/test_init.py @@ -14,7 +14,7 @@ from .test_controller import ( setup_unifi_integration, ) -from tests.common import MockConfigEntry +from tests.common import MockConfigEntry, flush_store async def test_setup_with_no_config(hass): @@ -110,6 +110,7 @@ async def test_wireless_clients(hass, hass_storage, aioclient_mock): config_entry = await setup_unifi_integration( hass, aioclient_mock, clients_response=[client_1, client_2] ) + await flush_store(hass.data[unifi.UNIFI_WIRELESS_CLIENTS]._store) for mac in [ "00:00:00:00:00:00", diff --git a/tests/components/unifi/test_switch.py b/tests/components/unifi/test_switch.py index 85850062583..796434c5cd9 100644 --- a/tests/components/unifi/test_switch.py +++ b/tests/components/unifi/test_switch.py @@ -22,6 +22,7 @@ from homeassistant.helpers.dispatcher import async_dispatcher_send from .test_controller import ( CONTROLLER_HOST, + DEFAULT_CONFIG_ENTRY_ID, DESCRIPTION, ENTRY_CONFIG, setup_unifi_integration, @@ -857,7 +858,7 @@ async def test_restore_client_succeed(hass, aioclient_mock): data=ENTRY_CONFIG, source="test", options={}, - entry_id=1, + entry_id=DEFAULT_CONFIG_ENTRY_ID, ) registry = er.async_get(hass) @@ -947,7 +948,7 @@ async def test_restore_client_no_old_state(hass, aioclient_mock): data=ENTRY_CONFIG, source="test", options={}, - entry_id=1, + entry_id=DEFAULT_CONFIG_ENTRY_ID, ) registry = er.async_get(hass) diff --git a/tests/fixtures/trace/automation_saved_traces.json b/tests/fixtures/trace/automation_saved_traces.json index 45bcfffc157..7f6ed56a8bc 100644 --- a/tests/fixtures/trace/automation_saved_traces.json +++ b/tests/fixtures/trace/automation_saved_traces.json @@ -1,5 +1,6 @@ { "version": 1, + "minor_version": 1, "key": "trace.saved_traces", "data": { "automation.sun": [ diff --git a/tests/fixtures/trace/script_saved_traces.json b/tests/fixtures/trace/script_saved_traces.json index 91677b2a47e..ccd2902d726 100644 --- a/tests/fixtures/trace/script_saved_traces.json +++ b/tests/fixtures/trace/script_saved_traces.json @@ -1,5 +1,6 @@ { "version": 1, + "minor_version": 1, "key": "trace.saved_traces", "data": { "script.sun": [ diff --git a/tests/helpers/test_storage.py b/tests/helpers/test_storage.py index 61bf9fa8d0e..74c333f2448 100644 --- a/tests/helpers/test_storage.py +++ b/tests/helpers/test_storage.py @@ -25,7 +25,7 @@ MOCK_DATA2 = {"goodbye": "cruel world"} @pytest.fixture def store(hass): """Fixture of a store that prevents writing on Home Assistant stop.""" - yield storage.Store(hass, MOCK_VERSION, MOCK_KEY) + return storage.Store(hass, MOCK_VERSION, MOCK_KEY) async def test_loading(hass, store): @@ -64,8 +64,8 @@ async def test_loading_parallel(hass, store, hass_storage, caplog): results = await asyncio.gather(store.async_load(), store.async_load()) - assert results[0] is MOCK_DATA - assert results[1] is MOCK_DATA + assert results[0] == MOCK_DATA + assert results[0] is results[1] assert caplog.text.count(f"Loading data for {store.key}") @@ -279,3 +279,24 @@ async def test_migrator_transforming_config(hass, store, hass_storage): "version": MOCK_VERSION, "data": data, } + + +async def test_changing_delayed_written_data(hass, store, hass_storage): + """Test changing data that is written with delay.""" + data_to_store = {"hello": "world"} + store.async_delay_save(lambda: data_to_store, 1) + assert store.key not in hass_storage + + loaded_data = await store.async_load() + assert loaded_data == data_to_store + assert loaded_data is not data_to_store + + loaded_data["hello"] = "earth" + + async_fire_time_changed(hass, dt.utcnow() + timedelta(seconds=1)) + await hass.async_block_till_done() + assert hass_storage[store.key] == { + "version": MOCK_VERSION, + "key": MOCK_KEY, + "data": {"hello": "world"}, + } From 090c65488da56d27812464329e5c8d2f054d5ad3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 18 Nov 2021 16:18:05 -0800 Subject: [PATCH 10/13] Bumped version to 2021.11.5 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 5005540dbf2..910b9fe9ec8 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 11 -PATCH_VERSION: Final = "4" +PATCH_VERSION: Final = "5" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 04a36e0679c1cff064d1615d6b3526c9e551662e Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 16 Nov 2021 16:54:08 +0100 Subject: [PATCH 11/13] Remove test_check_package_version_does_not_match (#59785) --- tests/util/test_package.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/util/test_package.py b/tests/util/test_package.py index 3006cb17c37..d6b7402a5b6 100644 --- a/tests/util/test_package.py +++ b/tests/util/test_package.py @@ -251,13 +251,6 @@ def test_check_package_global(): assert not package.is_installed(f"{installed_package}<{installed_version}") -def test_check_package_version_does_not_match(): - """Test for version mismatch.""" - installed_package = list(pkg_resources.working_set)[0].project_name - assert not package.is_installed(f"{installed_package}==999.999.999") - assert not package.is_installed(f"{installed_package}>=999.999.999") - - def test_check_package_zip(): """Test for an installed zip package.""" assert not package.is_installed(TEST_ZIP_REQ) From 66d91544e839d01cbf48861d0cfdc86df2751ac5 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 18 Nov 2021 22:33:46 -0800 Subject: [PATCH 12/13] Fix some tests --- tests/fixtures/trace/automation_saved_traces.json | 1 - tests/fixtures/trace/script_saved_traces.json | 1 - 2 files changed, 2 deletions(-) diff --git a/tests/fixtures/trace/automation_saved_traces.json b/tests/fixtures/trace/automation_saved_traces.json index 7f6ed56a8bc..45bcfffc157 100644 --- a/tests/fixtures/trace/automation_saved_traces.json +++ b/tests/fixtures/trace/automation_saved_traces.json @@ -1,6 +1,5 @@ { "version": 1, - "minor_version": 1, "key": "trace.saved_traces", "data": { "automation.sun": [ diff --git a/tests/fixtures/trace/script_saved_traces.json b/tests/fixtures/trace/script_saved_traces.json index ccd2902d726..91677b2a47e 100644 --- a/tests/fixtures/trace/script_saved_traces.json +++ b/tests/fixtures/trace/script_saved_traces.json @@ -1,6 +1,5 @@ { "version": 1, - "minor_version": 1, "key": "trace.saved_traces", "data": { "script.sun": [ From 754fba1fb7c472931205acff2f680820768a1d60 Mon Sep 17 00:00:00 2001 From: jjlawren Date: Fri, 19 Nov 2021 10:14:12 -0600 Subject: [PATCH 13/13] Ignore non-Sonos SSDP devices with Sonos-like identifiers (#59809) --- homeassistant/components/sonos/__init__.py | 8 +++++--- tests/components/sonos/conftest.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/sonos/__init__.py b/homeassistant/components/sonos/__init__.py index 5e02832b05a..72e5a33ca28 100644 --- a/homeassistant/components/sonos/__init__.py +++ b/homeassistant/components/sonos/__init__.py @@ -267,11 +267,13 @@ class SonosDiscoveryManager: if change == ssdp.SsdpChange.BYEBYE: return + uid = info.get(ssdp.ATTR_UPNP_UDN) + if not uid.startswith("uuid:RINCON_"): + return + + uid = uid[5:] discovered_ip = urlparse(info[ssdp.ATTR_SSDP_LOCATION]).hostname boot_seqnum = info.get("X-RINCON-BOOTSEQ") - uid = info.get(ssdp.ATTR_UPNP_UDN) - if uid.startswith("uuid:"): - uid = uid[5:] self.async_discovered_player( "SSDP", info, discovered_ip, uid, boot_seqnum, info.get("modelName"), None ) diff --git a/tests/components/sonos/conftest.py b/tests/components/sonos/conftest.py index f650c6e8fef..8a3a6571faa 100644 --- a/tests/components/sonos/conftest.py +++ b/tests/components/sonos/conftest.py @@ -93,7 +93,7 @@ def discover_fixture(soco): async def do_callback(hass, callback, *args, **kwargs): await callback( { - ssdp.ATTR_UPNP_UDN: soco.uid, + ssdp.ATTR_UPNP_UDN: f"uuid:{soco.uid}", ssdp.ATTR_SSDP_LOCATION: f"http://{soco.ip_address}/", }, ssdp.SsdpChange.ALIVE,