Migrate remaining alarm control panel wrappers to Tuya library (#165686)

This commit is contained in:
epenet
2026-03-16 14:59:10 +01:00
committed by GitHub
parent 256d30c38d
commit 17bf6ca591
@@ -2,15 +2,16 @@
from __future__ import annotations
from typing import Any
from tuya_device_handlers.device_wrapper.alarm_control_panel import (
AlarmActionWrapper,
AlarmChangedByWrapper,
AlarmStateWrapper,
)
from tuya_device_handlers.device_wrapper.base import DeviceWrapper
from tuya_device_handlers.device_wrapper.common import DPCodeEnumWrapper
from tuya_device_handlers.helpers.homeassistant import TuyaAlarmControlPanelState
from tuya_device_handlers.helpers.homeassistant import (
TuyaAlarmControlPanelAction,
TuyaAlarmControlPanelState,
)
from tuya_device_handlers.type_information import EnumTypeInformation
from tuya_sharing import CustomerDevice, Manager
@@ -37,10 +38,7 @@ ALARM: dict[DeviceCategory, tuple[AlarmControlPanelEntityDescription, ...]] = {
)
}
_TUYA_TO_HA_STATE_MAPPINGS: dict[
TuyaAlarmControlPanelState | None, AlarmControlPanelState | None
] = {
None: None,
_TUYA_TO_HA_STATE_MAPPINGS = {
TuyaAlarmControlPanelState.DISARMED: AlarmControlPanelState.DISARMED,
TuyaAlarmControlPanelState.ARMED_HOME: AlarmControlPanelState.ARMED_HOME,
TuyaAlarmControlPanelState.ARMED_AWAY: AlarmControlPanelState.ARMED_AWAY,
@@ -54,33 +52,6 @@ _TUYA_TO_HA_STATE_MAPPINGS: dict[
}
class _AlarmActionWrapper(DPCodeEnumWrapper):
"""Wrapper for setting the alarm mode of a device."""
_ACTION_MAPPINGS = {
# Home Assistant action => Tuya device mode
"arm_home": "home",
"arm_away": "arm",
"disarm": "disarmed",
"trigger": "sos",
}
def __init__(self, dpcode: str, type_information: EnumTypeInformation) -> None:
"""Init _AlarmActionWrapper."""
super().__init__(dpcode, type_information)
self.options = [
ha_action
for ha_action, tuya_action in self._ACTION_MAPPINGS.items()
if tuya_action in type_information.range
]
def _convert_value_to_raw_value(self, device: CustomerDevice, value: Any) -> Any:
"""Convert value to raw value."""
if value in self.options:
return self._ACTION_MAPPINGS[value]
raise ValueError(f"Unsupported value {value} for {self.dpcode}")
async def async_setup_entry(
hass: HomeAssistant,
entry: TuyaConfigEntry,
@@ -101,7 +72,7 @@ async def async_setup_entry(
device,
manager,
description,
action_wrapper=_AlarmActionWrapper(
action_wrapper=AlarmActionWrapper(
master_mode.dpcode, master_mode
),
changed_by_wrapper=AlarmChangedByWrapper.find_dpcode(
@@ -139,7 +110,7 @@ class TuyaAlarmEntity(TuyaEntity, AlarmControlPanelEntity):
device_manager: Manager,
description: AlarmControlPanelEntityDescription,
*,
action_wrapper: DeviceWrapper[str],
action_wrapper: DeviceWrapper[TuyaAlarmControlPanelAction],
changed_by_wrapper: DeviceWrapper[str] | None,
state_wrapper: DeviceWrapper[TuyaAlarmControlPanelState],
) -> None:
@@ -152,17 +123,18 @@ class TuyaAlarmEntity(TuyaEntity, AlarmControlPanelEntity):
self._state_wrapper = state_wrapper
# Determine supported modes
if "arm_home" in action_wrapper.options:
if TuyaAlarmControlPanelAction.ARM_HOME in action_wrapper.options:
self._attr_supported_features |= AlarmControlPanelEntityFeature.ARM_HOME
if "arm_away" in action_wrapper.options:
if TuyaAlarmControlPanelAction.ARM_AWAY in action_wrapper.options:
self._attr_supported_features |= AlarmControlPanelEntityFeature.ARM_AWAY
if "trigger" in action_wrapper.options:
if TuyaAlarmControlPanelAction.TRIGGER in action_wrapper.options:
self._attr_supported_features |= AlarmControlPanelEntityFeature.TRIGGER
@property
def alarm_state(self) -> AlarmControlPanelState | None:
"""Return the state of the device."""
return _TUYA_TO_HA_STATE_MAPPINGS.get(self._read_wrapper(self._state_wrapper))
tuya_value = self._read_wrapper(self._state_wrapper)
return _TUYA_TO_HA_STATE_MAPPINGS.get(tuya_value) if tuya_value else None
@property
def changed_by(self) -> str | None:
@@ -171,16 +143,24 @@ class TuyaAlarmEntity(TuyaEntity, AlarmControlPanelEntity):
async def async_alarm_disarm(self, code: str | None = None) -> None:
"""Send Disarm command."""
await self._async_send_wrapper_updates(self._action_wrapper, "disarm")
await self._async_send_wrapper_updates(
self._action_wrapper, TuyaAlarmControlPanelAction.DISARM
)
async def async_alarm_arm_home(self, code: str | None = None) -> None:
"""Send Home command."""
await self._async_send_wrapper_updates(self._action_wrapper, "arm_home")
await self._async_send_wrapper_updates(
self._action_wrapper, TuyaAlarmControlPanelAction.ARM_HOME
)
async def async_alarm_arm_away(self, code: str | None = None) -> None:
"""Send Arm command."""
await self._async_send_wrapper_updates(self._action_wrapper, "arm_away")
await self._async_send_wrapper_updates(
self._action_wrapper, TuyaAlarmControlPanelAction.ARM_AWAY
)
async def async_alarm_trigger(self, code: str | None = None) -> None:
"""Send SOS command."""
await self._async_send_wrapper_updates(self._action_wrapper, "trigger")
await self._async_send_wrapper_updates(
self._action_wrapper, TuyaAlarmControlPanelAction.TRIGGER
)