mirror of
https://github.com/home-assistant/core.git
synced 2025-11-21 16:56:57 +00:00
82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
"""Provides triggers for alarm control panels."""
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.exceptions import HomeAssistantError
|
|
from homeassistant.helpers.entity import get_supported_features
|
|
from homeassistant.helpers.trigger import (
|
|
EntityStateTriggerBase,
|
|
Trigger,
|
|
make_entity_state_trigger,
|
|
)
|
|
|
|
from .const import DOMAIN, AlarmControlPanelEntityFeature, AlarmControlPanelState
|
|
|
|
|
|
def supports_feature(hass: HomeAssistant, entity_id: str, features: int) -> bool:
|
|
"""Get the device class of an entity or UNDEFINED if not found."""
|
|
try:
|
|
return bool(get_supported_features(hass, entity_id) & features)
|
|
except HomeAssistantError:
|
|
return False
|
|
|
|
|
|
class EntityStateTriggerRequiredFeatures(EntityStateTriggerBase):
|
|
"""Trigger for entity state changes."""
|
|
|
|
_required_features: int
|
|
|
|
def entity_filter(self, entities: set[str]) -> set[str]:
|
|
"""Filter entities of this domain."""
|
|
entities = super().entity_filter(entities)
|
|
return {
|
|
entity_id
|
|
for entity_id in entities
|
|
if supports_feature(self._hass, entity_id, self._required_features)
|
|
}
|
|
|
|
|
|
def make_entity_state_trigger_required_features(
|
|
domain: str, to_state: str, required_features: int
|
|
) -> type[EntityStateTriggerBase]:
|
|
"""Create an entity state trigger class."""
|
|
|
|
class CustomTrigger(EntityStateTriggerRequiredFeatures):
|
|
"""Trigger for entity state changes."""
|
|
|
|
_domain = domain
|
|
_to_state = to_state
|
|
_required_features = required_features
|
|
|
|
return CustomTrigger
|
|
|
|
|
|
TRIGGERS: dict[str, type[Trigger]] = {
|
|
"armed_away": make_entity_state_trigger_required_features(
|
|
DOMAIN,
|
|
AlarmControlPanelState.ARMED_AWAY,
|
|
AlarmControlPanelEntityFeature.ARM_AWAY,
|
|
),
|
|
"armed_home": make_entity_state_trigger_required_features(
|
|
DOMAIN,
|
|
AlarmControlPanelState.ARMED_HOME,
|
|
AlarmControlPanelEntityFeature.ARM_HOME,
|
|
),
|
|
"armed_night": make_entity_state_trigger_required_features(
|
|
DOMAIN,
|
|
AlarmControlPanelState.ARMED_NIGHT,
|
|
AlarmControlPanelEntityFeature.ARM_NIGHT,
|
|
),
|
|
"armed_vacation": make_entity_state_trigger_required_features(
|
|
DOMAIN,
|
|
AlarmControlPanelState.ARMED_VACATION,
|
|
AlarmControlPanelEntityFeature.ARM_VACATION,
|
|
),
|
|
"disarmed": make_entity_state_trigger(DOMAIN, AlarmControlPanelState.DISARMED),
|
|
"triggered": make_entity_state_trigger(DOMAIN, AlarmControlPanelState.TRIGGERED),
|
|
}
|
|
|
|
|
|
async def async_get_triggers(hass: HomeAssistant) -> dict[str, type[Trigger]]:
|
|
"""Return the triggers for alarm control panels."""
|
|
return TRIGGERS
|