mirror of
https://github.com/home-assistant/core.git
synced 2026-09-04 18:15:04 -05:00
Migrate remaining alarm control panel wrappers to Tuya library (#165686)
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user