enhanceTelemetry

This commit is contained in:
SpudGunMan
2024-10-06 16:11:05 -07:00
parent d9c250b9eb
commit 2f560a9049
2 changed files with 39 additions and 36 deletions
+23 -20
View File
@@ -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']
+16 -16
View File
@@ -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):