Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The PECO Outage Counter integration."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 from datetime import timedelta
7 from typing import Final
8 
9 from peco import (
10  AlertResults,
11  BadJSONError,
12  HttpError,
13  OutageResults,
14  PecoOutageApi,
15  UnresponsiveMeterError,
16 )
17 
18 from homeassistant.config_entries import ConfigEntry
19 from homeassistant.const import Platform
20 from homeassistant.core import HomeAssistant
21 from homeassistant.helpers.aiohttp_client import async_get_clientsession
22 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
23 
24 from .const import (
25  CONF_COUNTY,
26  CONF_PHONE_NUMBER,
27  DOMAIN,
28  LOGGER,
29  OUTAGE_SCAN_INTERVAL,
30  SMART_METER_SCAN_INTERVAL,
31 )
32 
33 PLATFORMS: Final = [Platform.BINARY_SENSOR, Platform.SENSOR]
34 
35 
36 @dataclass
38  """Something to hold the data for PECO."""
39 
40  outages: OutageResults
41  alerts: AlertResults
42 
43 
44 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
45  """Set up PECO Outage Counter from a config entry."""
46 
47  websession = async_get_clientsession(hass)
48  api = PecoOutageApi()
49  # Outage Counter Setup
50  county: str = entry.data[CONF_COUNTY]
51 
52  async def async_update_outage_data() -> PECOCoordinatorData:
53  """Fetch data from API."""
54  try:
55  outages: OutageResults = (
56  await api.get_outage_totals(websession)
57  if county == "TOTAL"
58  else await api.get_outage_count(county, websession)
59  )
60  alerts: AlertResults = await api.get_map_alerts(websession)
61  data = PECOCoordinatorData(outages, alerts)
62  except HttpError as err:
63  raise UpdateFailed(f"Error fetching data: {err}") from err
64  except BadJSONError as err:
65  raise UpdateFailed(f"Error parsing data: {err}") from err
66  return data
67 
68  outage_coordinator = DataUpdateCoordinator(
69  hass,
70  LOGGER,
71  config_entry=entry,
72  name="PECO Outage Count",
73  update_method=async_update_outage_data,
74  update_interval=timedelta(minutes=OUTAGE_SCAN_INTERVAL),
75  )
76 
77  await outage_coordinator.async_config_entry_first_refresh()
78 
79  hass.data.setdefault(DOMAIN, {})[entry.entry_id] = {
80  "outage_count": outage_coordinator
81  }
82 
83  if phone_number := entry.data.get(CONF_PHONE_NUMBER):
84  # Smart Meter Setup]
85 
86  async def async_update_meter_data() -> bool:
87  """Fetch data from API."""
88  try:
89  data: bool = await api.meter_check(phone_number, websession)
90  except UnresponsiveMeterError as err:
91  raise UpdateFailed("Unresponsive meter") from err
92  except HttpError as err:
93  raise UpdateFailed(f"Error fetching data: {err}") from err
94  except BadJSONError as err:
95  raise UpdateFailed(f"Error parsing data: {err}") from err
96  return data
97 
98  meter_coordinator = DataUpdateCoordinator(
99  hass,
100  LOGGER,
101  config_entry=entry,
102  name="PECO Smart Meter",
103  update_method=async_update_meter_data,
104  update_interval=timedelta(minutes=SMART_METER_SCAN_INTERVAL),
105  )
106 
107  await meter_coordinator.async_config_entry_first_refresh()
108 
109  hass.data[DOMAIN][entry.entry_id]["smart_meter"] = meter_coordinator
110 
111  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
112  return True
113 
114 
115 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
116  """Unload a config entry."""
117  if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
118  hass.data[DOMAIN].pop(entry.entry_id)
119 
120  return unload_ok
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:44
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:115
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)