mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +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,
|
||||
NetatmoDataHandler,
|
||||
)
|
||||
from .helper import get_all_home_ids, update_climate_schedules
|
||||
from .netatmo_entity_base import NetatmoBase
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@ -131,9 +132,6 @@ async def async_setup_entry(
|
||||
if not home_data or home_data.raw_data == {}:
|
||||
raise PlatformNotReady
|
||||
|
||||
if HOMEDATA_DATA_CLASS_NAME not in data_handler.data:
|
||||
raise PlatformNotReady
|
||||
|
||||
entities = []
|
||||
for home_id in get_all_home_ids(home_data):
|
||||
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:
|
||||
entities.append(NetatmoThermostat(data_handler, home_id, room_id))
|
||||
|
||||
hass.data[DOMAIN][DATA_SCHEDULES][home_id] = {
|
||||
schedule_id: schedule_data.get("name")
|
||||
for schedule_id, schedule_data in (
|
||||
data_handler.data[HOMEDATA_DATA_CLASS_NAME].schedules[home_id].items()
|
||||
)
|
||||
}
|
||||
hass.data[DOMAIN][DATA_SCHEDULES].update(
|
||||
update_climate_schedules(
|
||||
home_ids=get_all_home_ids(home_data),
|
||||
schedules=data_handler.data[HOMEDATA_DATA_CLASS_NAME].schedules,
|
||||
)
|
||||
)
|
||||
|
||||
hass.data[DOMAIN][DATA_HOMES] = {
|
||||
home_id: home_data.get("name")
|
||||
@ -257,7 +255,8 @@ class NetatmoThermostat(NetatmoBase, ClimateEntity):
|
||||
assert device
|
||||
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."""
|
||||
data = event["data"]
|
||||
|
||||
@ -617,14 +616,3 @@ class NetatmoThermostat(NetatmoBase, ClimateEntity):
|
||||
device_info: DeviceInfo = super().device_info
|
||||
device_info["suggested_area"] = self._room_data["name"]
|
||||
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."""
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from uuid import UUID, uuid4
|
||||
|
||||
import pyatmo
|
||||
|
||||
|
||||
@dataclass
|
||||
class NetatmoArea:
|
||||
@ -15,3 +19,25 @@ class NetatmoArea:
|
||||
mode: str
|
||||
show_on_map: bool
|
||||
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.entity_platform import AddEntitiesCallback
|
||||
|
||||
from .climate import get_all_home_ids
|
||||
from .const import (
|
||||
DATA_HANDLER,
|
||||
DATA_SCHEDULES,
|
||||
@ -23,6 +22,7 @@ from .const import (
|
||||
SIGNAL_NAME,
|
||||
)
|
||||
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
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@ -42,8 +42,12 @@ async def async_setup_entry(
|
||||
if not home_data or home_data.raw_data == {}:
|
||||
raise PlatformNotReady
|
||||
|
||||
if HOMEDATA_DATA_CLASS_NAME not in data_handler.data:
|
||||
raise PlatformNotReady
|
||||
hass.data[DOMAIN][DATA_SCHEDULES].update(
|
||||
update_climate_schedules(
|
||||
home_ids=get_all_home_ids(home_data),
|
||||
schedules=data_handler.data[HOMEDATA_DATA_CLASS_NAME].schedules,
|
||||
)
|
||||
)
|
||||
|
||||
entities = [
|
||||
NetatmoScheduleSelect(
|
||||
@ -51,8 +55,7 @@ async def async_setup_entry(
|
||||
home_id,
|
||||
list(hass.data[DOMAIN][DATA_SCHEDULES][home_id].values()),
|
||||
)
|
||||
for home_id in get_all_home_ids(home_data)
|
||||
if home_id in hass.data[DOMAIN][DATA_SCHEDULES]
|
||||
for home_id in hass.data[DOMAIN][DATA_SCHEDULES]
|
||||
]
|
||||
|
||||
_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."""
|
||||
data = event["data"]
|
||||
|
||||
|
@ -19,10 +19,6 @@ async def test_select_schedule_thermostats(hass, config_entry, caplog, netatmo_a
|
||||
select_entity = "select.netatmo_myhome"
|
||||
|
||||
assert hass.states.get(select_entity).state == "Default"
|
||||
assert hass.states.get(select_entity).attributes[ATTR_OPTIONS] == [
|
||||
"Default",
|
||||
"Winter",
|
||||
]
|
||||
|
||||
# Fake backend response changing schedule
|
||||
response = {
|
||||
@ -32,8 +28,13 @@ async def test_select_schedule_thermostats(hass, config_entry, caplog, netatmo_a
|
||||
"push_type": "home_event_changed",
|
||||
}
|
||||
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).attributes[ATTR_OPTIONS] == [
|
||||
"Default",
|
||||
"Winter",
|
||||
]
|
||||
|
||||
# Test setting a different schedule
|
||||
with patch(
|
||||
|
Loading…
x
Reference in New Issue
Block a user