This commit is contained in:
Your Name
2025-03-27 11:04:51 +01:00
parent 76a676925d
commit a67530ced6
5 changed files with 169 additions and 74 deletions

121
master.py
View File

@@ -53,27 +53,92 @@ Specific scripts can be disabled with config.json
import time
import threading
import subprocess
import json
import os
import sqlite3
# Base directory where scripts are stored
SCRIPT_DIR = "/var/www/moduleair_pro_4g/"
CONFIG_FILE = "/var/www/moduleair_pro_4g/config.json"
DB_PATH = "/var/www/moduleair_pro_4g/sqlite/sensors.db"
# Lock file path for SARA script
SARA_LOCK_FILE = "/var/www/moduleair_pro_4g/sara_script.lock"
def is_script_enabled(script_name):
"""Check if a script is enabled in the database."""
try:
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute(
"SELECT enabled FROM config_scripts_table WHERE script_path = ?",
(script_name,)
)
result = cursor.fetchone()
conn.close()
if result is None:
return True # Default to enabled if not found in database
return bool(result[0])
except Exception:
# If any database error occurs, default to enabled
return True
def create_lock_file():
"""Create a lock file for the SARA script."""
with open(SARA_LOCK_FILE, 'w') as f:
f.write(str(int(time.time())))
def remove_lock_file():
"""Remove the SARA script lock file."""
if os.path.exists(SARA_LOCK_FILE):
os.remove(SARA_LOCK_FILE)
def is_script_locked():
"""Check if the SARA script is currently locked."""
if not os.path.exists(SARA_LOCK_FILE):
return False
# Check if lock is older than 60 seconds (stale)
with open(SARA_LOCK_FILE, 'r') as f:
try:
lock_time = int(f.read().strip())
if time.time() - lock_time > 60:
# Lock is stale, remove it
remove_lock_file()
return False
except ValueError:
# Invalid lock file content
remove_lock_file()
return False
return True
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, delay=0):
"""Run a PYTHON script in a synchronized loop with an optional start delay."""
"""Run a script in a synchronized loop with an optional start delay."""
script_path = os.path.join(SCRIPT_DIR, script_name) # Build full path
next_run = time.monotonic() + delay # Apply the initial delay
while True:
config = load_config()
if config.get(script_name, True): # Default to True if not found
subprocess.run(["python3", script_path])
if is_script_enabled(script_name):
# Special handling for SARA script to prevent concurrent runs
if script_name == "loop/SARA_send_data_v2.py":
if not is_script_locked():
create_lock_file()
try:
subprocess.run(["python3", script_path])
finally:
remove_lock_file()
else:
# Run other scripts normally
subprocess.run(["python3", script_path])
# Wait until the next exact interval
next_run += interval
@@ -81,38 +146,20 @@ def run_script(script_name, interval, delay=0):
time.sleep(sleep_time)
# ✅ **Scripts that should start immediately**
IMMEDIATE_SCRIPTS = [
("RTC/save_to_db.py", 1, 0),
("NPM/get_data_modbus_v3.py", 10, 0),
("envea/read_value_v2.py", 10, 0),
("MH-Z19/write_data.py", 10, 0),
("loop/SARA_send_data_v2.py", 60, 1),
("BME280/get_data_v2.py", 120, 0),
("sqlite/flush_old_data.py", 86400, 0)
# Define scripts and their execution intervals (seconds)
SCRIPTS = [
# Format: (script_name, interval_in_seconds, start_delay_in_seconds)
("NPM/get_data_modbus_v3.py", 10, 0), # Get NPM data (modbus 5 channels) every 10s
("MH-Z19/write_data.py", 10, 0), # Get Envea data every 10s
("loop/SARA_send_data_v2.py", 60, 1), # Send data every 60 seconds, with 1s delay
("sqlite/flush_old_data.py", 86400, 0) # Flush old data inside db every day
]
# ✅ **The compiled binary that must wait for welcome_screen**
WAIT_BINARY = "/var/www/moduleair_pro_4g/matrix/test_forms" # Adjust path if needed
# 🚀 **Start all scripts that can run immediately**
for script_name, interval, delay in IMMEDIATE_SCRIPTS:
# Start threads for scripts
for script_name, interval, delay in SCRIPTS:
thread = threading.Thread(target=run_script, args=(script_name, interval, delay), daemon=True)
thread.start()
# 🚀 **Run welcome_screen in parallel**
print("🚀 Running welcome screen...")
welcome_process = subprocess.Popen(["sudo", "/var/www/moduleair_pro_4g/matrix/welcome_screen"])
print("✅ Welcome screen started in parallel with other scripts.")
# 🕒 **Wait for welcome_screen to finish before running WAIT_BINARY**
welcome_process.wait()
print("✅ Welcome screen finished. Starting another_screen...")
# 🚀 **Now run the compiled binary `another_screen`**
subprocess.run(["sudo", WAIT_BINARY])
print("✅ another_screen execution completed.")
# Keep the main script running
while True:
time.sleep(1)