mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Use runtime_data in homeworks (#144944)
This commit is contained in:
parent
0bbbd2cd54
commit
9d2302f2f5
@ -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)
|
||||||
|
|
||||||
|
@ -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 = []
|
||||||
|
@ -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, []):
|
||||||
|
@ -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, []):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user