From b5187293677547be12a2104da8e622f48159f3df Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Tue, 24 Mar 2026 15:23:48 +0100 Subject: [PATCH] Bump aiotedee to 0.3.0 (#166321) Co-authored-by: Joost Lekkerkerker --- homeassistant/components/tedee/__init__.py | 2 +- homeassistant/components/tedee/binary_sensor.py | 2 +- homeassistant/components/tedee/config_flow.py | 4 ++-- homeassistant/components/tedee/coordinator.py | 6 +++--- homeassistant/components/tedee/diagnostics.py | 2 +- homeassistant/components/tedee/entity.py | 14 +++++++------- homeassistant/components/tedee/lock.py | 14 +++++++------- homeassistant/components/tedee/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/tedee/conftest.py | 15 +++++---------- tests/components/tedee/fixtures/locks.json | 12 ++++++------ .../tedee/snapshots/test_diagnostics.ambr | 16 ++++++++-------- tests/components/tedee/test_config_flow.py | 2 +- tests/components/tedee/test_init.py | 2 +- tests/components/tedee/test_lock.py | 2 +- 16 files changed, 47 insertions(+), 52 deletions(-) diff --git a/homeassistant/components/tedee/__init__.py b/homeassistant/components/tedee/__init__.py index 95348053805..38035f1dd11 100644 --- a/homeassistant/components/tedee/__init__.py +++ b/homeassistant/components/tedee/__init__.py @@ -7,7 +7,7 @@ from typing import Any from aiohttp.hdrs import METH_POST from aiohttp.web import Request, Response -from aiotedee.exception import TedeeDataUpdateException, TedeeWebhookException +from aiotedee.exceptions import TedeeDataUpdateException, TedeeWebhookException from homeassistant.components.http import HomeAssistantView from homeassistant.components.webhook import ( diff --git a/homeassistant/components/tedee/binary_sensor.py b/homeassistant/components/tedee/binary_sensor.py index 5a1a85a1167..c7724b09bc3 100644 --- a/homeassistant/components/tedee/binary_sensor.py +++ b/homeassistant/components/tedee/binary_sensor.py @@ -4,7 +4,7 @@ from collections.abc import Callable from dataclasses import dataclass from aiotedee import TedeeLock -from aiotedee.lock import TedeeDoorState, TedeeLockState +from aiotedee.models import TedeeDoorState, TedeeLockState from homeassistant.components.binary_sensor import ( BinarySensorDeviceClass, diff --git a/homeassistant/components/tedee/config_flow.py b/homeassistant/components/tedee/config_flow.py index 830250d73d9..d41a861ae22 100644 --- a/homeassistant/components/tedee/config_flow.py +++ b/homeassistant/components/tedee/config_flow.py @@ -6,10 +6,10 @@ from typing import Any from aiotedee import ( TedeeAuthException, - TedeeClient, TedeeClientException, TedeeDataUpdateException, TedeeLocalAuthException, + TedeeLocalClient, ) import voluptuous as vol @@ -46,7 +46,7 @@ class TedeeConfigFlow(ConfigFlow, domain=DOMAIN): else: host = user_input[CONF_HOST] local_access_token = user_input[CONF_LOCAL_ACCESS_TOKEN] - tedee_client = TedeeClient( + tedee_client = TedeeLocalClient( local_token=local_access_token, local_ip=host, session=async_get_clientsession(self.hass), diff --git a/homeassistant/components/tedee/coordinator.py b/homeassistant/components/tedee/coordinator.py index fec59d1c596..693f6234873 100644 --- a/homeassistant/components/tedee/coordinator.py +++ b/homeassistant/components/tedee/coordinator.py @@ -9,14 +9,14 @@ import time from typing import Any from aiotedee import ( - TedeeClient, TedeeClientException, TedeeDataUpdateException, TedeeLocalAuthException, + TedeeLocalClient, TedeeLock, TedeeWebhookException, ) -from aiotedee.bridge import TedeeBridge +from aiotedee.models import TedeeBridge from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST @@ -52,7 +52,7 @@ class TedeeApiCoordinator(DataUpdateCoordinator[dict[int, TedeeLock]]): update_interval=SCAN_INTERVAL, ) - self.tedee_client = TedeeClient( + self.tedee_client = TedeeLocalClient( local_token=self.config_entry.data[CONF_LOCAL_ACCESS_TOKEN], local_ip=self.config_entry.data[CONF_HOST], session=async_get_clientsession(hass), diff --git a/homeassistant/components/tedee/diagnostics.py b/homeassistant/components/tedee/diagnostics.py index 633934db94d..ccf71eda6b8 100644 --- a/homeassistant/components/tedee/diagnostics.py +++ b/homeassistant/components/tedee/diagnostics.py @@ -10,7 +10,7 @@ from homeassistant.core import HomeAssistant from . import TedeeConfigEntry TO_REDACT = { - "lock_id", + "id", } diff --git a/homeassistant/components/tedee/entity.py b/homeassistant/components/tedee/entity.py index 96cc6f2b3f5..4c522d1feb1 100644 --- a/homeassistant/components/tedee/entity.py +++ b/homeassistant/components/tedee/entity.py @@ -1,6 +1,6 @@ """Bases for Tedee entities.""" -from aiotedee.lock import TedeeLock +from aiotedee.models import TedeeLock from homeassistant.core import callback from homeassistant.helpers.device_registry import DeviceInfo @@ -25,21 +25,21 @@ class TedeeEntity(CoordinatorEntity[TedeeApiCoordinator]): """Initialize Tedee entity.""" super().__init__(coordinator) self._lock = lock - self._attr_unique_id = f"{lock.lock_id}-{key}" + self._attr_unique_id = f"{lock.id}-{key}" self._attr_device_info = DeviceInfo( - identifiers={(DOMAIN, str(lock.lock_id))}, - name=lock.lock_name, + identifiers={(DOMAIN, str(lock.id))}, + name=lock.name, manufacturer="Tedee", - model=lock.lock_type, - model_id=lock.lock_type, + model=lock.type_name, + model_id=lock.type_name, via_device=(DOMAIN, coordinator.bridge.serial), ) @callback def _handle_coordinator_update(self) -> None: """Handle updated data from the coordinator.""" - self._lock = self.coordinator.data.get(self._lock.lock_id, self._lock) + self._lock = self.coordinator.data.get(self._lock.id, self._lock) super()._handle_coordinator_update() diff --git a/homeassistant/components/tedee/lock.py b/homeassistant/components/tedee/lock.py index da6db242db3..6d5131d07e9 100644 --- a/homeassistant/components/tedee/lock.py +++ b/homeassistant/components/tedee/lock.py @@ -84,7 +84,7 @@ class TedeeLockEntity(TedeeEntity, LockEntity): @property def is_jammed(self) -> bool: """Return true if lock is jammed.""" - return self._lock.is_state_jammed + return self._lock.is_jammed @property def available(self) -> bool: @@ -101,13 +101,13 @@ class TedeeLockEntity(TedeeEntity, LockEntity): self._lock.state = TedeeLockState.UNLOCKING self.async_write_ha_state() - await self.coordinator.tedee_client.unlock(self._lock.lock_id) + await self.coordinator.tedee_client.unlock(self._lock.id) await self.coordinator.async_request_refresh() except (TedeeClientException, Exception) as ex: raise HomeAssistantError( translation_domain=DOMAIN, translation_key="unlock_failed", - translation_placeholders={"lock_id": str(self._lock.lock_id)}, + translation_placeholders={"lock_id": str(self._lock.id)}, ) from ex async def async_lock(self, **kwargs: Any) -> None: @@ -116,13 +116,13 @@ class TedeeLockEntity(TedeeEntity, LockEntity): self._lock.state = TedeeLockState.LOCKING self.async_write_ha_state() - await self.coordinator.tedee_client.lock(self._lock.lock_id) + await self.coordinator.tedee_client.lock(self._lock.id) await self.coordinator.async_request_refresh() except (TedeeClientException, Exception) as ex: raise HomeAssistantError( translation_domain=DOMAIN, translation_key="lock_failed", - translation_placeholders={"lock_id": str(self._lock.lock_id)}, + translation_placeholders={"lock_id": str(self._lock.id)}, ) from ex @@ -140,11 +140,11 @@ class TedeeLockWithLatchEntity(TedeeLockEntity): self._lock.state = TedeeLockState.UNLOCKING self.async_write_ha_state() - await self.coordinator.tedee_client.open(self._lock.lock_id) + await self.coordinator.tedee_client.open(self._lock.id) await self.coordinator.async_request_refresh() except (TedeeClientException, Exception) as ex: raise HomeAssistantError( translation_domain=DOMAIN, translation_key="open_failed", - translation_placeholders={"lock_id": str(self._lock.lock_id)}, + translation_placeholders={"lock_id": str(self._lock.id)}, ) from ex diff --git a/homeassistant/components/tedee/manifest.json b/homeassistant/components/tedee/manifest.json index 579674f7405..033af0519ce 100644 --- a/homeassistant/components/tedee/manifest.json +++ b/homeassistant/components/tedee/manifest.json @@ -9,5 +9,5 @@ "iot_class": "local_push", "loggers": ["aiotedee"], "quality_scale": "platinum", - "requirements": ["aiotedee==0.2.27"] + "requirements": ["aiotedee==0.3.0"] } diff --git a/requirements_all.txt b/requirements_all.txt index 889621041bb..ae0bccc7dfe 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -422,7 +422,7 @@ aiosyncthing==0.7.1 aiotankerkoenig==0.5.1 # homeassistant.components.tedee -aiotedee==0.2.27 +aiotedee==0.3.0 # homeassistant.components.tractive aiotractive==1.0.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 0edfdc678d4..5d39d8eab7c 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -407,7 +407,7 @@ aiosyncthing==0.7.1 aiotankerkoenig==0.5.1 # homeassistant.components.tedee -aiotedee==0.2.27 +aiotedee==0.3.0 # homeassistant.components.tractive aiotractive==1.0.1 diff --git a/tests/components/tedee/conftest.py b/tests/components/tedee/conftest.py index d659560ee61..bc3315c4afd 100644 --- a/tests/components/tedee/conftest.py +++ b/tests/components/tedee/conftest.py @@ -6,8 +6,7 @@ from collections.abc import Generator import json from unittest.mock import AsyncMock, MagicMock, patch -from aiotedee.bridge import TedeeBridge -from aiotedee.lock import TedeeLock +from aiotedee.models import TedeeBridge, TedeeLock import pytest from homeassistant.components.tedee.const import CONF_LOCAL_ACCESS_TOKEN, DOMAIN @@ -52,10 +51,10 @@ def mock_tedee() -> Generator[MagicMock]: """Return a mocked Tedee client.""" with ( patch( - "homeassistant.components.tedee.coordinator.TedeeClient", autospec=True + "homeassistant.components.tedee.coordinator.TedeeLocalClient", autospec=True ) as tedee_mock, patch( - "homeassistant.components.tedee.config_flow.TedeeClient", + "homeassistant.components.tedee.config_flow.TedeeLocalClient", new=tedee_mock, ), ): @@ -63,10 +62,6 @@ def mock_tedee() -> Generator[MagicMock]: tedee.get_locks.return_value = None tedee.sync.return_value = None - tedee.get_bridges.return_value = [ - TedeeBridge(1234, "0000-0000", "Bridge-AB1C"), - TedeeBridge(5678, "9999-9999", "Bridge-CD2E"), - ] tedee.get_local_bridge.return_value = TedeeBridge(0, "0000-0000", "Bridge-AB1C") tedee.parse_webhook_message.return_value = None @@ -75,8 +70,8 @@ def mock_tedee() -> Generator[MagicMock]: locks_json = json.loads(load_fixture("locks.json", DOMAIN)) - lock_list = [TedeeLock(**lock) for lock in locks_json] - tedee.locks_dict = {lock.lock_id: lock for lock in lock_list} + lock_list = [TedeeLock.from_dict(lock) for lock in locks_json] + tedee.locks_dict = {lock.id: lock for lock in lock_list} yield tedee diff --git a/tests/components/tedee/fixtures/locks.json b/tests/components/tedee/fixtures/locks.json index 95a1adf40ec..579460ed55a 100644 --- a/tests/components/tedee/fixtures/locks.json +++ b/tests/components/tedee/fixtures/locks.json @@ -1,8 +1,8 @@ [ { - "lock_name": "Lock-1A2B", - "lock_id": 12345, - "lock_type": 2, + "name": "Lock-1A2B", + "id": 12345, + "type": 2, "state": 2, "battery_level": 70, "is_connected": true, @@ -13,9 +13,9 @@ "door_state": 0 }, { - "lock_name": "Lock-2C3D", - "lock_id": 98765, - "lock_type": 4, + "name": "Lock-2C3D", + "id": 98765, + "type": 4, "state": 2, "battery_level": 70, "is_connected": true, diff --git a/tests/components/tedee/snapshots/test_diagnostics.ambr b/tests/components/tedee/snapshots/test_diagnostics.ambr index d66b2601b72..903a401b40a 100644 --- a/tests/components/tedee/snapshots/test_diagnostics.ambr +++ b/tests/components/tedee/snapshots/test_diagnostics.ambr @@ -5,29 +5,29 @@ 'battery_level': 70, 'door_state': 0, 'duration_pullspring': 2, + 'id': '**REDACTED**', 'is_charging': False, 'is_connected': True, 'is_enabled_auto_pullspring': False, - 'is_enabled_pullspring': 1, - 'lock_id': '**REDACTED**', - 'lock_name': 'Lock-1A2B', - 'lock_type': 2, + 'is_enabled_pullspring': True, + 'name': 'Lock-1A2B', 'state': 2, 'state_change_result': 0, + 'type': 2, }), '1': dict({ 'battery_level': 70, 'door_state': 2, 'duration_pullspring': 0, + 'id': '**REDACTED**', 'is_charging': False, 'is_connected': True, 'is_enabled_auto_pullspring': False, - 'is_enabled_pullspring': 0, - 'lock_id': '**REDACTED**', - 'lock_name': 'Lock-2C3D', - 'lock_type': 4, + 'is_enabled_pullspring': False, + 'name': 'Lock-2C3D', 'state': 2, 'state_change_result': 0, + 'type': 4, }), }) # --- diff --git a/tests/components/tedee/test_config_flow.py b/tests/components/tedee/test_config_flow.py index 3fcbfa1e5ef..583ed141a97 100644 --- a/tests/components/tedee/test_config_flow.py +++ b/tests/components/tedee/test_config_flow.py @@ -7,7 +7,7 @@ from aiotedee import ( TedeeDataUpdateException, TedeeLocalAuthException, ) -from aiotedee.bridge import TedeeBridge +from aiotedee.models import TedeeBridge import pytest from homeassistant.components.tedee.const import CONF_LOCAL_ACCESS_TOKEN, DOMAIN diff --git a/tests/components/tedee/test_init.py b/tests/components/tedee/test_init.py index 7f1f52c7977..ad3e19055ec 100644 --- a/tests/components/tedee/test_init.py +++ b/tests/components/tedee/test_init.py @@ -5,7 +5,7 @@ from typing import Any from unittest.mock import MagicMock, patch from urllib.parse import urlparse -from aiotedee.exception import ( +from aiotedee.exceptions import ( TedeeAuthException, TedeeClientException, TedeeWebhookException, diff --git a/tests/components/tedee/test_lock.py b/tests/components/tedee/test_lock.py index e0fe9673a46..0d5b02e9e92 100644 --- a/tests/components/tedee/test_lock.py +++ b/tests/components/tedee/test_lock.py @@ -5,7 +5,7 @@ from unittest.mock import MagicMock, patch from urllib.parse import urlparse from aiotedee import TedeeLock, TedeeLockState -from aiotedee.exception import ( +from aiotedee.exceptions import ( TedeeClientException, TedeeDataUpdateException, TedeeLocalAuthException,