Skip to content

Commit 51248cf

Browse files
committed
Add more parameters to trigger event data
Like SNR, RSSI, Hops, Sender name and id
1 parent 0a49f01 commit 51248cf

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
@@ -317,6 +317,9 @@ async def _on_text_message(self, node: MeshNode, packet: Packet) -> None:
317317
"to": {"node": to_node, "channel": to_channel},
318318
"gateway": self.get_own_node()["num"],
319319
"message": packet.app_payload,
320+
"rx_snr": packet.rx_snr,
321+
"rx_rssi": packet.rx_rssi,
322+
"hop_count": packet.hop_count,
320323
},
321324
)
322325

custom_components/meshtastic/const.py

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

9393

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

102117

103118
# Primary user facing event

custom_components/meshtastic/logbook.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,14 @@
2929
from .const import (
3030
DOMAIN,
3131
EVENT_MESHTASTIC_DOMAIN_EVENT,
32+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_CHANNEL_NAME,
33+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_HOP_COUNT,
3234
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_MESSAGE,
35+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_RSSI,
36+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_SNR,
37+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_ID,
38+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_LONG_NAME,
39+
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_SHORT_NAME,
3340
EVENT_MESHTASTIC_DOMAIN_MESSAGE_LOG,
3441
EVENT_MESHTASTIC_MESSAGE_LOG_EVENT_DATA_ATTR_FROM_NAME,
3542
EVENT_MESHTASTIC_MESSAGE_LOG_EVENT_DATA_ATTR_MESSAGE,
@@ -135,6 +142,9 @@ async def _on_text_message(
135142
config_entry_id, gateway_node_id, to, to_device
136143
)
137144
message = data["message"]
145+
rx_snr = data.get("rx_snr")
146+
rx_rssi = data.get("rx_rssi")
147+
hop_count = data.get("hop_count")
138148

139149
if produce_domain_event:
140150
if from_device:
@@ -143,21 +153,55 @@ async def _on_text_message(
143153
CONF_TYPE: MeshtasticDomainEventType.MESSAGE_SENT,
144154
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_MESSAGE: message,
145155
}
156+
# Add signal quality metrics if available
157+
if rx_snr is not None:
158+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_SNR] = rx_snr
159+
if rx_rssi is not None:
160+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_RSSI] = rx_rssi
161+
if hop_count is not None:
162+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_HOP_COUNT] = hop_count
146163
if to_channel_entity_id:
147164
domain_event_data[CONF_ENTITY_ID] = to_channel_entity_id
165+
# Add channel name if available
166+
if channel_entity := entity_registry.entities.get(to_channel_entity_id):
167+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_CHANNEL_NAME] = (
168+
channel_entity.name or channel_entity.original_name
169+
)
148170
if to_dm_entity_id:
149171
domain_event_data[CONF_ENTITY_ID] = to_dm_entity_id
150172
hass.bus.async_fire(event_type=EVENT_MESHTASTIC_DOMAIN_EVENT, event_data=domain_event_data)
151173

152174
if to_device:
175+
# Get sender node info
176+
sender_node_info = entry.runtime_data.client.get_node_info(int(from_node_id))
177+
153178
domain_event_data: MeshtasticDomainEventData = {
154179
CONF_DEVICE_ID: to_device.id,
155180
CONF_TYPE: MeshtasticDomainEventType.MESSAGE_RECEIVED,
156181
EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_MESSAGE: message,
157182
}
158183

184+
# Add sender information if available
185+
if sender_node_info:
186+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_SHORT_NAME] = sender_node_info.short_name
187+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_LONG_NAME] = sender_node_info.long_name
188+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_SENDER_ID] = sender_node_info.user_id
189+
190+
# Add signal quality metrics if available
191+
if rx_snr is not None:
192+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_SNR] = rx_snr
193+
if rx_rssi is not None:
194+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_RX_RSSI] = rx_rssi
195+
if hop_count is not None:
196+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_HOP_COUNT] = hop_count
197+
159198
if to_channel_entity_id:
160199
domain_event_data[CONF_ENTITY_ID] = to_channel_entity_id
200+
# Add channel name if available
201+
if channel_entity := entity_registry.entities.get(to_channel_entity_id):
202+
domain_event_data[EVENT_MESHTASTIC_DOMAIN_EVENT_DATA_ATTR_CHANNEL_NAME] = (
203+
channel_entity.name or channel_entity.original_name
204+
)
161205
if to_dm_entity_id:
162206
domain_event_data[CONF_ENTITY_ID] = to_dm_entity_id
163207

0 commit comments

Comments
 (0)