1
0
mirror of https://github.com/home-assistant/core.git synced 2026-07-04 05:05:38 +01:00

Move RFXtrx services to async_setup (#175474)

This commit is contained in:
Erwin Douna
2026-07-03 19:08:05 +02:00
committed by GitHub
parent f2dfafb5a8
commit fd4e1ee47c
2 changed files with 50 additions and 26 deletions
+13 -26
View File
@@ -7,7 +7,6 @@ import logging
from typing import Any, NamedTuple, cast
import RFXtrx as rfxtrxmod
import voluptuous as vol
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
@@ -20,7 +19,7 @@ from homeassistant.const import (
EVENT_HOMEASSISTANT_STOP,
Platform,
)
from homeassistant.core import Event, HomeAssistant, ServiceCall, callback
from homeassistant.core import Event, HomeAssistant, callback
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import config_validation as cv, device_registry as dr
from homeassistant.helpers.device_registry import EventDeviceRegistryUpdatedData
@@ -30,9 +29,9 @@ from homeassistant.helpers.dispatcher import (
)
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType
from .const import (
ATTR_EVENT,
CONF_AUTOMATIC_ADD,
CONF_DATA_BITS,
CONF_PROTOCOLS,
@@ -40,9 +39,9 @@ from .const import (
DEVICE_PACKET_TYPE_LIGHTING4,
DOMAIN,
EVENT_RFXTRX_EVENT,
SERVICE_SEND,
SIGNAL_EVENT,
)
from .services import async_setup_services
DEFAULT_OFF_DELAY = 2.0
@@ -59,18 +58,6 @@ class DeviceTuple(NamedTuple):
id_string: str
def _bytearray_string(data: Any) -> bytearray:
val = cv.string(data)
try:
return bytearray.fromhex(val)
except ValueError as err:
raise vol.Invalid(
"Data must be a hex string with multiple of two characters"
) from err
SERVICE_SEND_SCHEMA = vol.Schema({ATTR_EVENT: _bytearray_string})
PLATFORMS = [
Platform.BINARY_SENSOR,
Platform.COVER,
@@ -81,6 +68,15 @@ PLATFORMS = [
Platform.SWITCH,
]
CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up RFXtrx services."""
hass.data.setdefault(DOMAIN, {})
async_setup_services(hass)
return True
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up the RFXtrx component."""
@@ -97,12 +93,10 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
if not await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
return False
hass.services.async_remove(DOMAIN, SERVICE_SEND)
rfx_object = hass.data[DOMAIN][DATA_RFXOBJECT]
await hass.async_add_executor_job(rfx_object.close_connection)
hass.data.pop(DOMAIN)
hass.data[DOMAIN].pop(DATA_RFXOBJECT)
return True
@@ -284,13 +278,6 @@ async def async_setup_internal(hass: HomeAssistant, entry: ConfigEntry) -> None:
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _shutdown_rfxtrx)
)
def send(call: ServiceCall) -> None:
event = call.data[ATTR_EVENT]
rfx_object.transport.send(event)
# pylint: disable-next=home-assistant-service-registered-in-setup-entry
hass.services.async_register(DOMAIN, SERVICE_SEND, send, schema=SERVICE_SEND_SCHEMA)
async def async_setup_platform_entry(
hass: HomeAssistant,
@@ -0,0 +1,37 @@
"""Support for RFXtrx services."""
from typing import Any
import voluptuous as vol
from homeassistant.core import HomeAssistant, ServiceCall, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import config_validation as cv
from .const import ATTR_EVENT, DATA_RFXOBJECT, DOMAIN, SERVICE_SEND
def _bytearray_string(data: Any) -> bytearray:
val = cv.string(data)
try:
return bytearray.fromhex(val)
except ValueError as err:
raise vol.Invalid(
"Data must be a hex string with multiple of two characters"
) from err
SERVICE_SEND_SCHEMA = vol.Schema({ATTR_EVENT: _bytearray_string})
@callback
def async_setup_services(hass: HomeAssistant) -> None:
"""Register the RFXtrx services."""
def send(call: ServiceCall) -> None:
rfx_object = hass.data.get(DOMAIN, {}).get(DATA_RFXOBJECT)
if rfx_object is None:
raise HomeAssistantError("RFXtrx is not connected, cannot send event")
rfx_object.transport.send(call.data[ATTR_EVENT])
hass.services.async_register(DOMAIN, SERVICE_SEND, send, schema=SERVICE_SEND_SCHEMA)