From 631a2f53ea4fab9db6a1aeae4f3b35401d1ab725 Mon Sep 17 00:00:00 2001 From: SpudGunMan Date: Tue, 14 Oct 2025 08:44:59 -0700 Subject: [PATCH] major refactor to schedule major thanks to @FJRPiolt --- README.md | 7 ++-- mesh_bot.py | 91 +++----------------------------------------- modules/scheduler.py | 87 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 88 deletions(-) create mode 100644 modules/scheduler.py diff --git a/README.md b/README.md index 84470cc..b839883 100644 --- a/README.md +++ b/README.md @@ -518,7 +518,7 @@ value = # value can be min,hour,day,mon,tue,wed,thu,fri,sat,sun interval = # interval to use when time is not set (e.g. every 2 days) time = # time of day in 24:00 hour format when value is 'day' and interval is not set ``` - The basic brodcast message can be setup in condig.ini. For advanced, See mesh_bot.py around the bottom of file, line [1491](https://github.com/SpudGunMan/meshing-around/blob/e94581936530c76ea43500eebb43f32ba7ed5e19/mesh_bot.py#L1491) to edit the schedule. See [schedule documentation](https://schedule.readthedocs.io/en/stable/) for more. Recomend to backup changes so they dont get lost. + The basic brodcast message can be setup in condig.ini. For advanced, See the [modules/scheduler.py](modules/scheduler.py) to edit the schedule. See [schedule documentation](https://schedule.readthedocs.io/en/stable/) for more. Recomend to backup changes so they dont get lost. ```python #Send WX every Morning at 08:00 using handle_wxc function to channel 2 on device 1 @@ -529,7 +529,7 @@ schedule.every().wednesday.at("19:00").do(lambda: send_message("Net Starting Now ``` #### BBS Link -The scheduler also handles the BBS Link Broadcast message, this would be an example of a mesh-admin channel on 8 being used to pass BBS post traffic between two bots as the initiator, one direction pull. +The scheduler also handles the BBS Link Broadcast message, this would be an example of a mesh-admin channel on 8 being used to pass BBS post traffic between two bots as the initiator, one direction pull. The message just needs to have bbslink ```python # Send bbslink looking for peers every other day at 10:00 using send_message function to channel 8 on device 1 schedule.every(2).days.at("10:00").do(lambda: send_message("bbslink MeshBot looking for peers", 8, 0, 1)) @@ -587,7 +587,8 @@ I used ideas and snippets from other responder bots and want to call them out! - **mikecarper**: ideas, and testing. hamtest - **c.merphy360**: high altitude alerts - **Iris**: testing and finding 🐞 -- **Cisien, bitflip, Woof, propstg, snydermesh, trs2982, FJRPilot, F0X, mesb1, and Hailo1999**: For testing and feature ideas on Discord and GitHub. +- **FJRPiolt**: testing bugs out!! +- **Cisien, bitflip, Woof, propstg, snydermesh, trs2982, F0X, mesb1, and Hailo1999**: For testing and feature ideas on Discord and GitHub. - **Meshtastic Discord Community**: For tossing out ideas and testing code. ### Tools diff --git a/mesh_bot.py b/mesh_bot.py index b04ed4c..255fc46 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -1829,91 +1829,12 @@ async def start_rx(): logger.warning("System: SMTP Email Alerting Enabled") if scheduler_enabled: - # basic scheduler - if schedulerMotd: - schedulerMessage = MOTD - if schedulerValue != '': - if schedulerValue.lower() == 'day': - if schedulerTime != '': - # Send a message every day at the time set in schedulerTime - schedule.every().day.at(schedulerTime).do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - else: - # Send a message every day at the time set in schedulerInterval - schedule.every(int(schedulerInterval)).days.do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - elif 'mon' in schedulerValue.lower() and schedulerTime != '': - # Send a message every Monday at the time set in schedulerTime - schedule.every().monday.at(schedulerTime).do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - elif 'tue' in schedulerValue.lower() and schedulerTime != '': - # Send a message every Tuesday at the time set in schedulerTime - schedule.every().tuesday.at(schedulerTime).do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - elif 'wed' in schedulerValue.lower() and schedulerTime != '': - # Send a message every Wednesday at the time set in schedulerTime - schedule.every().wednesday.at(schedulerTime).do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - elif 'thu' in schedulerValue.lower() and schedulerTime != '': - # Send a message every Thursday at the time set in schedulerTime - schedule.every().thursday.at(schedulerTime).do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - elif 'fri' in schedulerValue.lower() and schedulerTime != '': - # Send a message every Friday at the time set in schedulerTime - schedule.every().friday.at(schedulerTime).do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - elif 'sat' in schedulerValue.lower() and schedulerTime != '': - # Send a message every Saturday at the time set in schedulerTime - schedule.every().saturday.at(schedulerTime).do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - elif 'sun' in schedulerValue.lower() and schedulerTime != '': - # Send a message every Sunday at the time set in schedulerTime - schedule.every().sunday.at(schedulerTime).do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - elif 'hour' in schedulerValue.lower(): - # Send a message every hour at the time set in schedulerTime - schedule.every(int(schedulerInterval)).hours.do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - elif 'min' in schedulerValue.lower(): - # Send a message every minute at the time set in schedulerTime - schedule.every(int(schedulerInterval)).minutes.do(lambda: send_message(schedulerMessage, schedulerChannel, 0, schedulerInterface)) - logger.debug(f"System: Starting the scheduler to send '{schedulerMessage}' every {schedulerValue} at {schedulerTime} on Device:{schedulerInterface} Channel:{schedulerChannel}") - else: - # Reminder Scheduler is enabled every Monday at noon send a log message - schedule.every().monday.at("12:00").do(lambda: logger.info("System: Scheduled Broadcast Enabled Reminder")) - # example scheduler message - logger.debug(f"System: Starting the scheduler to send '{schedulerMessage}' every Monday at noon on Device:{schedulerInterface} Channel:{schedulerChannel}") - # Enhanced Examples of using the scheduler, Times here are in 24hr format - # https://schedule.readthedocs.io/en/stable/ - # If you want to use any of these examples uncomment the line and edit to your needs - # Be sure to change the channel number, device number and message to your needs - # Backup your .py file or the changes which will be lost on git pull, best I got for the moment. - logger.warning("System: No schedule.Value set edit the .py file to do more. See examples in the code.") - - # Good Morning Every day at 09:00 using send_message function to channel 2 on device 1 - #schedule.every().day.at("09:00").do(lambda: send_message("Good Morning", 2, 0, 1)) - - # Send WX every Morning at 08:00 using handle_wxc function to channel 2 on device 1 - #schedule.every().day.at("08:00").do(lambda: send_message(handle_wxc(0, 1, 'wx'), 2, 0, 1)) - - # Send Weather Channel Notice Wed. Noon on channel 2, device 1 - #schedule.every().wednesday.at("12:00").do(lambda: send_message("Weather alerts available on 'Alerts' channel with default 'AQ==' key.", 2, 0, 1)) - - # Send config URL for Medium Fast Network Use every other day at 10:00 to default channel 2 on device 1 - #schedule.every(2).days.at("10:00").do(lambda: send_message("Join us on Medium Fast https://meshtastic.org/e/#CgcSAQE6AggNEg4IARAEOAFAA0gBUB5oAQ", 2, 0, 1)) - - # Send a Net Starting Now Message Every Wednesday at 19:00 using send_message function to channel 2 on device 1 - #schedule.every().wednesday.at("19:00").do(lambda: send_message("Net Starting Now", 2, 0, 1)) - - # Send a Welcome Notice for group on the 15th and 25th of the month at 12:00 using send_message function to channel 2 on device 1 - #schedule.every().day.at("12:00").do(lambda: send_message("Welcome to the group", 2, 0, 1)).day(15, 25) - - # Send a joke every 6 hours using tell_joke function to channel 2 on device 1 - #schedule.every(6).hours.do(lambda: send_message(tell_joke(), 2, 0, 1)) - - # Send a joke every 2 minutes using tell_joke function to channel 2 on device 1 - #schedule.every(2).minutes.do(lambda: send_message(tell_joke(), 2, 0, 1)) - - # Send the Welcome Message every other day at 08:00 using send_message function to channel 2 on device 1 - #schedule.every(2).days.at("08:00").do(lambda: send_message(welcome_message, 2, 0, 1)) - - # Send the MOTD every day at 13:00 using send_message function to channel 2 on device 1 - #schedule.every().day.at("13:00").do(lambda: send_message(MOTD, 2, 0, 1)) - - # Send bbslink looking for peers every other day at 10:00 using send_message function to channel 3 on device 1 - #schedule.every(2).days.at("10:00").do(lambda: send_message("bbslink MeshBot looking for peers", 3, 0, 1)) - # show schedual details - await BroadcastScheduler() + # setup the scheduler + from modules.scheduler import setup_scheduler + await setup_scheduler( + schedulerMotd, MOTD, schedulerMessage, schedulerChannel, schedulerInterface, + schedulerValue, schedulerTime, schedulerInterval, logger, BroadcastScheduler + ) # here we go loopty loo while True: diff --git a/modules/scheduler.py b/modules/scheduler.py new file mode 100644 index 0000000..55b5642 --- /dev/null +++ b/modules/scheduler.py @@ -0,0 +1,87 @@ +# modules/scheduler.py 2025 meshing-around +import schedule +from modules.log import logger +from modules.system import send_message, BroadcastScheduler + +async def setup_scheduler( + schedulerMotd, MOTD, schedulerMessage, schedulerChannel, schedulerInterface, + schedulerValue, schedulerTime, schedulerInterval, logger, BroadcastScheduler +): + # Setup the scheduler based on configuration + try: + if schedulerMotd: + scheduler_message = MOTD + else: + scheduler_message = schedulerMessage + + if schedulerValue != '': + if schedulerValue.lower() == 'day': + if schedulerTime != '': + schedule.every().day.at(schedulerTime).do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + else: + schedule.every(int(schedulerInterval)).days.do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + elif 'mon' in schedulerValue.lower() and schedulerTime != '': + schedule.every().monday.at(schedulerTime).do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + elif 'tue' in schedulerValue.lower() and schedulerTime != '': + schedule.every().tuesday.at(schedulerTime).do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + elif 'wed' in schedulerValue.lower() and schedulerTime != '': + schedule.every().wednesday.at(schedulerTime).do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + elif 'thu' in schedulerValue.lower() and schedulerTime != '': + schedule.every().thursday.at(schedulerTime).do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + elif 'fri' in schedulerValue.lower() and schedulerTime != '': + schedule.every().friday.at(schedulerTime).do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + elif 'sat' in schedulerValue.lower() and schedulerTime != '': + schedule.every().saturday.at(schedulerTime).do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + elif 'sun' in schedulerValue.lower() and schedulerTime != '': + schedule.every().sunday.at(schedulerTime).do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + elif 'hour' in schedulerValue.lower(): + schedule.every(int(schedulerInterval)).hours.do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + elif 'min' in schedulerValue.lower(): + schedule.every(int(schedulerInterval)).minutes.do(lambda: send_message(scheduler_message, schedulerChannel, 0, schedulerInterface)) + logger.debug(f"System: Starting the scheduler to send '{scheduler_message}' on schedule '{schedulerValue}' every {schedulerInterval} interval at time '{schedulerTime}' on Device:{schedulerInterface} Channel:{schedulerChannel}") + else: + # Default schedule if no valid configuration is provided + # custom scheduler job to run the schedule see examples below + logger.debug(f"System: Starting the scheduler to send '{scheduler_message}' every Monday at noon on Device:{schedulerInterface} Channel:{schedulerChannel}") + schedule.every().monday.at("12:00").do(lambda: logger.info("System: Scheduled Broadcast Enabled Reminder")) + + # Start the Broadcast Scheduler + await BroadcastScheduler() + except Exception as e: + logger.error(f"System: Scheduler Error {e}") + +# Enhanced Examples of using the scheduler, Times here are in 24hr format +# https://schedule.readthedocs.io/en/stable/ + +# Good Morning Every day at 09:00 using send_message function to channel 2 on device 1 +#schedule.every().day.at("09:00").do(lambda: send_message("Good Morning", 2, 0, 1)) + +# Send WX every Morning at 08:00 using handle_wxc function to channel 2 on device 1 +#schedule.every().day.at("08:00").do(lambda: send_message(handle_wxc(0, 1, 'wx'), 2, 0, 1)) + +# Send Weather Channel Notice Wed. Noon on channel 2, device 1 +#schedule.every().wednesday.at("12:00").do(lambda: send_message("Weather alerts available on 'Alerts' channel with default 'AQ==' key.", 2, 0, 1)) + +# Send config URL for Medium Fast Network Use every other day at 10:00 to default channel 2 on device 1 +#schedule.every(2).days.at("10:00").do(lambda: send_message("Join us on Medium Fast https://meshtastic.org/e/#CgcSAQE6AggNEg4IARAEOAFAA0gBUB5oAQ", 2, 0, 1)) + +# Send a Net Starting Now Message Every Wednesday at 19:00 using send_message function to channel 2 on device 1 +#schedule.every().wednesday.at("19:00").do(lambda: send_message("Net Starting Now", 2, 0, 1)) + +# Send a Welcome Notice for group on the 15th and 25th of the month at 12:00 using send_message function to channel 2 on device 1 +#schedule.every().day.at("12:00").do(lambda: send_message("Welcome to the group", 2, 0, 1)).day(15, 25) + +# Send a joke every 6 hours using tell_joke function to channel 2 on device 1 +#schedule.every(6).hours.do(lambda: send_message(tell_joke(), 2, 0, 1)) + +# Send a joke every 2 minutes using tell_joke function to channel 2 on device 1 +#schedule.every(2).minutes.do(lambda: send_message(tell_joke(), 2, 0, 1)) + +# Send the Welcome Message every other day at 08:00 using send_message function to channel 2 on device 1 +#schedule.every(2).days.at("08:00").do(lambda: send_message(welcome_message, 2, 0, 1)) + +# Send the MOTD every day at 13:00 using send_message function to channel 2 on device 1 +#schedule.every().day.at("13:00").do(lambda: send_message(MOTD, 2, 0, 1)) + +# Send bbslink looking for peers every other day at 10:00 using send_message function to channel 3 on device 1 +#schedule.every(2).days.at("10:00").do(lambda: send_message("bbslink MeshBot looking for peers", 3, 0, 1)) \ No newline at end of file