Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
0aeff36
Fix PG&E and Duquesne Light Company in Opower (#149658)
tronikos Aug 6, 2025
1302b67
Deprecate MQTT vacuum battery feature and remove it as default featur…
jbouwh Aug 6, 2025
932bf81
Add common constant `ATTR_CONFIG_ENTRY_ID` (#150067)
mib1185 Aug 6, 2025
6098853
Enable disabled OpenAI config entries after entry migration (#150099)
joostlek Aug 6, 2025
e9444a2
Enable disabled Anthropic config entries after entry migration (#150098)
joostlek Aug 6, 2025
f26e6ad
Fix update coordinator ContextVar log for custom integrations (#150100)
MartinHjelmare Aug 6, 2025
25aae89
Add Tuya snapshots tests for mzj category (sous-vide) (#150102)
epenet Aug 6, 2025
afe574f
Simplify DPCode lookup in Tuya (#150052)
epenet Aug 6, 2025
a54f0ad
Enable disabled Ollama config entries after entry migration (#150105)
joostlek Aug 6, 2025
1efe2b4
Improve dependency transparency for Zimi integration (#145879)
markhannon Aug 6, 2025
33421bd
Remove myself as codeowner from traccar_server (#150107)
ludeeus Aug 6, 2025
fa3ce62
Bump holidays to 0.78 (#150103)
gjohansson-ST Aug 6, 2025
2215777
Fix zero-argument functions with as_function (#150062)
depoll Aug 6, 2025
e1f6820
Update frontend to 20250806.0 (#150106)
bramkragten Aug 6, 2025
260ea9a
Remove previously deprecated raw value attribute from onewire (#150112)
gjohansson-ST Aug 6, 2025
124e7cf
Add support for tuya ywcgq category (liquid level) (#150096)
epenet Aug 6, 2025
76ca9ce
Add comment to Tuya code for unsupported devices (#150125)
epenet Aug 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions CODEOWNERS

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion homeassistant/components/amberelectric/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
CONF_SITE_NAME = "site_name"
CONF_SITE_ID = "site_id"

ATTR_CONFIG_ENTRY_ID = "config_entry_id"
ATTR_CHANNEL_TYPE = "channel_type"

ATTRIBUTION = "Data provided by Amber Electric"
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/amberelectric/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import voluptuous as vol

from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import ATTR_CONFIG_ENTRY_ID
from homeassistant.core import (
HomeAssistant,
ServiceCall,
Expand All @@ -16,7 +17,6 @@

from .const import (
ATTR_CHANNEL_TYPE,
ATTR_CONFIG_ENTRY_ID,
CONTROLLED_LOAD_CHANNEL,
DOMAIN,
FEED_IN_CHANNEL,
Expand Down
89 changes: 78 additions & 11 deletions homeassistant/components/anthropic/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,11 +81,15 @@ async def async_update_options(
async def async_migrate_integration(hass: HomeAssistant) -> None:
"""Migrate integration entry structure."""

entries = hass.config_entries.async_entries(DOMAIN)
# Make sure we get enabled config entries first
entries = sorted(
hass.config_entries.async_entries(DOMAIN),
key=lambda e: e.disabled_by is not None,
)
if not any(entry.version == 1 for entry in entries):
return

api_keys_entries: dict[str, ConfigEntry] = {}
api_keys_entries: dict[str, tuple[ConfigEntry, bool]] = {}
entity_registry = er.async_get(hass)
device_registry = dr.async_get(hass)

Expand All @@ -99,30 +103,61 @@ async def async_migrate_integration(hass: HomeAssistant) -> None:
)
if entry.data[CONF_API_KEY] not in api_keys_entries:
use_existing = True
api_keys_entries[entry.data[CONF_API_KEY]] = entry
all_disabled = all(
e.disabled_by is not None
for e in entries
if e.data[CONF_API_KEY] == entry.data[CONF_API_KEY]
)
api_keys_entries[entry.data[CONF_API_KEY]] = (entry, all_disabled)

parent_entry = api_keys_entries[entry.data[CONF_API_KEY]]
parent_entry, all_disabled = api_keys_entries[entry.data[CONF_API_KEY]]

hass.config_entries.async_add_subentry(parent_entry, subentry)
conversation_entity = entity_registry.async_get_entity_id(
conversation_entity_id = entity_registry.async_get_entity_id(
"conversation",
DOMAIN,
entry.entry_id,
)
if conversation_entity is not None:
device = device_registry.async_get_device(
identifiers={(DOMAIN, entry.entry_id)}
)

if conversation_entity_id is not None:
conversation_entity_entry = entity_registry.entities[conversation_entity_id]
entity_disabled_by = conversation_entity_entry.disabled_by
if (
entity_disabled_by is er.RegistryEntryDisabler.CONFIG_ENTRY
and not all_disabled
):
# Device and entity registries don't update the disabled_by flag
# when moving a device or entity from one config entry to another,
# so we need to do it manually.
entity_disabled_by = (
er.RegistryEntryDisabler.DEVICE
if device
else er.RegistryEntryDisabler.USER
)
entity_registry.async_update_entity(
conversation_entity,
conversation_entity_id,
config_entry_id=parent_entry.entry_id,
config_subentry_id=subentry.subentry_id,
disabled_by=entity_disabled_by,
new_unique_id=subentry.subentry_id,
)

device = device_registry.async_get_device(
identifiers={(DOMAIN, entry.entry_id)}
)
if device is not None:
# Device and entity registries don't update the disabled_by flag when
# moving a device or entity from one config entry to another, so we
# need to do it manually.
device_disabled_by = device.disabled_by
if (
device.disabled_by is dr.DeviceEntryDisabler.CONFIG_ENTRY
and not all_disabled
):
device_disabled_by = dr.DeviceEntryDisabler.USER
device_registry.async_update_device(
device.id,
disabled_by=device_disabled_by,
new_identifiers={(DOMAIN, subentry.subentry_id)},
add_config_subentry_id=subentry.subentry_id,
add_config_entry_id=parent_entry.entry_id,
Expand All @@ -147,7 +182,7 @@ async def async_migrate_integration(hass: HomeAssistant) -> None:
title=DEFAULT_CONVERSATION_NAME,
options={},
version=2,
minor_version=2,
minor_version=3,
)


Expand All @@ -173,6 +208,38 @@ async def async_migrate_entry(hass: HomeAssistant, entry: AnthropicConfigEntry)

hass.config_entries.async_update_entry(entry, minor_version=2)

if entry.version == 2 and entry.minor_version == 2:
# Fix migration where the disabled_by flag was not set correctly.
# We can currently only correct this for enabled config entries,
# because migration does not run for disabled config entries. This
# is asserted in tests, and if that behavior is changed, we should
# correct also disabled config entries.
device_registry = dr.async_get(hass)
entity_registry = er.async_get(hass)
devices = dr.async_entries_for_config_entry(device_registry, entry.entry_id)
entity_entries = er.async_entries_for_config_entry(
entity_registry, entry.entry_id
)
if entry.disabled_by is None:
# If the config entry is not disabled, we need to set the disabled_by
# flag on devices to USER, and on entities to DEVICE, if they are set
# to CONFIG_ENTRY.
for device in devices:
if device.disabled_by is not dr.DeviceEntryDisabler.CONFIG_ENTRY:
continue
device_registry.async_update_device(
device.id,
disabled_by=dr.DeviceEntryDisabler.USER,
)
for entity in entity_entries:
if entity.disabled_by is not er.RegistryEntryDisabler.CONFIG_ENTRY:
continue
entity_registry.async_update_entity(
entity.entity_id,
disabled_by=er.RegistryEntryDisabler.DEVICE,
)
hass.config_entries.async_update_entry(entry, minor_version=3)

LOGGER.debug(
"Migration to version %s:%s successful", entry.version, entry.minor_version
)
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/anthropic/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class AnthropicConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for Anthropic."""

VERSION = 2
MINOR_VERSION = 2
MINOR_VERSION = 3

async def async_step_user(
self, user_input: dict[str, Any] | None = None
Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/blink/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
SERVICE_SAVE_VIDEO = "save_video"
SERVICE_SAVE_RECENT_CLIPS = "save_recent_clips"
SERVICE_SEND_PIN = "send_pin"
ATTR_CONFIG_ENTRY_ID = "config_entry_id"

PLATFORMS = [
Platform.ALARM_CONTROL_PANEL,
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/blink/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import voluptuous as vol

from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import CONF_PIN
from homeassistant.const import ATTR_CONFIG_ENTRY_ID, CONF_PIN
from homeassistant.core import HomeAssistant, ServiceCall, callback
from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
from homeassistant.helpers import config_validation as cv

from .const import ATTR_CONFIG_ENTRY_ID, DOMAIN, SERVICE_SEND_PIN
from .const import DOMAIN, SERVICE_SEND_PIN
from .coordinator import BlinkConfigEntry

SERVICE_SEND_PIN_SCHEMA = vol.Schema(
Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/bosch_alarm/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,3 @@
CONF_USER_CODE = "user_code"
ATTR_DATETIME = "datetime"
SERVICE_SET_DATE_TIME = "set_date_time"
ATTR_CONFIG_ENTRY_ID = "config_entry_id"
3 changes: 2 additions & 1 deletion homeassistant/components/bosch_alarm/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@
import voluptuous as vol

from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import ATTR_CONFIG_ENTRY_ID
from homeassistant.core import HomeAssistant, ServiceCall, callback
from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
from homeassistant.helpers import config_validation as cv
from homeassistant.util import dt as dt_util

from .const import ATTR_CONFIG_ENTRY_ID, ATTR_DATETIME, DOMAIN, SERVICE_SET_DATE_TIME
from .const import ATTR_DATETIME, DOMAIN, SERVICE_SET_DATE_TIME
from .types import BoschAlarmConfigEntry


Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/ecobee/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
_LOGGER = logging.getLogger(__package__)

DOMAIN = "ecobee"
ATTR_CONFIG_ENTRY_ID = "entry_id"
ATTR_AVAILABLE_SENSORS = "available_sensors"
ATTR_ACTIVE_SENSORS = "active_sensors"

Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/frontend/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
"documentation": "https://www.home-assistant.io/integrations/frontend",
"integration_type": "system",
"quality_scale": "internal",
"requirements": ["home-assistant-frontend==20250805.0"]
"requirements": ["home-assistant-frontend==20250806.0"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/holiday/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/holiday",
"iot_class": "local_polling",
"requirements": ["holidays==0.77", "babel==2.15.0"]
"requirements": ["holidays==0.78", "babel==2.15.0"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/huawei_lte/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_CONFIG_ENTRY_ID,
ATTR_HW_VERSION,
ATTR_MODEL,
ATTR_SW_VERSION,
Expand Down Expand Up @@ -54,7 +55,6 @@
from .const import (
ADMIN_SERVICES,
ALL_KEYS,
ATTR_CONFIG_ENTRY_ID,
CONF_MANUFACTURER,
CONF_UNAUTHENTICATED_MODE,
CONF_UPNP_UDN,
Expand Down
2 changes: 0 additions & 2 deletions homeassistant/components/huawei_lte/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

DOMAIN = "huawei_lte"

ATTR_CONFIG_ENTRY_ID = "config_entry_id"

CONF_MANUFACTURER = "manufacturer"
CONF_TRACK_WIRED_CLIENTS = "track_wired_clients"
CONF_UNAUTHENTICATED_MODE = "unauthenticated_mode"
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/huawei_lte/notify.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
from huawei_lte_api.exceptions import ResponseErrorException

from homeassistant.components.notify import ATTR_TARGET, BaseNotificationService
from homeassistant.const import CONF_RECIPIENT
from homeassistant.const import ATTR_CONFIG_ENTRY_ID, CONF_RECIPIENT
from homeassistant.core import HomeAssistant
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType

from . import Router
from .const import ATTR_CONFIG_ENTRY_ID, DOMAIN
from .const import DOMAIN

_LOGGER = logging.getLogger(__name__)

Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/mastodon/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
DEFAULT_URL: Final = "https://mastodon.social"
DEFAULT_NAME: Final = "Mastodon"

ATTR_CONFIG_ENTRY_ID = "config_entry_id"
ATTR_STATUS = "status"
ATTR_VISIBILITY = "visibility"
ATTR_CONTENT_WARNING = "content_warning"
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/mastodon/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
import voluptuous as vol

from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import ATTR_CONFIG_ENTRY_ID
from homeassistant.core import HomeAssistant, ServiceCall, ServiceResponse
from homeassistant.exceptions import HomeAssistantError, ServiceValidationError

from .const import (
ATTR_CONFIG_ENTRY_ID,
ATTR_CONTENT_WARNING,
ATTR_MEDIA,
ATTR_MEDIA_DESCRIPTION,
Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/mealie/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

LOGGER = logging.getLogger(__package__)

ATTR_CONFIG_ENTRY_ID = "config_entry_id"
ATTR_START_DATE = "start_date"
ATTR_END_DATE = "end_date"
ATTR_RECIPE_ID = "recipe_id"
Expand Down
3 changes: 1 addition & 2 deletions homeassistant/components/mealie/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import voluptuous as vol

from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import ATTR_DATE
from homeassistant.const import ATTR_CONFIG_ENTRY_ID, ATTR_DATE
from homeassistant.core import (
HomeAssistant,
ServiceCall,
Expand All @@ -25,7 +25,6 @@
from homeassistant.helpers import config_validation as cv

from .const import (
ATTR_CONFIG_ENTRY_ID,
ATTR_END_DATE,
ATTR_ENTRY_TYPE,
ATTR_INCLUDE_TAGS,
Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/mobile_app/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
ATTR_APP_ID = "app_id"
ATTR_APP_NAME = "app_name"
ATTR_APP_VERSION = "app_version"
ATTR_CONFIG_ENTRY_ID = "entry_id"
ATTR_DEVICE_NAME = "device_name"
ATTR_MANUFACTURER = "manufacturer"
ATTR_MODEL = "model"
Expand Down
4 changes: 4 additions & 0 deletions homeassistant/components/mqtt/strings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{
"issues": {
"deprecated_vacuum_battery_feature": {
"title": "Deprecated battery feature used",
"description": "Vacuum entity {entity_id} implements the battery feature which is deprecated. This will stop working in Home Assistant 2026.2. Implement a separate entity for the battery state instead. To fix the issue, remove the `battery` feature from the configured supported features, and restart Home Assistant."
},
"invalid_platform_config": {
"title": "Invalid config found for MQTT {domain} item",
"description": "Home Assistant detected an invalid config for a manually configured item.\n\nPlatform domain: **{domain}**\nConfiguration file: **{config_file}**\nNear line: **{line}**\nConfiguration found:\n```yaml\n{config}\n```\nError: **{error}**.\n\nMake sure the configuration is valid and [reload](/developer-tools/yaml) the manually configured MQTT items or restart Home Assistant to fix this issue."
Expand Down
Loading
Loading