Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """Rainforest data."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from datetime import timedelta
7 import logging
8 
9 import aioeagle
10 from eagle100 import Eagle as Eagle100Reader
11 
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.const import CONF_HOST, CONF_TYPE
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers import aiohttp_client
16 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
17 
18 from .const import (
19  CONF_CLOUD_ID,
20  CONF_HARDWARE_ADDRESS,
21  CONF_INSTALL_CODE,
22  TYPE_EAGLE_100,
23 )
24 from .data import UPDATE_100_ERRORS
25 
26 _LOGGER = logging.getLogger(__name__)
27 
28 
30  """Get the latest data from the Eagle device."""
31 
32  eagle100_reader: Eagle100Reader | None = None
33  eagle200_meter: aioeagle.ElectricMeter | None = None
34 
35  def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None:
36  """Initialize the data object."""
37  self.entryentry = entry
38  if self.typetypetype == TYPE_EAGLE_100:
39  self.modelmodel = "EAGLE-100"
40  update_method = self._async_update_data_100_async_update_data_100
41  else:
42  self.modelmodel = "EAGLE-200"
43  update_method = self._async_update_data_200_async_update_data_200
44 
45  super().__init__(
46  hass,
47  _LOGGER,
48  name=entry.data[CONF_CLOUD_ID],
49  update_interval=timedelta(seconds=30),
50  update_method=update_method,
51  )
52 
53  @property
54  def cloud_id(self):
55  """Return the cloud ID."""
56  return self.entryentry.data[CONF_CLOUD_ID]
57 
58  @property
59  def type(self):
60  """Return entry type."""
61  return self.entryentry.data[CONF_TYPE]
62 
63  @property
64  def hardware_address(self):
65  """Return hardware address of meter."""
66  return self.entryentry.data[CONF_HARDWARE_ADDRESS]
67 
68  @property
69  def is_connected(self):
70  """Return if the hub is connected to the electric meter."""
71  if self.eagle200_metereagle200_meter:
72  return self.eagle200_metereagle200_meter.is_connected
73 
74  return True
75 
76  async def _async_update_data_200(self):
77  """Get the latest data from the Eagle-200 device."""
78  if (eagle200_meter := self.eagle200_metereagle200_meter) is None:
79  hub = aioeagle.EagleHub(
80  aiohttp_client.async_get_clientsession(self.hasshass),
81  self.cloud_idcloud_id,
82  self.entryentry.data[CONF_INSTALL_CODE],
83  host=self.entryentry.data[CONF_HOST],
84  )
85  eagle200_meter = aioeagle.ElectricMeter.create_instance(
86  hub, self.hardware_addresshardware_address
87  )
88  is_connected = True
89  else:
90  is_connected = eagle200_meter.is_connected
91 
92  async with asyncio.timeout(30):
93  data = await eagle200_meter.get_device_query()
94 
95  if self.eagle200_metereagle200_meter is None:
96  self.eagle200_metereagle200_meter = eagle200_meter
97  elif is_connected and not eagle200_meter.is_connected:
98  _LOGGER.warning("Lost connection with electricity meter")
99 
100  _LOGGER.debug("API data: %s", data)
101  return {var["Name"]: var["Value"] for var in data.values()}
102 
103  async def _async_update_data_100(self):
104  """Get the latest data from the Eagle-100 device."""
105  try:
106  data = await self.hasshass.async_add_executor_job(self._fetch_data_100_fetch_data_100)
107  except UPDATE_100_ERRORS as error:
108  raise UpdateFailed from error
109 
110  _LOGGER.debug("API data: %s", data)
111  return data
112 
113  def _fetch_data_100(self):
114  """Fetch and return the four sensor values in a dict."""
115  if self.eagle100_readereagle100_reader is None:
116  self.eagle100_readereagle100_reader = Eagle100Reader(
117  self.cloud_idcloud_id,
118  self.entryentry.data[CONF_INSTALL_CODE],
119  self.entryentry.data[CONF_HOST],
120  )
121 
122  out = {}
123 
124  resp = self.eagle100_readereagle100_reader.get_instantaneous_demand()["InstantaneousDemand"]
125  out["zigbee:InstantaneousDemand"] = resp["Demand"]
126 
127  resp = self.eagle100_readereagle100_reader.get_current_summation()["CurrentSummation"]
128  out["zigbee:CurrentSummationDelivered"] = resp["SummationDelivered"]
129  out["zigbee:CurrentSummationReceived"] = resp["SummationReceived"]
130 
131  return out
None __init__(self, HomeAssistant hass, ConfigEntry entry)
Definition: coordinator.py:35