mirror of
https://github.com/home-assistant/core.git
synced 2026-04-18 07:56:03 +01:00
Bump aiotedee to 0.3.0 (#166321)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
This commit is contained in:
@@ -7,7 +7,7 @@ from typing import Any
|
|||||||
|
|
||||||
from aiohttp.hdrs import METH_POST
|
from aiohttp.hdrs import METH_POST
|
||||||
from aiohttp.web import Request, Response
|
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.http import HomeAssistantView
|
||||||
from homeassistant.components.webhook import (
|
from homeassistant.components.webhook import (
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from collections.abc import Callable
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from aiotedee import TedeeLock
|
from aiotedee import TedeeLock
|
||||||
from aiotedee.lock import TedeeDoorState, TedeeLockState
|
from aiotedee.models import TedeeDoorState, TedeeLockState
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDeviceClass,
|
BinarySensorDeviceClass,
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ from typing import Any
|
|||||||
|
|
||||||
from aiotedee import (
|
from aiotedee import (
|
||||||
TedeeAuthException,
|
TedeeAuthException,
|
||||||
TedeeClient,
|
|
||||||
TedeeClientException,
|
TedeeClientException,
|
||||||
TedeeDataUpdateException,
|
TedeeDataUpdateException,
|
||||||
TedeeLocalAuthException,
|
TedeeLocalAuthException,
|
||||||
|
TedeeLocalClient,
|
||||||
)
|
)
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ class TedeeConfigFlow(ConfigFlow, domain=DOMAIN):
|
|||||||
else:
|
else:
|
||||||
host = user_input[CONF_HOST]
|
host = user_input[CONF_HOST]
|
||||||
local_access_token = user_input[CONF_LOCAL_ACCESS_TOKEN]
|
local_access_token = user_input[CONF_LOCAL_ACCESS_TOKEN]
|
||||||
tedee_client = TedeeClient(
|
tedee_client = TedeeLocalClient(
|
||||||
local_token=local_access_token,
|
local_token=local_access_token,
|
||||||
local_ip=host,
|
local_ip=host,
|
||||||
session=async_get_clientsession(self.hass),
|
session=async_get_clientsession(self.hass),
|
||||||
|
|||||||
@@ -9,14 +9,14 @@ import time
|
|||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from aiotedee import (
|
from aiotedee import (
|
||||||
TedeeClient,
|
|
||||||
TedeeClientException,
|
TedeeClientException,
|
||||||
TedeeDataUpdateException,
|
TedeeDataUpdateException,
|
||||||
TedeeLocalAuthException,
|
TedeeLocalAuthException,
|
||||||
|
TedeeLocalClient,
|
||||||
TedeeLock,
|
TedeeLock,
|
||||||
TedeeWebhookException,
|
TedeeWebhookException,
|
||||||
)
|
)
|
||||||
from aiotedee.bridge import TedeeBridge
|
from aiotedee.models import TedeeBridge
|
||||||
|
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import CONF_HOST
|
from homeassistant.const import CONF_HOST
|
||||||
@@ -52,7 +52,7 @@ class TedeeApiCoordinator(DataUpdateCoordinator[dict[int, TedeeLock]]):
|
|||||||
update_interval=SCAN_INTERVAL,
|
update_interval=SCAN_INTERVAL,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.tedee_client = TedeeClient(
|
self.tedee_client = TedeeLocalClient(
|
||||||
local_token=self.config_entry.data[CONF_LOCAL_ACCESS_TOKEN],
|
local_token=self.config_entry.data[CONF_LOCAL_ACCESS_TOKEN],
|
||||||
local_ip=self.config_entry.data[CONF_HOST],
|
local_ip=self.config_entry.data[CONF_HOST],
|
||||||
session=async_get_clientsession(hass),
|
session=async_get_clientsession(hass),
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ from homeassistant.core import HomeAssistant
|
|||||||
from . import TedeeConfigEntry
|
from . import TedeeConfigEntry
|
||||||
|
|
||||||
TO_REDACT = {
|
TO_REDACT = {
|
||||||
"lock_id",
|
"id",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""Bases for Tedee entities."""
|
"""Bases for Tedee entities."""
|
||||||
|
|
||||||
from aiotedee.lock import TedeeLock
|
from aiotedee.models import TedeeLock
|
||||||
|
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
from homeassistant.helpers.device_registry import DeviceInfo
|
from homeassistant.helpers.device_registry import DeviceInfo
|
||||||
@@ -25,21 +25,21 @@ class TedeeEntity(CoordinatorEntity[TedeeApiCoordinator]):
|
|||||||
"""Initialize Tedee entity."""
|
"""Initialize Tedee entity."""
|
||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
self._lock = lock
|
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(
|
self._attr_device_info = DeviceInfo(
|
||||||
identifiers={(DOMAIN, str(lock.lock_id))},
|
identifiers={(DOMAIN, str(lock.id))},
|
||||||
name=lock.lock_name,
|
name=lock.name,
|
||||||
manufacturer="Tedee",
|
manufacturer="Tedee",
|
||||||
model=lock.lock_type,
|
model=lock.type_name,
|
||||||
model_id=lock.lock_type,
|
model_id=lock.type_name,
|
||||||
via_device=(DOMAIN, coordinator.bridge.serial),
|
via_device=(DOMAIN, coordinator.bridge.serial),
|
||||||
)
|
)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _handle_coordinator_update(self) -> None:
|
def _handle_coordinator_update(self) -> None:
|
||||||
"""Handle updated data from the coordinator."""
|
"""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()
|
super()._handle_coordinator_update()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ class TedeeLockEntity(TedeeEntity, LockEntity):
|
|||||||
@property
|
@property
|
||||||
def is_jammed(self) -> bool:
|
def is_jammed(self) -> bool:
|
||||||
"""Return true if lock is jammed."""
|
"""Return true if lock is jammed."""
|
||||||
return self._lock.is_state_jammed
|
return self._lock.is_jammed
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def available(self) -> bool:
|
def available(self) -> bool:
|
||||||
@@ -101,13 +101,13 @@ class TedeeLockEntity(TedeeEntity, LockEntity):
|
|||||||
self._lock.state = TedeeLockState.UNLOCKING
|
self._lock.state = TedeeLockState.UNLOCKING
|
||||||
self.async_write_ha_state()
|
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()
|
await self.coordinator.async_request_refresh()
|
||||||
except (TedeeClientException, Exception) as ex:
|
except (TedeeClientException, Exception) as ex:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
translation_domain=DOMAIN,
|
translation_domain=DOMAIN,
|
||||||
translation_key="unlock_failed",
|
translation_key="unlock_failed",
|
||||||
translation_placeholders={"lock_id": str(self._lock.lock_id)},
|
translation_placeholders={"lock_id": str(self._lock.id)},
|
||||||
) from ex
|
) from ex
|
||||||
|
|
||||||
async def async_lock(self, **kwargs: Any) -> None:
|
async def async_lock(self, **kwargs: Any) -> None:
|
||||||
@@ -116,13 +116,13 @@ class TedeeLockEntity(TedeeEntity, LockEntity):
|
|||||||
self._lock.state = TedeeLockState.LOCKING
|
self._lock.state = TedeeLockState.LOCKING
|
||||||
self.async_write_ha_state()
|
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()
|
await self.coordinator.async_request_refresh()
|
||||||
except (TedeeClientException, Exception) as ex:
|
except (TedeeClientException, Exception) as ex:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
translation_domain=DOMAIN,
|
translation_domain=DOMAIN,
|
||||||
translation_key="lock_failed",
|
translation_key="lock_failed",
|
||||||
translation_placeholders={"lock_id": str(self._lock.lock_id)},
|
translation_placeholders={"lock_id": str(self._lock.id)},
|
||||||
) from ex
|
) from ex
|
||||||
|
|
||||||
|
|
||||||
@@ -140,11 +140,11 @@ class TedeeLockWithLatchEntity(TedeeLockEntity):
|
|||||||
self._lock.state = TedeeLockState.UNLOCKING
|
self._lock.state = TedeeLockState.UNLOCKING
|
||||||
self.async_write_ha_state()
|
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()
|
await self.coordinator.async_request_refresh()
|
||||||
except (TedeeClientException, Exception) as ex:
|
except (TedeeClientException, Exception) as ex:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
translation_domain=DOMAIN,
|
translation_domain=DOMAIN,
|
||||||
translation_key="open_failed",
|
translation_key="open_failed",
|
||||||
translation_placeholders={"lock_id": str(self._lock.lock_id)},
|
translation_placeholders={"lock_id": str(self._lock.id)},
|
||||||
) from ex
|
) from ex
|
||||||
|
|||||||
@@ -9,5 +9,5 @@
|
|||||||
"iot_class": "local_push",
|
"iot_class": "local_push",
|
||||||
"loggers": ["aiotedee"],
|
"loggers": ["aiotedee"],
|
||||||
"quality_scale": "platinum",
|
"quality_scale": "platinum",
|
||||||
"requirements": ["aiotedee==0.2.27"]
|
"requirements": ["aiotedee==0.3.0"]
|
||||||
}
|
}
|
||||||
|
|||||||
2
requirements_all.txt
generated
2
requirements_all.txt
generated
@@ -422,7 +422,7 @@ aiosyncthing==0.7.1
|
|||||||
aiotankerkoenig==0.5.1
|
aiotankerkoenig==0.5.1
|
||||||
|
|
||||||
# homeassistant.components.tedee
|
# homeassistant.components.tedee
|
||||||
aiotedee==0.2.27
|
aiotedee==0.3.0
|
||||||
|
|
||||||
# homeassistant.components.tractive
|
# homeassistant.components.tractive
|
||||||
aiotractive==1.0.1
|
aiotractive==1.0.1
|
||||||
|
|||||||
2
requirements_test_all.txt
generated
2
requirements_test_all.txt
generated
@@ -407,7 +407,7 @@ aiosyncthing==0.7.1
|
|||||||
aiotankerkoenig==0.5.1
|
aiotankerkoenig==0.5.1
|
||||||
|
|
||||||
# homeassistant.components.tedee
|
# homeassistant.components.tedee
|
||||||
aiotedee==0.2.27
|
aiotedee==0.3.0
|
||||||
|
|
||||||
# homeassistant.components.tractive
|
# homeassistant.components.tractive
|
||||||
aiotractive==1.0.1
|
aiotractive==1.0.1
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ from collections.abc import Generator
|
|||||||
import json
|
import json
|
||||||
from unittest.mock import AsyncMock, MagicMock, patch
|
from unittest.mock import AsyncMock, MagicMock, patch
|
||||||
|
|
||||||
from aiotedee.bridge import TedeeBridge
|
from aiotedee.models import TedeeBridge, TedeeLock
|
||||||
from aiotedee.lock import TedeeLock
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components.tedee.const import CONF_LOCAL_ACCESS_TOKEN, DOMAIN
|
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."""
|
"""Return a mocked Tedee client."""
|
||||||
with (
|
with (
|
||||||
patch(
|
patch(
|
||||||
"homeassistant.components.tedee.coordinator.TedeeClient", autospec=True
|
"homeassistant.components.tedee.coordinator.TedeeLocalClient", autospec=True
|
||||||
) as tedee_mock,
|
) as tedee_mock,
|
||||||
patch(
|
patch(
|
||||||
"homeassistant.components.tedee.config_flow.TedeeClient",
|
"homeassistant.components.tedee.config_flow.TedeeLocalClient",
|
||||||
new=tedee_mock,
|
new=tedee_mock,
|
||||||
),
|
),
|
||||||
):
|
):
|
||||||
@@ -63,10 +62,6 @@ def mock_tedee() -> Generator[MagicMock]:
|
|||||||
|
|
||||||
tedee.get_locks.return_value = None
|
tedee.get_locks.return_value = None
|
||||||
tedee.sync.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.get_local_bridge.return_value = TedeeBridge(0, "0000-0000", "Bridge-AB1C")
|
||||||
|
|
||||||
tedee.parse_webhook_message.return_value = None
|
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))
|
locks_json = json.loads(load_fixture("locks.json", DOMAIN))
|
||||||
|
|
||||||
lock_list = [TedeeLock(**lock) for lock in locks_json]
|
lock_list = [TedeeLock.from_dict(lock) for lock in locks_json]
|
||||||
tedee.locks_dict = {lock.lock_id: lock for lock in lock_list}
|
tedee.locks_dict = {lock.id: lock for lock in lock_list}
|
||||||
|
|
||||||
yield tedee
|
yield tedee
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"lock_name": "Lock-1A2B",
|
"name": "Lock-1A2B",
|
||||||
"lock_id": 12345,
|
"id": 12345,
|
||||||
"lock_type": 2,
|
"type": 2,
|
||||||
"state": 2,
|
"state": 2,
|
||||||
"battery_level": 70,
|
"battery_level": 70,
|
||||||
"is_connected": true,
|
"is_connected": true,
|
||||||
@@ -13,9 +13,9 @@
|
|||||||
"door_state": 0
|
"door_state": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"lock_name": "Lock-2C3D",
|
"name": "Lock-2C3D",
|
||||||
"lock_id": 98765,
|
"id": 98765,
|
||||||
"lock_type": 4,
|
"type": 4,
|
||||||
"state": 2,
|
"state": 2,
|
||||||
"battery_level": 70,
|
"battery_level": 70,
|
||||||
"is_connected": true,
|
"is_connected": true,
|
||||||
|
|||||||
@@ -5,29 +5,29 @@
|
|||||||
'battery_level': 70,
|
'battery_level': 70,
|
||||||
'door_state': 0,
|
'door_state': 0,
|
||||||
'duration_pullspring': 2,
|
'duration_pullspring': 2,
|
||||||
|
'id': '**REDACTED**',
|
||||||
'is_charging': False,
|
'is_charging': False,
|
||||||
'is_connected': True,
|
'is_connected': True,
|
||||||
'is_enabled_auto_pullspring': False,
|
'is_enabled_auto_pullspring': False,
|
||||||
'is_enabled_pullspring': 1,
|
'is_enabled_pullspring': True,
|
||||||
'lock_id': '**REDACTED**',
|
'name': 'Lock-1A2B',
|
||||||
'lock_name': 'Lock-1A2B',
|
|
||||||
'lock_type': 2,
|
|
||||||
'state': 2,
|
'state': 2,
|
||||||
'state_change_result': 0,
|
'state_change_result': 0,
|
||||||
|
'type': 2,
|
||||||
}),
|
}),
|
||||||
'1': dict({
|
'1': dict({
|
||||||
'battery_level': 70,
|
'battery_level': 70,
|
||||||
'door_state': 2,
|
'door_state': 2,
|
||||||
'duration_pullspring': 0,
|
'duration_pullspring': 0,
|
||||||
|
'id': '**REDACTED**',
|
||||||
'is_charging': False,
|
'is_charging': False,
|
||||||
'is_connected': True,
|
'is_connected': True,
|
||||||
'is_enabled_auto_pullspring': False,
|
'is_enabled_auto_pullspring': False,
|
||||||
'is_enabled_pullspring': 0,
|
'is_enabled_pullspring': False,
|
||||||
'lock_id': '**REDACTED**',
|
'name': 'Lock-2C3D',
|
||||||
'lock_name': 'Lock-2C3D',
|
|
||||||
'lock_type': 4,
|
|
||||||
'state': 2,
|
'state': 2,
|
||||||
'state_change_result': 0,
|
'state_change_result': 0,
|
||||||
|
'type': 4,
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from aiotedee import (
|
|||||||
TedeeDataUpdateException,
|
TedeeDataUpdateException,
|
||||||
TedeeLocalAuthException,
|
TedeeLocalAuthException,
|
||||||
)
|
)
|
||||||
from aiotedee.bridge import TedeeBridge
|
from aiotedee.models import TedeeBridge
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components.tedee.const import CONF_LOCAL_ACCESS_TOKEN, DOMAIN
|
from homeassistant.components.tedee.const import CONF_LOCAL_ACCESS_TOKEN, DOMAIN
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from typing import Any
|
|||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from aiotedee.exception import (
|
from aiotedee.exceptions import (
|
||||||
TedeeAuthException,
|
TedeeAuthException,
|
||||||
TedeeClientException,
|
TedeeClientException,
|
||||||
TedeeWebhookException,
|
TedeeWebhookException,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from unittest.mock import MagicMock, patch
|
|||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from aiotedee import TedeeLock, TedeeLockState
|
from aiotedee import TedeeLock, TedeeLockState
|
||||||
from aiotedee.exception import (
|
from aiotedee.exceptions import (
|
||||||
TedeeClientException,
|
TedeeClientException,
|
||||||
TedeeDataUpdateException,
|
TedeeDataUpdateException,
|
||||||
TedeeLocalAuthException,
|
TedeeLocalAuthException,
|
||||||
|
|||||||
Reference in New Issue
Block a user