meshtastic-matrix-relay/plugins/health_plugin.py

63 wiersze
2.1 KiB
Python

2023-04-26 00:08:24 +00:00
import re
import statistics
2023-05-14 02:05:32 +00:00
from plugins.base_plugin import BasePlugin
2023-04-27 17:04:54 +00:00
2023-04-26 00:08:24 +00:00
class Plugin(BasePlugin):
2023-04-27 23:58:29 +00:00
plugin_name = "health"
@property
def description(self):
return "Show mesh health using avg battery, SNR, AirUtil"
2023-05-07 18:17:23 +00:00
def generate_response(self):
2023-05-14 02:05:32 +00:00
from meshtastic_utils import connect_meshtastic
2023-05-07 18:17:23 +00:00
meshtastic_client = connect_meshtastic()
battery_levels = []
air_util_tx = []
snr = []
for node, info in meshtastic_client.nodes.items():
if "deviceMetrics" in info:
if "batteryLevel" in info["deviceMetrics"]:
battery_levels.append(info["deviceMetrics"]["batteryLevel"])
if "airUtilTx" in info["deviceMetrics"]:
air_util_tx.append(info["deviceMetrics"]["airUtilTx"])
2023-05-07 18:17:23 +00:00
if "snr" in info:
snr.append(info["snr"])
low_battery = len([n for n in battery_levels if n <= 10])
radios = len(meshtastic_client.nodes)
avg_battery = statistics.mean(battery_levels) if battery_levels else 0
mdn_battery = statistics.median(battery_levels)
avg_air = statistics.mean(air_util_tx) if air_util_tx else 0
mdn_air = statistics.median(air_util_tx)
avg_snr = statistics.mean(snr) if snr else 0
mdn_snr = statistics.median(snr)
2023-05-19 15:02:25 +00:00
return f"""Nodes: {radios}
Battery: {avg_battery:.1f}% / {mdn_battery:.1f}% (avg / median)
Nodes with Low Battery (< 10): {low_battery}
Air Util: {avg_air:.2f} / {mdn_air:.2f} (avg / median)
SNR: {avg_snr:.2f} / {mdn_snr:.2f} (avg / median)
2023-05-07 18:17:23 +00:00
"""
2023-04-26 00:08:24 +00:00
async def handle_meshtastic_message(
self, packet, formatted_message, longname, meshnet_name
):
2023-05-07 18:17:23 +00:00
return False
2023-04-26 00:08:24 +00:00
async def handle_room_message(self, room, event, full_message):
2023-05-14 02:05:32 +00:00
from matrix_utils import connect_matrix
2023-05-07 18:17:23 +00:00
full_message = full_message.strip()
if not self.matches(full_message):
return False
response = await self.send_matrix_message(
2023-05-19 15:02:25 +00:00
room.room_id, self.generate_response(), formatted=False
2023-05-07 18:17:23 +00:00
)
return True