Mise à jour de domo91.py depuis develop révision 5
This commit is contained in:
133
domo91.py
133
domo91.py
@@ -34,7 +34,8 @@ def generer_pdf(site, date_str):
|
|||||||
conn = mysql.connector.connect(**db_config)
|
conn = mysql.connector.connect(**db_config)
|
||||||
cursor = conn.cursor(dictionary=True)
|
cursor = conn.cursor(dictionary=True)
|
||||||
|
|
||||||
cursor.execute(f"SELECT Sonde, Date, Temperature FROM `{site}` WHERE DATE(Date) = %s ORDER BY Sonde, Date", (date_str,))
|
cursor.execute(f"SELECT Sonde, Date, Temperature FROM `{site}` WHERE DATE(Date) = %s ORDER BY Sonde, Date",
|
||||||
|
(date_str,))
|
||||||
rows = cursor.fetchall()
|
rows = cursor.fetchall()
|
||||||
df = pd.DataFrame(rows)
|
df = pd.DataFrame(rows)
|
||||||
df["Heure"] = pd.to_datetime(df["Date"]).dt.strftime("%H:%M")
|
df["Heure"] = pd.to_datetime(df["Date"]).dt.strftime("%H:%M")
|
||||||
@@ -45,7 +46,8 @@ def generer_pdf(site, date_str):
|
|||||||
releves[sonde] = list(zip(df_sonde["Heure"], df_sonde["Temperature"]))
|
releves[sonde] = list(zip(df_sonde["Heure"], df_sonde["Temperature"]))
|
||||||
|
|
||||||
table_alertes = f"Alertes_{site}"
|
table_alertes = f"Alertes_{site}"
|
||||||
cursor.execute(f"SELECT Sonde, Debut_defaut, Status FROM {table_alertes} WHERE DATE(Debut_defaut) = %s", (date_str,))
|
cursor.execute(f"SELECT Sonde, Debut_defaut, Status FROM {table_alertes} WHERE DATE(Debut_defaut) = %s",
|
||||||
|
(date_str,))
|
||||||
alertes = cursor.fetchall()
|
alertes = cursor.fetchall()
|
||||||
|
|
||||||
cursor.close()
|
cursor.close()
|
||||||
@@ -106,6 +108,7 @@ def generer_pdf(site, date_str):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
st.error(f"Erreur lors de la génération du PDF : {e}")
|
st.error(f"Erreur lors de la génération du PDF : {e}")
|
||||||
|
|
||||||
|
|
||||||
# --- Initialisation des variables de session ---
|
# --- Initialisation des variables de session ---
|
||||||
if "authenticated" not in st.session_state:
|
if "authenticated" not in st.session_state:
|
||||||
st.session_state["authenticated"] = False
|
st.session_state["authenticated"] = False
|
||||||
@@ -130,6 +133,16 @@ if not st.session_state.get("authenticated"):
|
|||||||
st.session_state["role"] = result["role"]
|
st.session_state["role"] = result["role"]
|
||||||
st.session_state["lieu_autorise"] = result["Lieu"]
|
st.session_state["lieu_autorise"] = result["Lieu"]
|
||||||
st.success(f"Connecté comme {result['role']} ({result['Lieu']})")
|
st.success(f"Connecté comme {result['role']} ({result['Lieu']})")
|
||||||
|
# Enregistrement de la connexion dans Connexion_Log
|
||||||
|
try:
|
||||||
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
cursor.execute("""
|
||||||
|
INSERT INTO Connexion_Log (Utilisateur, Lieu, Date_Connexion)
|
||||||
|
VALUES (%s, %s, %s)
|
||||||
|
""", (login, result["Lieu"], now))
|
||||||
|
conn.commit()
|
||||||
|
except Exception as e:
|
||||||
|
st.warning(f"⚠️ Connexion enregistrée échouée : {e}")
|
||||||
st.rerun()
|
st.rerun()
|
||||||
else:
|
else:
|
||||||
st.sidebar.error("Identifiants invalides")
|
st.sidebar.error("Identifiants invalides")
|
||||||
@@ -158,7 +171,6 @@ if site_pdf and date_pdf:
|
|||||||
if st.sidebar.button("📥 Télécharger l’état du jour (PDF)", key="pdf_btn"):
|
if st.sidebar.button("📥 Télécharger l’état du jour (PDF)", key="pdf_btn"):
|
||||||
generer_pdf(site_pdf, date_pdf.strftime("%Y-%m-%d"))
|
generer_pdf(site_pdf, date_pdf.strftime("%Y-%m-%d"))
|
||||||
|
|
||||||
|
|
||||||
# 🔔 Forcer une alerte de test dynamique avec choix de la sonde (réservé aux superviseurs)
|
# 🔔 Forcer une alerte de test dynamique avec choix de la sonde (réservé aux superviseurs)
|
||||||
if st.session_state.get("authenticated") and st.session_state.get("role") == "superviseur":
|
if st.session_state.get("authenticated") and st.session_state.get("role") == "superviseur":
|
||||||
site_actuel = (
|
site_actuel = (
|
||||||
@@ -218,6 +230,42 @@ if st.session_state.get("authenticated") and st.session_state.get("role") == "su
|
|||||||
|
|
||||||
# --- CONTENU PRINCIPAL SI AUTHENTIFIÉ ---
|
# --- CONTENU PRINCIPAL SI AUTHENTIFIÉ ---
|
||||||
if st.session_state["authenticated"]:
|
if st.session_state["authenticated"]:
|
||||||
|
# --- AFFICHAGE GLOBAL DES ALERTES NON ACQUITTÉES ---
|
||||||
|
try:
|
||||||
|
conn = mysql.connector.connect(**db_config)
|
||||||
|
cursor = conn.cursor(dictionary=True)
|
||||||
|
|
||||||
|
site_selectionne = (
|
||||||
|
st.session_state["lieu_autorise"]
|
||||||
|
if st.session_state["role"] != "superviseur"
|
||||||
|
else st.session_state.get("selected_site", "Saclay")
|
||||||
|
)
|
||||||
|
|
||||||
|
table_alertes = f"Alertes_{site_selectionne}"
|
||||||
|
cursor.execute(
|
||||||
|
f"SELECT Sonde, Debut_defaut, Status FROM `{table_alertes}` WHERE Status != 'Acquitté' ORDER BY Debut_defaut DESC"
|
||||||
|
)
|
||||||
|
alertes = cursor.fetchall()
|
||||||
|
|
||||||
|
if alertes:
|
||||||
|
df_alertes = pd.DataFrame(alertes)
|
||||||
|
st.subheader("🚨 Alertes non acquittées")
|
||||||
|
st.dataframe(df_alertes, use_container_width=True)
|
||||||
|
else:
|
||||||
|
st.success("✅ Aucune alerte en cours.")
|
||||||
|
|
||||||
|
cursor.close()
|
||||||
|
conn.close()
|
||||||
|
except Exception as e:
|
||||||
|
st.error(f"Erreur lors de la récupération des alertes : {e}")
|
||||||
|
|
||||||
|
# --- NAVIGATION ---
|
||||||
|
if st.session_state["role"] == "superviseur":
|
||||||
|
onglet = st.sidebar.radio("📁 Navigation", ["Accueil", "Statistiques"])
|
||||||
|
else:
|
||||||
|
onglet = "Accueil"
|
||||||
|
|
||||||
|
if onglet == "Accueil":
|
||||||
st.markdown("## Sélection du site et de la date")
|
st.markdown("## Sélection du site et de la date")
|
||||||
try:
|
try:
|
||||||
conn = mysql.connector.connect(**db_config)
|
conn = mysql.connector.connect(**db_config)
|
||||||
@@ -230,7 +278,6 @@ if st.session_state["authenticated"]:
|
|||||||
site_selectionne = st.session_state["lieu_autorise"]
|
site_selectionne = st.session_state["lieu_autorise"]
|
||||||
st.info(f"Site imposé : {site_selectionne}")
|
st.info(f"Site imposé : {site_selectionne}")
|
||||||
|
|
||||||
|
|
||||||
selected_date = st.date_input("📅 Date du relevé", value=date.today())
|
selected_date = st.date_input("📅 Date du relevé", value=date.today())
|
||||||
st.session_state["selected_date"] = selected_date
|
st.session_state["selected_date"] = selected_date
|
||||||
|
|
||||||
@@ -243,13 +290,11 @@ if st.session_state["authenticated"]:
|
|||||||
df = pd.DataFrame(rows)
|
df = pd.DataFrame(rows)
|
||||||
df["Date"] = pd.to_datetime(df["Date"])
|
df["Date"] = pd.to_datetime(df["Date"])
|
||||||
sondes = sorted(df["Sonde"].unique())
|
sondes = sorted(df["Sonde"].unique())
|
||||||
sonde_choisie = st.selectbox("🧪 Choisissez une sonde :", sondes)
|
sonde_choisie = st.selectbox("🧪 Choisissez une sonde :", sondes, key="selectbox_accueil")
|
||||||
df_sonde = df[df["Sonde"] == sonde_choisie]
|
df_sonde = df[df["Sonde"] == sonde_choisie]
|
||||||
|
|
||||||
# Ajouter une colonne Heure pour faciliter les filtres
|
|
||||||
df_sonde.loc[:, "Heure"] = df_sonde["Date"].dt.hour
|
df_sonde.loc[:, "Heure"] = df_sonde["Date"].dt.hour
|
||||||
|
|
||||||
# Filtrage par tranche horaire
|
|
||||||
tranche = st.radio("🕒 Tranche horaire :",
|
tranche = st.radio("🕒 Tranche horaire :",
|
||||||
["Toute la journée", "Matin (6h-12h)", "Après-midi (12h-18h)", "Nuit (18h-6h)"])
|
["Toute la journée", "Matin (6h-12h)", "Après-midi (12h-18h)", "Nuit (18h-6h)"])
|
||||||
|
|
||||||
@@ -261,7 +306,8 @@ if st.session_state["authenticated"]:
|
|||||||
df_sonde = df_sonde[(df_sonde["Heure"] >= 18) | (df_sonde["Heure"] < 6)]
|
df_sonde = df_sonde[(df_sonde["Heure"] >= 18) | (df_sonde["Heure"] < 6)]
|
||||||
df_sonde = df_sonde.copy()
|
df_sonde = df_sonde.copy()
|
||||||
|
|
||||||
cursor.execute("SELECT Temp_Max FROM Chambres_froides WHERE Lieu = %s AND Sonde = %s", (site_selectionne, sonde_choisie))
|
cursor.execute("SELECT Temp_Max FROM Chambres_froides WHERE Lieu = %s AND Sonde = %s",
|
||||||
|
(site_selectionne, sonde_choisie))
|
||||||
seuil = cursor.fetchone()
|
seuil = cursor.fetchone()
|
||||||
seuil_temp = seuil["Temp_Max"] if seuil else 10
|
seuil_temp = seuil["Temp_Max"] if seuil else 10
|
||||||
|
|
||||||
@@ -279,10 +325,7 @@ if st.session_state["authenticated"]:
|
|||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
# Appliquer le style uniquement à la colonne "Temperature"
|
|
||||||
|
|
||||||
styled_df = df_filtré.style.applymap(surlignage_temp, subset=["Temperature"])
|
styled_df = df_filtré.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")
|
||||||
@@ -295,23 +338,63 @@ if st.session_state["authenticated"]:
|
|||||||
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
|
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
|
||||||
ax.legend()
|
ax.legend()
|
||||||
st.pyplot(fig)
|
st.pyplot(fig)
|
||||||
|
|
||||||
|
cursor.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
st.error(f"Erreur MySQL : {e}")
|
||||||
|
|
||||||
|
elif onglet == "Statistiques":
|
||||||
|
st.markdown("## 📈 Statistiques de température")
|
||||||
|
try:
|
||||||
|
conn = mysql.connector.connect(**db_config)
|
||||||
|
cursor = conn.cursor(dictionary=True)
|
||||||
|
|
||||||
|
site = (
|
||||||
|
st.session_state["lieu_autorise"]
|
||||||
|
if st.session_state["role"] != "superviseur"
|
||||||
|
else st.session_state.get("selected_site", "Saclay")
|
||||||
|
)
|
||||||
|
|
||||||
|
date_val = st.session_state.get("selected_date", date.today())
|
||||||
|
|
||||||
|
cursor.execute(
|
||||||
|
f"SELECT * FROM `{site}` WHERE DATE(Date) = %s ORDER BY Sonde, Date",
|
||||||
|
(date_val.strftime("%Y-%m-%d"),)
|
||||||
|
)
|
||||||
|
rows = cursor.fetchall()
|
||||||
|
df = pd.DataFrame(rows)
|
||||||
|
|
||||||
|
if df.empty:
|
||||||
|
st.info("Aucune donnée pour cette date.")
|
||||||
|
else:
|
||||||
|
df["Date"] = pd.to_datetime(df["Date"])
|
||||||
|
sondes = sorted(df["Sonde"].unique())
|
||||||
|
sonde = st.selectbox("Choisir une sonde :", sondes, key="selectbox_stats")
|
||||||
|
df_sonde = df[df["Sonde"] == sonde]
|
||||||
|
|
||||||
|
st.subheader("Évolution journalière")
|
||||||
|
fig, ax = plt.subplots(figsize=(10, 4))
|
||||||
|
ax.plot(df_sonde["Date"], df_sonde["Temperature"], marker='o')
|
||||||
|
ax.set_title(f"{sonde} - {date_val.strftime('%d/%m/%Y')}")
|
||||||
|
ax.set_xlabel("Heure")
|
||||||
|
ax.set_ylabel("Température (°C)")
|
||||||
|
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
|
||||||
|
st.pyplot(fig)
|
||||||
|
|
||||||
|
cursor.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
st.error(f"Erreur chargement statistiques : {e}")
|
||||||
|
|
||||||
# --- Affichage automatique des alertes non acquittées ---
|
# --- Affichage automatique des alertes non acquittées ---
|
||||||
try:
|
try:
|
||||||
conn = mysql.connector.connect(**db_config)
|
conn = mysql.connector.connect(**db_config)
|
||||||
cursor = conn.cursor(dictionary=True)
|
cursor = conn.cursor(dictionary=True)
|
||||||
|
|
||||||
table_alertes = f"Alertes_{site_selectionne}"
|
table_alertes = f"Alertes_{site_selectionne}"
|
||||||
cursor.execute(
|
|
||||||
f"SELECT Sonde, Debut_defaut, Status FROM `{table_alertes}` WHERE Status != 'Acquitté' ORDER BY Debut_defaut DESC"
|
|
||||||
)
|
|
||||||
alertes = cursor.fetchall()
|
|
||||||
|
|
||||||
if alertes:
|
|
||||||
df_alertes = pd.DataFrame(alertes)
|
|
||||||
st.subheader("🚨 Alertes non acquittées")
|
|
||||||
st.dataframe(df_alertes, use_container_width=True)
|
|
||||||
else:
|
|
||||||
st.success("✅ Aucune alerte en cours.")
|
|
||||||
|
|
||||||
cursor.close()
|
cursor.close()
|
||||||
conn.close()
|
conn.close()
|
||||||
@@ -378,13 +461,13 @@ if st.session_state["role"] == "superviseur":
|
|||||||
temp_max = chambre["Temp_Max"]
|
temp_max = chambre["Temp_Max"]
|
||||||
moins, val, plus = st.columns([1, 2, 1])
|
moins, val, plus = st.columns([1, 2, 1])
|
||||||
with moins:
|
with moins:
|
||||||
if st.button("-", key=f"moins_{chambre['Id']}"):
|
if st.button("▼", key=f"moins_{chambre['Id']}"):
|
||||||
temp_max -= 1
|
temp_max -= 1
|
||||||
with val:
|
with val:
|
||||||
st.markdown(f"<div style='text-align:center;font-size:20px'>{temp_max}°C</div>",
|
st.markdown(f"<div style='text-align:center;font-size:20px'>{temp_max}°C</div>",
|
||||||
unsafe_allow_html=True)
|
unsafe_allow_html=True)
|
||||||
with plus:
|
with plus:
|
||||||
if st.button("+", key=f"plus_{chambre['Id']}"):
|
if st.button("▲", key=f"plus_{chambre['Id']}"):
|
||||||
temp_max += 1
|
temp_max += 1
|
||||||
|
|
||||||
if new_etat != chambre["Etat"] or temp_max != chambre["Temp_Max"]:
|
if new_etat != chambre["Etat"] or temp_max != chambre["Temp_Max"]:
|
||||||
@@ -400,5 +483,3 @@ if st.session_state["role"] == "superviseur":
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
st.error(f"Erreur SQL (admin) : {e}")
|
st.error(f"Erreur SQL (admin) : {e}")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user