diff --git a/homeassistant/components/netatmo/data_handler.py b/homeassistant/components/netatmo/data_handler.py index e93e602d6a7..5e007e8634d 100644 --- a/homeassistant/components/netatmo/data_handler.py +++ b/homeassistant/components/netatmo/data_handler.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio from collections import deque +from dataclasses import dataclass from datetime import timedelta from itertools import islice import logging @@ -34,8 +35,6 @@ HOMEDATA_DATA_CLASS_NAME = "AsyncHomeData" HOMESTATUS_DATA_CLASS_NAME = "AsyncHomeStatus" PUBLICDATA_DATA_CLASS_NAME = "AsyncPublicData" -NEXT_SCAN = "next_scan" - DATA_CLASSES = { WEATHERSTATION_DATA_CLASS_NAME: pyatmo.AsyncWeatherStationData, HOMECOACH_DATA_CLASS_NAME: pyatmo.AsyncHomeCoachData, @@ -57,6 +56,16 @@ DEFAULT_INTERVALS = { SCAN_INTERVAL = 60 +@dataclass +class NetatmoDataClass: + """Class for keeping track of Netatmo data class metadata.""" + + name: str + interval: int + next_scan: float + subscriptions: list[CALLBACK_TYPE] + + class NetatmoDataHandler: """Manages the Netatmo data handling.""" @@ -93,12 +102,12 @@ class NetatmoDataHandler: to minimize the calls on the api service. """ for data_class in islice(self._queue, 0, BATCH_SIZE): - if data_class[NEXT_SCAN] > time(): + if data_class.next_scan > time(): continue - if data_class_name := data_class["name"]: - self.data_classes[data_class_name][NEXT_SCAN] = ( - time() + data_class["interval"] + if data_class_name := data_class.name: + self.data_classes[data_class_name].next_scan = ( + time() + data_class.interval ) await self.async_fetch_data(data_class_name) @@ -108,7 +117,7 @@ class NetatmoDataHandler: @callback def async_force_update(self, data_class_entry): """Prioritize data retrieval for given data class entry.""" - self.data_classes[data_class_entry][NEXT_SCAN] = time() + self.data_classes[data_class_entry].next_scan = time() self._queue.rotate(-(self._queue.index(self.data_classes[data_class_entry]))) async def async_cleanup(self): @@ -149,7 +158,7 @@ class NetatmoDataHandler: _LOGGER.debug(err) return - for update_callback in self.data_classes[data_class_entry]["subscriptions"]: + for update_callback in self.data_classes[data_class_entry].subscriptions: if update_callback: update_callback() @@ -158,21 +167,18 @@ class NetatmoDataHandler: ): """Register data class.""" if data_class_entry in self.data_classes: - if ( - update_callback - not in self.data_classes[data_class_entry]["subscriptions"] - ): - self.data_classes[data_class_entry]["subscriptions"].append( + if update_callback not in self.data_classes[data_class_entry].subscriptions: + self.data_classes[data_class_entry].subscriptions.append( update_callback ) return - self.data_classes[data_class_entry] = { - "name": data_class_entry, - "interval": DEFAULT_INTERVALS[data_class_name], - NEXT_SCAN: time() + DEFAULT_INTERVALS[data_class_name], - "subscriptions": [update_callback], - } + self.data_classes[data_class_entry] = NetatmoDataClass( + name=data_class_entry, + interval=DEFAULT_INTERVALS[data_class_name], + next_scan=time() + DEFAULT_INTERVALS[data_class_name], + subscriptions=[update_callback], + ) self.data[data_class_entry] = DATA_CLASSES[data_class_name]( self._auth, **kwargs @@ -185,9 +191,9 @@ class NetatmoDataHandler: async def unregister_data_class(self, data_class_entry, update_callback): """Unregister data class.""" - self.data_classes[data_class_entry]["subscriptions"].remove(update_callback) + self.data_classes[data_class_entry].subscriptions.remove(update_callback) - if not self.data_classes[data_class_entry].get("subscriptions"): + if not self.data_classes[data_class_entry].subscriptions: self._queue.remove(self.data_classes[data_class_entry]) self.data_classes.pop(data_class_entry) self.data.pop(data_class_entry) diff --git a/homeassistant/components/netatmo/netatmo_entity_base.py b/homeassistant/components/netatmo/netatmo_entity_base.py index b74975f3a62..eb65bc4da0f 100644 --- a/homeassistant/components/netatmo/netatmo_entity_base.py +++ b/homeassistant/components/netatmo/netatmo_entity_base.py @@ -61,7 +61,7 @@ class NetatmoBase(Entity): data_class["name"], signal_name, self.async_update_callback ) - for sub in self.data_handler.data_classes[signal_name].get("subscriptions"): + for sub in self.data_handler.data_classes[signal_name].subscriptions: if sub is None: await self.data_handler.unregister_data_class(signal_name, None)