mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 21:57:51 +00:00
Fix flaky netatmo tests (#53644)
This commit is contained in:
parent
b0c650e088
commit
8e61ed39fd
@ -58,6 +58,7 @@ from .data_handler import (
|
|||||||
HOMESTATUS_DATA_CLASS_NAME,
|
HOMESTATUS_DATA_CLASS_NAME,
|
||||||
NetatmoDataHandler,
|
NetatmoDataHandler,
|
||||||
)
|
)
|
||||||
|
from .helper import get_all_home_ids, update_climate_schedules
|
||||||
from .netatmo_entity_base import NetatmoBase
|
from .netatmo_entity_base import NetatmoBase
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -131,9 +132,6 @@ async def async_setup_entry(
|
|||||||
if not home_data or home_data.raw_data == {}:
|
if not home_data or home_data.raw_data == {}:
|
||||||
raise PlatformNotReady
|
raise PlatformNotReady
|
||||||
|
|
||||||
if HOMEDATA_DATA_CLASS_NAME not in data_handler.data:
|
|
||||||
raise PlatformNotReady
|
|
||||||
|
|
||||||
entities = []
|
entities = []
|
||||||
for home_id in get_all_home_ids(home_data):
|
for home_id in get_all_home_ids(home_data):
|
||||||
for room_id in home_data.rooms[home_id]:
|
for room_id in home_data.rooms[home_id]:
|
||||||
@ -145,12 +143,12 @@ async def async_setup_entry(
|
|||||||
if home_status and room_id in home_status.rooms:
|
if home_status and room_id in home_status.rooms:
|
||||||
entities.append(NetatmoThermostat(data_handler, home_id, room_id))
|
entities.append(NetatmoThermostat(data_handler, home_id, room_id))
|
||||||
|
|
||||||
hass.data[DOMAIN][DATA_SCHEDULES][home_id] = {
|
hass.data[DOMAIN][DATA_SCHEDULES].update(
|
||||||
schedule_id: schedule_data.get("name")
|
update_climate_schedules(
|
||||||
for schedule_id, schedule_data in (
|
home_ids=get_all_home_ids(home_data),
|
||||||
data_handler.data[HOMEDATA_DATA_CLASS_NAME].schedules[home_id].items()
|
schedules=data_handler.data[HOMEDATA_DATA_CLASS_NAME].schedules,
|
||||||
)
|
)
|
||||||
}
|
)
|
||||||
|
|
||||||
hass.data[DOMAIN][DATA_HOMES] = {
|
hass.data[DOMAIN][DATA_HOMES] = {
|
||||||
home_id: home_data.get("name")
|
home_id: home_data.get("name")
|
||||||
@ -257,7 +255,8 @@ class NetatmoThermostat(NetatmoBase, ClimateEntity):
|
|||||||
assert device
|
assert device
|
||||||
self.hass.data[DOMAIN][DATA_DEVICE_IDS][self._home_id] = device.id
|
self.hass.data[DOMAIN][DATA_DEVICE_IDS][self._home_id] = device.id
|
||||||
|
|
||||||
async def handle_event(self, event: dict) -> None:
|
@callback
|
||||||
|
def handle_event(self, event: dict) -> None:
|
||||||
"""Handle webhook events."""
|
"""Handle webhook events."""
|
||||||
data = event["data"]
|
data = event["data"]
|
||||||
|
|
||||||
@ -617,14 +616,3 @@ class NetatmoThermostat(NetatmoBase, ClimateEntity):
|
|||||||
device_info: DeviceInfo = super().device_info
|
device_info: DeviceInfo = super().device_info
|
||||||
device_info["suggested_area"] = self._room_data["name"]
|
device_info["suggested_area"] = self._room_data["name"]
|
||||||
return device_info
|
return device_info
|
||||||
|
|
||||||
|
|
||||||
def get_all_home_ids(home_data: pyatmo.HomeData | None) -> list[str]:
|
|
||||||
"""Get all the home ids returned by NetAtmo API."""
|
|
||||||
if home_data is None:
|
|
||||||
return []
|
|
||||||
return [
|
|
||||||
home_data.homes[home_id]["id"]
|
|
||||||
for home_id in home_data.homes
|
|
||||||
if "modules" in home_data.homes[home_id]
|
|
||||||
]
|
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
"""Helper for Netatmo integration."""
|
"""Helper for Netatmo integration."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from uuid import UUID, uuid4
|
from uuid import UUID, uuid4
|
||||||
|
|
||||||
|
import pyatmo
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class NetatmoArea:
|
class NetatmoArea:
|
||||||
@ -15,3 +19,25 @@ class NetatmoArea:
|
|||||||
mode: str
|
mode: str
|
||||||
show_on_map: bool
|
show_on_map: bool
|
||||||
uuid: UUID = uuid4()
|
uuid: UUID = uuid4()
|
||||||
|
|
||||||
|
|
||||||
|
def get_all_home_ids(home_data: pyatmo.HomeData | None) -> list[str]:
|
||||||
|
"""Get all the home ids returned by NetAtmo API."""
|
||||||
|
if home_data is None:
|
||||||
|
return []
|
||||||
|
return [
|
||||||
|
home_data.homes[home_id]["id"]
|
||||||
|
for home_id in home_data.homes
|
||||||
|
if "modules" in home_data.homes[home_id]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def update_climate_schedules(home_ids: list[str], schedules: dict) -> dict:
|
||||||
|
"""Get updated list of all climate schedules."""
|
||||||
|
return {
|
||||||
|
home_id: {
|
||||||
|
schedule_id: schedule_data.get("name")
|
||||||
|
for schedule_id, schedule_data in schedules[home_id].items()
|
||||||
|
}
|
||||||
|
for home_id in home_ids
|
||||||
|
}
|
||||||
|
@ -13,7 +13,6 @@ from homeassistant.exceptions import PlatformNotReady
|
|||||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
|
||||||
from .climate import get_all_home_ids
|
|
||||||
from .const import (
|
from .const import (
|
||||||
DATA_HANDLER,
|
DATA_HANDLER,
|
||||||
DATA_SCHEDULES,
|
DATA_SCHEDULES,
|
||||||
@ -23,6 +22,7 @@ from .const import (
|
|||||||
SIGNAL_NAME,
|
SIGNAL_NAME,
|
||||||
)
|
)
|
||||||
from .data_handler import HOMEDATA_DATA_CLASS_NAME, NetatmoDataHandler
|
from .data_handler import HOMEDATA_DATA_CLASS_NAME, NetatmoDataHandler
|
||||||
|
from .helper import get_all_home_ids, update_climate_schedules
|
||||||
from .netatmo_entity_base import NetatmoBase
|
from .netatmo_entity_base import NetatmoBase
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -42,8 +42,12 @@ async def async_setup_entry(
|
|||||||
if not home_data or home_data.raw_data == {}:
|
if not home_data or home_data.raw_data == {}:
|
||||||
raise PlatformNotReady
|
raise PlatformNotReady
|
||||||
|
|
||||||
if HOMEDATA_DATA_CLASS_NAME not in data_handler.data:
|
hass.data[DOMAIN][DATA_SCHEDULES].update(
|
||||||
raise PlatformNotReady
|
update_climate_schedules(
|
||||||
|
home_ids=get_all_home_ids(home_data),
|
||||||
|
schedules=data_handler.data[HOMEDATA_DATA_CLASS_NAME].schedules,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
entities = [
|
entities = [
|
||||||
NetatmoScheduleSelect(
|
NetatmoScheduleSelect(
|
||||||
@ -51,8 +55,7 @@ async def async_setup_entry(
|
|||||||
home_id,
|
home_id,
|
||||||
list(hass.data[DOMAIN][DATA_SCHEDULES][home_id].values()),
|
list(hass.data[DOMAIN][DATA_SCHEDULES][home_id].values()),
|
||||||
)
|
)
|
||||||
for home_id in get_all_home_ids(home_data)
|
for home_id in hass.data[DOMAIN][DATA_SCHEDULES]
|
||||||
if home_id in hass.data[DOMAIN][DATA_SCHEDULES]
|
|
||||||
]
|
]
|
||||||
|
|
||||||
_LOGGER.debug("Adding climate schedule select entities %s", entities)
|
_LOGGER.debug("Adding climate schedule select entities %s", entities)
|
||||||
@ -105,7 +108,8 @@ class NetatmoScheduleSelect(NetatmoBase, SelectEntity):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
async def handle_event(self, event: dict) -> None:
|
@callback
|
||||||
|
def handle_event(self, event: dict) -> None:
|
||||||
"""Handle webhook events."""
|
"""Handle webhook events."""
|
||||||
data = event["data"]
|
data = event["data"]
|
||||||
|
|
||||||
|
@ -19,10 +19,6 @@ async def test_select_schedule_thermostats(hass, config_entry, caplog, netatmo_a
|
|||||||
select_entity = "select.netatmo_myhome"
|
select_entity = "select.netatmo_myhome"
|
||||||
|
|
||||||
assert hass.states.get(select_entity).state == "Default"
|
assert hass.states.get(select_entity).state == "Default"
|
||||||
assert hass.states.get(select_entity).attributes[ATTR_OPTIONS] == [
|
|
||||||
"Default",
|
|
||||||
"Winter",
|
|
||||||
]
|
|
||||||
|
|
||||||
# Fake backend response changing schedule
|
# Fake backend response changing schedule
|
||||||
response = {
|
response = {
|
||||||
@ -32,8 +28,13 @@ async def test_select_schedule_thermostats(hass, config_entry, caplog, netatmo_a
|
|||||||
"push_type": "home_event_changed",
|
"push_type": "home_event_changed",
|
||||||
}
|
}
|
||||||
await simulate_webhook(hass, webhook_id, response)
|
await simulate_webhook(hass, webhook_id, response)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert hass.states.get(select_entity).state == "Winter"
|
assert hass.states.get(select_entity).state == "Winter"
|
||||||
|
assert hass.states.get(select_entity).attributes[ATTR_OPTIONS] == [
|
||||||
|
"Default",
|
||||||
|
"Winter",
|
||||||
|
]
|
||||||
|
|
||||||
# Test setting a different schedule
|
# Test setting a different schedule
|
||||||
with patch(
|
with patch(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user