Migrate elkm1 to use config entry runtime_data (#117077)

This commit is contained in:
J. Nick Koston 2024-05-08 16:44:39 -05:00 committed by GitHub
parent 8464c95fb4
commit 00150881a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 32 additions and 54 deletions

View File

@ -69,6 +69,8 @@ from .discovery import (
) )
from .models import ELKM1Data from .models import ELKM1Data
ElkM1ConfigEntry = ConfigEntry[ELKM1Data]
SYNC_TIMEOUT = 120 SYNC_TIMEOUT = 120
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -181,7 +183,6 @@ CONFIG_SCHEMA = vol.Schema(
async def async_setup(hass: HomeAssistant, hass_config: ConfigType) -> bool: async def async_setup(hass: HomeAssistant, hass_config: ConfigType) -> bool:
"""Set up the Elk M1 platform.""" """Set up the Elk M1 platform."""
hass.data.setdefault(DOMAIN, {})
_create_elk_services(hass) _create_elk_services(hass)
async def _async_discovery(*_: Any) -> None: async def _async_discovery(*_: Any) -> None:
@ -235,7 +236,7 @@ def _async_find_matching_config_entry(
return None return None
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ElkM1ConfigEntry) -> bool:
"""Set up Elk-M1 Control from a config entry.""" """Set up Elk-M1 Control from a config entry."""
conf: MappingProxyType[str, Any] = entry.data conf: MappingProxyType[str, Any] = entry.data
@ -308,7 +309,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
config["temperature_unit"] = temperature_unit config["temperature_unit"] = temperature_unit
prefix: str = conf[CONF_PREFIX] prefix: str = conf[CONF_PREFIX]
auto_configure: bool = conf[CONF_AUTO_CONFIGURE] auto_configure: bool = conf[CONF_AUTO_CONFIGURE]
hass.data[DOMAIN][entry.entry_id] = ELKM1Data( entry.runtime_data = ELKM1Data(
elk=elk, elk=elk,
prefix=prefix, prefix=prefix,
mac=entry.unique_id, mac=entry.unique_id,
@ -331,24 +332,20 @@ def _included(ranges: list[tuple[int, int]], set_to: bool, values: list[bool]) -
def _find_elk_by_prefix(hass: HomeAssistant, prefix: str) -> Elk | None: def _find_elk_by_prefix(hass: HomeAssistant, prefix: str) -> Elk | None:
"""Search all config entries for a given prefix.""" """Search all config entries for a given prefix."""
all_elk: dict[str, ELKM1Data] = hass.data[DOMAIN] for entry in hass.config_entries.async_entries(DOMAIN):
for elk_data in all_elk.values(): if not entry.runtime_data:
continue
elk_data: ELKM1Data = entry.runtime_data
if elk_data.prefix == prefix: if elk_data.prefix == prefix:
return elk_data.elk return elk_data.elk
return None return None
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_unload_entry(hass: HomeAssistant, entry: ElkM1ConfigEntry) -> bool:
"""Unload a config entry.""" """Unload a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
all_elk: dict[str, ELKM1Data] = hass.data[DOMAIN]
# disconnect cleanly # disconnect cleanly
all_elk[entry.entry_id].elk.disconnect() entry.runtime_data.elk.disconnect()
if unload_ok:
all_elk.pop(entry.entry_id)
return unload_ok return unload_ok

View File

@ -17,7 +17,6 @@ from homeassistant.components.alarm_control_panel import (
AlarmControlPanelEntityFeature, AlarmControlPanelEntityFeature,
CodeFormat, CodeFormat,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_HOME,
@ -33,12 +32,11 @@ import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.restore_state import RestoreEntity from homeassistant.helpers.restore_state import RestoreEntity
from . import ElkAttachedEntity, ElkEntity, create_elk_entities from . import ElkAttachedEntity, ElkEntity, ElkM1ConfigEntry, create_elk_entities
from .const import ( from .const import (
ATTR_CHANGED_BY_ID, ATTR_CHANGED_BY_ID,
ATTR_CHANGED_BY_KEYPAD, ATTR_CHANGED_BY_KEYPAD,
ATTR_CHANGED_BY_TIME, ATTR_CHANGED_BY_TIME,
DOMAIN,
ELK_USER_CODE_SERVICE_SCHEMA, ELK_USER_CODE_SERVICE_SCHEMA,
) )
from .models import ELKM1Data from .models import ELKM1Data
@ -63,12 +61,11 @@ SERVICE_ALARM_CLEAR_BYPASS = "alarm_clear_bypass"
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ElkM1ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up the ElkM1 alarm platform.""" """Set up the ElkM1 alarm platform."""
elk_data = config_entry.runtime_data
elk_data: ELKM1Data = hass.data[DOMAIN][config_entry.entry_id]
elk = elk_data.elk elk = elk_data.elk
entities: list[ElkEntity] = [] entities: list[ElkEntity] = []
create_elk_entities(elk_data, elk.areas, "area", ElkArea, entities) create_elk_entities(elk_data, elk.areas, "area", ElkArea, entities)

View File

@ -9,22 +9,19 @@ from elkm1_lib.elements import Element
from elkm1_lib.zones import Zone from elkm1_lib.zones import Zone
from homeassistant.components.binary_sensor import BinarySensorEntity from homeassistant.components.binary_sensor import BinarySensorEntity
from homeassistant.config_entries import ConfigEntry
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 . import ElkAttachedEntity, ElkEntity from . import ElkAttachedEntity, ElkEntity, ElkM1ConfigEntry
from .const import DOMAIN
from .models import ELKM1Data
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ElkM1ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Create the Elk-M1 sensor platform.""" """Create the Elk-M1 sensor platform."""
elk_data: ELKM1Data = hass.data[DOMAIN][config_entry.entry_id] elk_data = config_entry.runtime_data
elk = elk_data.elk elk = elk_data.elk
auto_configure = elk_data.auto_configure auto_configure = elk_data.auto_configure

View File

@ -17,14 +17,11 @@ from homeassistant.components.climate import (
ClimateEntityFeature, ClimateEntityFeature,
HVACMode, HVACMode,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import PRECISION_WHOLE from homeassistant.const import PRECISION_WHOLE
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 . import ElkEntity, create_elk_entities from . import ElkEntity, ElkM1ConfigEntry, create_elk_entities
from .const import DOMAIN
from .models import ELKM1Data
SUPPORT_HVAC = [ SUPPORT_HVAC = [
HVACMode.OFF, HVACMode.OFF,
@ -59,11 +56,11 @@ ELK_TO_HASS_FAN_MODES = {
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ElkM1ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Create the Elk-M1 thermostat platform.""" """Create the Elk-M1 thermostat platform."""
elk_data: ELKM1Data = hass.data[DOMAIN][config_entry.entry_id] elk_data = config_entry.runtime_data
elk = elk_data.elk elk = elk_data.elk
entities: list[ElkEntity] = [] entities: list[ElkEntity] = []
create_elk_entities( create_elk_entities(

View File

@ -9,22 +9,20 @@ from elkm1_lib.elk import Elk
from elkm1_lib.lights import Light from elkm1_lib.lights import Light
from homeassistant.components.light import ATTR_BRIGHTNESS, ColorMode, LightEntity from homeassistant.components.light import ATTR_BRIGHTNESS, ColorMode, LightEntity
from homeassistant.config_entries import ConfigEntry
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 . import ElkEntity, create_elk_entities from . import ElkEntity, ElkM1ConfigEntry, create_elk_entities
from .const import DOMAIN
from .models import ELKM1Data from .models import ELKM1Data
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ElkM1ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up the Elk light platform.""" """Set up the Elk light platform."""
elk_data: ELKM1Data = hass.data[DOMAIN][config_entry.entry_id] elk_data = config_entry.runtime_data
elk = elk_data.elk elk = elk_data.elk
entities: list[ElkEntity] = [] entities: list[ElkEntity] = []
create_elk_entities(elk_data, elk.lights, "plc", ElkLight, entities) create_elk_entities(elk_data, elk.lights, "plc", ElkLight, entities)

View File

@ -7,22 +7,19 @@ from typing import Any
from elkm1_lib.tasks import Task from elkm1_lib.tasks import Task
from homeassistant.components.scene import Scene from homeassistant.components.scene import Scene
from homeassistant.config_entries import ConfigEntry
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 . import ElkAttachedEntity, ElkEntity, create_elk_entities from . import ElkAttachedEntity, ElkEntity, ElkM1ConfigEntry, create_elk_entities
from .const import DOMAIN
from .models import ELKM1Data
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ElkM1ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Create the Elk-M1 scene platform.""" """Create the Elk-M1 scene platform."""
elk_data: ELKM1Data = hass.data[DOMAIN][config_entry.entry_id] elk_data = config_entry.runtime_data
elk = elk_data.elk elk = elk_data.elk
entities: list[ElkEntity] = [] entities: list[ElkEntity] = []
create_elk_entities(elk_data, elk.tasks, "task", ElkTask, entities) create_elk_entities(elk_data, elk.tasks, "task", ElkTask, entities)

View File

@ -15,16 +15,14 @@ from elkm1_lib.zones import Zone
import voluptuous as vol import voluptuous as vol
from homeassistant.components.sensor import SensorEntity from homeassistant.components.sensor import SensorEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory, UnitOfElectricPotential from homeassistant.const import EntityCategory, UnitOfElectricPotential
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import entity_platform from homeassistant.helpers import entity_platform
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ElkAttachedEntity, ElkEntity, create_elk_entities from . import ElkAttachedEntity, ElkEntity, ElkM1ConfigEntry, create_elk_entities
from .const import ATTR_VALUE, DOMAIN, ELK_USER_CODE_SERVICE_SCHEMA from .const import ATTR_VALUE, ELK_USER_CODE_SERVICE_SCHEMA
from .models import ELKM1Data
SERVICE_SENSOR_COUNTER_REFRESH = "sensor_counter_refresh" SERVICE_SENSOR_COUNTER_REFRESH = "sensor_counter_refresh"
SERVICE_SENSOR_COUNTER_SET = "sensor_counter_set" SERVICE_SENSOR_COUNTER_SET = "sensor_counter_set"
@ -39,11 +37,11 @@ ELK_SET_COUNTER_SERVICE_SCHEMA = {
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ElkM1ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Create the Elk-M1 sensor platform.""" """Create the Elk-M1 sensor platform."""
elk_data: ELKM1Data = hass.data[DOMAIN][config_entry.entry_id] elk_data = config_entry.runtime_data
elk = elk_data.elk elk = elk_data.elk
entities: list[ElkEntity] = [] entities: list[ElkEntity] = []
create_elk_entities(elk_data, elk.counters, "counter", ElkCounter, entities) create_elk_entities(elk_data, elk.counters, "counter", ElkCounter, entities)

View File

@ -7,22 +7,19 @@ from typing import Any
from elkm1_lib.outputs import Output from elkm1_lib.outputs import Output
from homeassistant.components.switch import SwitchEntity from homeassistant.components.switch import SwitchEntity
from homeassistant.config_entries import ConfigEntry
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 . import ElkAttachedEntity, ElkEntity, create_elk_entities from . import ElkAttachedEntity, ElkEntity, ElkM1ConfigEntry, create_elk_entities
from .const import DOMAIN
from .models import ELKM1Data
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ElkM1ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Create the Elk-M1 switch platform.""" """Create the Elk-M1 switch platform."""
elk_data: ELKM1Data = hass.data[DOMAIN][config_entry.entry_id] elk_data = config_entry.runtime_data
elk = elk_data.elk elk = elk_data.elk
entities: list[ElkEntity] = [] entities: list[ElkEntity] = []
create_elk_entities(elk_data, elk.outputs, "output", ElkOutput, entities) create_elk_entities(elk_data, elk.outputs, "output", ElkOutput, entities)