diff --git a/homeassistant/components/tuya/alarm_control_panel.py b/homeassistant/components/tuya/alarm_control_panel.py index 549f0fb0d7c1..8aa90a29ec8b 100644 --- a/homeassistant/components/tuya/alarm_control_panel.py +++ b/homeassistant/components/tuya/alarm_control_panel.py @@ -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 + )