mirror of
https://github.com/home-assistant/core.git
synced 2026-09-25 17:04:04 -04:00
95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
"""Infrared platform for SLZB-Ultima."""
|
|
|
|
from typing import override
|
|
|
|
from pysmlight.const import Events as SmEvents
|
|
from pysmlight.exceptions import SmlightError
|
|
from pysmlight.models import IRPayload
|
|
|
|
from homeassistant.components.infrared import (
|
|
InfraredCommand,
|
|
InfraredEmitterEntity,
|
|
InfraredReceivedSignal,
|
|
InfraredReceiverEntity,
|
|
)
|
|
from homeassistant.core import HomeAssistant, callback
|
|
from homeassistant.exceptions import HomeAssistantError
|
|
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
|
|
|
from .const import DOMAIN
|
|
from .coordinator import SmConfigEntry, SmDataUpdateCoordinator
|
|
from .entity import SmEntity
|
|
|
|
PARALLEL_UPDATES = 1
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
entry: SmConfigEntry,
|
|
async_add_entities: AddConfigEntryEntitiesCallback,
|
|
) -> None:
|
|
"""Initialize infrared for SLZB-Ultima device."""
|
|
coordinator = entry.runtime_data.data
|
|
|
|
if coordinator.data.info.has_peripherals:
|
|
async_add_entities(
|
|
[
|
|
SmInfraredEntity(coordinator),
|
|
SmInfraredReceiverEntity(coordinator),
|
|
]
|
|
)
|
|
|
|
|
|
class SmInfraredEntity(SmEntity, InfraredEmitterEntity):
|
|
"""Representation of a SLZB-Ultima infrared emitter."""
|
|
|
|
def __init__(self, coordinator: SmDataUpdateCoordinator) -> None:
|
|
"""Initialize the SLZB-Ultima infrared."""
|
|
super().__init__(coordinator)
|
|
self._attr_unique_id = f"{coordinator.unique_id}-infrared-emitter" # pylint: disable=home-assistant-entity-unique-id-redundant-platform
|
|
|
|
@override
|
|
async def async_send_command(self, command: InfraredCommand) -> None:
|
|
"""Send an IR command."""
|
|
# pysmlight's IRPayload.from_raw_timings expects positive durations,
|
|
# so strip the sign from the signed pulse/space timings.
|
|
timings = [abs(t) for t in command.get_raw_timings()]
|
|
|
|
freq = command.modulation
|
|
|
|
try:
|
|
await self.coordinator.async_execute_command(
|
|
self.coordinator.client.actions.send_ir_code,
|
|
IRPayload.from_raw_timings(timings, freq=freq),
|
|
)
|
|
except (SmlightError, ValueError) as err:
|
|
raise HomeAssistantError(
|
|
translation_domain=DOMAIN,
|
|
translation_key="send_ir_code_failed",
|
|
translation_placeholders={"error": str(err)},
|
|
) from err
|
|
|
|
|
|
class SmInfraredReceiverEntity(SmEntity, InfraredReceiverEntity):
|
|
"""Representation of a SLZB-Ultima infrared receiver."""
|
|
|
|
def __init__(self, coordinator: SmDataUpdateCoordinator) -> None:
|
|
"""Initialize the SLZB-Ultima infrared receiver."""
|
|
super().__init__(coordinator)
|
|
self._attr_unique_id = f"{coordinator.unique_id}-receiver"
|
|
|
|
@override
|
|
async def async_added_to_hass(self) -> None:
|
|
"""Register SSE callbacks when entity is added to hass."""
|
|
await super().async_added_to_hass()
|
|
self.async_on_remove(
|
|
self.coordinator.client.sse.register_callback(
|
|
SmEvents.IR_CODE, self._handle_ir_code
|
|
)
|
|
)
|
|
|
|
@callback
|
|
def _handle_ir_code(self, timings: list[int]) -> None:
|
|
"""Handle received IR code."""
|
|
self._handle_received_signal(InfraredReceivedSignal(timings=timings))
|