120 lines
4.7 KiB
Python
120 lines
4.7 KiB
Python
#!/usr/bin/env python3
|
|
# coding: utf-8
|
|
|
|
"""
|
|
Script d'automatisation pour la gestion du système timelapse
|
|
Ce script vérifie le statut du serveur et configure le système en conséquence.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import time
|
|
import logging
|
|
import subprocess
|
|
from timelapse.config import config
|
|
from timelapse.api_client import api_client
|
|
from timelapse.sensors import micro_controller
|
|
|
|
|
|
def main():
|
|
"""
|
|
Fonction principale d'automatisation
|
|
"""
|
|
logging.info("==================== AUTOMATISATION TIMELAPSE ====================")
|
|
|
|
try:
|
|
# Récupérer le statut de la caméra depuis l'API
|
|
camera_status = api_client.get_camera_status()
|
|
|
|
# Vérifier si la configuration actuelle est déjà active et non terminée
|
|
is_active_config = config.get("config_active", False)
|
|
images_remaining = config.get("nb_images_restantes", 0)
|
|
|
|
if camera_status is None:
|
|
logging.warning("Impossible d'obtenir le statut de la caméra depuis l'API")
|
|
if is_active_config and images_remaining > 0:
|
|
logging.info("Utilisation de la configuration locale existante")
|
|
return
|
|
logging.info("Aucune configuration active et impossibilité de récupérer le statut")
|
|
return
|
|
|
|
# Vérifier l'état de maintenance en priorité
|
|
if camera_status.get("maintenance", False):
|
|
logging.info("Caméra en mode maintenance, aucune action nécessaire")
|
|
# Mettre à jour la configuration pour refléter le mode maintenance
|
|
config.update_config({"maintenance": True, "config_active": False})
|
|
return
|
|
|
|
# Vérifier si un arrêt de la procédure est demandé
|
|
if camera_status.get("stop_flag", False):
|
|
logging.info("Arrêt de la procédure en cours...")
|
|
|
|
# Réinitialiser les configurations actives
|
|
config.update_config({
|
|
"config_active": False,
|
|
"nb_images_restantes": 0,
|
|
"stop_current_config": True
|
|
})
|
|
|
|
# Confirmer l'arrêt au serveur
|
|
confirmed = api_client.confirm_stop()
|
|
if confirmed:
|
|
logging.info("Arrêt confirmé au serveur")
|
|
else:
|
|
logging.warning("Échec de la confirmation d'arrêt au serveur")
|
|
|
|
# Configuration d'un redémarrage régulier pour vérifier les nouvelles configurations
|
|
config.set("restart_interval", 120) # 2 minutes
|
|
|
|
return
|
|
|
|
# Vérifier si le système est en IDLE et si une configuration est déjà active
|
|
is_idle = camera_status.get("idle", True)
|
|
|
|
if is_idle:
|
|
logging.info("Système en mode IDLE")
|
|
if is_active_config:
|
|
# Si le nombre d'images est atteint, désactiver la configuration
|
|
if images_remaining <= 0:
|
|
logging.info("Configuration terminée: nombre d'images atteint")
|
|
config.update_config({"config_active": False})
|
|
else:
|
|
logging.info(f"Configuration active: il reste {images_remaining} images à capturer")
|
|
else:
|
|
logging.info("Aucune configuration active, attente en mode IDLE")
|
|
# Configuration d'un redémarrage régulier pour vérifier les nouvelles configurations
|
|
config.set("restart_interval", 120) # 2 minutes
|
|
return
|
|
|
|
# Si on arrive ici, il y a une nouvelle configuration à appliquer
|
|
logging.info("Nouvelle configuration active détectée")
|
|
|
|
# Mettre à jour la configuration locale
|
|
config_update = {
|
|
"config_active": True,
|
|
"maintenance": False,
|
|
"timelapse": camera_status.get("interval", 3),
|
|
"conf_nb_images": camera_status.get("nb_images", 1),
|
|
"nb_images_restantes": camera_status.get("nb_images", 1),
|
|
"stop_current_config": False,
|
|
"idle": is_idle
|
|
}
|
|
|
|
config.update_config(config_update)
|
|
|
|
# Envoyer l'intervalle au microcontrôleur
|
|
interval = camera_status.get("interval", 3)
|
|
logging.info(f"Envoi de l'intervalle au microcontrôleur: {interval}s")
|
|
micro_controller.send_interval(interval)
|
|
|
|
# Éteindre le système après configuration (mais ne pas arrêter en prod)
|
|
# logging.info("Configuration terminée, arrêt du système")
|
|
# subprocess.run(["sudo", "shutdown", "now"])
|
|
|
|
except Exception as e:
|
|
logging.error(f"Erreur dans le script d'automatisation: {e}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|