Use runtime_data in homeworks (#144944)

This commit is contained in:
epenet 2025-05-16 21:57:36 +02:00 committed by GitHub
parent 0bbbd2cd54
commit 9d2302f2f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 31 additions and 40 deletions

View File

@ -3,7 +3,6 @@
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
from collections.abc import Mapping
from dataclasses import dataclass from dataclasses import dataclass
import logging import logging
from typing import Any from typing import Any
@ -58,6 +57,8 @@ SERVICE_SEND_COMMAND_SCHEMA = vol.Schema(
} }
) )
type HomeworksConfigEntry = ConfigEntry[HomeworksData]
@dataclass @dataclass
class HomeworksData: class HomeworksData:
@ -72,45 +73,44 @@ class HomeworksData:
def async_setup_services(hass: HomeAssistant) -> None: def async_setup_services(hass: HomeAssistant) -> None:
"""Set up services for Lutron Homeworks Series 4 and 8 integration.""" """Set up services for Lutron Homeworks Series 4 and 8 integration."""
async def async_call_service(service_call: ServiceCall) -> None:
"""Call the service."""
await async_send_command(hass, service_call.data)
hass.services.async_register( hass.services.async_register(
DOMAIN, DOMAIN,
"send_command", "send_command",
async_call_service, async_send_command,
schema=SERVICE_SEND_COMMAND_SCHEMA, schema=SERVICE_SEND_COMMAND_SCHEMA,
) )
async def async_send_command(hass: HomeAssistant, data: Mapping[str, Any]) -> None: async def async_send_command(service_call: ServiceCall) -> None:
"""Send command to a controller.""" """Send command to a controller."""
def get_controller_ids() -> list[str]: def get_controller_ids() -> list[str]:
"""Get homeworks data for the specified controller ID.""" """Get homeworks data for the specified controller ID."""
return [data.controller_id for data in hass.data[DOMAIN].values()] return [
entry.runtime_data.controller_id
for entry in service_call.hass.config_entries.async_loaded_entries(DOMAIN)
]
def get_homeworks_data(controller_id: str) -> HomeworksData | None: def get_homeworks_data(controller_id: str) -> HomeworksData | None:
"""Get homeworks data for the specified controller ID.""" """Get homeworks data for the specified controller ID."""
data: HomeworksData entry: HomeworksConfigEntry
for data in hass.data[DOMAIN].values(): for entry in service_call.hass.config_entries.async_loaded_entries(DOMAIN):
if data.controller_id == controller_id: if entry.runtime_data.controller_id == controller_id:
return data return entry.runtime_data
return None return None
homeworks_data = get_homeworks_data(data[CONF_CONTROLLER_ID]) homeworks_data = get_homeworks_data(service_call.data[CONF_CONTROLLER_ID])
if not homeworks_data: if not homeworks_data:
raise ServiceValidationError( raise ServiceValidationError(
translation_domain=DOMAIN, translation_domain=DOMAIN,
translation_key="invalid_controller_id", translation_key="invalid_controller_id",
translation_placeholders={ translation_placeholders={
"controller_id": data[CONF_CONTROLLER_ID], "controller_id": service_call.data[CONF_CONTROLLER_ID],
"controller_ids": ",".join(get_controller_ids()), "controller_ids": ",".join(get_controller_ids()),
}, },
) )
commands = data[CONF_COMMAND] commands = service_call.data[CONF_COMMAND]
_LOGGER.debug("Send commands: %s", commands) _LOGGER.debug("Send commands: %s", commands)
for command in commands: for command in commands:
if command.lower().startswith("delay"): if command.lower().startswith("delay"):
@ -119,7 +119,7 @@ async def async_send_command(hass: HomeAssistant, data: Mapping[str, Any]) -> No
await asyncio.sleep(delay / 1000) await asyncio.sleep(delay / 1000)
else: else:
_LOGGER.debug("Sending command '%s'", command) _LOGGER.debug("Sending command '%s'", command)
await hass.async_add_executor_job( await service_call.hass.async_add_executor_job(
homeworks_data.controller._send, # noqa: SLF001 homeworks_data.controller._send, # noqa: SLF001
command, command,
) )
@ -132,10 +132,9 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
return True return True
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: HomeworksConfigEntry) -> bool:
"""Set up Homeworks from a config entry.""" """Set up Homeworks from a config entry."""
hass.data.setdefault(DOMAIN, {})
controller_id = entry.options[CONF_CONTROLLER_ID] controller_id = entry.options[CONF_CONTROLLER_ID]
def hw_callback(msg_type: Any, values: Any) -> None: def hw_callback(msg_type: Any, values: Any) -> None:
@ -174,9 +173,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
name = key_config[CONF_NAME] name = key_config[CONF_NAME]
keypads[addr] = HomeworksKeypad(hass, controller, controller_id, addr, name) keypads[addr] = HomeworksKeypad(hass, controller, controller_id, addr, name)
hass.data[DOMAIN][entry.entry_id] = HomeworksData( entry.runtime_data = HomeworksData(controller, controller_id, keypads)
controller, controller_id, keypads
)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
entry.async_on_unload(entry.add_update_listener(update_listener)) entry.async_on_unload(entry.add_update_listener(update_listener))
@ -184,19 +181,18 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
return True return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_unload_entry(hass: HomeAssistant, entry: HomeworksConfigEntry) -> bool:
"""Unload a config entry.""" """Unload a config entry."""
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS): if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
data: HomeworksData = hass.data[DOMAIN].pop(entry.entry_id) for keypad in entry.runtime_data.keypads.values():
for keypad in data.keypads.values():
keypad.unsubscribe() keypad.unsubscribe()
await hass.async_add_executor_job(data.controller.stop) await hass.async_add_executor_job(entry.runtime_data.controller.stop)
return unload_ok return unload_ok
async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None: async def update_listener(hass: HomeAssistant, entry: HomeworksConfigEntry) -> None:
"""Handle options update.""" """Handle options update."""
await hass.config_entries.async_reload(entry.entry_id) await hass.config_entries.async_reload(entry.entry_id)

View File

@ -8,14 +8,13 @@ from typing import Any
from pyhomeworks.pyhomeworks import HW_KEYPAD_LED_CHANGED, Homeworks from pyhomeworks.pyhomeworks import HW_KEYPAD_LED_CHANGED, Homeworks
from homeassistant.components.binary_sensor import BinarySensorEntity from homeassistant.components.binary_sensor import BinarySensorEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_NAME from homeassistant.const import CONF_NAME
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import HomeworksData, HomeworksKeypad from . import HomeworksConfigEntry, HomeworksKeypad
from .const import ( from .const import (
CONF_ADDR, CONF_ADDR,
CONF_BUTTONS, CONF_BUTTONS,
@ -32,11 +31,11 @@ _LOGGER = logging.getLogger(__name__)
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HomeworksConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Homeworks binary sensors.""" """Set up Homeworks binary sensors."""
data: HomeworksData = hass.data[DOMAIN][entry.entry_id] data = entry.runtime_data
controller = data.controller controller = data.controller
controller_id = entry.options[CONF_CONTROLLER_ID] controller_id = entry.options[CONF_CONTROLLER_ID]
entities = [] entities = []

View File

@ -7,13 +7,12 @@ import asyncio
from pyhomeworks.pyhomeworks import Homeworks from pyhomeworks.pyhomeworks import Homeworks
from homeassistant.components.button import ButtonEntity from homeassistant.components.button import ButtonEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_NAME from homeassistant.const import CONF_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import HomeworksData from . import HomeworksConfigEntry
from .const import ( from .const import (
CONF_ADDR, CONF_ADDR,
CONF_BUTTONS, CONF_BUTTONS,
@ -28,12 +27,11 @@ from .entity import HomeworksEntity
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HomeworksConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Homeworks buttons.""" """Set up Homeworks buttons."""
data: HomeworksData = hass.data[DOMAIN][entry.entry_id] controller = entry.runtime_data.controller
controller = data.controller
controller_id = entry.options[CONF_CONTROLLER_ID] controller_id = entry.options[CONF_CONTROLLER_ID]
entities = [] entities = []
for keypad in entry.options.get(CONF_KEYPADS, []): for keypad in entry.options.get(CONF_KEYPADS, []):

View File

@ -8,14 +8,13 @@ from typing import Any
from pyhomeworks.pyhomeworks import HW_LIGHT_CHANGED, Homeworks from pyhomeworks.pyhomeworks import HW_LIGHT_CHANGED, Homeworks
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.const import CONF_NAME from homeassistant.const import CONF_NAME
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import HomeworksData from . import HomeworksConfigEntry
from .const import CONF_ADDR, CONF_CONTROLLER_ID, CONF_DIMMERS, CONF_RATE, DOMAIN from .const import CONF_ADDR, CONF_CONTROLLER_ID, CONF_DIMMERS, CONF_RATE, DOMAIN
from .entity import HomeworksEntity from .entity import HomeworksEntity
@ -24,12 +23,11 @@ _LOGGER = logging.getLogger(__name__)
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HomeworksConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Homeworks lights.""" """Set up Homeworks lights."""
data: HomeworksData = hass.data[DOMAIN][entry.entry_id] controller = entry.runtime_data.controller
controller = data.controller
controller_id = entry.options[CONF_CONTROLLER_ID] controller_id = entry.options[CONF_CONTROLLER_ID]
entities = [] entities = []
for dimmer in entry.options.get(CONF_DIMMERS, []): for dimmer in entry.options.get(CONF_DIMMERS, []):