From ab54dc06d789559dffd5a3713c8ab5e8be52868a Mon Sep 17 00:00:00 2001 From: SpudGunMan Date: Sun, 5 Jan 2025 14:02:30 -0800 Subject: [PATCH] enhance --- mesh_bot.py | 29 ++++++++++++----------------- modules/system.py | 19 +++++++++---------- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/mesh_bot.py b/mesh_bot.py index a99d869..a7de28f 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -134,6 +134,7 @@ def auto_response(message, snr, rssi, hop, pkiStatus, message_from_id, channel_n def handle_ping(message_from_id, deviceID, message, hop, snr, rssi, isDM, channel_number): global multiPing + myNodeNum = globals().get(f'myNodeNum{deviceID}', 777) if "?" in message and isDM: return message.split("?")[0].title() + " command returns SNR and RSSI, or hopcount from your message. Try adding e.g. @place or #tag" @@ -153,10 +154,7 @@ def handle_ping(message_from_id, deviceID, message, hop, snr, rssi, isDM, chann msg = random.choice(["✋ACK-ACK!\n", "✋Ack to you!\n"]) type = "✋ACK" elif "cqcq" in message.lower() or "cq" in message.lower() or "cqcqcq" in message.lower(): - if deviceID == 1: - myname = get_name_from_number(myNodeNum1, 'short', 1) - elif deviceID == 2: - myname = get_name_from_number(myNodeNum2, 'short', 2) + myname = get_name_from_number(myNodeNum, 'short', deviceID) msg = f"QSP QSL OM DE {myname} K\n" else: msg = "🔊 Can you hear me now?" @@ -221,6 +219,7 @@ def handle_alertBell(message_from_id, deviceID, message): return random.choice(msg) def handle_emergency(message_from_id, deviceID, message): + myNodeNum = globals().get(f'myNodeNum{deviceID}', 777) # if user in bbs_ban_list return if str(message_from_id) in bbs_ban_list: # silent discard @@ -228,13 +227,11 @@ def handle_emergency(message_from_id, deviceID, message): return '' # trgger alert to emergency_responder_alert_channel if message_from_id != 0: - if deviceID == 1: rxNode = myNodeNum1 - elif deviceID == 2: rxNode = myNodeNum2 nodeLocation = get_node_location(message_from_id, deviceID) # if default location is returned set to Unknown if nodeLocation[0] == latitudeValue and nodeLocation[1] == longitudeValue: nodeLocation = ["?", "?"] - nodeInfo = f"{get_name_from_number(message_from_id, 'short', deviceID)} detected by {get_name_from_number(rxNode, 'short', deviceID)} lastGPS {nodeLocation[0]}, {nodeLocation[1]}" + nodeInfo = f"{get_name_from_number(message_from_id, 'short', deviceID)} detected by {get_name_from_number(myNodeNum, 'short', deviceID)} lastGPS {nodeLocation[0]}, {nodeLocation[1]}" msg = f"🔔🚨Intercepted Possible Emergency Assistance needed for: {nodeInfo}" # alert the emergency_responder_alert_channel time.sleep(responseDelay) @@ -1048,7 +1045,7 @@ def onReceive(packet, interface): message_string = message_bytes.decode('utf-8') # check if the packet is from us - if message_from_id == myNodeNum1 or message_from_id == myNodeNum2: + if message_from_id in [myNodeNum1, myNodeNum2, myNodeNum3, myNodeNum4, myNodeNum5, myNodeNum6, myNodeNum7, myNodeNum8, myNodeNum9]: logger.warning(f"System: Packet from self {message_from_id} loop or traffic replay deteted") # get the signal strength and snr if available @@ -1110,7 +1107,7 @@ def onReceive(packet, interface): return # If the packet is a DM (Direct Message) respond to it, otherwise validate its a message for us on the channel - if packet['to'] == myNodeNum1 or packet['to'] == myNodeNum2: + if packet['to'] in [myNodeNum1, myNodeNum2, myNodeNum3, myNodeNum4, myNodeNum5, myNodeNum6, myNodeNum7, myNodeNum8, myNodeNum9]: # message is DM to us isDM = True # check if the message contains a trap word, DMs are always responded to @@ -1234,17 +1231,15 @@ async def start_rx(): pub.subscribe(onReceive, 'meshtastic.receive') pub.subscribe(onDisconnect, 'meshtastic.connection.lost') - logger.info(f"System: Autoresponder Started for Device1 {get_name_from_number(myNodeNum1, 'long', 1)}," - f"{get_name_from_number(myNodeNum1, 'short', 1)}. NodeID: {myNodeNum1}, {decimal_to_hex(myNodeNum1)}") + for i in range(1, 10): + if globals().get(f'interface{i}_enabled', False): + myNodeNum = globals().get(f'myNodeNum{i}', 0) + logger.info(f"System: Autoresponder Started for Device{i} {get_name_from_number(myNodeNum, 'long', i)}," + f"{get_name_from_number(myNodeNum, 'short', i)}. NodeID: {myNodeNum}, {decimal_to_hex(myNodeNum)}") - - if interface2_enabled: - logger.info(f"System: Autoresponder Started for Device2 {get_name_from_number(myNodeNum2, 'long', 2)}," - f"{get_name_from_number(myNodeNum2, 'short', 2)}. NodeID: {myNodeNum2}, {decimal_to_hex(myNodeNum2)}") - if llm_enabled: logger.debug(f"System: Ollama LLM Enabled, loading model {llmModel} please wait") - llm_query(" ", myNodeNum1) + llm_query(" ") logger.debug(f"System: LLM model {llmModel} loaded") if log_messages_to_file: diff --git a/modules/system.py b/modules/system.py index 907beba..c64ad16 100644 --- a/modules/system.py +++ b/modules/system.py @@ -238,13 +238,12 @@ for i in range(1, 10): # Get the node number of the devices, check if the devices are connected meshtastic devices for i in range(1, 10): - if globals().get(f'interface{i}'): - if globals().get(f'interface{i}_enabled'): - try: - globals()[f'myNodeNum{i}'] = globals()[f'interface{i}'].getMyNodeInfo()['num'] - logger.debug(f"System: Initalized Radio Device{i} Node Number: {globals()[f'myNodeNum{i}']}") - except Exception as e: - logger.critical(f"System: critical error initializing interface{i} {e}") + if globals().get(f'interface{i}') and globals().get(f'interface{i}_enabled'): + try: + globals()[f'myNodeNum{i}'] = globals()[f'interface{i}'].getMyNodeInfo()['num'] + logger.debug(f"System: Initalized Radio Device{i} Node Number: {globals()[f'myNodeNum{i}']}") + except Exception as e: + logger.critical(f"System: critical error initializing interface{i} {e}") else: globals()[f'myNodeNum{i}'] = 777 @@ -302,7 +301,7 @@ def get_node_list(nodeInt=1): if interface.nodes: for node in interface.nodes.values(): # ignore own - if all(node['num'] != globals().get(f'myNodeNum{i}', 777) for i in range(1, 10)): + if all(node['num'] != globals().get(f'myNodeNum{i}') for i in range(1, 10)): node_name = get_name_from_number(node['num'], 'short', nodeInt) snr = node.get('snr', 0) @@ -400,7 +399,7 @@ def get_closest_nodes(nodeInt=1,returnCount=3): distance = round(geopy.distance.geodesic((latitudeValue, longitudeValue), (latitude, longitude)).m, 2) if (distance < sentry_radius): - if (nodeID not in [globals().get(f'myNodeNum{i}', 777) for i in range(1, 10)]) and str(nodeID) not in sentryIgnoreList: + if (nodeID not in [globals().get(f'myNodeNum{i}') for i in range(1, 10)]) and str(nodeID) not in sentryIgnoreList: node_list.append({'id': nodeID, 'latitude': latitude, 'longitude': longitude, 'distance': distance}) except Exception as e: @@ -783,7 +782,7 @@ def getNodeFirmware(nodeID=0, nodeInt=1): def displayNodeTelemetry(nodeID=0, rxNode=0, userRequested=False): interface = globals()[f'interface{rxNode}'] - myNodeNum = globals().get(f'myNodeNum{rxNode}', 777) + myNodeNum = globals().get(f'myNodeNum{rxNode}') global telemetryData # throttle the telemetry requests to prevent spamming the device