Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
4fb7c04
Use NEWEST_FIRST replay for Matter BLE commissioning (#176822)
cryptomilk Aug 31, 2026
7ea682a
Bump tuya-device-handlers to 0.0.27 (#180906)
epenet Aug 31, 2026
a3a841a
Bump python-duco-connectivity to 0.13.1 (#180896)
ronaldvdmeer Aug 31, 2026
68b5fcb
Rest: Move common platform setup code into entity.py (#179868)
iluvdata Aug 31, 2026
c4cfba0
Add pylint checker to ensure flow menus have backing step handlers (#…
emontnemery Aug 31, 2026
9889cfc
Add atmospheres (atm) as a pressure unit (#178708)
Bre77 Aug 31, 2026
9c0ef04
Add swing mode support to LG Infrared AC climate (#177191)
Dr-Blank Aug 31, 2026
1a9b569
Set stable device name in lunatone (#180915)
zweckj Aug 31, 2026
581ade3
Bump sofar-modbus to 0.7.1 (#180907)
darkrain-nl Aug 31, 2026
448e786
Add switch platform to LG Infrared (#180843)
Dr-Blank Aug 31, 2026
18a6ac2
Use reactive power device class for iotawatt VAR sensors (#180913)
agners Aug 31, 2026
cdd43af
Bump neopool-modbus to 4.6.2 (#180908)
svasek Aug 31, 2026
4a0594e
Deprecate Configurator integration (#180912)
MartinHjelmare Aug 31, 2026
3b8cd50
Update pylint rule for async_get_device_diagnostics (#179966)
emontnemery Aug 31, 2026
2aae837
Add map tiles integration to proxy the OpenStreetMap base map (#180441)
bramkragten Aug 31, 2026
5f1a7f4
Bump pyprobeplus to 2.1.0 (#180921)
pantherale0 Aug 31, 2026
876ab37
Add kPa as a valid unit of measurement for pressure in weather entity…
RussellAult Aug 31, 2026
d6d4107
Use registry fixtures in tests (1/8) (#180919)
joostlek Aug 31, 2026
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: 2 additions & 0 deletions CODEOWNERS

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

11 changes: 7 additions & 4 deletions homeassistant/components/alexa_devices/diagnostics.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
"""Diagnostics support for Alexa Devices integration."""

from dataclasses import asdict
from typing import Any
from typing import TYPE_CHECKING, Any

from aioamazondevices.structures import AmazonDevice

from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry, DeviceEntry

from .coordinator import AmazonConfigEntry

Expand Down Expand Up @@ -48,13 +48,16 @@ async def async_get_config_entry_diagnostics(


async def async_get_device_diagnostics(
hass: HomeAssistant, entry: AmazonConfigEntry, device_entry: DeviceEntry
hass: HomeAssistant, entry: AmazonConfigEntry, device_entry: AnyDeviceEntry
) -> dict[str, Any]:
"""Return diagnostics for a device."""

coordinator = entry.runtime_data

assert device_entry.serial_number
if TYPE_CHECKING:
# alexa_devices does not create child devices, and devices have a serial number
assert isinstance(device_entry, DeviceEntry)
assert device_entry.serial_number

return build_device_data(coordinator.data[device_entry.serial_number])

Expand Down
50 changes: 49 additions & 1 deletion homeassistant/components/configurator/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,16 @@
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.entity import async_generate_entity_id
from homeassistant.helpers.event import async_call_later
from homeassistant.helpers.frame import ReportBehavior, report_usage
from homeassistant.helpers.service import async_register_admin_service
from homeassistant.helpers.typing import ConfigType
from homeassistant.util.async_ import run_callback_threadsafe

_KEY_INSTANCE = "configurator"

# The configurator integration is deprecated and can be removed in HA Core 2027.10
_BREAKS_IN_HA_VERSION = "2027.10"

DATA_REQUESTS = "configurator_requests"

ATTR_CONFIGURE_ID = "configure_id"
Expand All @@ -54,6 +58,17 @@
CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)


def _report_deprecation() -> None:
"""Report use of the deprecated configurator integration."""
report_usage(
"uses the deprecated configurator integration, which should be replaced "
"by a config flow",
breaks_in_ha_version=_BREAKS_IN_HA_VERSION,
core_behavior=ReportBehavior.LOG,
exclude_integrations={DOMAIN},
)


@async_callback
def async_request_config(
hass: HomeAssistant,
Expand All @@ -69,6 +84,38 @@ def async_request_config(
) -> str:
"""Create a new request for configuration.

Will return an ID to be used for subsequent calls.
"""
_report_deprecation()
return _async_request_config(
hass,
name,
callback=callback,
description=description,
description_image=description_image,
submit_caption=submit_caption,
fields=fields,
link_name=link_name,
link_url=link_url,
entity_picture=entity_picture,
)


@async_callback
def _async_request_config(
hass: HomeAssistant,
name: str,
callback: ConfiguratorCallback | None = None,
description: str | None = None,
description_image: str | None = None,
submit_caption: str | None = None,
fields: list[dict[str, str]] | None = None,
link_name: str | None = None,
link_url: str | None = None,
entity_picture: str | None = None,
) -> str:
"""Create a new request for configuration.

Will return an ID to be used for sequent calls.
"""
if description and link_name is not None and link_url is not None:
Expand Down Expand Up @@ -97,8 +144,9 @@ def request_config(hass: HomeAssistant, *args: Any, **kwargs: Any) -> str:

Will return an ID to be used for sequent calls.
"""
_report_deprecation()
return run_callback_threadsafe(
hass.loop, ft.partial(async_request_config, hass, *args, **kwargs)
hass.loop, ft.partial(_async_request_config, hass, *args, **kwargs)
).result()


Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/diagnostics/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import attr

from homeassistant.core import callback
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry
from homeassistant.helpers.entity_registry import RegistryEntry

from .const import REDACTED
Expand Down Expand Up @@ -65,7 +65,7 @@ def _device_entry_filter(a: attr.Attribute, _: Any) -> bool:


@callback
def device_entry_as_dict(entry: DeviceEntry) -> dict[str, Any]:
def device_entry_as_dict(entry: AnyDeviceEntry) -> dict[str, Any]:
"""Convert a device registry entry to a dict for diagnostics.

This excludes internal fields that should not be exposed in diagnostics.
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/duco/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"iot_class": "local_polling",
"loggers": ["duco_connectivity"],
"quality_scale": "platinum",
"requirements": ["python-duco-connectivity==0.12.0"],
"requirements": ["python-duco-connectivity==0.13.1"],
"zeroconf": [
{
"name": "duco [[][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][]].*",
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/ecowitt/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
from typing import Any

from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry

from . import EcowittConfigEntry
from .const import DOMAIN


async def async_get_device_diagnostics(
hass: HomeAssistant, entry: EcowittConfigEntry, device: DeviceEntry
hass: HomeAssistant, entry: EcowittConfigEntry, device: AnyDeviceEntry
) -> dict[str, Any]:
"""Return diagnostics for a device entry."""
ecowitt = entry.runtime_data
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/fibaro/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from homeassistant.components.diagnostics import async_redact_data
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry

from . import CONF_IMPORT_PLUGINS, FibaroConfigEntry

Expand All @@ -34,7 +34,7 @@ async def async_get_config_entry_diagnostics(


async def async_get_device_diagnostics(
hass: HomeAssistant, config_entry: FibaroConfigEntry, device: DeviceEntry
hass: HomeAssistant, config_entry: FibaroConfigEntry, device: AnyDeviceEntry
) -> Mapping[str, Any]:
"""Return diagnostics for a device."""
controller = config_entry.runtime_data
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/frontend/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"file_upload",
"http",
"lovelace",
"map_tiles",
"onboarding",
"repairs",
"search",
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/fully_kiosk/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@


async def async_get_device_diagnostics(
hass: HomeAssistant, entry: FullyKioskConfigEntry, device: dr.DeviceEntry
hass: HomeAssistant, entry: FullyKioskConfigEntry, device: dr.AnyDeviceEntry
) -> dict[str, Any]:
"""Return device diagnostics."""
coordinator = entry.runtime_data
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/heos/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry

from .const import ATTR_PASSWORD, ATTR_USERNAME, DOMAIN
from .coordinator import HeosConfigEntry
Expand Down Expand Up @@ -66,7 +66,7 @@ async def async_get_config_entry_diagnostics(


async def async_get_device_diagnostics(
hass: HomeAssistant, config_entry: HeosConfigEntry, device: DeviceEntry
hass: HomeAssistant, config_entry: HeosConfigEntry, device: AnyDeviceEntry
) -> dict[str, Any]:
"""Return diagnostics for a device."""
entity_registry = er.async_get(hass)
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/home_connect/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from aiohomeconnect.model import GetSetting, Status

from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry

from .const import DOMAIN
from .coordinator import HomeConnectApplianceData, HomeConnectConfigEntry
Expand Down Expand Up @@ -53,7 +53,7 @@ async def async_get_config_entry_diagnostics(


async def async_get_device_diagnostics(
hass: HomeAssistant, entry: HomeConnectConfigEntry, device: DeviceEntry
hass: HomeAssistant, entry: HomeConnectConfigEntry, device: AnyDeviceEntry
) -> dict[str, Any]:
"""Return diagnostics for a device."""
ha_id = next(
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/homee/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
CONF_USERNAME,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry

from . import DOMAIN, HomeeConfigEntry

Expand Down Expand Up @@ -42,7 +42,7 @@ async def async_get_config_entry_diagnostics(


async def async_get_device_diagnostics(
hass: HomeAssistant, entry: HomeeConfigEntry, device: DeviceEntry
hass: HomeAssistant, entry: HomeeConfigEntry, device: AnyDeviceEntry
) -> dict[str, Any]:
"""Return diagnostics for a device."""

Expand Down
10 changes: 7 additions & 3 deletions homeassistant/components/homekit_controller/diagnostics.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
"""Diagnostics support for HomeKit Controller."""

from typing import Any
from typing import TYPE_CHECKING, Any

from aiohomekit.model.characteristics.characteristic_types import CharacteristicsTypes

from homeassistant.components.diagnostics import REDACTED, async_redact_data
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry, DeviceEntry

from .connection import HKDevice
from .const import KNOWN_DEVICES
Expand All @@ -33,9 +33,13 @@ async def async_get_config_entry_diagnostics(


async def async_get_device_diagnostics(
hass: HomeAssistant, entry: ConfigEntry, device: DeviceEntry
hass: HomeAssistant, entry: ConfigEntry, device: AnyDeviceEntry
) -> dict[str, Any]:
"""Return diagnostics for a device entry."""
if TYPE_CHECKING:
# homekit_controller does not create child devices
assert isinstance(device, DeviceEntry)

return _async_get_diagnostics(hass, entry, device)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from homeassistant.const import ATTR_CONFIGURATION_URL, CONF_HOST
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry

from .const import REDACT_HUB_ADDRESS, REDACT_MAC_ADDRESS, REDACT_SERIAL_NUMBER
from .model import PowerviewConfigEntry
Expand Down Expand Up @@ -43,7 +43,7 @@ async def async_get_config_entry_diagnostics(


async def async_get_device_diagnostics(
hass: HomeAssistant, entry: PowerviewConfigEntry, device: DeviceEntry
hass: HomeAssistant, entry: PowerviewConfigEntry, device: AnyDeviceEntry
) -> dict[str, Any]:
"""Return diagnostics for a device entry."""
data = _async_get_diagnostics(hass, entry)
Expand Down Expand Up @@ -71,7 +71,9 @@ def _async_get_diagnostics(


@callback
def _async_device_as_dict(hass: HomeAssistant, device: DeviceEntry) -> dict[str, Any]:
def _async_device_as_dict(
hass: HomeAssistant, device: AnyDeviceEntry
) -> dict[str, Any]:
"""Represent a Powerview device as a dictionary."""

# Gather information how this device is represented in Home Assistant
Expand Down
10 changes: 7 additions & 3 deletions homeassistant/components/husqvarna_automower/diagnostics.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
"""Diagnostics support for Husqvarna Automower."""

import logging
from typing import Any
from typing import TYPE_CHECKING, Any

from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_ACCESS_TOKEN
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.device_registry import AnyDeviceEntry, DeviceEntry

from . import AutomowerConfigEntry
from .const import DOMAIN
Expand All @@ -30,9 +30,13 @@ async def async_get_config_entry_diagnostics(


async def async_get_device_diagnostics(
hass: HomeAssistant, entry: AutomowerConfigEntry, device: DeviceEntry
hass: HomeAssistant, entry: AutomowerConfigEntry, device: AnyDeviceEntry
) -> dict[str, Any]:
"""Return diagnostics for a device entry."""
if TYPE_CHECKING:
# husqvarna_automower does not create child devices
assert isinstance(device, DeviceEntry)

coordinator = entry.runtime_data
for identifier in device.identifiers:
if identifier[0] == DOMAIN:
Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/iotawatt/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import httpx

DOMAIN = "iotawatt"
VOLT_AMPERE_REACTIVE = "VAR"
VOLT_AMPERE_REACTIVE_HOURS = "VARh"

CONNECTION_ERRORS = (KeyError, json.JSONDecodeError, httpx.HTTPError)
7 changes: 4 additions & 3 deletions homeassistant/components/iotawatt/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
UnitOfEnergy,
UnitOfFrequency,
UnitOfPower,
UnitOfReactivePower,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import device_registry as dr, entity_registry as er
Expand All @@ -29,7 +30,7 @@
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util import dt as dt_util

from .const import VOLT_AMPERE_REACTIVE, VOLT_AMPERE_REACTIVE_HOURS
from .const import VOLT_AMPERE_REACTIVE_HOURS
from .coordinator import IotawattConfigEntry, IotawattUpdater

_LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -87,9 +88,9 @@ class IotaWattSensorEntityDescription(SensorEntityDescription):
),
"VAR": IotaWattSensorEntityDescription(
key="VAR",
native_unit_of_measurement=VOLT_AMPERE_REACTIVE,
native_unit_of_measurement=UnitOfReactivePower.VOLT_AMPERE_REACTIVE,
state_class=SensorStateClass.MEASUREMENT,
icon="mdi:flash",
device_class=SensorDeviceClass.REACTIVE_POWER,
entity_registry_enabled_default=False,
),
"VARh": IotaWattSensorEntityDescription(
Expand Down
Loading
Loading