Rév.1.1
This commit is contained in:
160
domo91.py
160
domo91.py
@@ -1,5 +1,7 @@
|
|||||||
# Application Gestion de sondes
|
# Application Gestion de sondes
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
from logging import exception
|
||||||
|
|
||||||
import streamlit as st
|
import streamlit as st
|
||||||
import mysql.connector
|
import mysql.connector
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
@@ -23,13 +25,14 @@ if "authenticated" not in st.session_state:
|
|||||||
|
|
||||||
st.title("📡 Supervision Températures")
|
st.title("📡 Supervision Températures")
|
||||||
|
|
||||||
db_config ={
|
db_config = {
|
||||||
"host": os.getenv("DB_HOST"),
|
"host": os.getenv("DB_HOST"),
|
||||||
"user": os.getenv("DB_USER"),
|
"user": os.getenv("DB_USER"),
|
||||||
"password": os.getenv("DB_PASSWORD"),
|
"password": os.getenv("DB_PASSWORD"),
|
||||||
"database": os.getenv("DB_NAME")
|
"database": os.getenv("DB_NAME")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# --- Fonction de génération PDF ---
|
# --- Fonction de génération PDF ---
|
||||||
def generer_pdf(site, date_str):
|
def generer_pdf(site, date_str):
|
||||||
st.info(f"Génération du rapport PDF pour {site} à la date {date_str}")
|
st.info(f"Génération du rapport PDF pour {site} à la date {date_str}")
|
||||||
@@ -237,7 +240,11 @@ if st.session_state["authenticated"]:
|
|||||||
try:
|
try:
|
||||||
conn = mysql.connector.connect(**db_config)
|
conn = mysql.connector.connect(**db_config)
|
||||||
cursor = conn.cursor(dictionary=True)
|
cursor = conn.cursor(dictionary=True)
|
||||||
|
if "role" not in st.session_state:
|
||||||
|
st.session_state["role"] = None
|
||||||
|
|
||||||
|
if "lieu_autorise" not in st.session_state:
|
||||||
|
st.session_state["lieu_autorise"] = None
|
||||||
site_selectionne = (
|
site_selectionne = (
|
||||||
st.session_state["lieu_autorise"]
|
st.session_state["lieu_autorise"]
|
||||||
if st.session_state["role"] != "superviseur"
|
if st.session_state["role"] != "superviseur"
|
||||||
@@ -315,8 +322,8 @@ if st.session_state["authenticated"]:
|
|||||||
seuil_temp = seuil["Temp_Max"] if seuil else 10
|
seuil_temp = seuil["Temp_Max"] if seuil else 10
|
||||||
|
|
||||||
st.subheader("📊 Tableau des relevés")
|
st.subheader("📊 Tableau des relevés")
|
||||||
df_filtré = df_sonde.copy()
|
df_filtre = df_sonde.copy()
|
||||||
df_filtré = df_filtré.drop(columns="Id", errors="ignore")
|
df_filtre = df_filtre.drop(columns="Id", errors="ignore")
|
||||||
|
|
||||||
|
|
||||||
def surlignage_temp(val):
|
def surlignage_temp(val):
|
||||||
@@ -328,12 +335,12 @@ if st.session_state["authenticated"]:
|
|||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
styled_df = df_filtré.style.applymap(surlignage_temp, subset=["Temperature"])
|
styled_df = df_filtre.style.applymap(surlignage_temp, subset=["Temperature"])
|
||||||
st.dataframe(styled_df, use_container_width=True)
|
st.dataframe(styled_df, use_container_width=True)
|
||||||
|
|
||||||
st.subheader("📈 Évolution de la température")
|
st.subheader("📈 Évolution de la température")
|
||||||
fig, ax = plt.subplots(figsize=(10, 4))
|
fig, ax = plt.subplots(figsize=(10, 4))
|
||||||
ax.plot(df_filtré["Date"], df_filtré["Temperature"], marker='o', label="Température")
|
ax.plot(df_filtre["Date"], df_filtre["Temperature"], marker='o', label="Température")
|
||||||
ax.axhline(seuil_temp, color='red', linestyle='--', label=f"Seuil {seuil_temp}°C")
|
ax.axhline(seuil_temp, color='red', linestyle='--', label=f"Seuil {seuil_temp}°C")
|
||||||
ax.set_xlabel("Heure")
|
ax.set_xlabel("Heure")
|
||||||
ax.set_ylabel("Température (°C)")
|
ax.set_ylabel("Température (°C)")
|
||||||
@@ -404,85 +411,80 @@ if st.session_state["authenticated"]:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
st.error(f"Erreur lors de la récupération des alertes : {e}")
|
st.error(f"Erreur lors de la récupération des alertes : {e}")
|
||||||
|
|
||||||
except Exception as err:
|
# --- Fonctionnalités administrateur : ajout et gestion des chambres froides ---
|
||||||
st.error(f"Erreur MySQL : {e}")
|
if st.session_state["role"] == "superviseur":
|
||||||
if st.session_state["role"] == "superviseur":
|
with st.expander("+ Ajouter une nouvelle chambre froide", expanded=False):
|
||||||
with st.expander("+ Ajouter une nouvelle chambre froide", expanded=False):
|
with st.form("ajout_sonde"):
|
||||||
with st.form("ajout_sonde"):
|
nouvelle_sonde = st.text_input("Nom de la sonde")
|
||||||
nouvelle_sonde = st.text_input("Nom de la sonde")
|
temp_max = st.number_input("Température maximale autorisée (°C)", value=4)
|
||||||
temp_max = st.number_input("Température maximale autorisée (°C)", value=4)
|
etat_on = st.checkbox("État actif (ON)", value=True)
|
||||||
etat_on = st.checkbox("État actif (ON)", value=True)
|
|
||||||
|
submitted = st.form_submit_button("✅ Ajouter")
|
||||||
|
if submitted:
|
||||||
|
try:
|
||||||
|
conn_add = mysql.connector.connect(**db_config)
|
||||||
|
cursor_add = conn_add.cursor()
|
||||||
|
cursor_add.execute(
|
||||||
|
"INSERT INTO Chambres_froides (Lieu, Sonde, Temp_Max, Status) VALUES (%s, %s, %s, %s)",
|
||||||
|
(site, nouvelle_sonde, temp_max, "ON" if etat_on else "OFF")
|
||||||
|
)
|
||||||
|
conn_add.commit()
|
||||||
|
cursor_add.close()
|
||||||
|
conn_add.close()
|
||||||
|
st.success(f"Sonde '{nouvelle_sonde}' ajoutée avec succès au site {site} 🎉")
|
||||||
|
st.session_state["refresh_admin"] = random.randint(1000, 9999)
|
||||||
|
except Exception as e:
|
||||||
|
st.error(f"Erreur lors de l'ajout : {e}")
|
||||||
|
|
||||||
|
with st.expander("🛠️ Gestion des chambres froides (administrateur)", expanded=True):
|
||||||
|
if st.button("🔄 Actualiser la liste"):
|
||||||
|
st.session_state["refresh_admin"] = random.randint(0, 9999)
|
||||||
|
|
||||||
submitted = st.form_submit_button("✅ Ajouter")
|
|
||||||
if submitted:
|
|
||||||
try:
|
try:
|
||||||
conn_add = mysql.connector.connect(**db_config)
|
conn_admin = mysql.connector.connect(**db_config)
|
||||||
cursor_add = conn_add.cursor()
|
cursor_admin = conn_admin.cursor(dictionary=True)
|
||||||
|
cursor_admin.execute("SELECT * FROM Chambres_froides WHERE Lieu = %s", (site,))
|
||||||
|
chambres = cursor_admin.fetchall()
|
||||||
|
|
||||||
cursor_add.execute(
|
if not chambres:
|
||||||
"INSERT INTO Chambres_froides (Lieu, Sonde, Temp_Max, Status) VALUES (%s, %s, %s, %s)",
|
st.warning("Aucune chambre froide pour ce site.")
|
||||||
(site_selectionne, nouvelle_sonde, temp_max, "ON" if etat_on else "OFF")
|
else:
|
||||||
)
|
for chambre in chambres:
|
||||||
conn_add.commit()
|
col1, col2, col3 = st.columns([3, 1, 2])
|
||||||
cursor_add.close()
|
with col1:
|
||||||
conn_add.close()
|
st.markdown(f"**{chambre['Sonde']}**")
|
||||||
|
|
||||||
st.success(f"Sonde '{nouvelle_sonde}' ajoutée avec succès au site {site_selectionne} 🎉")
|
with col2:
|
||||||
|
etat = st.checkbox("ON", value=(chambre["Etat"] == "ON"),
|
||||||
|
key=f"etat_{chambre['Id']}_{st.session_state.get('refresh_admin', 0)}")
|
||||||
|
new_etat = "ON" if etat else "OFF"
|
||||||
|
|
||||||
# Refresh immédiat
|
with col3:
|
||||||
st.session_state["refresh_admin"] = random.randint(1000, 9999)
|
temp_max = chambre["Temp_Max"]
|
||||||
|
moins, val, plus = st.columns([1, 2, 1])
|
||||||
|
with moins:
|
||||||
|
if st.button("▼", key=f"moins_{chambre['Id']}"):
|
||||||
|
temp_max -= 1
|
||||||
|
with val:
|
||||||
|
st.markdown(f"<div style='text-align:center;font-size:20px'>{temp_max}°C</div>",
|
||||||
|
unsafe_allow_html=True)
|
||||||
|
with plus:
|
||||||
|
if st.button("▲", key=f"plus_{chambre['Id']}"):
|
||||||
|
temp_max += 1
|
||||||
|
|
||||||
|
if new_etat != chambre["Etat"] or temp_max != chambre["Temp_Max"]:
|
||||||
|
cursor_admin.execute(
|
||||||
|
"UPDATE Chambres_froides SET Etat = %s, Temp_Max = %s WHERE Id = %s",
|
||||||
|
(new_etat, temp_max, chambre["Id"])
|
||||||
|
)
|
||||||
|
conn_admin.commit()
|
||||||
|
st.success(f"{chambre['Sonde']} mise à jour")
|
||||||
|
|
||||||
|
cursor_admin.close()
|
||||||
|
conn_admin.close()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
st.error(f"Erreur lors de l'ajout : {e}")
|
st.error(f"Erreur SQL (admin) : {e}")
|
||||||
with st.expander("🛠️ Gestion des chambres froides (administrateur)", expanded=True):
|
|
||||||
|
|
||||||
# Bouton d'actualisation
|
except exception as err:
|
||||||
if st.button("🔄 Actualiser la liste"):
|
st.error(f"Erreur MySQL : {err}")
|
||||||
st.session_state["refresh_admin"] = random.randint(0, 9999) # Force le rerun
|
|
||||||
|
|
||||||
try:
|
|
||||||
conn_admin = mysql.connector.connect(**db_config)
|
|
||||||
cursor_admin = conn_admin.cursor(dictionary=True)
|
|
||||||
|
|
||||||
cursor_admin.execute("SELECT * FROM Chambres_froides WHERE Lieu = %s", (site_selectionne,))
|
|
||||||
chambres = cursor_admin.fetchall()
|
|
||||||
|
|
||||||
if not chambres:
|
|
||||||
st.warning("Aucune chambre froide pour ce site.")
|
|
||||||
else:
|
|
||||||
for chambre in chambres:
|
|
||||||
col1, col2, col3 = st.columns([3, 1, 2])
|
|
||||||
with col1:
|
|
||||||
st.markdown(f"**{chambre['Sonde']}**")
|
|
||||||
|
|
||||||
with col2:
|
|
||||||
etat = st.checkbox("ON", value=(chambre["Etat"] == "ON"),
|
|
||||||
key=f"etat_{chambre['Id']}_{st.session_state.get('refresh_admin', 0)}")
|
|
||||||
new_etat = "ON" if etat else "OFF"
|
|
||||||
|
|
||||||
with col3:
|
|
||||||
temp_max = chambre["Temp_Max"]
|
|
||||||
moins, val, plus = st.columns([1, 2, 1])
|
|
||||||
with moins:
|
|
||||||
if st.button("▼", key=f"moins_{chambre['Id']}"):
|
|
||||||
temp_max -= 1
|
|
||||||
with val:
|
|
||||||
st.markdown(f"<div style='text-align:center;font-size:20px'>{temp_max}°C</div>",
|
|
||||||
unsafe_allow_html=True)
|
|
||||||
with plus:
|
|
||||||
if st.button("▲", key=f"plus_{chambre['Id']}"):
|
|
||||||
temp_max += 1
|
|
||||||
|
|
||||||
if new_etat != chambre["Etat"] or temp_max != chambre["Temp_Max"]:
|
|
||||||
cursor_admin.execute(
|
|
||||||
"UPDATE Chambres_froides SET Etat = %s, Temp_Max = %s WHERE Id = %s",
|
|
||||||
(new_etat, temp_max, chambre["Id"])
|
|
||||||
)
|
|
||||||
conn_admin.commit()
|
|
||||||
st.success(f"{chambre['Sonde']} mise à jour")
|
|
||||||
|
|
||||||
cursor_admin.close()
|
|
||||||
conn_admin.close()
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
st.error(f"Erreur SQL (admin) : {e}")
|
|
||||||
|
|||||||
Reference in New Issue
Block a user