From 2f560a9049c2744adabb26f03a0f84428569f958 Mon Sep 17 00:00:00 2001 From: SpudGunMan Date: Sun, 6 Oct 2024 16:11:05 -0700 Subject: [PATCH] enhanceTelemetry --- mesh_bot.py | 43 +++++++++++++++++++++++-------------------- modules/system.py | 32 ++++++++++++++++---------------- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/mesh_bot.py b/mesh_bot.py index c268372..212e894 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -902,16 +902,16 @@ def onDisconnect(interface): elif interface2_enabled and interface2_type == 'ble': retry_int2 = True +numPacketsTx, numPacketsRx, numPacketsTxErr, numPacketsRxErr = [0,0], [0,0], [0,0], [0,0] def onReceive(packet, interface): - # Priocess the incoming packet, handles the responses to the packet - # extract interface defailts from interface object + # Priocess the incoming packet, handles the responses to the packet with auto_response() + # Sends the packet to the correct handler for processing + + # extract interface details from inbound packet rxType = type(interface).__name__ - rxNode = 0 - message_from_id = 0 - snr = 0 - rssi = 0 - hop = 0 - hop_away = 0 + + # Valies assinged to the packet + rxNode, message_from_id, snr, rssi, hop, hop_away = 0, 0, 0, 0, 0, 0 pkiStatus = (False, 'ABC') isDM = False @@ -922,6 +922,8 @@ def onReceive(packet, interface): # Debug print the packet for debugging logger.debug(f"Packet Received\n {packet} \n END of packet \n") + + # set the value for the incomming interface if rxType == 'SerialInterface': rxInterface = interface.__dict__.get('devPath', 'unknown') if port1 in rxInterface: @@ -942,18 +944,19 @@ def onReceive(packet, interface): elif interface2_enabled and interface2_type == 'ble': rxNode = 2 - # TELEMETRY + # TELEMETRY packets + global numPacketsRx, numPacketsTx, numPacketsRxErr, numPacketsTxErr if packet.get('decoded') and packet['decoded']['portnum'] == 'TELEMETRY_APP': #print(f"Telemetry Packet: {packet}") # get the telemetry data - telemetry = packet['decoded']['telemetry'] - if telemetry.get('deviceMetrics'): - deviceMetrics = telemetry['deviceMetrics'] - #print(f"deviceMetrics: {deviceMetrics}") - if telemetry.get('localStats'): - localStats = telemetry['localStats'] - if localStats.get('numPacketsTx') and localStats.get('numPacketsRx'): - global numPacketsTx, numPacketsRx, numPacketsTxErr, numPacketsRxErr + telemetry_packet = packet['decoded']['telemetry'] + # if telemetry_packet.get('deviceMetrics'): + # deviceMetrics = telemetry_packet['deviceMetrics'] + # #print(f"deviceMetrics: {deviceMetrics}") + if telemetry_packet.get('localStats'): + localStats = telemetry_packet['localStats'] + if localStats.get('numPacketsTx') and localStats.get('numPacketsRx') != 0: + #print(f"numPacketsTx, numPacketsRx, numPacketsTxErr, numPacketsRxErr: {numPacketsTx}, {numPacketsRx}, {numPacketsTxErr}, {numPacketsRxErr}") # Assign the values and include rxNode numPacketsTx = (localStats['numPacketsTx'], rxNode) numPacketsRx = (localStats['numPacketsRx'], rxNode) @@ -961,10 +964,10 @@ def onReceive(packet, interface): numPacketsTxErr = (localStats['numPacketsTxErr'], rxNode) numPacketsRxErr = (localStats['numPacketsRxErr'], rxNode) except KeyError: - numPacketsTxErr = (0, rxNode) - numPacketsRxErr = (0, rxNode) + numPacketsTxErr = (-1, rxNode) + numPacketsRxErr = (-1, rxNode) #airUtilTx = (round(localStats['airUtilTx'], 2), rxNode) - + # check for BBS DM for mail delivery if bbs_enabled and 'decoded' in packet: message_from_id = packet['from'] diff --git a/modules/system.py b/modules/system.py index d3f74f6..9a0735c 100644 --- a/modules/system.py +++ b/modules/system.py @@ -668,15 +668,16 @@ def getNodeFirmware(nodeID=0, nodeInt=1): return -1 return fwVer -def getNodeTelemetry(nodeID=0, nodeInt=1): - # throttle the telemetry requests to prevent spamming the device +def getNodeTelemetry(nodeID=0, rxNode=1): global lastTelemetryRequest, numPacketsTx, numPacketsRx, numPacketsTxErr, numPacketsRxErr - if time.time() - lastTelemetryRequest < 600: + # throttle the telemetry requests to prevent spamming the device + if time.time() - lastTelemetryRequest < 1200: + print(f"numPacketsTx, numPacketsRx, numPacketsTxErr, numPacketsRxErr: {numPacketsTx}, {numPacketsRx}, {numPacketsTxErr}, {numPacketsRxErr}") return -1 lastTelemetryRequest = time.time() # get the telemetry data for a node dataResponse = "" - if nodeInt == 1: + if rxNode == 1: chutil = round(interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("channelUtilization", 0), 1) airUtilTx = round(interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("airUtilTx", 0), 1) uptimeSeconds = interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("uptimeSeconds", 0) @@ -685,7 +686,7 @@ def getNodeTelemetry(nodeID=0, nodeInt=1): #numPacketsRx = interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("localStats", {}).get("numPacketsRx", 0) #numPacketsTx = interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("localStats", {}).get("numPacketsTx", 0) numTotalNodes = len(interface1.nodes) - elif nodeInt == 2: + elif rxNode == 2: chutil = round(interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("channelUtilization", 0), 1) airUtilTx = round(interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("airUtilTx", 0), 1) uptimeSeconds = interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("uptimeSeconds", 0) @@ -698,20 +699,20 @@ def getNodeTelemetry(nodeID=0, nodeInt=1): return -1 # packet telemetry - if nodeInt == 1: - dataResponse += f"Telemetry:{nodeInt} numPacketsTx:{numPacketsTx} numPacketsRx:{numPacketsRx} numPacketsTxErr:{numPacketsTxErr} numPacketsRxErr:{numPacketsRxErr}" - if nodeInt == 2: - dataResponse += f"Telemetry:{nodeInt} numPacketsTx:{numPacketsTx2} numPacketsRx:{numPacketsRx2} numPacketsTxErr:{numPacketsTxErr2} numPacketsRxErr:{numPacketsRxErr2}" - - + if numPacketsRx != 0: + if numPacketsTx[1] == 1: + dataResponse += f"Telemetry:{rxNode} numPacketsTx:{numPacketsTx[0]} numPacketsRx:{numPacketsRx[0]} numPacketsTxErr:{numPacketsTxErr[0]} numPacketsRxErr:{numPacketsRxErr[0]}" + elif numPacketsTx[1] == 2: + dataResponse += f"Telemetry:{rxNode} numPacketsTx:{numPacketsTx[0]} numPacketsRx:{numPacketsRx[0]} numPacketsTxErr:{numPacketsTxErr[0]} numPacketsRxErr:{numPacketsRxErr[0]} " + # Channel utilization and airUtilTx dataResponse += " ChUtil%:" + str(round(chutil, 2)) + " AirTx%:" + str(round(airUtilTx, 2)) if chutil > 40: - logger.warning(f"System: High Channel Utilization {chutil}% on Device: {nodeInt}") + logger.warning(f"System: High Channel Utilization {chutil}% on Device: {rxNode}") if airUtilTx > 25: - logger.warning(f"System: High Air Utilization {airUtilTx}% on Device: {nodeInt}") + logger.warning(f"System: High Air Utilization {airUtilTx}% on Device: {rxNode}") # add packet Rx/Tx info to the response dataResponse += f" Rx#:{numPacketsRx} Tx#:{numPacketsTx}" @@ -728,10 +729,9 @@ def getNodeTelemetry(nodeID=0, nodeInt=1): dataResponse += f" Volt:{round(voltage, 1)}" if batteryLevel < 25: - logger.warning(f"System: Low Battery Level: {batteryLevel}{emji} on Device: {nodeInt}") + logger.warning(f"System: Low Battery Level: {batteryLevel}{emji} on Device: {rxNode}") elif batteryLevel < 10: - logger.critical(f"System: Critical Battery Level: {batteryLevel}{emji} on Device: {nodeInt}") - + logger.critical(f"System: Critical Battery Level: {batteryLevel}{emji} on Device: {rxNode}") return dataResponse def handleMultiPing(nodeID=0, deviceID=1):