1 """Matter event entities from Node events."""
3 from __future__
import annotations
7 from chip.clusters
import Objects
as clusters
8 from matter_server.client.models
import device_types
9 from matter_server.common.models
import EventType, MatterNodeEvent
14 EventEntityDescription,
21 from .entity
import MatterEntity
22 from .helpers
import get_matter
23 from .models
import MatterDiscoverySchema
25 SwitchFeature = clusters.Switch.Bitmaps.Feature
34 5:
"multi_press_ongoing",
35 6:
"multi_press_complete",
41 config_entry: ConfigEntry,
42 async_add_entities: AddEntitiesCallback,
44 """Set up Matter switches from Config Entry."""
46 matter.register_platform_handler(Platform.EVENT, async_add_entities)
50 """Representation of a Matter Event entity."""
52 def __init__(self, *args: Any, **kwargs: Any) ->
None:
53 """Initialize the entity."""
56 event_types: list[str] = []
58 self.get_matter_attribute_value(clusters.Switch.Attributes.FeatureMap)
60 if feature_map & SwitchFeature.kLatchingSwitch:
62 event_types.append(
"switch_latched")
63 elif feature_map & SwitchFeature.kMomentarySwitchMultiPress:
69 max_presses_supported = self.get_matter_attribute_value(
70 clusters.Switch.Attributes.MultiPressMax
72 max_presses_supported =
min(max_presses_supported
or 1, 8)
73 for i
in range(max_presses_supported):
74 event_types.append(f
"multi_press_{i + 1}")
75 elif feature_map & SwitchFeature.kMomentarySwitch:
77 event_types.append(
"initial_press")
78 if feature_map & SwitchFeature.kMomentarySwitchRelease:
80 event_types.append(
"short_release")
83 if feature_map & SwitchFeature.kMomentarySwitchLongPress:
84 event_types.append(
"long_press")
85 event_types.append(
"long_release")
87 self._attr_event_types = event_types
90 """Handle being added to Home Assistant."""
94 self._unsubscribes.append(
95 self.matter_client.subscribe_events(
96 callback=self._on_matter_node_event,
97 event_filter=EventType.NODE_EVENT,
98 node_filter=self._endpoint.node.node_id,
102 def _update_from_device(self) -> None:
103 """Call when Node attribute(s) changed."""
106 def _on_matter_node_event(
109 data: MatterNodeEvent,
111 """Call on NodeEvent."""
112 if data.endpoint_id != self._endpoint.endpoint_id:
114 if data.event_id == clusters.Switch.Events.MultiPressComplete.event_id:
116 presses = (data.data
or {}).
get(
"totalNumberOfPressesCounted", 1)
117 event_type = f
"multi_press_{presses}"
119 event_type = EVENT_TYPES_MAP[data.event_id]
121 if event_type
not in self.event_types:
127 self._trigger_event(event_type, data.data)
128 self.async_write_ha_state()
132 DISCOVERY_SCHEMAS = [
134 platform=Platform.EVENT,
137 device_class=EventDeviceClass.BUTTON,
138 translation_key=
"button",
140 entity_class=MatterEventEntity,
141 required_attributes=(
142 clusters.Switch.Attributes.CurrentPosition,
143 clusters.Switch.Attributes.FeatureMap,
145 device_type=(device_types.GenericSwitch,),
146 optional_attributes=(
147 clusters.Switch.Attributes.NumberOfPositions,
148 clusters.FixedLabel.Attributes.LabelList,
None __init__(self, _AOSmithCoordinatorT coordinator, str junction_id)
None async_added_to_hass(self)
web.Response get(self, web.Request request, str config_key)
MatterAdapter get_matter(HomeAssistant hass)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)