Files
core/homeassistant/components/button/trigger.py
T

118 lines
3.3 KiB
Python

"""Provides triggers for buttons."""
from typing import override
from homeassistant.components.event import (
ATTR_MULTI_PRESS_COUNT,
DOMAIN as EVENT_DOMAIN,
ButtonEventType,
EventDeviceClass,
EventEntityStateAttribute,
)
from homeassistant.components.input_button import DOMAIN as INPUT_BUTTON_DOMAIN
from homeassistant.core import HomeAssistant, State
from homeassistant.helpers.automation import DomainSpec
from homeassistant.helpers.trigger import (
NotTriggeredReasonReporter,
StatelessEntityTriggerBase,
Trigger,
)
from . import DOMAIN
_EVENT_BUTTON_DOMAIN_SPECS = {
EVENT_DOMAIN: DomainSpec(device_class=EventDeviceClass.BUTTON)
}
class ButtonPressedTrigger(StatelessEntityTriggerBase):
"""Trigger for button entity presses."""
_domain_specs = {
DOMAIN: DomainSpec(),
EVENT_DOMAIN: DomainSpec(device_class=EventDeviceClass.BUTTON),
INPUT_BUTTON_DOMAIN: DomainSpec(),
}
@override
def is_valid_state(
self,
state: State,
report_not_triggered: NotTriggeredReasonReporter,
) -> bool:
"""Check if the state is a button press."""
if state.domain == EVENT_DOMAIN:
return (
state.attributes.get(EventEntityStateAttribute.EVENT_TYPE)
== ButtonEventType.PRESS_END
)
return True
class ButtonDoublePressedTrigger(StatelessEntityTriggerBase):
"""Trigger for button event entity double presses."""
_domain_specs = _EVENT_BUTTON_DOMAIN_SPECS
@override
def is_valid_state(
self,
state: State,
report_not_triggered: NotTriggeredReasonReporter,
) -> bool:
"""Check if the event is a completed double press."""
return (
state.attributes.get(EventEntityStateAttribute.EVENT_TYPE)
== ButtonEventType.MULTI_PRESS_END
and state.attributes.get(ATTR_MULTI_PRESS_COUNT) == 2
)
class ButtonHoldStartedTrigger(StatelessEntityTriggerBase):
"""Trigger for button event entity hold start."""
_domain_specs = _EVENT_BUTTON_DOMAIN_SPECS
@override
def is_valid_state(
self,
state: State,
report_not_triggered: NotTriggeredReasonReporter,
) -> bool:
"""Check if the event is a hold start."""
return (
state.attributes.get(EventEntityStateAttribute.EVENT_TYPE)
== ButtonEventType.LONG_PRESS_START
)
class ButtonHoldEndedTrigger(StatelessEntityTriggerBase):
"""Trigger for button event entity hold end."""
_domain_specs = _EVENT_BUTTON_DOMAIN_SPECS
@override
def is_valid_state(
self,
state: State,
report_not_triggered: NotTriggeredReasonReporter,
) -> bool:
"""Check if the event is a hold end."""
return (
state.attributes.get(EventEntityStateAttribute.EVENT_TYPE)
== ButtonEventType.LONG_PRESS_END
)
TRIGGERS: dict[str, type[Trigger]] = {
"pressed": ButtonPressedTrigger,
"double_pressed": ButtonDoublePressedTrigger,
"hold_started": ButtonHoldStartedTrigger,
"hold_ended": ButtonHoldEndedTrigger,
}
async def async_get_triggers(hass: HomeAssistant) -> dict[str, type[Trigger]]:
"""Return the triggers for buttons."""
return TRIGGERS