10000 Fix duplicate unique id issue in Sensibo by gjohansson-ST · Pull Request #139582 · home-assistant/core · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Fix duplicate unique id issue in Sensibo #139582

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 1, 2025
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
10000
Diff view
Diff view
6 changes: 3 additions & 3 deletions homeassistant/components/sensibo/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,10 @@ def _add_remove_devices() -> None:
"""Handle additions of devices and sensors."""
entities: list[SensiboMotionSensor | SensiboDeviceSensor] = []
nonlocal added_devices
new_devices, remove_devices, added_devices = coordinator.get_devices(
new_devices, remove_devices, new_added_devices = coordinator.get_devices(
added_devices
)
added_devices = new_added_devices

if LOGGER.isEnabledFor(logging.DEBUG):
LOGGER.debug(
Expand Down Expand Up @@ -168,8 +169,7 @@ def _add_remove_devices() -> None:
device_data.model, DEVICE_SENSOR_TYPES
)
)

async_add_entities(entities)
async_add_entities(entities)

entry.async_on_unload(coordinator.async_add_listener(_add_remove_devices))
_add_remove_devices()
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/sensibo/button.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ async def async_setup_entry(
def _add_remove_devices() -> None:
"""Handle additions of devices and sensors."""
nonlocal added_devices
new_devices, _, added_devices = coordinator.get_devices(added_devices)
new_devices, _, new_added_devices = coordinator.get_devices(added_devices)
added_devices = new_added_devices

if new_devices:
async_add_entities(
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/sensibo/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,8 @@ async def async_setup_entry(
def _add_remove_devices() -> None:
"""Handle additions of devices and sensors."""
nonlocal added_devices
new_devices, _, added_devices = coordinator.get_devices(added_devices)
new_devices, _, new_added_devices = coordinator.get_devices(added_devices)
added_devices = new_added_devices

if new_devices:
async_add_entities(
Expand Down
27 changes: 20 additions & 7 deletions homeassistant/components/sensibo/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,18 +56,31 @@ def get_devices(
) -> tuple[set[str], set[str], set[str]]:
"""Addition and removal of devices."""
data = self.data
motion_sensors = {
current_motion_sensors = {
sensor_id
for device_data in data.parsed.values()
if device_data.motion_sensors
for sensor_id in device_data.motion_sensors
}
devices: set[str] = set(data.parsed)
new_devices: set[str] = motion_sensors | devices - added_devices
remove_devices = added_devices - devices - motion_sensors
added_devices = (added_devices - remove_devices) | new_devices

return (new_devices, remove_devices, added_devices)
current_devices: set[str] = set(data.parsed)
LOGGER.debug(
"Current devices: %s, moption sensors: %s",
current_devices,
current_motion_sensors,
)
new_devices: set[str] = (
current_motion_sensors | current_devices
) - added_devices
remove_devices = added_devices - current_devices - current_motion_sensors
new_added_devices = (added_devices - remove_devices) | new_devices

LOGGER.debug(
"New devices: %s, Removed devices: %s, Added devices: %s",
new_devices,
remove_devices,
new_added_devices,
)
return (new_devices, remove_devices, new_added_devices)

async def _async_update_data(self) -> SensiboData:
"""Fetch data from Sensibo."""
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/sensibo/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ async def async_setup_entry(
def _add_remove_devices() -> None:
"""Handle additions of devices and sensors."""
nonlocal added_devices
new_devices, _, added_devices = coordinator.get_devices(added_devices)
new_devices, _, new_added_devices = coordinator.get_devices(added_devices)
added_devices = new_added_devices

if new_devices:
8000 async_add_entities(
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/sensibo/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,8 @@ async def async_setup_entry(
def _add_remove_devices() -> None:
"""Handle additions of devices and sensors."""
nonlocal added_devices
new_devices, _, added_devices = coordinator.get_devices(added_devices)
new_devices, _, new_added_devices = coordinator.get_devices(added_devices)
added_devices = new_added_devices

if new_devices:
async_add_entities(
Expand Down
5 changes: 2 additions & 3 deletions homeassistant/components/sensibo/sensor.py 6DAF
Original file line number Diff line number Diff line change
Expand Up @@ -253,9 +253,8 @@ def _add_remove_devices() -> None:

entities: list[SensiboMotionSensor | SensiboDeviceSensor] = []
nonlocal added_devices
new_devices, remove_devices, added_devices = coordinator.get_devices(
added_devices
)
new_devices, _, new_added_devices = coordinator.get_devices(added_devices)
added_devices = new_added_devices

if new_devices:
entities.extend(
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/sensibo/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ async def async_setup_entry(
def _add_remove_devices() -> None:
"""Handle additions of devices and sensors."""
nonlocal added_devices
new_devices, _, added_devices = coordinator.get_devices(added_devices)
new_devices, _, new_added_devices = coordinator.get_devices(added_devices)
added_devices = new_added_devices

if new_devices:
async_add_entities(
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/sensibo/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ async def async_setup_entry(
def _add_remove_devices() -> None:
"""Handle additions of devices and sensors."""
nonlocal added_devices
new_devices, _, added_devices = coordinator.get_devices(added_devices)
new_devices, _, new_added_devices = coordinator.get_devices(added_devices)
added_devices = new_added_devices

if new_devices:
async_add_entities(
Expand Down
4 changes: 4 additions & 0 deletions tests/components/sensibo/test_coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from freezegun.api import FrozenDateTimeFactory
from pysensibo.exceptions import AuthenticationError, SensiboError
from pysensibo.model import SensiboData
import pytest

from homeassistant.components.climate import HVACMode
from homeassistant.components.sensibo.const import DOMAIN
Expand All @@ -25,6 +26,7 @@ async def test_coordinator(
mock_client: MagicMock,
get_data: tuple[SensiboData, dict[str, Any], dict[str, Any]],
freezer: FrozenDateTimeFactory,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test the Sensibo coordinator with errors."""
config_entry = MockConfigEntry(
Expand Down Expand Up @@ -87,3 +89,5 @@ async def test_coordinator(
mock_data.assert_called_once()
state = hass.states.get("climate.hallway")
assert state.state == STATE_UNAVAILABLE

assert "Platform sensibo does not generate unique IDs" not in caplog.text
0