Skip to content

Commit 339b995

Browse files
committed
Add more parameters to trigger event data
Like SNR, RSSI, Hops, Sender name and id
1 parent 8844217 commit 339b995

File tree

4 files changed

+87
-6
lines changed

4 files changed

+87
-6
lines changed

custom_components/meshtastic/aiomeshtastic/packet.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,25 @@ def rx_time(self) -> int | None:
3131
def rx_snr(self) -> float | None:
3232
return self.mesh_packet.rx_snr if self.mesh_packet is not None else None
3333

34+
@property
35+
def rx_rssi(self) -> int | None:
36+
return self.mesh_packet.rx_rssi if self.mesh_packet is not None else None
37+
38+
@property
39+
def hop_start(self) -> int | None:
40+
return self.mesh_packet.hop_start if self.mesh_packet is not None else None
41+
42+
@property
43+
def hop_limit(self) -> int | None:
44+
return self.mesh_packet.hop_limit if self.mesh_packet is not None else None
45+
46+
@property
47+
def hop_count(self) -> int | None:
48+
"""Calculate how many hops this packet traveled (hop_start - hop_limit)."""
49+
if self.mesh_packet is not None and self.hop_start is not None and self.hop_limit is not None:
50+
return self.hop_start - self.hop_limit
51+
return None
52+
3453
@property
3554
def to_id(self) -> int | None:
3655
return self.mesh_packet.to if self.mesh_packet is not None else None

custom_components/meshtastic/api.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ async def _on_text_message(self, node: MeshNode, packet: Packet) -> None:
277277
"to": {"node": to_node, "channel": to_channel},
278278
"gateway": self.get_own_node()["num"],
279279
"message": packet.app_payload,
280+
"rx_snr": packet.rx_snr,
281+
"rx_rssi": packet.rx_rssi,
282+
"hop_count": packet.hop_count,
280283
},
281284
)
282285

custom_components/meshtastic/const.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,27 @@ class MeshtasticDomainEventType(enum.StrEnum):
9090

9191

9292
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_MESSAGE: Final = "message"
93-
94-
95-
class MeshtasticDomainEventData(TypedDict):
96-
CONF_DEVICE_ID: str
97-
CONF_ENTITY_ID: str | None
98-
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_MESSAGE: str
93+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_CHANNEL_NAME: Final = "channel_name"
94+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_SHORT_NAME: Final = "sender_short_name"
95+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_LONG_NAME: Final = "sender_long_name"
96+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_ID: Final = "sender_id"
97+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_SNR: Final = "rx_snr"
98+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_RSSI: Final = "rx_rssi"
99+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_HOP_COUNT: Final = "hop_count"
100+
101+
102+
class MeshtasticDomainEventData(TypedDict, total=False):
103+
CONF_DEVICE_ID: str # Required
104+
CONF_TYPE: str # Required
105+
CONF_ENTITY_ID: str | None # Optional
106+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_MESSAGE: str # Required
107+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_CHANNEL_NAME: str # Optional
108+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_SHORT_NAME: str # Optional
109+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_LONG_NAME: str # Optional
110+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_ID: str # Optional
111+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_SNR: float # Optional
112+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_RSSI: int # Optional
113+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_HOP_COUNT: int # Optional
99114

100115

101116
# Primary user facing event

custom_components/meshtastic/logbook.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,14 @@
2828
from .const import (
2929
DOMAIN,
3030
EVENT_MESHTASTIC_DOMAIN_EVENT,
31+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_CHANNEL_NAME,
32+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_HOP_COUNT,
3133
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_MESSAGE,
34+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_RSSI,
35+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_SNR,
36+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_ID,
37+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_LONG_NAME,
38+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_SHORT_NAME,
3239
EVENT_MESHTASTIC_DOMAIN_MESSAGE_LOG,
3340
EVENT_MESHTASTIC_MESSAGE_LOG_EVENT_DATA_ATTR_FROM_NAME,
3441
EVENT_MESHTASTIC_MESSAGE_LOG_EVENT_DATA_ATTR_MESSAGE,
@@ -132,28 +139,65 @@ async def _on_text_message(event: Event) -> None:
132139
config_entry_id, gateway_node_id, to, to_device
133140
)
134141
message = data["message"]
142+
rx_snr = data.get("rx_snr")
143+
rx_rssi = data.get("rx_rssi")
144+
hop_count = data.get("hop_count")
135145

136146
if from_device:
137147
domain_event_data: MeshtasticDomainEventData = {
138148
CONF_DEVICE_ID: from_device.id,
139149
CONF_TYPE: MeshtasticDomainEventType.MESSAGE_SENT,
140150
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_MESSAGE: message,
141151
}
152+
# Add signal quality metrics if available
153+
if rx_snr is not None:
154+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_SNR] = rx_snr
155+
if rx_rssi is not None:
156+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_RSSI] = rx_rssi
157+
if hop_count is not None:
158+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_HOP_COUNT] = hop_count
142159
if to_channel_entity_id:
143160
domain_event_data[CONF_ENTITY_ID] = to_channel_entity_id
161+
# Add channel name if available
162+
if channel_entity := entity_registry.entities.get(to_channel_entity_id):
163+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_CHANNEL_NAME] = (
164+
channel_entity.name or channel_entity.original_name
165+
)
144166
if to_dm_entity_id:
145167
domain_event_data[CONF_ENTITY_ID] = to_dm_entity_id
146168
hass.bus.async_fire(event_type=EVENT_MESHTASTIC_DOMAIN_EVENT, event_data=domain_event_data)
147169

148170
if to_device:
171+
# Get sender node info
172+
sender_node_info = entry.runtime_data.client.get_node_info(int(from_node_id))
173+
149174
domain_event_data: MeshtasticDomainEventData = {
150175
CONF_DEVICE_ID: to_device.id,
151176
CONF_TYPE: MeshtasticDomainEventType.MESSAGE_RECEIVED,
152177
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_MESSAGE: message,
153178
}
154179

180+
# Add sender information if available
181+
if sender_node_info:
182+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_SHORT_NAME] = sender_node_info.short_name
183+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_LONG_NAME] = sender_node_info.long_name
184+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_ID] = sender_node_info.user_id
185+
186+
# Add signal quality metrics if available
187+
if rx_snr is not None:
188+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_SNR] = rx_snr
189+
if rx_rssi is not None:
190+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_RSSI] = rx_rssi
191+
if hop_count is not None:
192+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_HOP_COUNT] = hop_count
193+
155194
if to_channel_entity_id:
156195
domain_event_data[CONF_ENTITY_ID] = to_channel_entity_id
196+
# Add channel name if available
197+
if channel_entity := entity_registry.entities.get(to_channel_entity_id):
198+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_CHANNEL_NAME] = (
199+
channel_entity.name or channel_entity.original_name
200+
)
157201
if to_dm_entity_id:
158202
domain_event_data[CONF_ENTITY_ID] = to_dm_entity_id
159203

0 commit comments

Comments
 (0)