Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ jobs:
sed -i "/uv/d" requirements_diff.txt

- name: Build wheels
uses: home-assistant/wheels@2025.03.0
uses: home-assistant/wheels@2025.07.0
with:
abi: ${{ matrix.abi }}
tag: musllinux_1_2
Expand Down Expand Up @@ -219,7 +219,7 @@ jobs:
sed -i "/uv/d" requirements_diff.txt

- name: Build wheels
uses: home-assistant/wheels@2025.03.0
uses: home-assistant/wheels@2025.07.0
with:
abi: ${{ matrix.abi }}
tag: musllinux_1_2
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/esphome/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"mqtt": ["esphome/discover/#"],
"quality_scale": "platinum",
"requirements": [
"aioesphomeapi==37.1.6",
"aioesphomeapi==37.2.0",
"esphome-dashboard-api==1.3.0",
"bleak-esphome==3.1.0"
],
Expand Down
10 changes: 9 additions & 1 deletion homeassistant/components/homeassistant_hardware/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
ManifestMissing,
)

from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed

Expand All @@ -24,13 +25,20 @@
class FirmwareUpdateCoordinator(DataUpdateCoordinator[FirmwareManifest]):
"""Coordinator to manage firmware updates."""

def __init__(self, hass: HomeAssistant, session: ClientSession, url: str) -> None:
def __init__(
self,
hass: HomeAssistant,
config_entry: ConfigEntry,
session: ClientSession,
url: str,
) -> None:
"""Initialize the firmware update coordinator."""
super().__init__(
hass,
_LOGGER,
name="firmware update coordinator",
update_interval=FIRMWARE_REFRESH_INTERVAL,
config_entry=config_entry,
)
self.hass = hass
self.session = session
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ def _async_create_update_entity(
config_entry=config_entry,
update_coordinator=FirmwareUpdateCoordinator(
hass,
config_entry,
session,
NABU_CASA_FIRMWARE_RELEASES_URL,
),
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/homeassistant_yellow/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ def _async_create_update_entity(
config_entry=config_entry,
update_coordinator=FirmwareUpdateCoordinator(
hass,
config_entry,
session,
NABU_CASA_FIRMWARE_RELEASES_URL,
),
Expand Down
10 changes: 5 additions & 5 deletions homeassistant/components/template/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"arm_vacation": "Defines actions to run when the alarm control panel is armed to `arm_vacation`. Receives variable `code`.",
"trigger": "Defines actions to run when the alarm control panel is triggered. Receives variable `code`.",
"code_arm_required": "If true, the code is required to arm the alarm.",
"code_format": "One of number, text or no_code. Format for the code used to arm/disarm the alarm."
"code_format": "One of `number`, `text` or `no_code`. Format for the code used to arm/disarm the alarm."
},
"sections": {
"advanced_options": {
Expand Down Expand Up @@ -179,7 +179,7 @@
"data_description": {
"device_id": "[%key:component::template::common::device_id_description%]",
"url": "Defines a template to get the URL on which the image is served.",
"verify_ssl": "Enable or disable SSL certificate verification. Disable to use an http-only URL, or if you have a self-signed SSL certificate and haven’t installed the CA certificate to enable verification."
"verify_ssl": "Enable or disable SSL certificate verification. Disable to use an http URL, or if you have a self-signed SSL certificate and haven’t installed the CA certificate to enable verification."
},
"sections": {
"advanced_options": {
Expand Down Expand Up @@ -282,7 +282,7 @@
"set_value": "Defines actions to run when the number is set to a value. Receives variable `value`.",
"max": "Template for the number's maximum value.",
"min": "Template for the number's minimum value.",
"unit_of_measurement": "Defines the units of measurement of the number, if any."
"unit_of_measurement": "Defines the unit of measurement of the number, if any."
},
"sections": {
"advanced_options": {
Expand Down Expand Up @@ -336,7 +336,7 @@
"data_description": {
"device_id": "[%key:component::template::common::device_id_description%]",
"state": "Defines a template to get the state of the sensor. If the sensor is numeric, i.e. it has a `state_class` or a `unit_of_measurement`, the state template must render to a number or to `none`. The state template must not render to a string, including `unknown` or `unavailable`. An `availability` template may be defined to suppress rendering of the state template.",
"unit_of_measurement": "Defines the units of measurement of the sensor, if any. This will also display the value based on the number format setting in the user profile and influence the graphical presentation in the history visualization as a continuous value."
"unit_of_measurement": "Defines the unit of measurement for the sensor, if any. This will also display the value based on the number format setting in the user profile and influence the graphical presentation in the history visualization as a continuous value."
},
"sections": {
"advanced_options": {
Expand Down Expand Up @@ -418,7 +418,7 @@
"start": "Defines actions to run when the vacuum is started.",
"fan_speed": "Defines a template to get the fan speed of the vacuum.",
"fan_speeds": "List of fan speeds supported by the vacuum.",
"set_fan_speed": "Defines actions to run when the vacuum is given a command to set the fan speed. Receives variable `fan_speed`",
"set_fan_speed": "Defines actions to run when the vacuum is given a command to set the fan speed. Receives variable `fan_speed`.",
"stop": "Defines actions to run when the vacuum is stopped.",
"pause": "Defines actions to run when the vacuum is paused.",
"return_to_base": "Defines actions to run when the vacuum is given a 'Return to dock' command.",
Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/template/weather.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
from homeassistant.const import (
CONF_NAME,
CONF_TEMPERATURE_UNIT,
CONF_UNIQUE_ID,
STATE_UNAVAILABLE,
STATE_UNKNOWN,
)
Expand Down Expand Up @@ -151,6 +152,7 @@
vol.Optional(CONF_PRESSURE_UNIT): vol.In(PressureConverter.VALID_UNITS),
vol.Required(CONF_TEMPERATURE_TEMPLATE): cv.template,
vol.Optional(CONF_TEMPERATURE_UNIT): vol.In(TemperatureConverter.VALID_UNITS),
vol.Optional(CONF_UNIQUE_ID): cv.string,
vol.Optional(CONF_VISIBILITY_TEMPLATE): cv.template,
vol.Optional(CONF_VISIBILITY_UNIT): vol.In(DistanceConverter.VALID_UNITS),
vol.Optional(CONF_WIND_BEARING_TEMPLATE): cv.template,
Expand Down
16 changes: 3 additions & 13 deletions homeassistant/data_entry_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -705,10 +705,7 @@ def async_show_form(
last_step: bool | None = None,
preview: str | None = None,
) -> _FlowResultT:
"""Return the definition of a form to gather user input.

The step_id parameter is deprecated and will be removed in a future release.
"""
"""Return the definition of a form to gather user input."""
flow_result = self._flow_result(
type=FlowResultType.FORM,
flow_id=self.flow_id,
Expand Down Expand Up @@ -770,10 +767,7 @@ def async_external_step(
url: str,
description_placeholders: Mapping[str, str] | None = None,
) -> _FlowResultT:
"""Return the definition of an external step for the user to take.

The step_id parameter is deprecated and will be removed in a future release.
"""
"""Return the definition of an external step for the user to take."""
flow_result = self._flow_result(
type=FlowResultType.EXTERNAL_STEP,
flow_id=self.flow_id,
Expand Down Expand Up @@ -804,10 +798,7 @@ def async_show_progress(
description_placeholders: Mapping[str, str] | None = None,
progress_task: asyncio.Task[Any] | None = None,
) -> _FlowResultT:
"""Show a progress message to the user, without user input allowed.

The step_id parameter is deprecated and will be removed in a future release.
"""
"""Show a progress message to the user, without user input allowed."""
if progress_task is None and not self.__no_progress_task_reported:
self.__no_progress_task_reported = True
cls = self.__class__
Expand Down Expand Up @@ -867,7 +858,6 @@ def async_show_menu(
"""Show a navigation menu to the user.

Options dict maps step_id => i18n label
The step_id parameter is deprecated and will be removed in a future release.
"""
flow_result = self._flow_result(
type=FlowResultType.MENU,
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/helpers/device_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ class _EventDeviceRegistryUpdatedData_Remove(TypedDict):

action: Literal["remove"]
device_id: str
device: DeviceEntry
device: dict[str, Any]


class _EventDeviceRegistryUpdatedData_Update(TypedDict):
Expand Down Expand Up @@ -1319,7 +1319,7 @@ def async_remove_device(self, device_id: str) -> None:
self.hass.bus.async_fire_internal(
EVENT_DEVICE_REGISTRY_UPDATED,
_EventDeviceRegistryUpdatedData_Remove(
action="remove", device_id=device_id, device=device
action="remove", device_id=device_id, device=device.dict_repr
),
)
self.async_schedule_save()
Expand Down
6 changes: 3 additions & 3 deletions homeassistant/helpers/entity_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -1103,13 +1103,13 @@ def async_device_modified(
entities = async_entries_for_device(
self, event.data["device_id"], include_disabled_entities=True
)
removed_device = event.data["device"]
removed_device_dict = event.data["device"]
for entity in entities:
config_entry_id = entity.config_entry_id
if (
config_entry_id in removed_device.config_entries
config_entry_id in removed_device_dict["config_entries"]
and entity.config_subentry_id
in removed_device.config_entries_subentries[config_entry_id]
in removed_device_dict["config_entries_subentries"][config_entry_id]
):
self.async_remove(entity.entity_id)
else:
Expand Down
2 changes: 1 addition & 1 deletion requirements_all.txt

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

2 changes: 1 addition & 1 deletion requirements_test_all.txt

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

6 changes: 5 additions & 1 deletion tests/components/homeassistant_hardware/test_coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,17 @@
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.util import dt as dt_util

from tests.common import MockConfigEntry


async def test_firmware_update_coordinator_fetching(
hass: HomeAssistant, caplog: pytest.LogCaptureFixture
) -> None:
"""Test the firmware update coordinator loads manifests."""
session = async_get_clientsession(hass)

mock_config_entry = MockConfigEntry()

manifest = FirmwareManifest(
url=URL("https://example.org/firmware"),
html_url=URL("https://example.org/release_notes"),
Expand All @@ -35,7 +39,7 @@ async def test_firmware_update_coordinator_fetching(
return_value=mock_client,
):
coordinator = FirmwareUpdateCoordinator(
hass, session, "https://example.org/firmware"
hass, mock_config_entry, session, "https://example.org/firmware"
)

listener = Mock()
Expand Down
2 changes: 2 additions & 0 deletions tests/components/homeassistant_hardware/test_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ def _mock_async_create_update_entity(
config_entry=config_entry,
update_coordinator=FirmwareUpdateCoordinator(
hass,
config_entry,
session,
TEST_FIRMWARE_RELEASES_URL,
),
Expand Down Expand Up @@ -593,6 +594,7 @@ async def test_update_entity_graceful_firmware_type_callback_errors(
config_entry=update_config_entry,
update_coordinator=FirmwareUpdateCoordinator(
hass,
update_config_entry,
session,
TEST_FIRMWARE_RELEASES_URL,
),
Expand Down
1 change: 1 addition & 0 deletions tests/components/template/test_weather.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ async def setup_weather(
{
"platform": "template",
"name": "test",
"unique_id": "abc123",
"attribution_template": "{{ states('sensor.attribution') }}",
"condition_template": "sunny",
"temperature_template": "{{ states('sensor.temperature') | float }}",
Expand Down
20 changes: 10 additions & 10 deletions tests/helpers/test_device_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -1652,7 +1652,7 @@ async def test_removing_config_entries(
assert update_events[4].data == {
"action": "remove",
"device_id": entry3.id,
"device": entry3,
"device": entry3.dict_repr,
}


Expand Down Expand Up @@ -1725,12 +1725,12 @@ async def test_deleted_device_removing_config_entries(
assert update_events[3].data == {
"action": "remove",
"device_id": entry.id,
"device": entry2,
"device": entry2.dict_repr,
}
assert update_events[4].data == {
"action": "remove",
"device_id": entry3.id,
"device": entry3,
"device": entry3.dict_repr,
}

device_registry.async_clear_config_entry(config_entry_1.entry_id)
Expand Down Expand Up @@ -1976,7 +1976,7 @@ async def test_removing_config_subentries(
assert update_events[7].data == {
"action": "remove",
"device_id": entry.id,
"device": entry,
"device": entry.dict_repr,
}


Expand Down Expand Up @@ -2106,7 +2106,7 @@ async def test_deleted_device_removing_config_subentries(
assert update_events[4].data == {
"action": "remove",
"device_id": entry.id,
"device": entry4,
"device": entry4.dict_repr,
}

device_registry.async_clear_config_subentry(config_entry_1.entry_id, None)
Expand Down Expand Up @@ -2930,7 +2930,7 @@ async def test_update_remove_config_entries(
assert update_events[6].data == {
"action": "remove",
"device_id": entry3.id,
"device": entry3,
"device": entry3.dict_repr,
}


Expand Down Expand Up @@ -3208,7 +3208,7 @@ async def test_update_remove_config_subentries(
assert update_events[7].data == {
"action": "remove",
"device_id": entry_id,
"device": entry_before_remove,
"device": entry_before_remove.dict_repr,
}


Expand Down Expand Up @@ -3551,7 +3551,7 @@ async def test_restore_device(
assert update_events[2].data == {
"action": "remove",
"device_id": entry.id,
"device": entry,
"device": entry.dict_repr,
}
assert update_events[3].data == {
"action": "create",
Expand Down Expand Up @@ -3874,7 +3874,7 @@ async def test_restore_shared_device(
assert update_events[3].data == {
"action": "remove",
"device_id": entry.id,
"device": updated_device,
"device": updated_device.dict_repr,
}
assert update_events[4].data == {
"action": "create",
Expand All @@ -3883,7 +3883,7 @@ async def test_restore_shared_device(
assert update_events[5].data == {
"action": "remove",
"device_id": entry.id,
"device": entry2,
"device": entry2.dict_repr,
}
assert update_events[6].data == {
"action": "create",
Expand Down
Loading