telemetry

This commit is contained in:
SpudGunMan
2024-10-08 00:47:16 -07:00
parent d49da4376a
commit e455da63c2
2 changed files with 46 additions and 64 deletions
+18 -25
View File
@@ -848,34 +848,27 @@ def onReceive(packet, interface):
# deviceMetrics = telemetry_packet['deviceMetrics']
# #print(f"DEBUG deviceMetrics: {deviceMetrics}")
if telemetry_packet.get('localStats'):
#print(f"DEBUG localStats: {telemetry_packet}")
print(f"DEBUG localStats: {telemetry_packet}")
localStats = telemetry_packet['localStats']
# Check if 'numPacketsTx' and 'numPacketsRx' exist and are not zero
if localStats.get('numPacketsTx') is not None and localStats.get('numPacketsRx') is not None and localStats['numPacketsTx'] != -1:
# Assign the values and include rxNode
numPacketsTx = (localStats['numPacketsTx'], rxNode)
numPacketsRx = (localStats['numPacketsRx'], rxNode)
try:
numOnlineNodes = (localStats['numOnlineNodes'], rxNode)
except KeyError:
numOnlineNodes = (-1, rxNode)
try:
numPacketsTxErr = (localStats['numPacketsTxErr'], rxNode)
except KeyError:
numPacketsTxErr = (-1, rxNode)
try:
numPacketsRxErr = (localStats['numPacketsRxErr'], rxNode)
except KeyError:
numPacketsRxErr = (-1, rxNode)
try:
numTotalNodes = (localStats['numTotalNodes'], rxNode)
except KeyError:
numTotalNodes = (-1, rxNode)
print(f"----onReceive() numPacketsTx: {numPacketsTx} numPacketsRx: {numPacketsRx} numOnlineNodes: {numOnlineNodes} numPacketsTxErr: {numPacketsTxErr} numPacketsRxErr: {numPacketsRxErr} numTotalNodes: {numTotalNodes}")
# update the telemetry values
telemetry_values = [numPacketsTx, numPacketsRx, numOnlineNodes, numPacketsTxErr, numPacketsRxErr, numTotalNodes]
update_telemetry(rxNode, telemetry_values)
# Assign the values to the telemetry dictionary
print(f"DEBUG match: {localStats}")
if localStats.get('numPacketsTx') is not None:
telemetryData[rxNode]['numPacketsTx'] = localStats.get('numPacketsTx')
if localStats.get('numPacketsRx') is not None:
telemetryData[rxNode]['numPacketsRx'] = localStats.get('numPacketsRx')
if localStats.get('numOnlineNodes') is not None:
telemetryData[rxNode]['numOnlineNodes'] = localStats.get('numOnlineNodes')
if localStats.get('numOfflineNodes') is not None:
telemetryData[rxNode]['numOfflineNodes'] = localStats.get('numOfflineNodes')
if localStats.get('numPacketsTxErr') is not None:
telemetryData[rxNode]['numPacketsTxErr'] = localStats.get('numPacketsTxErr')
if localStats.get('numPacketsRxErr') is not None:
telemetryData[rxNode]['numPacketsRxErr'] = localStats.get('numPacketsRxErr')
if localStats.get('numTotalNodes') is not None:
telemetryData[rxNode]['numTotalNodes'] = localStats.get('numTotalNodes')
# BBS DM MAIL CHECKER
if bbs_enabled and 'decoded' in packet:
message_from_id = packet['from']
+28 -39
View File
@@ -617,43 +617,36 @@ def onDisconnect(interface):
retry_int2 = True
# Telemetry Functions
lastTelemetryRequest = {}
def initialize_telemetry():
lastTelemetryRequest[0] = {'interface1': 0, 'interface2': 0, 'lastAlert1': '', 'lastAlert2': ''}
lastTelemetryRequest[1] = {'numPacketsTx': 0, 'numPacketsRx': 0, 'numOnlineNodes': 0, 'numPacketsTxErr': 0, 'numPacketsRxErr': 0, 'numTotalNodes': 0}
lastTelemetryRequest[2] = {'numPacketsTx': 0, 'numPacketsRx': 0, 'numOnlineNodes': 0, 'numPacketsTxErr': 0, 'numPacketsRxErr': 0, 'numTotalNodes': 0}
initialize_telemetry()
def update_telemetry(interface_id, telemetry_data):
global lastTelemetryRequest
# update the telemetry data for the interface
for i in range(len(telemetry_data)):
if telemetry_data[i] != -1:
lastTelemetryRequest[interface_id][i] = telemetry_data[i]
telemetryData = {}
def initialize_telemetryData():
telemetryData[0] = {'interface1': 0, 'interface2': 0, 'lastAlert1': '', 'lastAlert2': ''}
telemetryData[1] = {'numPacketsTx': 0, 'numPacketsRx': 0, 'numOnlineNodes': 0, 'numPacketsTxErr': 0, 'numPacketsRxErr': 0, 'numTotalNodes': 0}
telemetryData[2] = {'numPacketsTx': 0, 'numPacketsRx': 0, 'numOnlineNodes': 0, 'numPacketsTxErr': 0, 'numPacketsRxErr': 0, 'numTotalNodes': 0}
# indented to be called from the main loop
initialize_telemetryData()
def displayNodeTelemetry(nodeID=0, rxNode=0):
interface = interface1 if rxNode == 1 else interface2
global lastTelemetryRequest
global telemetryData
# throttle the telemetry requests to prevent spamming the device
if rxNode == 1:
if time.time() - lastTelemetryRequest[0]['interface1'] < 600:
if time.time() - telemetryData[0]['interface1'] < 120:
return -1
lastTelemetryRequest[0]['interface1'] = time.time()
telemetryData[0]['interface1'] = time.time()
elif rxNode == 2:
if time.time() - lastTelemetryRequest[0]['interface2'] < 600:
if time.time() - telemetryData[0]['interface2'] < 120:
return -1
lastTelemetryRequest[0]['interface2'] = time.time()
telemetryData[0]['interface2'] = time.time()
# some telemetry data is not available in python-meshtastic?
# bring in values from the last telemetry request for the node
numPacketsTx = lastTelemetryRequest[rxNode]['numPacketsTx'], 1
numPacketsRx = lastTelemetryRequest[rxNode]['numPacketsRx'], 1
numPacketsTxErr = lastTelemetryRequest[rxNode]['numPacketsTxErr'], 1
numPacketsRxErr = lastTelemetryRequest[rxNode]['numPacketsRxErr'], 1
numTotalNodes = lastTelemetryRequest[rxNode]['numTotalNodes']
totalOnlineNodes = lastTelemetryRequest[rxNode]['numOnlineNodes']
numPacketsTx = telemetryData[rxNode]['numPacketsTx']
numPacketsRx = telemetryData[rxNode]['numPacketsRx']
numPacketsTxErr = telemetryData[rxNode]['numPacketsTxErr']
numPacketsRxErr = telemetryData[rxNode]['numPacketsRxErr']
numTotalNodes = telemetryData[rxNode]['numTotalNodes']
totalOnlineNodes = telemetryData[rxNode]['numOnlineNodes']
# get the telemetry data for a node
chutil = round(interface.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("channelUtilization", 0), 1)
@@ -667,13 +660,9 @@ def displayNodeTelemetry(nodeID=0, rxNode=0):
dataResponse = f"Telemetry:{rxNode}"
# packet telemetry
if numPacketsTx[1] == 1:
dataResponse += f" numPacketsTx:{numPacketsTx[0]} numPacketsRx:{numPacketsRx[0]} numPacketsTxErr:{numPacketsTxErr[0]} numPacketsRxErr:{numPacketsRxErr[0]}"
elif numPacketsTx[1] == 2:
dataResponse += f" numPacketsTx:{numPacketsTx[0]} numPacketsRx:{numPacketsRx[0]} numPacketsTxErr:{numPacketsTxErr[0]} numPacketsRxErr:{numPacketsRxErr[0]}"
else:
dataResponse += f" numPacketsTx:-1 numPacketsRx:-1 numPacketsTxErr:-1 numPacketsRxErr:-1"
# packet info telemetry
dataResponse += f" numPacketsRx:{numPacketsRx} umPacketsRxErr:{numPacketsRxErr} numPacketsTxErr:{numPacketsTxErr} numPacketsTx:{numPacketsTx}"
# Channel utilization and airUtilTx
dataResponse += " ChUtil%:" + str(round(chutil, 2)) + " AirTx%:" + str(round(airUtilTx, 2))
@@ -684,10 +673,10 @@ def displayNodeTelemetry(nodeID=0, rxNode=0):
logger.warning(f"System: High Air Utilization {airUtilTx}% on Device: {rxNode}")
# add packet Rx/Tx info to the response
dataResponse += f" Rx#:{numPacketsRx[0]} Tx#:{numPacketsTx[0]}"
dataResponse += f" Rx#:{numPacketsRx} Tx#:{numPacketsTx}"
# Number of nodes
dataResponse += " Nodes:" + str(numTotalNodes) + " Online:" + str(totalOnlineNodes)
dataResponse += " totalNodes:" + str(numTotalNodes) + " Online:" + str(totalOnlineNodes)
# Uptime
uptimeSeconds = getPrettyTime(uptimeSeconds)
@@ -856,7 +845,7 @@ async def handleSentinel(deviceID=1):
handleSentinel_loop += 1
async def watchdog():
global retry_int1, retry_int2, lastTelemetryRequest
global retry_int1, retry_int2, telemetryData
int1Data, int2Data = "", ""
while True:
await asyncio.sleep(20)
@@ -880,9 +869,9 @@ async def watchdog():
# Telemetry data
int1Data = displayNodeTelemetry(0, 1)
if int1Data != -1 and lastTelemetryRequest[0]['lastAlert1'] != int1Data:
if int1Data != -1 and telemetryData[0]['lastAlert1'] != int1Data:
logger.debug(int1Data + f" Firmware:{firmware}")
lastTelemetryRequest[0]['lastAlert1'] = int1Data
telemetryData[0]['lastAlert1'] = int1Data
if retry_int1:
try:
@@ -909,9 +898,9 @@ async def watchdog():
# Telemetry data
int2Data = displayNodeTelemetry(0, 2)
if int2Data != -1 and lastTelemetryRequest[0]['lastAlert2'] != int2Data:
if int2Data != -1 and telemetryData[0]['lastAlert2'] != int2Data:
logger.debug(int2Data + f" Firmware:{firmware2}")
lastTelemetryRequest[0]['lastAlert2'] = int2Data
telemetryData[0]['lastAlert2'] = int2Data
if retry_int2:
try: