From 744bb6a0687d4d46b7ec4497a2eaaf4229b91748 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 17:26:16 +0200 Subject: [PATCH 01/34] Add missing flow form field translation in tuya (#173745) --- homeassistant/components/tuya/strings.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/homeassistant/components/tuya/strings.json b/homeassistant/components/tuya/strings.json index 69a032d86bc26..bcf19a3ba0034 100644 --- a/homeassistant/components/tuya/strings.json +++ b/homeassistant/components/tuya/strings.json @@ -15,6 +15,9 @@ "description": "The Tuya integration now uses an improved login method. To reauthenticate with your Smart Life or Tuya Smart account, you need to enter your user code.\n\nYou can find this code in the Smart Life app or Tuya Smart app in **Settings** > **Account and Security** screen, and enter the code shown on the **User Code** field. The user code is case-sensitive, please be sure to enter it exactly as shown in the app." }, "scan": { + "data": { + "QR": "QR code" + }, "description": "Use the Smart Life app or Tuya Smart app to scan the following QR code to complete the login.\n\nContinue to the next step once you have completed this step in the app." }, "user": { From a63f2f1d20f6f1fbe7a487b755767ee51c804b61 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 17:26:39 +0200 Subject: [PATCH 02/34] Replace duplicate constants with homeassistant.const imports in Teslemetry (#173744) --- .../components/teslemetry/services.py | 18 +++++++++--------- tests/components/teslemetry/test_services.py | 14 +++++++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/teslemetry/services.py b/homeassistant/components/teslemetry/services.py index d72fbc6f888a6..d4b62631ffb38 100644 --- a/homeassistant/components/teslemetry/services.py +++ b/homeassistant/components/teslemetry/services.py @@ -6,7 +6,15 @@ from voluptuous import All, Range from homeassistant.config_entries import ConfigEntry -from homeassistant.const import CONF_DEVICE_ID, CONF_LATITUDE, CONF_LONGITUDE +from homeassistant.const import ( + ATTR_ID, + ATTR_LOCATION, + ATTR_NAME, + ATTR_TIME, + CONF_DEVICE_ID, + CONF_LATITUDE, + CONF_LONGITUDE, +) from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError, ServiceValidationError from homeassistant.helpers import config_validation as cv, device_registry as dr @@ -18,20 +26,14 @@ _LOGGER = logging.getLogger(__name__) # Attributes -# pylint: disable-next=home-assistant-duplicate-const -ATTR_ID = "id" ATTR_GPS = "gps" ATTR_TYPE = "type" ATTR_VALUE = "value" -# pylint: disable-next=home-assistant-duplicate-const -ATTR_LOCATION = "location" ATTR_LOCALE = "locale" ATTR_ORDER = "order" ATTR_TIMESTAMP = "timestamp" ATTR_FIELDS = "fields" ATTR_ENABLE = "enable" -# pylint: disable-next=home-assistant-duplicate-const -ATTR_TIME = "time" ATTR_PIN = "pin" ATTR_TOU_SETTINGS = "tou_settings" ATTR_PRECONDITIONING_ENABLED = "preconditioning_enabled" @@ -44,8 +46,6 @@ ATTR_START_TIME = "start_time" ATTR_END_TIME = "end_time" ATTR_ONE_TIME = "one_time" -# pylint: disable-next=home-assistant-duplicate-const -ATTR_NAME = "name" ATTR_PRECONDITION_TIME = "precondition_time" # Services diff --git a/tests/components/teslemetry/test_services.py b/tests/components/teslemetry/test_services.py index 6eb22c3686d86..8004870bb8be5 100644 --- a/tests/components/teslemetry/test_services.py +++ b/tests/components/teslemetry/test_services.py @@ -13,9 +13,6 @@ ATTR_END_OFF_PEAK_TIME, ATTR_END_TIME, ATTR_GPS, - ATTR_ID, - ATTR_LOCATION, - ATTR_NAME, ATTR_OFF_PEAK_CHARGING_ENABLED, ATTR_OFF_PEAK_CHARGING_WEEKDAYS, ATTR_ONE_TIME, @@ -24,7 +21,6 @@ ATTR_PRECONDITIONING_ENABLED, ATTR_PRECONDITIONING_WEEKDAYS, ATTR_START_TIME, - ATTR_TIME, ATTR_TOU_SETTINGS, SERVICE_ADD_CHARGE_SCHEDULE, SERVICE_ADD_PRECONDITION_SCHEDULE, @@ -37,7 +33,15 @@ SERVICE_TIME_OF_USE, SERVICE_VALET_MODE, ) -from homeassistant.const import CONF_DEVICE_ID, CONF_LATITUDE, CONF_LONGITUDE +from homeassistant.const import ( + ATTR_ID, + ATTR_LOCATION, + ATTR_NAME, + ATTR_TIME, + CONF_DEVICE_ID, + CONF_LATITUDE, + CONF_LONGITUDE, +) from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError, ServiceValidationError from homeassistant.helpers import entity_registry as er From 46a38cc481ab2221b7c7a0d26d486338e1c80a5b Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 17:30:13 +0200 Subject: [PATCH 03/34] Add missing flow form field translation in flux_led (#173746) --- homeassistant/components/flux_led/strings.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/homeassistant/components/flux_led/strings.json b/homeassistant/components/flux_led/strings.json index ea1d083c5044e..f8bfb39d9f4fd 100644 --- a/homeassistant/components/flux_led/strings.json +++ b/homeassistant/components/flux_led/strings.json @@ -13,6 +13,11 @@ "discovery_confirm": { "description": "Do you want to set up {model} {id} ({ipaddr})?" }, + "pick_device": { + "data": { + "device": "[%key:common::config_flow::data::device%]" + } + }, "user": { "data": { "host": "[%key:common::config_flow::data::host%]" From 9bc5e2b06b2eec7b12eefe2e4f44eca926123249 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 17:30:21 +0200 Subject: [PATCH 04/34] Fix flow form field translation key in lookin (#173751) --- homeassistant/components/lookin/strings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/lookin/strings.json b/homeassistant/components/lookin/strings.json index a0da3130b20d5..82cdc6bd60683 100644 --- a/homeassistant/components/lookin/strings.json +++ b/homeassistant/components/lookin/strings.json @@ -23,7 +23,7 @@ }, "user": { "data": { - "ip_address": "[%key:common::config_flow::data::ip%]" + "host": "[%key:common::config_flow::data::host%]" } } } From 9ec0f2fe4fc4aba683f8c099efaec549d82216d8 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 17:30:29 +0200 Subject: [PATCH 05/34] Add missing flow form field translation in gogogate2 (#173753) --- homeassistant/components/gogogate2/strings.json | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/gogogate2/strings.json b/homeassistant/components/gogogate2/strings.json index d66f22922a611..1db0c966ee58e 100644 --- a/homeassistant/components/gogogate2/strings.json +++ b/homeassistant/components/gogogate2/strings.json @@ -11,6 +11,7 @@ "step": { "user": { "data": { + "device": "[%key:common::config_flow::data::device%]", "ip_address": "[%key:common::config_flow::data::ip%]", "password": "[%key:common::config_flow::data::password%]", "username": "[%key:common::config_flow::data::username%]" From efa3334616572dd0358d956fe94c25b091bd511e Mon Sep 17 00:00:00 2001 From: G Johansson Date: Sun, 14 Jun 2026 18:00:43 +0200 Subject: [PATCH 06/34] Bump lxml to 6.1.1 (#173748) --- homeassistant/components/scrape/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/scrape/manifest.json b/homeassistant/components/scrape/manifest.json index 1fddfe6c8f1e0..8140d9608100d 100644 --- a/homeassistant/components/scrape/manifest.json +++ b/homeassistant/components/scrape/manifest.json @@ -6,5 +6,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/scrape", "iot_class": "cloud_polling", - "requirements": ["beautifulsoup4==4.13.3", "lxml==6.0.1"] + "requirements": ["beautifulsoup4==4.13.3", "lxml==6.1.1"] } diff --git a/requirements_all.txt b/requirements_all.txt index 6079bfc5524e1..1bf9fbda5329a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1522,7 +1522,7 @@ lupupy==0.3.2 lw12==0.9.2 # homeassistant.components.scrape -lxml==6.0.1 +lxml==6.1.1 # homeassistant.components.matrix matrix-nio==0.25.2 From 0fdb3ebed7fac0162dc2d2da3c172cea2a2b0595 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:16:06 +0200 Subject: [PATCH 07/34] Bump aioamazondevices to 14.0.4 (#173761) --- homeassistant/components/alexa_devices/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/alexa_devices/manifest.json b/homeassistant/components/alexa_devices/manifest.json index a9fc6bb090fbf..d9c72c6163d63 100644 --- a/homeassistant/components/alexa_devices/manifest.json +++ b/homeassistant/components/alexa_devices/manifest.json @@ -8,5 +8,5 @@ "iot_class": "cloud_polling", "loggers": ["aioamazondevices"], "quality_scale": "platinum", - "requirements": ["aioamazondevices==14.0.3"] + "requirements": ["aioamazondevices==14.0.4"] } diff --git a/requirements_all.txt b/requirements_all.txt index 1bf9fbda5329a..b7f0413f79d56 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -190,7 +190,7 @@ aioairzone-cloud==0.7.2 aioairzone==1.0.5 # homeassistant.components.alexa_devices -aioamazondevices==14.0.3 +aioamazondevices==14.0.4 # homeassistant.components.ambient_network # homeassistant.components.ambient_station From b4319c4d0c56c9ac58a0d7ea66e7313e407ffd6d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:35:35 +0200 Subject: [PATCH 08/34] Bump aioacaia to 0.1.18 (#173762) --- homeassistant/components/acaia/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/acaia/manifest.json b/homeassistant/components/acaia/manifest.json index 4b2b3da9d7525..e6fdea2600e28 100644 --- a/homeassistant/components/acaia/manifest.json +++ b/homeassistant/components/acaia/manifest.json @@ -26,5 +26,5 @@ "iot_class": "local_push", "loggers": ["aioacaia"], "quality_scale": "platinum", - "requirements": ["aioacaia==0.1.17"] + "requirements": ["aioacaia==0.1.18"] } diff --git a/requirements_all.txt b/requirements_all.txt index b7f0413f79d56..72ff4db30582d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -178,7 +178,7 @@ aio-georss-gdacs==0.10 aio-ownet==0.0.5 # homeassistant.components.acaia -aioacaia==0.1.17 +aioacaia==0.1.18 # homeassistant.components.airq aioairq==0.4.7 From 987c19d99166d418e05d6dfb25e706e871b9478c Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:48:55 +0200 Subject: [PATCH 09/34] Replace duplicate SERVICE_RELOAD constant with homeassistant.const import in conversation (#173741) --- homeassistant/components/conversation/__init__.py | 3 +-- homeassistant/components/conversation/const.py | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/homeassistant/components/conversation/__init__.py b/homeassistant/components/conversation/__init__.py index e3c3efa18d54e..f596838aac80b 100644 --- a/homeassistant/components/conversation/__init__.py +++ b/homeassistant/components/conversation/__init__.py @@ -8,7 +8,7 @@ import voluptuous as vol from homeassistant.config_entries import ConfigEntry -from homeassistant.const import MATCH_ALL +from homeassistant.const import MATCH_ALL, SERVICE_RELOAD from homeassistant.core import ( HomeAssistant, ServiceCall, @@ -53,7 +53,6 @@ METADATA_CUSTOM_FILE, METADATA_CUSTOM_SENTENCE, SERVICE_PROCESS, - SERVICE_RELOAD, ConversationEntityFeature, ) from .default_agent import async_setup_default_agent diff --git a/homeassistant/components/conversation/const.py b/homeassistant/components/conversation/const.py index cd832f8828020..fc5c3508e1b28 100644 --- a/homeassistant/components/conversation/const.py +++ b/homeassistant/components/conversation/const.py @@ -19,8 +19,6 @@ ATTR_CONVERSATION_ID = "conversation_id" SERVICE_PROCESS = "process" -# pylint: disable-next=home-assistant-duplicate-const -SERVICE_RELOAD = "reload" DATA_COMPONENT: HassKey[EntityComponent[ConversationEntity]] = HassKey(DOMAIN) From 742bfb00ff4d2cceb61047fce48c716d0de6fbc8 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:49:24 +0200 Subject: [PATCH 10/34] Bump anova-wifi to 0.17.1 (#173764) --- homeassistant/components/anova/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/anova/manifest.json b/homeassistant/components/anova/manifest.json index 0e4e1c352f407..a4119a03abc39 100644 --- a/homeassistant/components/anova/manifest.json +++ b/homeassistant/components/anova/manifest.json @@ -7,5 +7,5 @@ "integration_type": "hub", "iot_class": "cloud_push", "loggers": ["anova_wifi"], - "requirements": ["anova-wifi==0.17.0"] + "requirements": ["anova-wifi==0.17.1"] } diff --git a/requirements_all.txt b/requirements_all.txt index 72ff4db30582d..ed3cb647fa5a8 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -516,7 +516,7 @@ androidtvremote2==0.3.1 anel-pwrctrl-homeassistant==0.0.1.dev2 # homeassistant.components.anova -anova-wifi==0.17.0 +anova-wifi==0.17.1 # homeassistant.components.anthemav anthemav==1.4.1 From b75c839868a038d9ea23efdab1ca67a2ad2bcecc Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:49:59 +0200 Subject: [PATCH 11/34] Bump python-linkplay to 0.2.14 (#173770) --- homeassistant/components/linkplay/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/linkplay/manifest.json b/homeassistant/components/linkplay/manifest.json index 335f1acf396bf..853468e5208d0 100644 --- a/homeassistant/components/linkplay/manifest.json +++ b/homeassistant/components/linkplay/manifest.json @@ -7,6 +7,6 @@ "integration_type": "hub", "iot_class": "local_polling", "loggers": ["linkplay"], - "requirements": ["python-linkplay==0.2.12"], + "requirements": ["python-linkplay==0.2.14"], "zeroconf": ["_linkplay._tcp.local."] } diff --git a/requirements_all.txt b/requirements_all.txt index ed3cb647fa5a8..2981238c16d4f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2684,7 +2684,7 @@ python-join-api==0.1.1 python-kasa[speedups]==0.10.2 # homeassistant.components.linkplay -python-linkplay==0.2.12 +python-linkplay==0.2.14 # homeassistant.components.melcloud python-melcloud==0.1.3 From bd68e9fbe3c2244b3c2953d6c3629d03663f72ea Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:51:12 +0200 Subject: [PATCH 12/34] Bump syrupy to 5.3.2 (#173767) --- requirements_test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements_test.txt b/requirements_test.txt index a5f65e074e0c1..01c5009e7ec53 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -37,7 +37,7 @@ pytest==9.0.3 requests==2.34.2 requests-mock==1.12.1 respx==0.23.1 -syrupy==5.3.1 +syrupy==5.3.2 tqdm==4.67.1 types-aiofiles==24.1.0.20250822 types-atomicwrites==1.4.5.1 From 8aca342a78c9b7b9dd1b185a06b336c1c14b5071 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:51:48 +0200 Subject: [PATCH 13/34] Bump snapcast to 2.3.8 (#173765) --- homeassistant/components/snapcast/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/snapcast/manifest.json b/homeassistant/components/snapcast/manifest.json index 21358156455fa..397241df37b4d 100644 --- a/homeassistant/components/snapcast/manifest.json +++ b/homeassistant/components/snapcast/manifest.json @@ -7,5 +7,5 @@ "integration_type": "hub", "iot_class": "local_push", "loggers": ["construct", "snapcast"], - "requirements": ["snapcast==2.3.7"] + "requirements": ["snapcast==2.3.8"] } diff --git a/requirements_all.txt b/requirements_all.txt index 2981238c16d4f..a1b2f013ca20e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -3046,7 +3046,7 @@ slixmpp==1.13.2 smart-meter-texas==0.5.5 # homeassistant.components.snapcast -snapcast==2.3.7 +snapcast==2.3.8 # homeassistant.components.sonos soco==0.31.1 From 501d956b1b18019abd457edf14e3312b28458703 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:52:24 +0200 Subject: [PATCH 14/34] Bump pylint to 4.0.6 (#173769) --- requirements_test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements_test.txt b/requirements_test.txt index 01c5009e7ec53..80dfcf78fd403 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -19,7 +19,7 @@ mock-open==1.4.0 mypy==2.1.0 prek==0.2.28 pydantic==2.13.4 -pylint==4.0.5 +pylint==4.0.6 pylint-per-file-ignores==3.2.1 pipdeptree==2.26.1 pytest-asyncio==1.4.0 From 8017e802dd39e628bbe6614f369735e06221ac01 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:56:12 +0200 Subject: [PATCH 15/34] Bump aiopulse to 0.4.7 (#173763) --- homeassistant/components/acmeda/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/acmeda/manifest.json b/homeassistant/components/acmeda/manifest.json index 0c35904cac699..b80332873f820 100644 --- a/homeassistant/components/acmeda/manifest.json +++ b/homeassistant/components/acmeda/manifest.json @@ -6,5 +6,5 @@ "documentation": "https://www.home-assistant.io/integrations/acmeda", "iot_class": "local_push", "loggers": ["aiopulse"], - "requirements": ["aiopulse==0.4.6"] + "requirements": ["aiopulse==0.4.7"] } diff --git a/requirements_all.txt b/requirements_all.txt index a1b2f013ca20e..ae151a51e4272 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -372,7 +372,7 @@ aiopnsense==1.0.8 aioptdevices==2026.03.2 # homeassistant.components.acmeda -aiopulse==0.4.6 +aiopulse==0.4.7 # homeassistant.components.purpleair aiopurpleair==2025.08.1 From 6c116cf3e43eeece488c492f5e1fd855a472fbac Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Sun, 14 Jun 2026 18:56:55 +0200 Subject: [PATCH 16/34] Bump reolink_aio to 0.21.1 (#173772) --- homeassistant/components/reolink/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/reolink/manifest.json b/homeassistant/components/reolink/manifest.json index eec71a5a8a906..584098ef5d623 100644 --- a/homeassistant/components/reolink/manifest.json +++ b/homeassistant/components/reolink/manifest.json @@ -20,5 +20,5 @@ "iot_class": "local_push", "loggers": ["reolink_aio"], "quality_scale": "platinum", - "requirements": ["reolink-aio==0.21.0"] + "requirements": ["reolink-aio==0.21.1"] } diff --git a/requirements_all.txt b/requirements_all.txt index ae151a51e4272..b896dbbfa4471 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2902,7 +2902,7 @@ renault-api==0.5.12 renson-endura-delta==1.7.2 # homeassistant.components.reolink -reolink-aio==0.21.0 +reolink-aio==0.21.1 # homeassistant.components.radio_frequency rf-protocols==4.2.0 From e01215da0e94d13eab9597d0c8042f4f6018f14c Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:58:05 +0200 Subject: [PATCH 17/34] Fix exception translation placeholder mismatch in Swiss Public Transport (#173735) --- homeassistant/components/swiss_public_transport/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/homeassistant/components/swiss_public_transport/__init__.py b/homeassistant/components/swiss_public_transport/__init__.py index 67706d6f85999..fe1e92ab6f269 100644 --- a/homeassistant/components/swiss_public_transport/__init__.py +++ b/homeassistant/components/swiss_public_transport/__init__.py @@ -86,12 +86,11 @@ async def async_setup_entry( }, ) from e except OpendataTransportError as e: - # pylint: disable-next=home-assistant-exception-placeholder-mismatch raise ConfigEntryError( translation_domain=DOMAIN, translation_key="invalid_data", translation_placeholders={ - **PLACEHOLDERS, + "stationboard_url": PLACEHOLDERS["stationboard_url"], "config_title": entry.title, "error": str(e), }, From 3fda722dbbc84c5f3ad300da107f803c2a581441 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:58:52 +0200 Subject: [PATCH 18/34] Add missing flow form field translation in blink (#173756) --- homeassistant/components/blink/strings.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/homeassistant/components/blink/strings.json b/homeassistant/components/blink/strings.json index abeaef005ae8a..af05dea999ae5 100644 --- a/homeassistant/components/blink/strings.json +++ b/homeassistant/components/blink/strings.json @@ -26,6 +26,12 @@ "description": "The credentials for {username} need to be updated", "title": "Re-authenticate Blink" }, + "reconfigure": { + "data": { + "password": "[%key:common::config_flow::data::password%]", + "username": "[%key:common::config_flow::data::username%]" + } + }, "user": { "data": { "password": "[%key:common::config_flow::data::password%]", From 52b2738b2a390d9b72ca6b93e46e9ce7a5b5f6d9 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 18:59:23 +0200 Subject: [PATCH 19/34] Add missing flow form field translation in motionblinds_ble (#173758) --- homeassistant/components/motionblinds_ble/strings.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/homeassistant/components/motionblinds_ble/strings.json b/homeassistant/components/motionblinds_ble/strings.json index d09373ac00e65..540e39103c1a0 100644 --- a/homeassistant/components/motionblinds_ble/strings.json +++ b/homeassistant/components/motionblinds_ble/strings.json @@ -10,6 +10,9 @@ }, "step": { "confirm": { + "data": { + "blind_type": "Blind type" + }, "description": "What kind of blind is {display_name}?" }, "user": { From 11a4533ccc722447801a9f853da3b4d5d32aee0b Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 19:00:12 +0200 Subject: [PATCH 20/34] Fix flow form field translation key in meteoclimatic (#173754) --- homeassistant/components/meteoclimatic/strings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/meteoclimatic/strings.json b/homeassistant/components/meteoclimatic/strings.json index d325d1f10c22a..1ce56f571cd92 100644 --- a/homeassistant/components/meteoclimatic/strings.json +++ b/homeassistant/components/meteoclimatic/strings.json @@ -10,10 +10,10 @@ "step": { "user": { "data": { - "code": "Station code" + "station_code": "Station code" }, "data_description": { - "code": "Looks like ESCAT4300000043206B" + "station_code": "Looks like ESCAT4300000043206B" } } } From 377fdceb6c8bc0e780a4fe83ab80de029366e49f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 19:00:56 +0200 Subject: [PATCH 21/34] Add missing flow form field translation in melnor (#173752) --- homeassistant/components/melnor/strings.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/homeassistant/components/melnor/strings.json b/homeassistant/components/melnor/strings.json index c07cc8ef3214a..c51c76044361f 100644 --- a/homeassistant/components/melnor/strings.json +++ b/homeassistant/components/melnor/strings.json @@ -8,6 +8,11 @@ "bluetooth_confirm": { "description": "Do you want to add the Melnor Bluetooth valve `{name}` to Home Assistant?", "title": "Discovered Melnor Bluetooth valve" + }, + "pick_device": { + "data": { + "address": "[%key:common::config_flow::data::device%]" + } } } }, From 687c91d5f4771bd862e9b7bf101e8d6b6d7bdb35 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 19:01:36 +0200 Subject: [PATCH 22/34] Add missing flow form field translation in lacrosse_view (#173750) --- homeassistant/components/lacrosse_view/strings.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/homeassistant/components/lacrosse_view/strings.json b/homeassistant/components/lacrosse_view/strings.json index b08f355c961cb..b97fa1754bff5 100644 --- a/homeassistant/components/lacrosse_view/strings.json +++ b/homeassistant/components/lacrosse_view/strings.json @@ -10,6 +10,11 @@ "unknown": "[%key:common::config_flow::error::unknown%]" }, "step": { + "location": { + "data": { + "location": "[%key:common::config_flow::data::location%]" + } + }, "user": { "data": { "password": "[%key:common::config_flow::data::password%]", From 3aec97032133b2ba4bd83343951b24457b0958d5 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 19:02:03 +0200 Subject: [PATCH 23/34] Add missing flow form field translations in islamic_prayer_times (#173749) --- homeassistant/components/islamic_prayer_times/strings.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/homeassistant/components/islamic_prayer_times/strings.json b/homeassistant/components/islamic_prayer_times/strings.json index eaf54950ab4d0..803b5b40e0d77 100644 --- a/homeassistant/components/islamic_prayer_times/strings.json +++ b/homeassistant/components/islamic_prayer_times/strings.json @@ -5,6 +5,10 @@ }, "step": { "user": { + "data": { + "location": "[%key:common::config_flow::data::location%]", + "name": "[%key:common::config_flow::data::name%]" + }, "description": "Do you want to set up Islamic Prayer Times?", "title": "Set up Islamic Prayer Times" } From 8c452c280f4f9e621f419c21df4abcd44760bcdf Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 19:02:44 +0200 Subject: [PATCH 24/34] Add missing flow form field translation in hue (#173747) --- homeassistant/components/hue/strings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/hue/strings.json b/homeassistant/components/hue/strings.json index 2b1d3830cb7dc..9ecfbcb93941c 100644 --- a/homeassistant/components/hue/strings.json +++ b/homeassistant/components/hue/strings.json @@ -18,7 +18,8 @@ "step": { "init": { "data": { - "host": "[%key:common::config_flow::data::host%]" + "host": "[%key:common::config_flow::data::host%]", + "id": "Hue bridge" }, "data_description": { "host": "The hostname or IP address of your Hue bridge." From af60e248d36b74c54660eebb071897bc50c3a498 Mon Sep 17 00:00:00 2001 From: G Johansson Date: Sun, 14 Jun 2026 19:05:33 +0200 Subject: [PATCH 25/34] Remove listener from holiday calendar when entity is disabled (#173759) --- homeassistant/components/holiday/calendar.py | 7 ++++ tests/components/holiday/test_calendar.py | 44 ++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/homeassistant/components/holiday/calendar.py b/homeassistant/components/holiday/calendar.py index 286436915dede..0d6b2ee5d5f6f 100644 --- a/homeassistant/components/holiday/calendar.py +++ b/homeassistant/components/holiday/calendar.py @@ -151,6 +151,13 @@ async def async_added_to_hass(self) -> None: """Set up first update.""" self._update_state_and_setup_listener() + async def async_will_remove_from_hass(self) -> None: + """Cancel listener when removing.""" + await super().async_will_remove_from_hass() + if self.unsub: + self.unsub() + self.unsub = None + def update_event(self, now: datetime) -> CalendarEvent | None: """Return the next upcoming event.""" next_holiday = None diff --git a/tests/components/holiday/test_calendar.py b/tests/components/holiday/test_calendar.py index 463f86456470d..f988b377b6744 100644 --- a/tests/components/holiday/test_calendar.py +++ b/tests/components/holiday/test_calendar.py @@ -1,6 +1,7 @@ """Tests for calendar platform of Holiday integration.""" from datetime import datetime, timedelta +import logging from freezegun.api import FrozenDateTimeFactory from holidays import CATHOLIC @@ -17,6 +18,7 @@ ) from homeassistant.const import CONF_COUNTRY from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er from homeassistant.setup import async_setup_component from homeassistant.util import dt as dt_util @@ -431,3 +433,45 @@ async def test_categories( ] } } + + +async def test_no_update_when_disabled( + hass: HomeAssistant, + freezer: FrozenDateTimeFactory, + entity_registry: er.EntityRegistry, + caplog: pytest.LogCaptureFixture, +) -> None: + """Test that a disabled calendar entity does not trigger updates.""" + zone = await dt_util.async_get_time_zone("US/Hawaii") + freezer.move_to(datetime(2023, 1, 1, 0, 1, 1, tzinfo=zone)) + config_entry = MockConfigEntry( + domain=DOMAIN, + data={CONF_COUNTRY: "US", CONF_PROVINCE: "AK"}, + title="United States, AK", + ) + config_entry.add_to_hass(hass) + + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + await async_setup_component(hass, "calendar", {}) + await hass.async_block_till_done() + + entity_id = "calendar.united_states_ak" + state = hass.states.get(entity_id) + assert state is not None + + entity_registry.async_update_entity( + entity_id, disabled_by=er.RegistryEntryDisabler.USER + ) + await hass.async_block_till_done() + + with caplog.at_level(logging.WARNING, logger="homeassistant.helpers.entity"): + freezer.move_to(datetime(2023, 1, 2, 0, 1, 1, tzinfo=zone)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + + assert ( + "incorrectly being triggered for updates while it is disabled" + not in caplog.text + ) From 5433beeec11d34544aff263eb08ecddc199b0154 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 19:06:54 +0200 Subject: [PATCH 26/34] Skip Miele fan set_percentage when already at the target step (#173725) --- homeassistant/components/miele/fan.py | 2 ++ tests/components/miele/test_fan.py | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/homeassistant/components/miele/fan.py b/homeassistant/components/miele/fan.py index 4e0a7879cd7a4..870010d280e3a 100644 --- a/homeassistant/components/miele/fan.py +++ b/homeassistant/components/miele/fan.py @@ -135,6 +135,8 @@ async def async_set_percentage(self, percentage: int) -> None: _LOGGER.debug("Calc ventilation_step: %s", ventilation_step) if ventilation_step == 0: await self.async_turn_off() + elif ventilation_step == self.device.state_ventilation_step: + return else: try: await self.api.send_action( diff --git a/tests/components/miele/test_fan.py b/tests/components/miele/test_fan.py index 4dc5f6d740842..6c5a6c1a4a3cc 100644 --- a/tests/components/miele/test_fan.py +++ b/tests/components/miele/test_fan.py @@ -113,6 +113,32 @@ async def test_fan_set_speed( ) +async def test_fan_set_percentage_no_op_when_already_at_target( + hass: HomeAssistant, + mock_miele_client: MagicMock, + setup_platform: MockConfigEntry, +) -> None: + """Test that set_percentage is a no-op when already at the target step.""" + await hass.services.async_call( + FAN_DOMAIN, + SERVICE_SET_PERCENTAGE, + {ATTR_ENTITY_ID: ENTITY_ID, ATTR_PERCENTAGE: 50}, + blocking=True, + ) + mock_miele_client.send_action.assert_called_once_with( + "DummyAppliance_18", {"ventilationStep": 2} + ) + mock_miele_client.send_action.reset_mock() + + await hass.services.async_call( + FAN_DOMAIN, + SERVICE_SET_PERCENTAGE, + {ATTR_ENTITY_ID: ENTITY_ID, ATTR_PERCENTAGE: 50}, + blocking=True, + ) + mock_miele_client.send_action.assert_not_called() + + async def test_fan_turn_on_w_percentage( hass: HomeAssistant, mock_miele_client: MagicMock, From 401fae6bdd93ba3cc2c6360aeba7a7c9266721aa Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Sun, 14 Jun 2026 19:08:49 +0200 Subject: [PATCH 27/34] Bump py-synologydsm-api to 2.10.0 (#173774) --- homeassistant/components/synology_dsm/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/synology_dsm/manifest.json b/homeassistant/components/synology_dsm/manifest.json index d3b9f2be9a448..9210d3b417171 100644 --- a/homeassistant/components/synology_dsm/manifest.json +++ b/homeassistant/components/synology_dsm/manifest.json @@ -8,7 +8,7 @@ "integration_type": "device", "iot_class": "local_polling", "loggers": ["synology_dsm"], - "requirements": ["py-synologydsm-api==2.9.0"], + "requirements": ["py-synologydsm-api==2.10.0"], "ssdp": [ { "deviceType": "urn:schemas-upnp-org:device:Basic:1", diff --git a/requirements_all.txt b/requirements_all.txt index b896dbbfa4471..240a49f714cee 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1948,7 +1948,7 @@ py-schluter==0.1.7 py-sucks==0.9.11 # homeassistant.components.synology_dsm -py-synologydsm-api==2.9.0 +py-synologydsm-api==2.10.0 # homeassistant.components.unifi_access py-unifi-access==1.3.0 From 825d99ddafed38b41cee3179bb326798d7ce0147 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 19:09:43 +0200 Subject: [PATCH 28/34] Bump uv to 0.11.21 (#173768) --- homeassistant/package_constraints.txt | 2 +- pyproject.toml | 2 +- requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index a0a69a5109741..050d86588783d 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -70,7 +70,7 @@ standard-telnetlib==3.13.0 typing-extensions>=4.15.0,<5.0 ulid-transform==2.2.9 urllib3>=2.0 -uv==0.11.19 +uv==0.11.21 voluptuous-openapi==0.3.0 voluptuous-serialize==2.7.0 voluptuous==0.15.2 diff --git a/pyproject.toml b/pyproject.toml index bd65dce2718a2..8b71c9bd97a01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,7 @@ dependencies = [ "typing-extensions>=4.15.0,<5.0", "ulid-transform==2.2.9", "urllib3>=2.0", - "uv==0.11.19", + "uv==0.11.21", "voluptuous==0.15.2", "voluptuous-serialize==2.7.0", "voluptuous-openapi==0.3.0", diff --git a/requirements.txt b/requirements.txt index da66cc9dc4d89..787c75320897f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -55,7 +55,7 @@ standard-telnetlib==3.13.0 typing-extensions>=4.15.0,<5.0 ulid-transform==2.2.9 urllib3>=2.0 -uv==0.11.19 +uv==0.11.21 voluptuous-openapi==0.3.0 voluptuous-serialize==2.7.0 voluptuous==0.15.2 From f7342ea9b076e0f531b7b92a6135278c63c6a39c Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 19:11:42 +0200 Subject: [PATCH 29/34] Add missing translation_domain to nasweb exception raises (#173732) --- homeassistant/components/nasweb/__init__.py | 22 ++-- homeassistant/components/nasweb/strings.json | 2 +- tests/components/nasweb/conftest.py | 50 ++++++++ tests/components/nasweb/test_init.py | 121 +++++++++++++++++++ 4 files changed, 184 insertions(+), 11 deletions(-) create mode 100644 tests/components/nasweb/test_init.py diff --git a/homeassistant/components/nasweb/__init__.py b/homeassistant/components/nasweb/__init__.py index 4b85684bd50e4..2b08fec8b47ad 100644 --- a/homeassistant/components/nasweb/__init__.py +++ b/homeassistant/components/nasweb/__init__.py @@ -50,16 +50,16 @@ async def async_setup_entry(hass: HomeAssistant, entry: NASwebConfigEntry) -> bo ) if not await webio_api.refresh_device_info(): _LOGGER.error("[%s] Refresh device info failed", entry.data[CONF_HOST]) - # pylint: disable-next=home-assistant-exception-translation-key-domain-mismatch raise ConfigEntryError( + translation_domain=DOMAIN, translation_key="config_entry_error_internal_error", translation_placeholders={"support_email": SUPPORT_EMAIL}, ) webio_serial = webio_api.get_serial_number() if webio_serial is None: _LOGGER.error("[%s] Serial number not available", entry.data[CONF_HOST]) - # pylint: disable-next=home-assistant-exception-translation-key-domain-mismatch raise ConfigEntryError( + translation_domain=DOMAIN, translation_key="config_entry_error_internal_error", translation_placeholders={"support_email": SUPPORT_EMAIL}, ) @@ -67,8 +67,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: NASwebConfigEntry) -> bo _LOGGER.error( "[%s] Serial number doesn't match config entry", entry.data[CONF_HOST] ) - # pylint: disable-next=home-assistant-exception-translation-key-domain-mismatch - raise ConfigEntryError(translation_key="config_entry_error_serial_mismatch") + raise ConfigEntryError( + translation_domain=DOMAIN, + translation_key="config_entry_error_serial_mismatch", + ) coordinator = NASwebCoordinator( hass, webio_api, name=f"NASweb[{webio_api.get_name()}]" @@ -79,15 +81,15 @@ async def async_setup_entry(hass: HomeAssistant, entry: NASwebConfigEntry) -> bo webhook_url = nasweb_data.get_webhook_url(hass) if not await webio_api.status_subscription(webhook_url, True): _LOGGER.error("Failed to subscribe for status updates from webio") - # pylint: disable-next=home-assistant-exception-translation-key-domain-mismatch raise ConfigEntryError( + translation_domain=DOMAIN, translation_key="config_entry_error_internal_error", translation_placeholders={"support_email": SUPPORT_EMAIL}, ) if not await nasweb_data.notify_coordinator.check_connection(webio_serial): _LOGGER.error("Did not receive status from device") - # pylint: disable-next=home-assistant-exception-translation-key-domain-mismatch raise ConfigEntryError( + translation_domain=DOMAIN, translation_key="config_entry_error_no_status_update", translation_placeholders={"support_email": SUPPORT_EMAIL}, ) @@ -96,14 +98,14 @@ async def async_setup_entry(hass: HomeAssistant, entry: NASwebConfigEntry) -> bo f"[{entry.data[CONF_HOST]}] Check connection reached timeout" ) from error except AuthError as error: - # pylint: disable-next=home-assistant-exception-translation-key-domain-mismatch raise ConfigEntryError( - translation_key="config_entry_error_invalid_authentication" + translation_domain=DOMAIN, + translation_key="config_entry_error_invalid_authentication", ) from error except NoURLAvailableError as error: - # pylint: disable-next=home-assistant-exception-translation-key-domain-mismatch raise ConfigEntryError( - translation_key="config_entry_error_missing_internal_url" + translation_domain=DOMAIN, + translation_key="config_entry_error_missing_internal_url", ) from error device_registry = dr.async_get(hass) diff --git a/homeassistant/components/nasweb/strings.json b/homeassistant/components/nasweb/strings.json index 4ec206f3ae5b4..19da2d4841fef 100644 --- a/homeassistant/components/nasweb/strings.json +++ b/homeassistant/components/nasweb/strings.json @@ -65,7 +65,7 @@ "config_entry_error_no_status_update": { "message": "Did not receive any status updates within the expected time window. Make sure the Home Assistant internal URL is reachable from the NASweb device. If the issue persists contact support at {support_email}" }, - "serial_mismatch": { + "config_entry_error_serial_mismatch": { "message": "Connected to different NASweb device (serial number mismatch)." } } diff --git a/tests/components/nasweb/conftest.py b/tests/components/nasweb/conftest.py index 77ecaf3abc242..d4c52be6f8e16 100644 --- a/tests/components/nasweb/conftest.py +++ b/tests/components/nasweb/conftest.py @@ -5,6 +5,25 @@ import pytest +from homeassistant.components.nasweb.const import DOMAIN +from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME + +from tests.common import MockConfigEntry + + +@pytest.fixture +def mock_config_entry() -> MockConfigEntry: + """Return the default mocked config entry.""" + return MockConfigEntry( + domain=DOMAIN, + data={ + CONF_HOST: "1.1.1.1", + CONF_USERNAME: "test-username", + CONF_PASSWORD: "test-password", + }, + unique_id=TEST_SERIAL_NUMBER, + ) + @pytest.fixture def mock_setup_entry() -> Generator[AsyncMock]: @@ -59,3 +78,34 @@ def validate_input_all_ok() -> Generator[dict[str, AsyncMock | MagicMock]]: BASE_NASWEB_DATA + "NotificationCoordinator.check_connection": check_status_confirmation, } + + +@pytest.fixture +def mock_webio_api() -> Generator[MagicMock]: + """Return a mocked WebioAPI client.""" + with ( + patch( + "homeassistant.components.nasweb.WebioAPI", + autospec=True, + ) as webio_api_mock, + patch( + BASE_NASWEB_DATA + "NASwebData.get_webhook_url", + return_value="http://127.0.0.1:8123/api/webhook/test", + ), + patch( + BASE_NASWEB_DATA + "NotificationCoordinator.check_connection", + return_value=True, + ), + ): + webio_api = webio_api_mock.return_value + webio_api.check_connection.return_value = True + webio_api.refresh_device_info.return_value = True + webio_api.get_serial_number.return_value = TEST_SERIAL_NUMBER + webio_api.get_name.return_value = "TestNASweb" + webio_api.status_subscription.return_value = True + webio_api.outputs = {} + webio_api.inputs = {} + webio_api.temp_sensor = {} + webio_api.thermostat = {} + webio_api.zones = {} + yield webio_api diff --git a/tests/components/nasweb/test_init.py b/tests/components/nasweb/test_init.py new file mode 100644 index 0000000000000..53b393c15e29c --- /dev/null +++ b/tests/components/nasweb/test_init.py @@ -0,0 +1,121 @@ +"""Tests for the NASweb integration.""" + +from unittest.mock import MagicMock, patch + +import pytest +from webio_api.api_client import AuthError + +from homeassistant.config_entries import ConfigEntryState +from homeassistant.core import HomeAssistant +from homeassistant.helpers.network import NoURLAvailableError + +from .conftest import BASE_NASWEB_DATA + +from tests.common import MockConfigEntry + + +@pytest.mark.parametrize( + ("mock_attr", "mock_value", "expected_translation_key"), + [ + ( + "refresh_device_info", + False, + "config_entry_error_internal_error", + ), + ( + "get_serial_number", + None, + "config_entry_error_internal_error", + ), + ( + "get_serial_number", + "different_serial", + "config_entry_error_serial_mismatch", + ), + ( + "status_subscription", + False, + "config_entry_error_internal_error", + ), + ], +) +async def test_setup_entry_config_entry_error( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_webio_api: MagicMock, + mock_attr: str, + mock_value: object, + expected_translation_key: str, +) -> None: + """Test setup entry raises ConfigEntryError with correct translation key.""" + getattr(mock_webio_api, mock_attr).return_value = mock_value + mock_config_entry.add_to_hass(hass) + + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.SETUP_ERROR + assert mock_config_entry.error_reason_translation_key == expected_translation_key + + +async def test_setup_entry_auth_error( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_webio_api: MagicMock, +) -> None: + """Test setup entry raises ConfigEntryError on authentication failure.""" + mock_webio_api.check_connection.side_effect = AuthError + mock_config_entry.add_to_hass(hass) + + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.SETUP_ERROR + assert ( + mock_config_entry.error_reason_translation_key + == "config_entry_error_invalid_authentication" + ) + + +async def test_setup_entry_no_status_update( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_webio_api: MagicMock, +) -> None: + """Test setup entry raises ConfigEntryError when no status update received.""" + with patch( + BASE_NASWEB_DATA + "NotificationCoordinator.check_connection", + return_value=False, + ): + mock_config_entry.add_to_hass(hass) + + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.SETUP_ERROR + assert ( + mock_config_entry.error_reason_translation_key + == "config_entry_error_no_status_update" + ) + + +async def test_setup_entry_missing_internal_url( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_webio_api: MagicMock, +) -> None: + """Test setup entry raises ConfigEntryError when internal URL is missing.""" + with patch( + BASE_NASWEB_DATA + "NASwebData.get_webhook_url", + side_effect=NoURLAvailableError, + ): + mock_config_entry.add_to_hass(hass) + + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.SETUP_ERROR + assert ( + mock_config_entry.error_reason_translation_key + == "config_entry_error_missing_internal_url" + ) From 26b7d1e32cdc02ac1a7940bbbc5dab1b6d802d1a Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 19:12:05 +0200 Subject: [PATCH 30/34] Slugify OwnTracks beacon name in entity ID (#173629) --- .../components/owntracks/__init__.py | 3 ++- .../owntracks/test_device_tracker.py | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/owntracks/__init__.py b/homeassistant/components/owntracks/__init__.py index d1e0b6e6cb02a..d76d07a8b82eb 100644 --- a/homeassistant/components/owntracks/__init__.py +++ b/homeassistant/components/owntracks/__init__.py @@ -26,6 +26,7 @@ ) from homeassistant.helpers.typing import ConfigType from homeassistant.setup import async_when_setup +from homeassistant.util import slugify from homeassistant.util.json import json_loads from .config_flow import CONF_SECRET @@ -311,6 +312,6 @@ def async_see_beacons(self, hass, dev_id, kwargs_param): # kwargs location is the beacon's configured lat/lon kwargs.pop("battery", None) for beacon in self.mobile_beacons_active[dev_id]: - kwargs["dev_id"] = f"{BEACON_DEV_ID}_{beacon}" + kwargs["dev_id"] = slugify(f"{BEACON_DEV_ID}_{beacon}") kwargs["host_name"] = beacon self.async_see(**kwargs) diff --git a/tests/components/owntracks/test_device_tracker.py b/tests/components/owntracks/test_device_tracker.py index 9c89eb12dcbb7..b1fcd816c23c1 100644 --- a/tests/components/owntracks/test_device_tracker.py +++ b/tests/components/owntracks/test_device_tracker.py @@ -1728,3 +1728,22 @@ async def test_returns_array_friends( assert response_json[0]["lat"] == 10 assert response_json[0]["lon"] == 20 assert response_json[0]["tid"] == "p1" + + +@pytest.mark.usefixtures("context") +async def test_mobile_beacon_uppercase_name( + hass: HomeAssistant, + caplog: pytest.LogCaptureFixture, +) -> None: + """Test that a mobile beacon with uppercase name gets a valid entity ID.""" + await send_message(hass, LOCATION_TOPIC, LOCATION_MESSAGE) + + message = build_message( + {"desc": "Office", "event": "enter"}, DEFAULT_BEACON_TRANSITION_MESSAGE + ) + await send_message(hass, EVENT_TOPIC, message) + + state = hass.states.get("device_tracker.beacon_office") + assert state is not None + assert state.state == "outer" + assert "sets an invalid entity ID" not in caplog.text From 7454f40dd85dd3cd103f31246387296c2dfe4add Mon Sep 17 00:00:00 2001 From: Raphael Hehl <7577984+RaHehl@users.noreply.github.com> Date: Sun, 14 Jun 2026 19:12:07 +0200 Subject: [PATCH 31/34] Bump uiprotect to 13.1.2 (#173728) --- homeassistant/components/unifiprotect/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/unifiprotect/manifest.json b/homeassistant/components/unifiprotect/manifest.json index 8efec0345ad9a..58f4af27beea6 100644 --- a/homeassistant/components/unifiprotect/manifest.json +++ b/homeassistant/components/unifiprotect/manifest.json @@ -9,5 +9,5 @@ "iot_class": "local_push", "loggers": ["uiprotect"], "quality_scale": "platinum", - "requirements": ["uiprotect==13.1.1"] + "requirements": ["uiprotect==13.1.2"] } diff --git a/requirements_all.txt b/requirements_all.txt index 240a49f714cee..fd490c9640315 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -3255,7 +3255,7 @@ uasiren==0.0.1 uhooapi==1.2.8 # homeassistant.components.unifiprotect -uiprotect==13.1.1 +uiprotect==13.1.2 # homeassistant.components.landisgyr_heat_meter ultraheat-api==0.6.1 From 26b007994504ede7356f9a40b3cb91ee9d11c445 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 21:13:54 +0200 Subject: [PATCH 32/34] Bump pyenphase to 2.4.9 (#173785) --- homeassistant/components/enphase_envoy/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/enphase_envoy/manifest.json b/homeassistant/components/enphase_envoy/manifest.json index 76afa7624a399..529890104dff9 100644 --- a/homeassistant/components/enphase_envoy/manifest.json +++ b/homeassistant/components/enphase_envoy/manifest.json @@ -8,7 +8,7 @@ "iot_class": "local_polling", "loggers": ["pyenphase"], "quality_scale": "platinum", - "requirements": ["pyenphase==2.4.8"], + "requirements": ["pyenphase==2.4.9"], "zeroconf": [ { "type": "_enphase-envoy._tcp.local." diff --git a/requirements_all.txt b/requirements_all.txt index fd490c9640315..8a823009442d4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2151,7 +2151,7 @@ pyegps==0.2.5 pyemoncms==0.1.3 # homeassistant.components.enphase_envoy -pyenphase==2.4.8 +pyenphase==2.4.9 # homeassistant.components.envertech_evt800 pyenvertechevt800==0.2.4 From b7a29bfa2f5b67fb68ba937445fcad0442fae339 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 21:23:59 +0200 Subject: [PATCH 33/34] Bump pyrainbird to 6.3.1 (#173786) --- homeassistant/components/rainbird/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/rainbird/manifest.json b/homeassistant/components/rainbird/manifest.json index b8a77b87fafdb..3f2aaa86c03cc 100644 --- a/homeassistant/components/rainbird/manifest.json +++ b/homeassistant/components/rainbird/manifest.json @@ -7,5 +7,5 @@ "integration_type": "hub", "iot_class": "local_polling", "loggers": ["pyrainbird"], - "requirements": ["pyrainbird==6.3.0"] + "requirements": ["pyrainbird==6.3.1"] } diff --git a/requirements_all.txt b/requirements_all.txt index 8a823009442d4..51e3532f60a16 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2495,7 +2495,7 @@ pyqwikswitch==0.93 pyrail==0.4.1 # homeassistant.components.rainbird -pyrainbird==6.3.0 +pyrainbird==6.3.1 # homeassistant.components.playstation_network pyrate-limiter==4.2.0 From e4e8f901ab7b2ae6696a80e21ff725b3469e49d3 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 14 Jun 2026 21:58:12 +0200 Subject: [PATCH 34/34] Bump yalexs-ble to 3.3.1 (#173792) --- homeassistant/components/august/manifest.json | 2 +- homeassistant/components/yale/manifest.json | 2 +- homeassistant/components/yalexs_ble/manifest.json | 2 +- requirements_all.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/august/manifest.json b/homeassistant/components/august/manifest.json index e7b0fef0081fc..82300f9a615c4 100644 --- a/homeassistant/components/august/manifest.json +++ b/homeassistant/components/august/manifest.json @@ -30,5 +30,5 @@ "integration_type": "hub", "iot_class": "cloud_push", "loggers": ["pubnub", "yalexs"], - "requirements": ["yalexs==9.2.7", "yalexs-ble==3.3.0"] + "requirements": ["yalexs==9.2.7", "yalexs-ble==3.3.1"] } diff --git a/homeassistant/components/yale/manifest.json b/homeassistant/components/yale/manifest.json index 29585c862fabc..ce44726eecbac 100644 --- a/homeassistant/components/yale/manifest.json +++ b/homeassistant/components/yale/manifest.json @@ -14,5 +14,5 @@ "integration_type": "hub", "iot_class": "cloud_push", "loggers": ["socketio", "engineio", "yalexs"], - "requirements": ["yalexs==9.2.7", "yalexs-ble==3.3.0"] + "requirements": ["yalexs==9.2.7", "yalexs-ble==3.3.1"] } diff --git a/homeassistant/components/yalexs_ble/manifest.json b/homeassistant/components/yalexs_ble/manifest.json index cf60aa8625357..9c9be13009382 100644 --- a/homeassistant/components/yalexs_ble/manifest.json +++ b/homeassistant/components/yalexs_ble/manifest.json @@ -13,5 +13,5 @@ "documentation": "https://www.home-assistant.io/integrations/yalexs_ble", "integration_type": "device", "iot_class": "local_push", - "requirements": ["yalexs-ble==3.3.0"] + "requirements": ["yalexs-ble==3.3.1"] } diff --git a/requirements_all.txt b/requirements_all.txt index 51e3532f60a16..73cf13d3dfef0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -3423,7 +3423,7 @@ yalesmartalarmclient==0.4.3 # homeassistant.components.august # homeassistant.components.yale # homeassistant.components.yalexs_ble -yalexs-ble==3.3.0 +yalexs-ble==3.3.1 # homeassistant.components.august # homeassistant.components.yale