Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for EcoNet products."""
2 
3 import asyncio
4 from datetime import timedelta
5 import logging
6 
7 from aiohttp.client_exceptions import ClientError
8 from pyeconet import EcoNetApiInterface
9 from pyeconet.equipment import EquipmentType
10 from pyeconet.errors import (
11  GenericHTTPError,
12  InvalidCredentialsError,
13  InvalidResponseFormat,
14  PyeconetError,
15 )
16 
17 from homeassistant.config_entries import ConfigEntry
18 from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, Platform
19 from homeassistant.core import HomeAssistant
20 from homeassistant.exceptions import ConfigEntryNotReady
21 from homeassistant.helpers.dispatcher import dispatcher_send
22 from homeassistant.helpers.event import async_track_time_interval
23 
24 from .const import API_CLIENT, DOMAIN, EQUIPMENT, PUSH_UPDATE
25 
26 _LOGGER = logging.getLogger(__name__)
27 
28 PLATFORMS = [
29  Platform.BINARY_SENSOR,
30  Platform.CLIMATE,
31  Platform.SENSOR,
32  Platform.SWITCH,
33  Platform.WATER_HEATER,
34 ]
35 
36 INTERVAL = timedelta(minutes=60)
37 
38 
39 async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
40  """Set up EcoNet as config entry."""
41 
42  email = config_entry.data[CONF_EMAIL]
43  password = config_entry.data[CONF_PASSWORD]
44 
45  try:
46  api = await EcoNetApiInterface.login(email, password=password)
47  except InvalidCredentialsError:
48  _LOGGER.error("Invalid credentials provided")
49  return False
50  except PyeconetError as err:
51  _LOGGER.error("Config entry failed: %s", err)
52  raise ConfigEntryNotReady from err
53 
54  try:
55  equipment = await api.get_equipment_by_type(
56  [EquipmentType.WATER_HEATER, EquipmentType.THERMOSTAT]
57  )
58  except (ClientError, GenericHTTPError, InvalidResponseFormat) as err:
59  raise ConfigEntryNotReady from err
60  hass.data.setdefault(DOMAIN, {API_CLIENT: {}, EQUIPMENT: {}})
61  hass.data[DOMAIN][API_CLIENT][config_entry.entry_id] = api
62  hass.data[DOMAIN][EQUIPMENT][config_entry.entry_id] = equipment
63 
64  await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
65 
66  api.subscribe()
67 
68  def update_published():
69  """Handle a push update."""
70  dispatcher_send(hass, PUSH_UPDATE)
71 
72  for _eqip in equipment[EquipmentType.WATER_HEATER]:
73  _eqip.set_update_callback(update_published)
74 
75  for _eqip in equipment[EquipmentType.THERMOSTAT]:
76  _eqip.set_update_callback(update_published)
77 
78  async def resubscribe(now):
79  """Resubscribe to the MQTT updates."""
80  await hass.async_add_executor_job(api.unsubscribe)
81  api.subscribe()
82 
83  # Refresh values
84  await asyncio.sleep(60)
85  await api.refresh_equipment()
86 
87  config_entry.async_on_unload(async_track_time_interval(hass, resubscribe, INTERVAL))
88 
89  return True
90 
91 
92 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
93  """Unload a EcoNet config entry."""
94  unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
95  if unload_ok:
96  hass.data[DOMAIN][API_CLIENT].pop(entry.entry_id)
97  hass.data[DOMAIN][EQUIPMENT].pop(entry.entry_id)
98  return unload_ok
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:92
bool async_setup_entry(HomeAssistant hass, ConfigEntry config_entry)
Definition: __init__.py:39
None dispatcher_send(HomeAssistant hass, str signal, *Any args)
Definition: dispatcher.py:137
CALLBACK_TYPE async_track_time_interval(HomeAssistant hass, Callable[[datetime], Coroutine[Any, Any, None]|None] action, timedelta interval, *str|None name=None, bool|None cancel_on_shutdown=None)
Definition: event.py:1679