Allow arm levels be in order for google assistant (#119645)

This commit is contained in:
Joakim Plate 2024-06-14 07:18:57 +02:00 committed by GitHub
parent 95b9e15306
commit 097844aca6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 12 deletions

View File

@ -1553,19 +1553,20 @@ class ArmDisArmTrait(_Trait):
state_to_service = { state_to_service = {
STATE_ALARM_ARMED_HOME: SERVICE_ALARM_ARM_HOME, STATE_ALARM_ARMED_HOME: SERVICE_ALARM_ARM_HOME,
STATE_ALARM_ARMED_AWAY: SERVICE_ALARM_ARM_AWAY,
STATE_ALARM_ARMED_NIGHT: SERVICE_ALARM_ARM_NIGHT, STATE_ALARM_ARMED_NIGHT: SERVICE_ALARM_ARM_NIGHT,
STATE_ALARM_ARMED_AWAY: SERVICE_ALARM_ARM_AWAY,
STATE_ALARM_ARMED_CUSTOM_BYPASS: SERVICE_ALARM_ARM_CUSTOM_BYPASS, STATE_ALARM_ARMED_CUSTOM_BYPASS: SERVICE_ALARM_ARM_CUSTOM_BYPASS,
STATE_ALARM_TRIGGERED: SERVICE_ALARM_TRIGGER, STATE_ALARM_TRIGGERED: SERVICE_ALARM_TRIGGER,
} }
state_to_support = { state_to_support = {
STATE_ALARM_ARMED_HOME: AlarmControlPanelEntityFeature.ARM_HOME, STATE_ALARM_ARMED_HOME: AlarmControlPanelEntityFeature.ARM_HOME,
STATE_ALARM_ARMED_AWAY: AlarmControlPanelEntityFeature.ARM_AWAY,
STATE_ALARM_ARMED_NIGHT: AlarmControlPanelEntityFeature.ARM_NIGHT, STATE_ALARM_ARMED_NIGHT: AlarmControlPanelEntityFeature.ARM_NIGHT,
STATE_ALARM_ARMED_AWAY: AlarmControlPanelEntityFeature.ARM_AWAY,
STATE_ALARM_ARMED_CUSTOM_BYPASS: AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS, STATE_ALARM_ARMED_CUSTOM_BYPASS: AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS,
STATE_ALARM_TRIGGERED: AlarmControlPanelEntityFeature.TRIGGER, STATE_ALARM_TRIGGERED: AlarmControlPanelEntityFeature.TRIGGER,
} }
"""The list of states to support in increasing security state."""
@staticmethod @staticmethod
def supported(domain, features, device_class, _): def supported(domain, features, device_class, _):
@ -1592,7 +1593,7 @@ class ArmDisArmTrait(_Trait):
if STATE_ALARM_TRIGGERED in states: if STATE_ALARM_TRIGGERED in states:
states.remove(STATE_ALARM_TRIGGERED) states.remove(STATE_ALARM_TRIGGERED)
if len(states) != 1: if not states:
raise SmartHomeError(ERR_NOT_SUPPORTED, "ArmLevel missing") raise SmartHomeError(ERR_NOT_SUPPORTED, "ArmLevel missing")
return states[0] return states[0]
@ -1614,7 +1615,7 @@ class ArmDisArmTrait(_Trait):
} }
levels.append(level) levels.append(level)
response["availableArmLevels"] = {"levels": levels, "ordered": False} response["availableArmLevels"] = {"levels": levels, "ordered": True}
return response return response
def query_attributes(self): def query_attributes(self):
@ -1631,8 +1632,8 @@ class ArmDisArmTrait(_Trait):
async def execute(self, command, data, params, challenge): async def execute(self, command, data, params, challenge):
"""Execute an ArmDisarm command.""" """Execute an ArmDisarm command."""
if params["arm"] and not params.get("cancel"): if params["arm"] and not params.get("cancel"):
# If no arm level given, we can only arm it if there is # If no arm level given, we we arm the first supported
# only one supported arm type. We never default to triggered. # level in state_to_support.
if not (arm_level := params.get("armLevel")): if not (arm_level := params.get("armLevel")):
arm_level = self._default_arm_state() arm_level = self._default_arm_state()

View File

@ -1763,7 +1763,7 @@ async def test_arm_disarm_arm_away(hass: HomeAssistant) -> None:
], ],
}, },
], ],
"ordered": False, "ordered": True,
} }
} }
@ -1905,7 +1905,8 @@ async def test_arm_disarm_disarm(hass: HomeAssistant) -> None:
{ {
alarm_control_panel.ATTR_CODE_ARM_REQUIRED: True, alarm_control_panel.ATTR_CODE_ARM_REQUIRED: True,
ATTR_SUPPORTED_FEATURES: AlarmControlPanelEntityFeature.TRIGGER ATTR_SUPPORTED_FEATURES: AlarmControlPanelEntityFeature.TRIGGER
| AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS, | AlarmControlPanelEntityFeature.ARM_HOME
| AlarmControlPanelEntityFeature.ARM_AWAY,
}, },
), ),
PIN_CONFIG, PIN_CONFIG,
@ -1914,10 +1915,19 @@ async def test_arm_disarm_disarm(hass: HomeAssistant) -> None:
"availableArmLevels": { "availableArmLevels": {
"levels": [ "levels": [
{ {
"level_name": "armed_custom_bypass", "level_name": "armed_home",
"level_values": [ "level_values": [
{ {
"level_synonym": ["armed custom bypass", "custom"], "level_synonym": ["armed home", "home"],
"lang": "en",
}
],
},
{
"level_name": "armed_away",
"level_values": [
{
"level_synonym": ["armed away", "away"],
"lang": "en", "lang": "en",
} }
], ],
@ -1927,12 +1937,12 @@ async def test_arm_disarm_disarm(hass: HomeAssistant) -> None:
"level_values": [{"level_synonym": ["triggered"], "lang": "en"}], "level_values": [{"level_synonym": ["triggered"], "lang": "en"}],
}, },
], ],
"ordered": False, "ordered": True,
} }
} }
assert trt.query_attributes() == { assert trt.query_attributes() == {
"currentArmLevel": "armed_custom_bypass", "currentArmLevel": "armed_home",
"isArmed": False, "isArmed": False,
} }