132 lines
4.2 KiB
Python
Executable File
132 lines
4.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
r'''
|
|
__ ___ ___ ___ ____
|
|
\ \ / (_) _(_) | | _ \ _____ _____ _ __
|
|
\ \ /\ / /| | | | | | | |_) / _ \ \ /\ / / _ \ '__|
|
|
\ V V / | | | | | | | __/ (_) \ V V / __/ |
|
|
\_/\_/ |_|_| |_|_| |_| \___/ \_/\_/ \___|_|
|
|
____
|
|
/ ___| __ ___ _____
|
|
\___ \ / _` \ \ / / _ \
|
|
___) | (_| |\ V / __/
|
|
|____/ \__,_| \_/ \___|
|
|
|
|
WiFi Power Saving Script
|
|
Disables WiFi completely after 10 minutes of boot if wifi_power_saving is enabled in config.
|
|
Saves ~100-200mA of power consumption.
|
|
WiFi is automatically re-enabled at next boot (see boot_hotspot.sh).
|
|
|
|
Usage:
|
|
/usr/bin/python3 /var/www/nebuleair_pro_4g/wifi/power_save.py
|
|
'''
|
|
|
|
import sqlite3
|
|
import subprocess
|
|
import sys
|
|
import datetime
|
|
|
|
# Paths
|
|
DB_PATH = "/var/www/nebuleair_pro_4g/sqlite/sensors.db"
|
|
LOG_PATH = "/var/www/nebuleair_pro_4g/logs/app.log"
|
|
|
|
def log_message(message):
|
|
"""Write message to log file with timestamp"""
|
|
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
log_entry = f"[{timestamp}] [WiFi Power Save] {message}\n"
|
|
try:
|
|
with open(LOG_PATH, "a") as log_file:
|
|
log_file.write(log_entry)
|
|
except Exception as e:
|
|
print(f"Failed to write to log: {e}", file=sys.stderr)
|
|
print(log_entry.strip())
|
|
|
|
def get_config_value(key):
|
|
"""Read configuration value from database"""
|
|
try:
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
cursor.execute("SELECT value FROM config_table WHERE key = ?", (key,))
|
|
result = cursor.fetchone()
|
|
conn.close()
|
|
return result[0] if result else None
|
|
except sqlite3.Error as e:
|
|
log_message(f"Database error: {e}")
|
|
return None
|
|
|
|
def is_wifi_enabled():
|
|
"""Check if WiFi radio is currently enabled"""
|
|
try:
|
|
result = subprocess.run(
|
|
["nmcli", "radio", "wifi"],
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=10
|
|
)
|
|
return result.stdout.strip() == "enabled"
|
|
except Exception as e:
|
|
log_message(f"Failed to check WiFi status: {e}")
|
|
return None
|
|
|
|
def disable_wifi():
|
|
"""Disable WiFi radio completely using nmcli"""
|
|
try:
|
|
# Disable WiFi radio completely to save maximum power
|
|
# WiFi will be re-enabled automatically at next boot by boot_hotspot.sh
|
|
result = subprocess.run(
|
|
["sudo", "nmcli", "radio", "wifi", "off"],
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=10
|
|
)
|
|
if result.returncode == 0:
|
|
log_message("WiFi disabled completely - saving ~100-200mA power (will re-enable at next boot)")
|
|
return True
|
|
else:
|
|
log_message(f"Failed to disable WiFi: {result.stderr}")
|
|
return False
|
|
except subprocess.TimeoutExpired:
|
|
log_message("Timeout while trying to disable WiFi")
|
|
return False
|
|
except Exception as e:
|
|
log_message(f"Error disabling WiFi: {e}")
|
|
return False
|
|
|
|
def main():
|
|
"""Main function"""
|
|
log_message("WiFi power save script started")
|
|
|
|
# Check if wifi_power_saving is enabled in config
|
|
wifi_power_saving = get_config_value("wifi_power_saving")
|
|
|
|
if wifi_power_saving is None:
|
|
log_message("wifi_power_saving config not found - skipping (run migration or set_config.py)")
|
|
return 0
|
|
|
|
if wifi_power_saving == "0":
|
|
log_message("WiFi power saving is disabled in config - WiFi will remain enabled")
|
|
return 0
|
|
|
|
log_message("WiFi power saving is enabled in config")
|
|
|
|
# Check current WiFi status
|
|
wifi_enabled = is_wifi_enabled()
|
|
if wifi_enabled is None:
|
|
log_message("Could not determine WiFi status - aborting")
|
|
return 1
|
|
|
|
if not wifi_enabled:
|
|
log_message("WiFi is already disabled - nothing to do")
|
|
return 0
|
|
|
|
# Disable WiFi completely after 10-minute configuration window
|
|
log_message("Disabling WiFi completely after 10-minute configuration window...")
|
|
if disable_wifi():
|
|
log_message("WiFi disabled successfully - will re-enable at next boot")
|
|
return 0
|
|
else:
|
|
log_message("WiFi disable failed")
|
|
return 1
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|