Jelajahi Sumber

Alarm control panel: add new alarm_state property.

New in HA 2024.11, alarm state should be set through alarm_state
using new Enum AlarmControlPanelState instead of constants.

This will silence any deprecation warnings and prepare for the
constant removals in late 2025.

Issue #2445
Jason Rumney 1 tahun lalu
induk
melakukan
12f4d412a0

+ 19 - 25
custom_components/tuya_local/alarm_control_panel.py

@@ -7,15 +7,7 @@ import logging
 from homeassistant.components.alarm_control_panel import AlarmControlPanelEntity
 from homeassistant.components.alarm_control_panel.const import (
     AlarmControlPanelEntityFeature as Feature,
-)
-from homeassistant.const import (
-    STATE_ALARM_ARMED_AWAY,
-    STATE_ALARM_ARMED_CUSTOM_BYPASS,
-    STATE_ALARM_ARMED_HOME,
-    STATE_ALARM_ARMED_NIGHT,
-    STATE_ALARM_ARMED_VACATION,
-    STATE_ALARM_DISARMED,
-    STATE_ALARM_TRIGGERED,
+    AlarmControlPanelState,
 )
 
 from .device import TuyaLocalDevice
@@ -57,15 +49,15 @@ class TuyaLocalAlarmControlPanel(TuyaLocalEntity, AlarmControlPanelEntity):
             raise AttributeError(f"{config.config_id} is missing an alarm_state dp")
 
         alarm_states = self._alarm_state_dp.values(device)
-        if STATE_ALARM_ARMED_HOME in alarm_states:
+        if AlarmControlPanelState.ARMED_HOME in alarm_states:
             self._attr_supported_features |= Feature.ARM_HOME
-        if STATE_ALARM_ARMED_AWAY in alarm_states:
+        if AlarmControlPanelState.ARMED_AWAY in alarm_states:
             self._attr_supported_features |= Feature.ARM_AWAY
-        if STATE_ALARM_ARMED_NIGHT in alarm_states:
+        if AlarmControlPanelState.ARMED_NIGHT in alarm_states:
             self._attr_supported_features |= Feature.ARM_NIGHT
-        if STATE_ALARM_ARMED_VACATION in alarm_states:
+        if AlarmControlPanelState.ARMED_VACATION in alarm_states:
             self._attr_supported_features |= Feature.ARM_VACATION
-        if STATE_ALARM_ARMED_CUSTOM_BYPASS in alarm_states:
+        if AlarmControlPanelState.ARMED_CUSTOM_BYPASS in alarm_states:
             self._attr_supported_features |= Feature.ARM_CUSTOM_BYPASS
         if self._trigger_dp:
             self._attr_supported_features |= Feature.TRIGGER
@@ -74,13 +66,15 @@ class TuyaLocalAlarmControlPanel(TuyaLocalEntity, AlarmControlPanelEntity):
         self._attr_code_arm_required = False
 
     @property
-    def state(self):
+    def alarm_state(self):
         """Return the current alarm state."""
         if self._trigger_dp and self._trigger_dp.get_value(self._device):
-            return STATE_ALARM_TRIGGERED
-        return self._alarm_state_dp.get_value(self._device)
+            return AlarmControlPanelState.TRIGGERED
+        return AlarmControlPanelState(
+            self._alarm_state_dp.get_value(self._device),
+        )
 
-    async def _alarm_send_command(self, cmd):
+    async def _alarm_send_command(self, cmd: str):
         if cmd in self._alarm_state_dp.values(self._device):
             await self._alarm_state_dp.async_set_value(self._device, cmd)
         else:
@@ -88,28 +82,28 @@ class TuyaLocalAlarmControlPanel(TuyaLocalEntity, AlarmControlPanelEntity):
 
     async def async_alarm_disarm(self, code=None):
         """Send disarm command"""
-        await self._alarm_send_command(STATE_ALARM_DISARMED)
+        await self._alarm_send_command(AlarmControlPanelState.DISARMED)
 
     async def async_alarm_arm_home(self, code=None):
-        await self._alarm_send_command(STATE_ALARM_ARMED_HOME)
+        await self._alarm_send_command(AlarmControlPanelState.ARMED_HOME)
 
     async def async_alarm_arm_away(self, code=None):
         """Send away command"""
-        await self._alarm_send_command(STATE_ALARM_ARMED_AWAY)
+        await self._alarm_send_command(AlarmControlPanelState.ARMED_AWAY)
 
     async def async_alarm_arm_night(self, code=None):
         """Send away command"""
-        await self._alarm_send_command(STATE_ALARM_ARMED_NIGHT)
+        await self._alarm_send_command(AlarmControlPanelState.ARMED_NIGHT)
 
     async def async_alarm_arm_vacation(self, code=None):
         """Send away command"""
-        await self._alarm_send_command(STATE_ALARM_ARMED_VACATION)
+        await self._alarm_send_command(AlarmControlPanelState.ARMED_VACATION)
 
     async def async_alarm_arm_custom_bypass(self, code=None):
-        await self._alarm_send_command(STATE_ALARM_ARMED_CUSTOM_BYPASS)
+        await self._alarm_send_command(AlarmControlPanelState.ARMED_CUSTOM_BYPASS)
 
     async def async_alarm_trigger(self, code=None):
         if self._trigger_dp:
             await self._trigger_dp.async_set_value(self._device, True)
         else:
-            await self._alarm_send_command(STATE_ALARM_TRIGGERED)
+            await self._alarm_send_command(AlarmControlPanelState.TRIGGERED)

+ 1 - 1
hacs.json

@@ -1,5 +1,5 @@
 {
   "name": "Tuya Local",
   "render_readme": true,
-  "homeassistant": "2024.9.0"
+  "homeassistant": "2024.11.0"
 }

+ 1 - 1
requirements-dev.txt

@@ -1,6 +1,6 @@
 fuzzywuzzy
 levenshtein
-pytest-homeassistant-custom-component>=0.13.161
+pytest-homeassistant-custom-component>=0.13.181
 pytest
 pytest-asyncio
 pytest-cov

+ 2 - 4
tests/devices/test_zx_g30_alarm.py

@@ -2,9 +2,7 @@
 
 from homeassistant.components.alarm_control_panel import (
     AlarmControlPanelEntityFeature as Feature,
-)
-from homeassistant.const import (
-    STATE_ALARM_DISARMED,
+    AlarmControlPanelState,
 )
 
 from ..const import ZXG30_ALARM_PAYLOAD
@@ -58,7 +56,7 @@ class TestZXG30Alarm(TuyaDeviceTestCase):
 
     def test_state(self):
         self.dps[ALARMSTATE_DP] = "disarmed"
-        self.assertEqual(self.subject.state, STATE_ALARM_DISARMED)
+        self.assertEqual(self.subject.alarm_state, AlarmControlPanelState.DISARMED)
 
     async def test_arm_home(self):
         async with assert_device_properties_set(