mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 07:07:28 +00:00
Use runtime_data in electric_kiwi (#136699)
This commit is contained in:
parent
164078ac69
commit
c7c234c5dd
@ -6,23 +6,25 @@ import aiohttp
|
|||||||
from electrickiwi_api import ElectricKiwiApi
|
from electrickiwi_api import ElectricKiwiApi
|
||||||
from electrickiwi_api.exceptions import ApiException
|
from electrickiwi_api.exceptions import ApiException
|
||||||
|
|
||||||
from homeassistant.config_entries import ConfigEntry
|
|
||||||
from homeassistant.const import Platform
|
from homeassistant.const import Platform
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
|
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
|
||||||
from homeassistant.helpers import aiohttp_client, config_entry_oauth2_flow
|
from homeassistant.helpers import aiohttp_client, config_entry_oauth2_flow
|
||||||
|
|
||||||
from . import api
|
from . import api
|
||||||
from .const import ACCOUNT_COORDINATOR, DOMAIN, HOP_COORDINATOR
|
|
||||||
from .coordinator import (
|
from .coordinator import (
|
||||||
ElectricKiwiAccountDataCoordinator,
|
ElectricKiwiAccountDataCoordinator,
|
||||||
|
ElectricKiwiConfigEntry,
|
||||||
ElectricKiwiHOPDataCoordinator,
|
ElectricKiwiHOPDataCoordinator,
|
||||||
|
ElectricKiwiRuntimeData,
|
||||||
)
|
)
|
||||||
|
|
||||||
PLATFORMS: list[Platform] = [Platform.SELECT, Platform.SENSOR]
|
PLATFORMS: list[Platform] = [Platform.SELECT, Platform.SENSOR]
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
async def async_setup_entry(
|
||||||
|
hass: HomeAssistant, entry: ElectricKiwiConfigEntry
|
||||||
|
) -> bool:
|
||||||
"""Set up Electric Kiwi from a config entry."""
|
"""Set up Electric Kiwi from a config entry."""
|
||||||
implementation = (
|
implementation = (
|
||||||
await config_entry_oauth2_flow.async_get_config_entry_implementation(
|
await config_entry_oauth2_flow.async_get_config_entry_implementation(
|
||||||
@ -44,8 +46,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
ek_api = ElectricKiwiApi(
|
ek_api = ElectricKiwiApi(
|
||||||
api.AsyncConfigEntryAuth(aiohttp_client.async_get_clientsession(hass), session)
|
api.AsyncConfigEntryAuth(aiohttp_client.async_get_clientsession(hass), session)
|
||||||
)
|
)
|
||||||
hop_coordinator = ElectricKiwiHOPDataCoordinator(hass, ek_api)
|
hop_coordinator = ElectricKiwiHOPDataCoordinator(hass, entry, ek_api)
|
||||||
account_coordinator = ElectricKiwiAccountDataCoordinator(hass, ek_api)
|
account_coordinator = ElectricKiwiAccountDataCoordinator(hass, entry, ek_api)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await ek_api.set_active_session()
|
await ek_api.set_active_session()
|
||||||
@ -54,19 +56,17 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
except ApiException as err:
|
except ApiException as err:
|
||||||
raise ConfigEntryNotReady from err
|
raise ConfigEntryNotReady from err
|
||||||
|
|
||||||
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = {
|
entry.runtime_data = ElectricKiwiRuntimeData(
|
||||||
HOP_COORDINATOR: hop_coordinator,
|
hop=hop_coordinator, account=account_coordinator
|
||||||
ACCOUNT_COORDINATOR: account_coordinator,
|
)
|
||||||
}
|
|
||||||
|
|
||||||
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
async def async_unload_entry(
|
||||||
|
hass: HomeAssistant, entry: ElectricKiwiConfigEntry
|
||||||
|
) -> bool:
|
||||||
"""Unload a config entry."""
|
"""Unload a config entry."""
|
||||||
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
|
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
|
||||||
hass.data[DOMAIN].pop(entry.entry_id)
|
|
||||||
|
|
||||||
return unload_ok
|
|
||||||
|
@ -9,6 +9,3 @@ OAUTH2_TOKEN = "https://welcome.electrickiwi.co.nz/oauth/token"
|
|||||||
API_BASE_URL = "https://api.electrickiwi.co.nz"
|
API_BASE_URL = "https://api.electrickiwi.co.nz"
|
||||||
|
|
||||||
SCOPE_VALUES = "read_connection_detail read_billing_frequency read_account_running_balance read_consumption_summary read_consumption_averages read_hop_intervals_config read_hop_connection save_hop_connection read_session"
|
SCOPE_VALUES = "read_connection_detail read_billing_frequency read_account_running_balance read_consumption_summary read_consumption_averages read_hop_intervals_config read_hop_connection save_hop_connection read_session"
|
||||||
|
|
||||||
HOP_COORDINATOR = "hop_coordinator"
|
|
||||||
ACCOUNT_COORDINATOR = "account_coordinator"
|
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
"""Electric Kiwi coordinators."""
|
"""Electric Kiwi coordinators."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
from dataclasses import dataclass
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -9,6 +12,7 @@ from electrickiwi_api import ElectricKiwiApi
|
|||||||
from electrickiwi_api.exceptions import ApiException, AuthException
|
from electrickiwi_api.exceptions import ApiException, AuthException
|
||||||
from electrickiwi_api.model import AccountBalance, Hop, HopIntervals
|
from electrickiwi_api.model import AccountBalance, Hop, HopIntervals
|
||||||
|
|
||||||
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.exceptions import ConfigEntryAuthFailed
|
from homeassistant.exceptions import ConfigEntryAuthFailed
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
@ -19,14 +23,31 @@ ACCOUNT_SCAN_INTERVAL = timedelta(hours=6)
|
|||||||
HOP_SCAN_INTERVAL = timedelta(minutes=20)
|
HOP_SCAN_INTERVAL = timedelta(minutes=20)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ElectricKiwiRuntimeData:
|
||||||
|
"""ElectricKiwi runtime data."""
|
||||||
|
|
||||||
|
hop: ElectricKiwiHOPDataCoordinator
|
||||||
|
account: ElectricKiwiAccountDataCoordinator
|
||||||
|
|
||||||
|
|
||||||
|
type ElectricKiwiConfigEntry = ConfigEntry[ElectricKiwiRuntimeData]
|
||||||
|
|
||||||
|
|
||||||
class ElectricKiwiAccountDataCoordinator(DataUpdateCoordinator[AccountBalance]):
|
class ElectricKiwiAccountDataCoordinator(DataUpdateCoordinator[AccountBalance]):
|
||||||
"""ElectricKiwi Account Data object."""
|
"""ElectricKiwi Account Data object."""
|
||||||
|
|
||||||
def __init__(self, hass: HomeAssistant, ek_api: ElectricKiwiApi) -> None:
|
def __init__(
|
||||||
|
self,
|
||||||
|
hass: HomeAssistant,
|
||||||
|
entry: ElectricKiwiConfigEntry,
|
||||||
|
ek_api: ElectricKiwiApi,
|
||||||
|
) -> None:
|
||||||
"""Initialize ElectricKiwiAccountDataCoordinator."""
|
"""Initialize ElectricKiwiAccountDataCoordinator."""
|
||||||
super().__init__(
|
super().__init__(
|
||||||
hass,
|
hass,
|
||||||
_LOGGER,
|
_LOGGER,
|
||||||
|
config_entry=entry,
|
||||||
name="Electric Kiwi Account Data",
|
name="Electric Kiwi Account Data",
|
||||||
update_interval=ACCOUNT_SCAN_INTERVAL,
|
update_interval=ACCOUNT_SCAN_INTERVAL,
|
||||||
)
|
)
|
||||||
@ -48,11 +69,17 @@ class ElectricKiwiAccountDataCoordinator(DataUpdateCoordinator[AccountBalance]):
|
|||||||
class ElectricKiwiHOPDataCoordinator(DataUpdateCoordinator[Hop]):
|
class ElectricKiwiHOPDataCoordinator(DataUpdateCoordinator[Hop]):
|
||||||
"""ElectricKiwi HOP Data object."""
|
"""ElectricKiwi HOP Data object."""
|
||||||
|
|
||||||
def __init__(self, hass: HomeAssistant, ek_api: ElectricKiwiApi) -> None:
|
def __init__(
|
||||||
|
self,
|
||||||
|
hass: HomeAssistant,
|
||||||
|
entry: ElectricKiwiConfigEntry,
|
||||||
|
ek_api: ElectricKiwiApi,
|
||||||
|
) -> None:
|
||||||
"""Initialize ElectricKiwiAccountDataCoordinator."""
|
"""Initialize ElectricKiwiAccountDataCoordinator."""
|
||||||
super().__init__(
|
super().__init__(
|
||||||
hass,
|
hass,
|
||||||
_LOGGER,
|
_LOGGER,
|
||||||
|
config_entry=entry,
|
||||||
# Name of the data. For logging purposes.
|
# Name of the data. For logging purposes.
|
||||||
name="Electric Kiwi HOP Data",
|
name="Electric Kiwi HOP Data",
|
||||||
# Polling interval. Will only be polled if there are subscribers.
|
# Polling interval. Will only be polled if there are subscribers.
|
||||||
|
@ -5,14 +5,13 @@ from __future__ import annotations
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from homeassistant.components.select import SelectEntity, SelectEntityDescription
|
from homeassistant.components.select import SelectEntity, SelectEntityDescription
|
||||||
from homeassistant.config_entries import ConfigEntry
|
|
||||||
from homeassistant.const import EntityCategory
|
from homeassistant.const import EntityCategory
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||||
|
|
||||||
from .const import ATTRIBUTION, DOMAIN, HOP_COORDINATOR
|
from .const import ATTRIBUTION
|
||||||
from .coordinator import ElectricKiwiHOPDataCoordinator
|
from .coordinator import ElectricKiwiConfigEntry, ElectricKiwiHOPDataCoordinator
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
ATTR_EK_HOP_SELECT = "hop_select"
|
ATTR_EK_HOP_SELECT = "hop_select"
|
||||||
@ -25,12 +24,12 @@ HOP_SELECT = SelectEntityDescription(
|
|||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
hass: HomeAssistant,
|
||||||
|
entry: ElectricKiwiConfigEntry,
|
||||||
|
async_add_entities: AddEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Electric Kiwi select setup."""
|
"""Electric Kiwi select setup."""
|
||||||
hop_coordinator: ElectricKiwiHOPDataCoordinator = hass.data[DOMAIN][entry.entry_id][
|
hop_coordinator = entry.runtime_data.hop
|
||||||
HOP_COORDINATOR
|
|
||||||
]
|
|
||||||
|
|
||||||
_LOGGER.debug("Setting up select entity")
|
_LOGGER.debug("Setting up select entity")
|
||||||
async_add_entities([ElectricKiwiSelectHOPEntity(hop_coordinator, HOP_SELECT)])
|
async_add_entities([ElectricKiwiSelectHOPEntity(hop_coordinator, HOP_SELECT)])
|
||||||
|
@ -14,16 +14,16 @@ from homeassistant.components.sensor import (
|
|||||||
SensorEntityDescription,
|
SensorEntityDescription,
|
||||||
SensorStateClass,
|
SensorStateClass,
|
||||||
)
|
)
|
||||||
from homeassistant.config_entries import ConfigEntry
|
|
||||||
from homeassistant.const import CURRENCY_DOLLAR, PERCENTAGE
|
from homeassistant.const import CURRENCY_DOLLAR, PERCENTAGE
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||||
from homeassistant.util import dt as dt_util
|
from homeassistant.util import dt as dt_util
|
||||||
|
|
||||||
from .const import ACCOUNT_COORDINATOR, ATTRIBUTION, DOMAIN, HOP_COORDINATOR
|
from .const import ATTRIBUTION
|
||||||
from .coordinator import (
|
from .coordinator import (
|
||||||
ElectricKiwiAccountDataCoordinator,
|
ElectricKiwiAccountDataCoordinator,
|
||||||
|
ElectricKiwiConfigEntry,
|
||||||
ElectricKiwiHOPDataCoordinator,
|
ElectricKiwiHOPDataCoordinator,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -122,12 +122,12 @@ HOP_SENSOR_TYPES: tuple[ElectricKiwiHOPSensorEntityDescription, ...] = (
|
|||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
hass: HomeAssistant,
|
||||||
|
entry: ElectricKiwiConfigEntry,
|
||||||
|
async_add_entities: AddEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Electric Kiwi Sensors Setup."""
|
"""Electric Kiwi Sensors Setup."""
|
||||||
account_coordinator: ElectricKiwiAccountDataCoordinator = hass.data[DOMAIN][
|
account_coordinator = entry.runtime_data.account
|
||||||
entry.entry_id
|
|
||||||
][ACCOUNT_COORDINATOR]
|
|
||||||
|
|
||||||
entities: list[SensorEntity] = [
|
entities: list[SensorEntity] = [
|
||||||
ElectricKiwiAccountEntity(
|
ElectricKiwiAccountEntity(
|
||||||
@ -137,9 +137,7 @@ async def async_setup_entry(
|
|||||||
for description in ACCOUNT_SENSOR_TYPES
|
for description in ACCOUNT_SENSOR_TYPES
|
||||||
]
|
]
|
||||||
|
|
||||||
hop_coordinator: ElectricKiwiHOPDataCoordinator = hass.data[DOMAIN][entry.entry_id][
|
hop_coordinator = entry.runtime_data.hop
|
||||||
HOP_COORDINATOR
|
|
||||||
]
|
|
||||||
entities.extend(
|
entities.extend(
|
||||||
[
|
[
|
||||||
ElectricKiwiHOPEntity(hop_coordinator, description)
|
ElectricKiwiHOPEntity(hop_coordinator, description)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user