# Surveillance continue avec envoi d'alertes par email + log CSV import mysql.connector from datetime import datetime, timedelta import time import smtplib from email.mime.text import MIMEText import pandas as pd import os # --- Config MySQL --- config = { "host": "54.36.188.119", "user": "michel", "password": "#SO2&1nf%mZ@jfh", "database": "Sondes" } # --- Destinataires email --- def get_destinataires(lieu): return os.getenv(f"EMAIL_{lieu.upper()}", os.getenv("EMAIL_DEFAULT")).split(",") # --- Fonction d'envoi de mail --- def envoyer_mail(sujet, message, destinataires): msg = MIMEText(message) msg['Subject'] = sujet msg['From'] = os.getenv("EMAIL_FROM") msg['To'] = ', '.join(destinataires) try: with smtplib.SMTP_SSL(os.getenv("SMTP_HOST"), int(os.getenv("SMTP_PORT"))) as server: server.login(os.getenv("SMTP_USER"), os.getenv("SMTP_PASSWORD")) server.sendmail(msg['From'], destinataires, msg.as_string()) print(f"📧 Mail envoyé à {destinataires}", flush=True) except Exception as e: print(f"Erreur envoi mail : {e}", flush=True) # --- Fonction de surveillance --- def surveiller(): log_entries = [] try: conn = mysql.connector.connect(**config) cursor = conn.cursor(dictionary=True) cursor.execute("SELECT DISTINCT Lieu FROM Chambres_froides") lieux = [row['Lieu'] for row in cursor.fetchall()] for lieu in lieux: table_temp = lieu table_alertes = f"Alertes_{lieu}" cursor.execute("SELECT Sonde, Temp_Max FROM Chambres_froides WHERE Lieu=%s AND Etat='ON'", (lieu,)) sondes = cursor.fetchall() for sonde in sondes: nom_sonde = sonde['Sonde'] seuil = sonde['Temp_Max'] cursor.execute(f""" SELECT Date, Temperature FROM {table_temp} WHERE Sonde = %s ORDER BY Date DESC LIMIT 6 """, (nom_sonde,)) relevés = cursor.fetchall() # Log CSV : tous les relevés analysés for r in relevés: log_entries.append({ "Date": r['Date'], "Lieu": lieu, "Sonde": nom_sonde, "Température": r['Temperature'], "Seuil": seuil, "État": "Dépassement" if r['Temperature'] > seuil else "Normal" }) if len(relevés) == 6: toutes_hors_seuil = all(r['Temperature'] > seuil for r in relevés) plus_ancien = relevés[-1]['Date'] maintenant = datetime.now() if toutes_hors_seuil and (maintenant - plus_ancien >= timedelta(minutes=30)): cursor.execute(f""" SELECT COUNT(*) as total FROM {table_alertes} WHERE Sonde=%s AND Status='En cours' """, (nom_sonde,)) en_cours = cursor.fetchone() if en_cours['total'] == 0: cursor.execute( f"INSERT INTO {table_alertes} (Sonde, Debut_defaut, Status) VALUES (%s, NOW(), 'En cours')", (nom_sonde,) ) print(f"🚨 Alerte déclenchée pour {nom_sonde} ({lieu})", flush=True) sujet = f"🚨 ALERTE TEMPÉRATURE - {nom_sonde} ({lieu})" message = ( f"La sonde '{nom_sonde}' du site '{lieu}' a dépassé le seuil de {seuil}°C " f"depuis plus de 30 minutes.\nHeure : {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" ) envoyer_mail(sujet, message, get_destinataires(lieu)) # Acquittement automatique cursor.execute(f""" SELECT Temperature FROM {table_temp} WHERE Sonde = %s ORDER BY Date DESC LIMIT 1 """, (nom_sonde,)) derniere = cursor.fetchone() if derniere and derniere['Temperature'] <= seuil: cursor.execute(f""" UPDATE {table_alertes} SET Status = 'Acquitté' WHERE Sonde = %s AND Status IN ('En cours', 'Test') """, (nom_sonde,)) conn.commit() cursor.close() conn.close() # Enregistrer le log if log_entries: df_logs = pd.DataFrame(log_entries) df_logs.to_csv("/home/debian/travail/Logs/monitor.csv", sep=";", index=False) except Exception as e: print(f"Erreur : {e}", flush=True) # --- Boucle principale --- while True: print(f"📡 Vérification à {datetime.now()}", flush=True) surveiller() time.sleep(300) # 5 minutes