#!/bin/bash # File: /var/www/moduleair_pro_4g/services/setup_services.sh # Purpose: Set up all systemd services for moduleair data collection and LED matrix display # to install: # sudo chmod +x /var/www/moduleair_pro_4g/services/setup_services.sh # sudo /var/www/moduleair_pro_4g/services/setup_services.sh echo "Setting up moduleair systemd services and timers..." # Create directory for logs if it doesn't exist mkdir -p /var/www/moduleair_pro_4g/logs # Create service and timer files for NPM Data cat > /etc/systemd/system/moduleair-npm-data.service << 'EOL' [Unit] Description=moduleair NPM Data Collection Service After=network.target [Service] Type=oneshot ExecStart=/usr/bin/python3 /var/www/moduleair_pro_4g/NPM/get_data_modbus_v3.py User=root WorkingDirectory=/var/www/moduleair_pro_4g StandardOutput=append:/var/www/moduleair_pro_4g/logs/npm_service.log StandardError=append:/var/www/moduleair_pro_4g/logs/npm_service_errors.log [Install] WantedBy=multi-user.target EOL cat > /etc/systemd/system/moduleair-npm-data.timer << 'EOL' [Unit] Description=Run moduleair NPM Data Collection every 10 seconds Requires=moduleair-npm-data.service [Timer] OnBootSec=10s OnUnitActiveSec=10s AccuracySec=1s [Install] WantedBy=timers.target EOL # Create service and timer files for CO2 Data cat > /etc/systemd/system/moduleair-co2-data.service << 'EOL' [Unit] Description=moduleair co2 Data Collection Service After=network.target [Service] Type=oneshot ExecStart=/usr/bin/python3 /var/www/moduleair_pro_4g/MH-Z19/write_data.py User=root WorkingDirectory=/var/www/moduleair_pro_4g StandardOutput=append:/var/www/moduleair_pro_4g/logs/co2_service.log StandardError=append:/var/www/moduleair_pro_4g/logs/co2_service_errors.log [Install] WantedBy=multi-user.target EOL cat > /etc/systemd/system/moduleair-co2-data.timer << 'EOL' [Unit] Description=Run moduleair co2 Data Collection every 10 seconds Requires=moduleair-co2-data.service [Timer] OnBootSec=10s OnUnitActiveSec=10s AccuracySec=1s [Install] WantedBy=timers.target EOL # Create service and timer files for Envea Data cat > /etc/systemd/system/moduleair-envea-data.service << 'EOL' [Unit] Description=moduleair Envea Data Collection Service After=network.target [Service] Type=oneshot ExecStart=/usr/bin/python3 /var/www/moduleair_pro_4g/envea/read_value_v2.py User=root WorkingDirectory=/var/www/moduleair_pro_4g StandardOutput=append:/var/www/moduleair_pro_4g/logs/envea_service.log StandardError=append:/var/www/moduleair_pro_4g/logs/envea_service_errors.log [Install] WantedBy=multi-user.target EOL cat > /etc/systemd/system/moduleair-envea-data.timer << 'EOL' [Unit] Description=Run moduleair Envea Data Collection every 10 seconds Requires=moduleair-envea-data.service [Timer] OnBootSec=10s OnUnitActiveSec=10s AccuracySec=1s [Install] WantedBy=timers.target EOL # Create service and timer files for SARA Data (No Lock File Needed) cat > /etc/systemd/system/moduleair-sara-data.service << 'EOL' [Unit] Description=moduleair SARA Data Transmission Service After=network.target [Service] Type=oneshot ExecStart=/usr/bin/python3 /var/www/moduleair_pro_4g/loop/SARA_send_data_v2.py User=root WorkingDirectory=/var/www/moduleair_pro_4g StandardOutput=append:/var/www/moduleair_pro_4g/logs/sara_service.log StandardError=append:/var/www/moduleair_pro_4g/logs/sara_service_errors.log RuntimeMaxSec=200s [Install] WantedBy=multi-user.target EOL cat > /etc/systemd/system/moduleair-sara-data.timer << 'EOL' [Unit] Description=Run moduleair SARA Data Transmission every 60 seconds Requires=moduleair-sara-data.service [Timer] OnBootSec=60s OnUnitActiveSec=60s AccuracySec=1s # This is the key setting that prevents overlap Persistent=true [Install] WantedBy=timers.target EOL # Create service and timer files for BME280 Data cat > /etc/systemd/system/moduleair-bme280-data.service << 'EOL' [Unit] Description=moduleair BME280 Data Collection Service After=network.target [Service] Type=oneshot ExecStart=/usr/bin/python3 /var/www/moduleair_pro_4g/BME280/get_data_v2.py User=root WorkingDirectory=/var/www/moduleair_pro_4g StandardOutput=append:/var/www/moduleair_pro_4g/logs/bme280_service.log StandardError=append:/var/www/moduleair_pro_4g/logs/bme280_service_errors.log [Install] WantedBy=multi-user.target EOL cat > /etc/systemd/system/moduleair-bme280-data.timer << 'EOL' [Unit] Description=Run moduleair BME280 Data Collection every 120 seconds Requires=moduleair-bme280-data.service [Timer] OnBootSec=120s OnUnitActiveSec=120s AccuracySec=1s [Install] WantedBy=timers.target EOL # Create service and timer files for Database Cleanup cat > /etc/systemd/system/moduleair-db-cleanup-data.service << 'EOL' [Unit] Description=moduleair Database Cleanup Service After=network.target [Service] Type=oneshot ExecStart=/usr/bin/python3 /var/www/moduleair_pro_4g/sqlite/flush_old_data.py User=root WorkingDirectory=/var/www/moduleair_pro_4g StandardOutput=append:/var/www/moduleair_pro_4g/logs/db_cleanup_service.log StandardError=append:/var/www/moduleair_pro_4g/logs/db_cleanup_service_errors.log [Install] WantedBy=multi-user.target EOL cat > /etc/systemd/system/moduleair-db-cleanup-data.timer << 'EOL' [Unit] Description=Run moduleair Database Cleanup daily Requires=moduleair-db-cleanup-data.service [Timer] OnBootSec=1h OnUnitActiveSec=24h AccuracySec=1h [Install] WantedBy=timers.target EOL # Create service and timer files for LED Matrix Display cat > /etc/systemd/system/moduleair-matrix-display.service << 'EOL' [Unit] Description=moduleair LED Matrix Display Service After=network.target [Service] Type=oneshot ExecStart=/var/www/moduleair_pro_4g/matrix/imageScreen/image_split /var/www/moduleair_pro_4g/matrix/imageScreen/ModuleAir128x64.png User=root WorkingDirectory=/var/www/moduleair_pro_4g/matrix/imageScreen/ StandardOutput=append:/var/www/moduleair_pro_4g/logs/matrix_service.log StandardError=append:/var/www/moduleair_pro_4g/logs/matrix_service_errors.log [Install] WantedBy=multi-user.target EOL cat > /etc/systemd/system/moduleair-matrix-display.timer << 'EOL' [Unit] Description=Run moduleair LED Matrix Display every 10 seconds Requires=moduleair-matrix-display.service [Timer] OnBootSec=30s OnUnitActiveSec=10s AccuracySec=1s [Install] WantedBy=timers.target EOL # Make sure the matrix executable has proper permissions echo "Setting permissions for LED matrix executable..." chmod +x /var/www/moduleair_pro_4g/matrix/imageScreen/image_split # Reload systemd to recognize new services systemctl daemon-reload # Enable and start all timers echo "Enabling and starting all services..." for service in npm envea sara bme280 co2 db-cleanup matrix-display; do systemctl enable moduleair-$service-data.timer 2>/dev/null || systemctl enable moduleair-$service.timer systemctl start moduleair-$service-data.timer 2>/dev/null || systemctl start moduleair-$service.timer echo "Started moduleair-$service timer" done echo "Checking status of all timers..." systemctl list-timers | grep moduleair echo "Setup complete. All moduleair services are now running." echo "" echo "LED Matrix Display will:" echo " - Start 30 seconds after boot" echo " - Run every 10 seconds (6s animation + 4s gap)" echo " - Show split reveal animation + 3s display" echo "" echo "To check the status of services:" echo " sudo systemctl status moduleair-npm-data.service" echo " sudo systemctl status moduleair-matrix-display.service" echo "" echo "To view logs for services:" echo " sudo journalctl -u moduleair-npm-data.service" echo " sudo journalctl -u moduleair-matrix-display.service" echo " tail -f /var/www/moduleair_pro_4g/logs/matrix_service.log" echo "" echo "To restart timers:" echo " sudo systemctl restart moduleair-npm-data.timer" echo " sudo systemctl restart moduleair-matrix-display.timer" echo "" echo "To disable matrix display:" echo " sudo systemctl stop moduleair-matrix-display.timer" echo " sudo systemctl disable moduleair-matrix-display.timer"