diff --git a/README.md b/README.md index e2c8074..3cd510e 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ There is no direct support for MQTT in the code, however, reports from Discord a | `askai` and `ask:` | Ask Ollama LLM AI for a response. Example: `askai what temp do I cook chicken` | ✅ | | `messages` | Replays the last messages heard, like Store and Forward | ✅ | | `readnews` | returns the contents of a file (news.txt, by default) via the chunker on air | ✅ | -| `satpass` | returns the pass info from API for defined NORAD ID in config | | +| `satpass` | returns the pass info from API for defined NORAD ID in config or Example: `satpass 25544,33591`| | ### Games (via DM) | Command | Description | | diff --git a/mesh_bot.py b/mesh_bot.py index 98f093f..29e58ea 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -65,7 +65,7 @@ def auto_response(message, snr, rssi, hop, pkiStatus, message_from_id, channel_n "pong": lambda: "🏓PING!!🛜", "readnews": lambda: read_news(), "rlist": lambda: handle_repeaterQuery(message_from_id, deviceID, channel_number), - "satpass": lambda: handle_satpass(message_from_id, deviceID, channel_number), + "satpass": lambda: handle_satpass(message_from_id, deviceID, channel_number, message), "setemail": lambda: handle_email(message_from_id, message), "setsms": lambda: handle_sms( message_from_id, message), "sitrep": lambda: handle_lheard(message, message_from_id, deviceID, isDM), @@ -291,9 +291,20 @@ llmRunCounter = 0 llmTotalRuntime = [] llmLocationTable = [{'nodeID': 1234567890, 'location': 'No Location'},] -def handle_satpass(message_from_id, deviceID, channel_number): +def handle_satpass(message_from_id, deviceID, channel_number, message): location = get_node_location(message_from_id, deviceID) passes = '' + satList = satListConfig + + # if user has a NORAD ID in the message + if "satpass " in message: + try: + userList = message.split("satpass ")[1].split(" ")[0] + #split userList and make into satList overrided the config.ini satList + satList = userList.split(",") + except: + return "example use:🛰️satpass 25544,33591" + # Detailed satellite pass for bird in satList: satPass = getNextSatellitePass(bird, str(location[0]), str(location[1])) diff --git a/modules/settings.py b/modules/settings.py index 204520f..fbfc576 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -164,7 +164,7 @@ try: wxAlertBroadcastEnabled = config['location'].getboolean('wxAlertBroadcastEnabled', False) # default False ignoreFEMAtest = config['location'].getboolean('ignoreFEMAtest', True) # default True n2yoAPIKey = config['location'].get('n2yoAPIKey', '') # default empty - satList = config['location'].get('satList', '25544').split(',') # default 25544 ISS + satListConfig = config['location'].get('satList', '25544').split(',') # default 25544 ISS # brodcast channel for weather alerts wxAlertBroadcastChannel = config['location'].get('wxAlertBroadcastCh') if wxAlertBroadcastChannel: diff --git a/modules/space.py b/modules/space.py index 287b0e2..e8fd6ca 100644 --- a/modules/space.py +++ b/modules/space.py @@ -154,23 +154,29 @@ def getNextSatellitePass(satellite, lat=0, lon=0): return "not configured, bug your sysop" url = visualPassAPI + str(satellite) + "/" + str(lat) + "/" + str(lon) + "/0/2/300/" + "&apiKey=" + n2yoAPIKey # get the next pass data - next_pass_data = requests.get(url, timeout=urlTimeoutSeconds) - if(next_pass_data.ok): - pass_json = next_pass_data.json() - if 'info' in pass_json and 'passescount' in pass_json['info'] and pass_json['info']['passescount'] > 0: - satname = pass_json['info']['satname'] - pass_time = pass_json['passes'][0]['startUTC'] - pass_duration = pass_json['passes'][0]['duration'] - pass_maxEl = pass_json['passes'][0]['maxEl'] - pass_rise_time = datetime.fromtimestamp(pass_time).strftime('%a %d %I:%M%p') - pass_startAzCompass = pass_json['passes'][0]['startAzCompass'] - pass_set_time = datetime.fromtimestamp(pass_time + pass_duration).strftime('%a %d %I:%M%p') - pass__endAzCompass = pass_json['passes'][0]['endAzCompass'] - pass_data = f"{satname} @{pass_rise_time} Az:{pass_startAzCompass} for{getPrettyTime(pass_duration)}, MaxEl:{pass_maxEl}° Set@{pass_set_time} Az:{pass__endAzCompass}" - elif pass_json['info']['passescount'] == 0: - satname = pass_json['info']['satname'] - pass_data = f"{satname} has no upcoming passes" - else: - logger.error("System: Error fetching satellite pass data") - pass_data = ERROR_FETCHING_DATA + try: + if not int(satellite): + raise Exception("Invalid satellite number") + next_pass_data = requests.get(url, timeout=urlTimeoutSeconds) + if(next_pass_data.ok): + pass_json = next_pass_data.json() + if 'info' in pass_json and 'passescount' in pass_json['info'] and pass_json['info']['passescount'] > 0: + satname = pass_json['info']['satname'] + pass_time = pass_json['passes'][0]['startUTC'] + pass_duration = pass_json['passes'][0]['duration'] + pass_maxEl = pass_json['passes'][0]['maxEl'] + pass_rise_time = datetime.fromtimestamp(pass_time).strftime('%a %d %I:%M%p') + pass_startAzCompass = pass_json['passes'][0]['startAzCompass'] + pass_set_time = datetime.fromtimestamp(pass_time + pass_duration).strftime('%a %d %I:%M%p') + pass__endAzCompass = pass_json['passes'][0]['endAzCompass'] + pass_data = f"{satname} @{pass_rise_time} Az:{pass_startAzCompass} for{getPrettyTime(pass_duration)}, MaxEl:{pass_maxEl}° Set@{pass_set_time} Az:{pass__endAzCompass}" + elif pass_json['info']['passescount'] == 0: + satname = pass_json['info']['satname'] + pass_data = f"{satname} has no upcoming passes" + else: + logger.error(f"System: Error fetching satellite pass data {satellite}") + pass_data = ERROR_FETCHING_DATA + except Exception as e: + logger.warning(f"System: User supplied value {satellite} unknown or invalid") + pass_data = "Provide NORAD# example use:🛰️satpass 25544,33591" return pass_data