From afad195652f013987f0029c19cd36dabad0c6b90 Mon Sep 17 00:00:00 2001 From: Artur Pragacz <49985303+arturpragacz@users.noreply.github.com> Date: Thu, 30 Jul 2026 08:49:23 +0200 Subject: [PATCH] Do not set a device on YAML integration entities (#177596) --- .../components/integration/sensor.py | 11 ++--- tests/components/integration/test_sensor.py | 44 +++++++++++++++++++ 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/integration/sensor.py b/homeassistant/components/integration/sensor.py index edd7c5d0c1d0..8621d59faa64 100644 --- a/homeassistant/components/integration/sensor.py +++ b/homeassistant/components/integration/sensor.py @@ -38,6 +38,7 @@ from homeassistant.core import ( ) from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers.device import async_entity_id_to_device +from homeassistant.helpers.device_registry import DeviceEntry from homeassistant.helpers.entity_platform import ( AddConfigEntryEntitiesCallback, AddEntitiesCallback, @@ -266,7 +267,6 @@ async def async_setup_entry( round_digits = int(round_digits) integral = IntegrationSensor( - hass, integration_method=config_entry.options[CONF_METHOD], name=config_entry.title, round_digits=round_digits, @@ -275,6 +275,7 @@ async def async_setup_entry( unit_prefix=unit_prefix, unit_time=config_entry.options[CONF_UNIT_TIME], max_sub_interval=max_sub_interval, + device=async_entity_id_to_device(hass, source_entity_id), ) async_add_entities([integral]) @@ -288,7 +289,6 @@ async def async_setup_platform( ) -> None: """Set up the integration sensor.""" integral = IntegrationSensor( - hass, integration_method=config[CONF_METHOD], name=config.get(CONF_NAME), round_digits=config.get(CONF_ROUND_DIGITS), @@ -310,7 +310,6 @@ class IntegrationSensor(RestoreSensor): def __init__( self, - hass: HomeAssistant, *, integration_method: str, name: str | None, @@ -320,6 +319,7 @@ class IntegrationSensor(RestoreSensor): unit_prefix: str | None, unit_time: UnitOfTime, max_sub_interval: timedelta | None, + device: DeviceEntry | None = None, ) -> None: """Initialize the integration sensor.""" self._attr_unique_id = unique_id @@ -337,10 +337,7 @@ class IntegrationSensor(RestoreSensor): self._attr_icon = "mdi:chart-histogram" self._source_entity: str = source_entity self._last_valid_state: Decimal | None = None - self.device_entry = async_entity_id_to_device( - hass, - source_entity, - ) + self.device_entry = device self._max_sub_interval: timedelta | None = ( None # disable time based integration if max_sub_interval is None or max_sub_interval.total_seconds() == 0 diff --git a/tests/components/integration/test_sensor.py b/tests/components/integration/test_sensor.py index b672182c87de..b8c8b0270abd 100644 --- a/tests/components/integration/test_sensor.py +++ b/tests/components/integration/test_sensor.py @@ -918,6 +918,50 @@ async def test_device_id( assert integration_entity.device_id == source_entity.device_id +async def test_device_id_yaml( + hass: HomeAssistant, + device_registry: dr.DeviceRegistry, + entity_registry: er.EntityRegistry, + caplog: pytest.LogCaptureFixture, +) -> None: + """Test no device is set for a YAML-configured Riemann sum integral.""" + source_config_entry = MockConfigEntry() + source_config_entry.add_to_hass(hass) + source_device_entry = device_registry.async_get_or_create( + config_entry_id=source_config_entry.entry_id, + identifiers={("sensor", "identifier_test")}, + connections={("mac", "30:31:32:33:34:35")}, + ) + entity_registry.async_get_or_create( + "sensor", + "test", + "source", + config_entry=source_config_entry, + device_id=source_device_entry.id, + ) + await hass.async_block_till_done() + + assert await async_setup_component( + hass, + "sensor", + { + "sensor": { + "platform": "integration", + "name": "integration", + "source": "sensor.test_source", + "method": "right", + "unique_id": "integration_yaml", + } + }, + ) + await hass.async_block_till_done() + + integration_entity = entity_registry.async_get("sensor.integration") + assert integration_entity is not None + assert integration_entity.device_id is None + assert "attempts to attach a device to an entity" not in caplog.text + + def _integral_sensor_config(max_sub_interval: dict[str, int] | None) -> dict[str, Any]: sensor = { "platform": "integration",