Remise en état des fichiers
This commit is contained in:
26
.env
Normal file
26
.env
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#connexion mysql
|
||||||
|
DB_HOST=162.19.78.131
|
||||||
|
DB_USER=Michel
|
||||||
|
DB_PASSWORD=wuP^wu&6xjx61bh*kjS^4
|
||||||
|
DB_NAME=Sondes
|
||||||
|
|
||||||
|
# paramètres mail
|
||||||
|
SMTP_HOST=smtp.mail.ovh.net
|
||||||
|
SMTP_PORT=465
|
||||||
|
EMAIL_FROM=services@domo91.fr
|
||||||
|
EMAIL_PASSWORD=6ZiCsVtSf9@nEHv@$^0
|
||||||
|
EMAIL_DESTINATAIRES=services@domo91.fr
|
||||||
|
|
||||||
|
# connexion OVH pour les SMS
|
||||||
|
OVH_APP_KEY=f725d07b2f98a195
|
||||||
|
OVH_APP_SECRET=5ca392a0a728e2395edd426bb1e11ad6
|
||||||
|
OVH_CONSUMER_KEY=305f2e8611e58b83930de84ee65c99f9
|
||||||
|
OVH_ENDPOINT=ovh-eu
|
||||||
|
OVH_SMS_ACCOUNT=sms-jm164396-1
|
||||||
|
OVH_SMS_SENDER=DOMO91FR
|
||||||
|
OVH_SERVICE_NAME=sms-jm164396-1
|
||||||
|
SMS_RECEIVER=+33635164680
|
||||||
|
ENVOI_SMS=1
|
||||||
|
PHONE_SACLAY=+33682069405,+33650270939
|
||||||
|
PHONE_MEUDON=+33666271128
|
||||||
|
PHONE_ADMIN=+33635164680
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -7,8 +7,6 @@
|
|||||||
# 👉 Environnement virtuel
|
# 👉 Environnement virtuel
|
||||||
.venv/
|
.venv/
|
||||||
venv/
|
venv/
|
||||||
env/
|
|
||||||
.env
|
|
||||||
|
|
||||||
# 👉 Fichiers Python compilés
|
# 👉 Fichiers Python compilés
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|||||||
1
.idea/Gestion sondes.iml
generated
1
.idea/Gestion sondes.iml
generated
@@ -2,6 +2,7 @@
|
|||||||
<module type="PYTHON_MODULE" version="4">
|
<module type="PYTHON_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$">
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="jdk" jdkName="Python 3.13 (Gestion_sondes)" jdkType="Python SDK" />
|
<orderEntry type="jdk" jdkName="Python 3.13 (Gestion_sondes)" jdkType="Python SDK" />
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import streamlit as st
|
import streamlit as st
|
||||||
import mysql.connector
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import matplotlib.dates as mdates
|
import matplotlib.dates as mdates
|
||||||
@@ -10,7 +9,7 @@ import random
|
|||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from datetime import datetime, date, time
|
from datetime import datetime, date, time
|
||||||
import bcrypt
|
import bcrypt
|
||||||
|
from .utils_db import connect_to_mysql
|
||||||
# Charger les variables d'environnement
|
# Charger les variables d'environnement
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
@@ -22,12 +21,6 @@ if "authenticated" not in st.session_state:
|
|||||||
|
|
||||||
st.title("📡 Supervision Températures")
|
st.title("📡 Supervision Températures")
|
||||||
|
|
||||||
db_config = {
|
|
||||||
"host": os.getenv("DB_HOST"),
|
|
||||||
"user": os.getenv("DB_USER"),
|
|
||||||
"password": os.getenv("DB_PASSWORD"),
|
|
||||||
"database": os.getenv("DB_NAME")
|
|
||||||
}
|
|
||||||
def get_connection():
|
def get_connection():
|
||||||
return mysql.connector.connect(**db_config)
|
return mysql.connector.connect(**db_config)
|
||||||
|
|
||||||
@@ -181,7 +174,7 @@ if not st.session_state.get("authenticated"):
|
|||||||
if result["Expiration"] and result["Expiration"] < date.today():
|
if result["Expiration"] and result["Expiration"] < date.today():
|
||||||
st.sidebar.error("⛔ Votre accès a expiré. Veuillez contacter un administrateur.")
|
st.sidebar.error("⛔ Votre accès a expiré. Veuillez contacter un administrateur.")
|
||||||
cursor.close()
|
cursor.close()
|
||||||
conn.close()sondes
|
conn.close()
|
||||||
st.stop()
|
st.stop()
|
||||||
st.session_state["authenticated"] = True
|
st.session_state["authenticated"] = True
|
||||||
st.session_state["role"] = result["role"]
|
st.session_state["role"] = result["role"]
|
||||||
49
app/Logs/monitor.csv
Normal file
49
app/Logs/monitor.csv
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
Date;Lieu;Sonde;Température;Seuil;État
|
||||||
|
2025-07-26 13:04:30;Saclay;Congelateur;-14.75;-15.0;Dépassement
|
||||||
|
2025-07-26 12:59:27;Saclay;Congelateur;-11.25;-15.0;Dépassement
|
||||||
|
2025-07-26 12:54:25;Saclay;Congelateur;-6.50;-15.0;Dépassement
|
||||||
|
2025-07-26 12:49:22;Saclay;Congelateur;-4.75;-15.0;Dépassement
|
||||||
|
2025-07-26 12:44:19;Saclay;Congelateur;-7.75;-15.0;Dépassement
|
||||||
|
2025-07-26 12:39:17;Saclay;Congelateur;-11.50;-15.0;Dépassement
|
||||||
|
2025-07-26 13:04:30;Saclay;BOF;1.75;8.0;Normal
|
||||||
|
2025-07-26 12:59:28;Saclay;BOF;2.25;8.0;Normal
|
||||||
|
2025-07-26 12:54:25;Saclay;BOF;1.00;8.0;Normal
|
||||||
|
2025-07-26 12:49:22;Saclay;BOF;2.00;8.0;Normal
|
||||||
|
2025-07-26 12:44:20;Saclay;BOF;0.75;8.0;Normal
|
||||||
|
2025-07-26 12:39:17;Saclay;BOF;2.00;8.0;Normal
|
||||||
|
2025-07-26 13:04:31;Saclay;Viandes;21.00;6.0;Dépassement
|
||||||
|
2025-07-26 12:59:28;Saclay;Viandes;21.00;6.0;Dépassement
|
||||||
|
2025-07-26 12:54:26;Saclay;Viandes;20.75;6.0;Dépassement
|
||||||
|
2025-07-26 12:49:23;Saclay;Viandes;21.00;6.0;Dépassement
|
||||||
|
2025-07-26 12:44:20;Saclay;Viandes;20.75;6.0;Dépassement
|
||||||
|
2025-07-26 12:39:18;Saclay;Viandes;21.00;6.0;Dépassement
|
||||||
|
2025-07-26 13:04:31;Saclay;Legumes;5.25;10.0;Normal
|
||||||
|
2025-07-26 12:59:29;Saclay;Legumes;4.25;10.0;Normal
|
||||||
|
2025-07-26 12:54:26;Saclay;Legumes;2.75;10.0;Normal
|
||||||
|
2025-07-26 12:49:23;Saclay;Legumes;5.50;10.0;Normal
|
||||||
|
2025-07-26 12:44:21;Saclay;Legumes;5.00;10.0;Normal
|
||||||
|
2025-07-26 12:39:18;Saclay;Legumes;3.75;10.0;Normal
|
||||||
|
2025-07-26 13:04:32;Saclay;MeP;6.25;8.0;Normal
|
||||||
|
2025-07-26 12:59:29;Saclay;MeP;7.75;8.0;Normal
|
||||||
|
2025-07-26 12:54:27;Saclay;MeP;7.00;8.0;Normal
|
||||||
|
2025-07-26 12:49:24;Saclay;MeP;5.75;8.0;Normal
|
||||||
|
2025-07-26 12:44:21;Saclay;MeP;3.25;8.0;Normal
|
||||||
|
2025-07-26 12:39:19;Saclay;MeP;4.75;8.0;Normal
|
||||||
|
2025-07-26 07:09:45;Meudon;Viandes;3.94;6.0;Normal
|
||||||
|
2025-07-25 14:37:50;Meudon;Viandes;3.94;6.0;Normal
|
||||||
|
2025-07-25 14:32:11;Meudon;Viandes;3.94;6.0;Normal
|
||||||
|
2025-07-25 14:30:20;Meudon;Viandes;3.94;6.0;Normal
|
||||||
|
2025-07-24 11:00:36;Meudon;Viandes;3.94;6.0;Normal
|
||||||
|
2025-07-24 10:41:08;Meudon;Viandes;3.94;6.0;Normal
|
||||||
|
2025-07-26 07:09:45;Meudon;Poissons;3.94;6.0;Normal
|
||||||
|
2025-07-25 14:37:50;Meudon;Poissons;3.94;6.0;Normal
|
||||||
|
2025-07-25 14:32:11;Meudon;Poissons;3.94;6.0;Normal
|
||||||
|
2025-07-25 14:30:20;Meudon;Poissons;3.94;6.0;Normal
|
||||||
|
2025-07-24 11:00:36;Meudon;Poissons;3.94;6.0;Normal
|
||||||
|
2025-07-24 10:41:08;Meudon;Poissons;3.94;6.0;Normal
|
||||||
|
2025-07-26 07:09:45;Meudon;BOF;3.00;8.0;Normal
|
||||||
|
2025-07-25 14:37:50;Meudon;BOF;3.00;8.0;Normal
|
||||||
|
2025-07-25 14:32:11;Meudon;BOF;3.00;8.0;Normal
|
||||||
|
2025-07-25 14:30:20;Meudon;BOF;3.00;8.0;Normal
|
||||||
|
2025-07-24 11:00:36;Meudon;BOF;3.00;8.0;Normal
|
||||||
|
2025-07-24 10:41:08;Meudon;BOF;3.00;8.0;Normal
|
||||||
|
@@ -2,9 +2,10 @@ import os
|
|||||||
import time
|
import time
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from db_utils import connect_to_mysql
|
from app.utils_db import connect_to_mysql
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from utils_sms import envoyer_sms
|
from app.utils_sms import envoyer_sms
|
||||||
|
|
||||||
|
|
||||||
if os.name != 'nt':
|
if os.name != 'nt':
|
||||||
log_dir = Path('/home/debian/Gestion_sondes/Logs')
|
log_dir = Path('/home/debian/Gestion_sondes/Logs')
|
||||||
@@ -37,7 +38,13 @@ def surveiller():
|
|||||||
table_temp = lieu
|
table_temp = lieu
|
||||||
table_alertes = f"Alertes_{lieu}"
|
table_alertes = f"Alertes_{lieu}"
|
||||||
|
|
||||||
cursor.execute("SELECT Sonde, Temp_Max FROM `Chambres_froides` WHERE Lieu=%s AND Etat='ON'", (lieu,))
|
cursor.execute("""
|
||||||
|
SELECT Sonde, Temp_Max
|
||||||
|
FROM Sondes.Chambres_froides
|
||||||
|
WHERE Lieu = %s
|
||||||
|
AND Etat = 'ON'
|
||||||
|
AND En_entretien = 0
|
||||||
|
""", (lieu,))
|
||||||
sondes = cursor.fetchall()
|
sondes = cursor.fetchall()
|
||||||
|
|
||||||
for sonde in sondes:
|
for sonde in sondes:
|
||||||
@@ -1,25 +1,12 @@
|
|||||||
import streamlit as st
|
import streamlit as st
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import mysql.connector
|
|
||||||
from utils.db import (
|
|
||||||
get_latest_chaufferie,
|
|
||||||
get_history_by_sonde,
|
|
||||||
verifier_utilisateur_commun,
|
|
||||||
lire_alertes_sondes,
|
|
||||||
acquitter_alerte
|
|
||||||
)
|
|
||||||
import altair as alt
|
import altair as alt
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
import os
|
from .utils_db import connect_to_mysql
|
||||||
|
|
||||||
st.set_page_config(page_title="Tech Chaufferie", layout="wide")
|
st.set_page_config(page_title="Tech Chaufferie", layout="wide")
|
||||||
load_dotenv() # charger .env à la racine du projet
|
load_dotenv() # charger .env à la racine du projet
|
||||||
|
|
||||||
# Accès aux variables d'environnement
|
|
||||||
MYSQL_HOST = os.getenv("DB_HOST")
|
|
||||||
MYSQL_USER = os.getenv("DB_USER")
|
|
||||||
MYSQL_PASSWORD = os.getenv("DB_PASSWORD")
|
|
||||||
MYSQL_DATABASE = os.getenv("DB_NAME")
|
|
||||||
|
|
||||||
def login_commun():
|
def login_commun():
|
||||||
login = st.text_input("Identifiant", type="default")
|
login = st.text_input("Identifiant", type="default")
|
||||||
@@ -108,12 +95,6 @@ if sonde_selection:
|
|||||||
conn = None
|
conn = None
|
||||||
cursor = None
|
cursor = None
|
||||||
try:
|
try:
|
||||||
conn = mysql.connector.connect(
|
|
||||||
host=MYSQL_HOST,
|
|
||||||
user=MYSQL_USER,
|
|
||||||
password=MYSQL_PASSWORD,
|
|
||||||
database=MYSQL_DATABASE
|
|
||||||
)
|
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
|
||||||
# Vérifie s'il existe déjà une alerte en cours
|
# Vérifie s'il existe déjà une alerte en cours
|
||||||
0
app/_init_.py
Normal file
0
app/_init_.py
Normal file
@@ -1,26 +1,7 @@
|
|||||||
# utils/db.py
|
# utils/db.py
|
||||||
|
|
||||||
import mysql.connector
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import logging
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from app.utils_db import connect_to_mysql # ✅ Import centralisé
|
||||||
|
|
||||||
def connect_to_mysql(db_name: str = None):
|
|
||||||
"""Connexion à MySQL via variables d'environnement."""
|
|
||||||
try:
|
|
||||||
mydb = mysql.connector.connect(
|
|
||||||
host=os.getenv("DB_HOST"),
|
|
||||||
user=os.getenv("DB_USER"),
|
|
||||||
password=os.getenv("DB_PASSWORD"),
|
|
||||||
database=db_name if db_name else os.getenv("DB_NAME")
|
|
||||||
)
|
|
||||||
return mydb
|
|
||||||
except mysql.connector.Error as err:
|
|
||||||
logging.error(f"Erreur de connexion MySQL : {err}")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def get_latest_chaufferie():
|
def get_latest_chaufferie():
|
||||||
"""Renvoie les dernières valeurs par sonde dans la table 'Chaufferie'."""
|
"""Renvoie les dernières valeurs par sonde dans la table 'Chaufferie'."""
|
||||||
@@ -28,10 +9,10 @@ def get_latest_chaufferie():
|
|||||||
cursor = db.cursor(dictionary=True)
|
cursor = db.cursor(dictionary=True)
|
||||||
query = """
|
query = """
|
||||||
SELECT c1.*
|
SELECT c1.*
|
||||||
FROM Chaufferie c1
|
FROM Sondes.Chaufferie c1
|
||||||
INNER JOIN (
|
INNER JOIN (
|
||||||
SELECT Sonde, MAX(Date) AS MaxDate
|
SELECT Sonde, MAX(Date) AS MaxDate
|
||||||
FROM Chaufferie
|
FROM Sondes.Chaufferie
|
||||||
GROUP BY Sonde
|
GROUP BY Sonde
|
||||||
) c2 ON c1.Sonde = c2.Sonde AND c1.Date = c2.MaxDate
|
) c2 ON c1.Sonde = c2.Sonde AND c1.Date = c2.MaxDate
|
||||||
ORDER BY c1.Sonde;
|
ORDER BY c1.Sonde;
|
||||||
@@ -48,7 +29,7 @@ def get_history_by_sonde(sonde: str, start: datetime, end: datetime):
|
|||||||
db = connect_to_mysql()
|
db = connect_to_mysql()
|
||||||
cursor = db.cursor(dictionary=True)
|
cursor = db.cursor(dictionary=True)
|
||||||
query = """
|
query = """
|
||||||
SELECT * FROM Chaufferie
|
SELECT * FROM Sondes.Chaufferie
|
||||||
WHERE Sonde = %s AND Date BETWEEN %s AND %s
|
WHERE Sonde = %s AND Date BETWEEN %s AND %s
|
||||||
ORDER BY Date;
|
ORDER BY Date;
|
||||||
"""
|
"""
|
||||||
@@ -64,8 +45,8 @@ def verifier_utilisateur_commun(utilisateur: str, motdepasse: str):
|
|||||||
db = connect_to_mysql()
|
db = connect_to_mysql()
|
||||||
cursor = db.cursor(dictionary=True)
|
cursor = db.cursor(dictionary=True)
|
||||||
query = """
|
query = """
|
||||||
SELECT * FROM MotsDePasse
|
SELECT * FROM Sondes.MotsDePasse
|
||||||
WHERE utilisateur = %s AND motdepasse = %s AND role = 'utilisateur'
|
WHERE utilisateur = %s AND mot_de_passe = %s AND role = 'utilisateur'
|
||||||
"""
|
"""
|
||||||
cursor.execute(query, (utilisateur, motdepasse))
|
cursor.execute(query, (utilisateur, motdepasse))
|
||||||
result = cursor.fetchone()
|
result = cursor.fetchone()
|
||||||
@@ -79,7 +60,7 @@ def lire_alertes_sondes():
|
|||||||
db = connect_to_mysql()
|
db = connect_to_mysql()
|
||||||
cursor = db.cursor(dictionary=True)
|
cursor = db.cursor(dictionary=True)
|
||||||
query = """
|
query = """
|
||||||
SELECT * FROM Alertes_Chaufferie
|
SELECT * FROM Sondes.Alertes_Chaufferie
|
||||||
WHERE Etat != 'Acquitté'
|
WHERE Etat != 'Acquitté'
|
||||||
ORDER BY Debut_defaut DESC
|
ORDER BY Debut_defaut DESC
|
||||||
"""
|
"""
|
||||||
@@ -94,7 +75,7 @@ def acquitter_alerte(id_alerte: int):
|
|||||||
"""Met à jour une alerte comme acquittée dans la base."""
|
"""Met à jour une alerte comme acquittée dans la base."""
|
||||||
db = connect_to_mysql()
|
db = connect_to_mysql()
|
||||||
cursor = db.cursor()
|
cursor = db.cursor()
|
||||||
query = "UPDATE Alertes_Chaufferie SET Etat = 'Acquitté' WHERE Id = %s"
|
query = "UPDATE Sondes.Alertes_Chaufferie SET Etat = 'Acquitté' WHERE Id = %s"
|
||||||
cursor.execute(query, (id_alerte,))
|
cursor.execute(query, (id_alerte,))
|
||||||
db.commit()
|
db.commit()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
@@ -2,8 +2,8 @@ import argparse
|
|||||||
import paho.mqtt.client as mqtt_client
|
import paho.mqtt.client as mqtt_client
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
import logging
|
import logging
|
||||||
from logger_config import setup_logger
|
from app.logger_config import setup_logger
|
||||||
from db_utils import connect_to_mysql
|
from utils_db import connect_to_mysql
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
def on_message(table_sql, _client, _userdata, msg):
|
def on_message(table_sql, _client, _userdata, msg):
|
||||||
0
scripts/supervisor_watchdog.py → app/supervisor_watchdog.py
Executable file → Normal file
0
scripts/supervisor_watchdog.py → app/supervisor_watchdog.py
Executable file → Normal file
4
scripts/surveillance_releves.py → app/surveillance_releves.py
Executable file → Normal file
4
scripts/surveillance_releves.py → app/surveillance_releves.py
Executable file → Normal file
@@ -3,7 +3,7 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
import os
|
import os
|
||||||
import db_utils
|
import utils_db
|
||||||
import logging
|
import logging
|
||||||
from utils_sms import envoyer_sms
|
from utils_sms import envoyer_sms
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ def clear_state(site):
|
|||||||
os.remove(state_file)
|
os.remove(state_file)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
cnx = db_utils.connect_to_mysql() # ← appel via db_utils
|
cnx = utils_db.connect_to_mysql() # ← appel via db_utils
|
||||||
cursor = cnx.cursor()
|
cursor = cnx.cursor()
|
||||||
|
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
Reference in New Issue
Block a user