# Application Gestion de sondes import streamlit as st import mysql.connector import pandas as pd from datetime import date import matplotlib.pyplot as plt import matplotlib.dates as mdates import random from fpdf import FPDF import os st.set_page_config(page_title="Domo91 - Surveillance", layout="wide") st.title("📡 Supervision Températures") # --- Configuration base de données --- db_config = { "host": "54.36.188.119", "user": "michel", "password": "#SO2&1nf%mZ@jfh", "database": "Sondes" } # --- Initialisation session --- if "authenticated" not in st.session_state: st.session_state["authenticated"] = False st.session_state["role"] = None st.session_state["lieu_autorise"] = None # --- Sidebar (connexion + bouton PDF) --- with st.sidebar: st.header("🔐 Connexion") if not st.session_state.get("authenticated"): login = st.text_input("Nom d'utilisateur") password = st.text_input("Mot de passe", type="password") if st.button("Se connecter"): try: conn = mysql.connector.connect(**db_config) cursor = conn.cursor(dictionary=True) cursor.execute("SELECT * FROM MotsDePasse WHERE utilisateur = %s", (login,)) result = cursor.fetchone() if result and result["mot_de_passe"] == password: st.session_state["authenticated"] = True st.session_state["role"] = result["role"] st.session_state["lieu_autorise"] = result["Lieu"] st.success(f"Connecté comme {result['role']} ({result['Lieu']})") else: st.error("Identifiants invalides") cursor.close() conn.close() except Exception as e: st.error(f"Erreur lors de la connexion à la base : {e}") else: st.success(f"Connecté ({st.session_state['role']})") if st.button("🔓 Déconnexion"): st.session_state["authenticated"] = False st.session_state["role"] = None st.session_state["lieu_autorise"] = None st.rerun() st.markdown("---") st.subheader("📄 Rapport PDF") if "selected_date" in st.session_state: if st.button("📥 Télécharger l’état du jour (PDF)"): site = st.session_state["lieu_autorise"] date_val = st.session_state["selected_date"].strftime("%Y-%m-%d") def generer_pdf(site, date_str): releves = { "Chambre 1": [("06:00", 3.5), ("07:00", 3.2), ("08:00", 3.1)], "Congélateur": [("06:00", -18.1), ("07:00", -17.8), ("08:00", -17.5)] } alertes = [ {"Sonde": "Chambre 2", "Debut": f"{date_str} 08:45", "Statut": "En cours"}, {"Sonde": "Congélateur", "Debut": f"{date_str} 12:30", "Statut": "Acquittée"} ] class RapportPDF(FPDF): def header(self): self.set_font("Arial", "B", 14) self.cell(0, 10, "Rapport de surveillance des sondes", ln=1, align="C") self.set_font("Arial", "", 12) self.cell(0, 10, f"Date : {date_str}", ln=1, align="C") self.ln(5) def site_info(self, site_name): self.set_font("Arial", "B", 12) self.cell(0, 10, f"Site : {site_name}", ln=1) self.ln(2) def releves_section(self, data): self.set_font("Arial", "B", 12) self.cell(0, 10, "Relevés de température", ln=1) for sonde, mesures in data.items(): self.set_font("Arial", "B", 11) self.cell(0, 8, f"Sonde : {sonde}", ln=1) self.set_font("Arial", "", 10) for heure, temp in mesures: self.cell(0, 6, f"{heure} - {temp} °C", ln=1) self.ln(2) def alertes_section(self, data): self.set_font("Arial", "B", 12) self.cell(0, 10, "Alertes enregistrées", ln=1) self.set_font("Arial", "", 10) for a in data: self.cell(0, 6, f"{a['Sonde']} - {a['Debut']} - {a['Statut']}", ln=1) pdf = RapportPDF() pdf.add_page() pdf.site_info(site) pdf.releves_section(releves) pdf.alertes_section(alertes) file_name = f"rapport_{site}_{date_str}.pdf" output_path =file_name pdf.output(output_path) with open(output_path, "rb") as f: st.download_button( label="📥 Télécharger le rapport PDF", data=f, file_name=file_name, mime="application/pdf" ) generer_pdf(site, date_val) else: st.info("Sélectionnez une date pour activer la génération PDF.") # --- CONTENU PRINCIPAL SI AUTHENTIFIÉ --- if st.session_state["authenticated"]: st.markdown("## Sélection du site et de la date") try: conn = mysql.connector.connect(**db_config) cursor = conn.cursor(dictionary=True) sites_possibles = ["Saclay", "Meudon"] if st.session_state["role"] == "superviseur": site_selectionne = st.selectbox("📍 Choisissez un site :", sites_possibles) else: site_selectionne = st.session_state["lieu_autorise"] # --- SECTION ADMINISTRATEUR : Gestion des sondes du site --- if st.session_state["role"] == "superviseur": st.markdown("## 🛠️ Gestion des chambres froides") 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 chambres: for chambre in chambres: col1, col2, col3 = st.columns([3, 1, 2]) with col1: st.markdown(f"**{chambre['Sonde']}**") # --- Toggle ON/OFF with col2: etat = st.checkbox("ON", value=(chambre["Etat"] == "ON"), key=f"etat_{chambre['Id']}") new_etat = "ON" if etat else "OFF" # --- Contrôle +/- Temp_Max 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"