Files
nebuleair_pro_4g/master.py
PaulVua 1cb1b05b51 update
2025-02-10 10:06:16 +01:00

93 lines
2.8 KiB
Python

'''
__ __ _
| \/ | __ _ ___| |_ ___ _ __
| |\/| |/ _` / __| __/ _ \ '__|
| | | | (_| \__ \ || __/ |
|_| |_|\__,_|___/\__\___|_|
Master Python script that will trigger other scripts at every chosen time pace
This script is triggered as a systemd service used as an alternative to cronjobs
Attention:
to do -> prevent SARA R4 Script to run again if it's taking more than 60 secs to finish (using a lock file ??)
First time: need to create the service file
-->sudo nano /etc/systemd/system/master_nebuleair.service
⬇️
[Unit]
Description=Master manager for the Python loop scripts
After=network.target
[Service]
ExecStart=/usr/bin/python3 /var/www/nebuleair_pro_4g/master.py
Restart=always
User=root
WorkingDirectory=/var/www/nebuleair_pro_4g
StandardOutput=append:/var/www/nebuleair_pro_4g/logs/master.log
StandardError=append:/var/www/nebuleair_pro_4g/logs/master_errors.log
[Install]
WantedBy=multi-user.target
⬆️
Reload systemd (first time after creating the service):
sudo systemctl daemon-reload
Enable (once), start (once and after stopping) and restart (after modification)systemd:
sudo systemctl enable master_nebuleair.service
sudo systemctl start master_nebuleair.service
sudo systemctl restart master_nebuleair.service
Check the service status:
sudo systemctl status master_nebuleair.service
Specific scripts can be disabled with config.json
Exemple: stop gathering data from NPM
Exemple: stop sending data with SARA R4
'''
import time
import threading
import subprocess
import json
import os
# Base directory where scripts are stored
SCRIPT_DIR = "/var/www/nebuleair_pro_4g/"
CONFIG_FILE = "/var/www/nebuleair_pro_4g/config.json"
def load_config():
"""Load the configuration file to determine which scripts to run."""
with open(CONFIG_FILE, "r") as f:
return json.load(f)
def run_script(script_name, interval):
"""Run a script in a loop with a delay."""
script_path = os.path.join(SCRIPT_DIR, script_name) # Build full path
while True:
config = load_config()
if config.get(script_name, True): # Default to True if not found
subprocess.run(["python3", script_path])
time.sleep(interval)
# Define scripts and their execution intervals (seconds)
SCRIPTS = [
("NPM/get_data_v2.py", 60), # Get NPM data every 60s
("loop/SARA_send_data_v2.py", 60), # Send data every 60 seconds
("RTC/save_to_db.py", 1), # SAVE RTC time every 1 second
("BME280/get_data_v2.py", 120) # Get BME280 data every 120 seconds
]
# Start threads for enabled scripts
for script_name, interval in SCRIPTS:
thread = threading.Thread(target=run_script, args=(script_name, interval), daemon=True)
thread.start()
# Keep the main script running
while True:
time.sleep(1)