1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
|
#coding: utf-8
import csv
import os
import time
from datetime import datetime
import RPi.GPIO as gpio
Temp_Voulue_ECS = 55
import locale
# --- Configuration de la locale en français ---
# Nécessaire pour que strftime("%B") retourne "octobre" et non "October"
try:
locale.setlocale(locale.LC_TIME, 'fr_FR.UTF-8')
except locale.Error:
print("Locale fr_FR.UTF-8 non trouvée. Installation via 'sudo dpkg-reconfigure locales'.")
locale.setlocale(locale.LC_TIME, '') # Utilise la locale système par défaut
#print(current_date)
current_datetime = datetime.now()
current_month = current_datetime.strftime("%B%Y")
Source_dir = '/home/pi/Domotique/Donnees_Chaudiere/' + current_month
Source_file_Chaudiere = Source_dir + f"/{current_month}.txt"
Source_dir_Temperature = '/home/pi/Domotique/Donnees_Temperature/' + current_month
def Lecture_donnees_ECS():
try:
# 'with open' ferme automatiquement le fichier, même si une erreur survient
with open(Source_file_Chaudiere, 'r') as f_Etat_ECS:
lines_Etat_ECS = f_Etat_ECS.readlines()
# return lines_Etat_ECS
except FileNotFoundError:
print(f"Erreur: fichier non trouvé à* {Source_file_Chaudiere}")
return None
except Exception as e:
print(f"Erreur de lecture fichier {Source_file_Chaudiere}: {e}")
return None# print('pas de donnees')
try:
donnees_Etat_ECS = int(lines_Etat_ECS[-1].split(",")[12])
donnees_temperature_ECS = int(lines_Etat_ECS[-1].split(",")[16])
Heure = int(lines_Etat_ECS[-1].split(",")[1].split(":")[0])
return donnees_Etat_ECS,donnees_temperature_ECS,Heure
except (IndexError, ValueError) as e:
print(f"Erreur parsing données pour {Source_file_Chaudiere}: {e}")
return None
def Gestion_ECS(Temp_Voulue_ECS,donnees_Etat_ECS,donnees_temperature_ECS,Heure):
donnees_Etat_ECS = Lecture_donnees_ECS()[0]
donnees_temperature_ECS = Lecture_donnees_ECS()[1]
Heure = Lecture_donnees_ECS()[2]
# print(donnees_Etat_ECS)
# print(donnees_temperature_ECS)
# print(Heure)
try:
if donnees_Etat_ECS == 1 and donnees_temperature_ECS < Temp_Voulue_ECS and Heure in [22,23,0,1,2,3,4,5,6]:
gpio.setmode(gpio.BCM)
#Vanne ECS ouverte
gpio.setup(18, gpio.OUT)
gpio.output(18, gpio.LOW)
Vanne_ECS = "Ouverte"
#Chauffe-eau electrique sur on
gpio.setup(23, gpio.OUT)
gpio.output(23, gpio.LOW)
Chauffe_eau = "Allumé"
elif donnees_Etat_ECS == 1 and donnees_temperature_ECS < Temp_Voulue_ECS and Heure in [7,8,9,10,11,12,13,14,15,16,17,18,19,29,21]:
gpio.setmode(gpio.BCM)
#Vanne ECS fermee
gpio.setup(18, gpio.OUT)
gpio.output(18, gpio.LOW)
Vanne_ECS = "Ouverte"
#Chauffe-eau electrique sur off
gpio.setup(23, gpio.OUT)
gpio.output(23, gpio.HIGH)
Chauffe_eau = "Eteint"
elif donnees_Etat_ECS == 1 and donnees_temperature_ECS > Temp_Voulue_ECS:
gpio.setmode(gpio.BCM)
#Vanne ECS ouverte
gpio.setup(18, gpio.OUT)
gpio.output(18, gpio.LOW)
Vanne_ECS = "Fermée"
#Chauffe-eau electrique sur off
gpio.setup(23, gpio.OUT)
gpio.output(23, gpio.HIGH)
Chauffe_eau = "Eteint"
elif donnees_Etat_ECS == 0 and donnees_temperature_ECS < Temp_Voulue_ECS and Heure in [22,23,0,1,2,3,4,5,6]:
gpio.setmode(gpio.BCM)
#Vanne ECS fermee
gpio.setup(18, gpio.OUT)
gpio.output(18, gpio.LOW)
Vanne_ECS = "Fermée"
#Chauffe-eau electrique sur on
gpio.setup(23, gpio.OUT)
gpio.output(23, gpio.LOW)
Chauffe_eau = "Allumé"
elif donnees_Etat_ECS == 0 and donnees_temperature_ECS < Temp_Voulue_ECS and Heure in [7,8,9,10,11,12,13,14,15,16,17,18,19,29,21]:
gpio.setmode(gpio.BCM)
#Vanne ECS fermee
gpio.setup(18, gpio.OUT)
gpio.output(18, gpio.LOW)
Vanne_ECS = "Fermée"
#Chauffe-eau electrique sur off
gpio.setup(23, gpio.OUT)
gpio.output(23, gpio.HIGH)
Chauffe_eau = "Eteint"
elif donnees_Etat_ECS == 0 and donnees_temperature_ECS > Temp_Voulue_ECS:
gpio.setmode(gpio.BCM)
#Vanne ECS fermee
gpio.setup(18, gpio.OUT)
gpio.output(18, gpio.LOW)
Vanne_ECS = "Fermée"
#Chauffe-eau electrique sur off
gpio.setup(23, gpio.OUT)
gpio.output(23, gpio.HIGH)
Chauffe_eau = "Eteint"
return Vanne_ECS,Chauffe_eau
except Exception as e:
# print(f"Une erreur inattendue est survenue: {e}")
print("Toto")
return None
#print(Gestion_ECS(Temp_Voulue_ECS,donnees_Etat_ECS,donnees_temperature_ECS,Heure)[0])
#print(Gestion_ECS(Temp_Voulue_ECS,donnees_Etat_ECS,donnees_temperature_ECS,Heure)[1])
#--- Boucle Principale ---
print("Lancement du script d'enregistrement des données...")
print(Lecture_donnees_ECS()[0])
print(Lecture_donnees_ECS()[1])
print(Lecture_donnees_ECS()[2])
print(Gestion_ECS(Temp_Voulue_ECS,donnees_Etat_ECS=Lecture_donnees_ECS()[0],donnees_temperature_ECS=Lecture_donnees_ECS()[1],Heure=Lecture_donnees_ECS()[2])[0])
print(Gestion_ECS(Temp_Voulue_ECS,donnees_Etat_ECS=Lecture_donnees_ECS()[0],donnees_temperature_ECS=Lecture_donnees_ECS()[1],Heure=Lecture_donnees_ECS()[2])[1])
while True:
try:
# --- 1. Calcul des chemins (Ã FAIRE DANS LA BOUCLE) ---
# En calculant la date ici, le script céera un nouveau
# fichier/dossier Ã* chaque changement de mois.
current_datetime = datetime.now()
current_date = current_datetime.strftime("%Y-%m-%d")
current_time = current_datetime.strftime("%H:%M:%S")
# Utilise la locale 'fr_FR' pour obtenir le nom du mois
current_month = current_datetime.strftime("%B%Y")
Record_dir = '/home/pi/Domotique/Gestion_ECS/' + current_month
Record_file_ECS = Record_dir + f"/{current_month}.txt"
# --- 3. Création du dossier ---
# 'exist_ok=True' évite une erreur si le dossier existe déjâ*
os.makedirs(Record_dir, exist_ok=True)
# print(Record_dir)
# print(Record_file_ECS)
# --- 2. Lecture des températures ---
donnees_Etat_ECS = Lecture_donnees_ECS()[0]
donnees_temperature_ECS = Lecture_donnees_ECS()[1]
Heure = Lecture_donnees_ECS()[2]
Vanne_ECS = Gestion_ECS(Temp_Voulue_ECS,donnees_Etat_ECS=Lecture_donnees_ECS()[0],
donnees_temperature_ECS=Lecture_donnees_ECS()[1],Heure=Lecture_donnees_ECS()[2])[0]
Chauffe_eau = Gestion_ECS(Temp_Voulue_ECS,donnees_Etat_ECS=Lecture_donnees_ECS()[0],
donnees_temperature_ECS=Lecture_donnees_ECS()[1],Heure=Lecture_donnees_ECS()[2])[1]
# print(Vanne_ECS)
# print(Chauffe_eau)
data_to_write = {
"Date": current_date,
"Heure": current_time,
"Etat_ECS_Chaudiere": donnees_Etat_ECS if donnees_Etat_ECS is not None else "Erreur",
"Etat_Vanne_ECS": Vanne_ECS if Vanne_ECS is not None else "Erreur",
"Etat_Chauffe_eau_elec": Chauffe_eau if Chauffe_eau is not None else "Erreur",
"Température_ECS": donnees_temperature_ECS if donnees_temperature_ECS is not None else "Erreur"
}
#print(data_to_write.update(root))
# Vérifier si le fichier existe pour ecrire l'en-tete ou non
file_exists = os.path.isfile(Record_file_ECS)
# print(data_to_write.values())
with open(Record_file_ECS, "a", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
# écrire l'en-tete si le fichier est nouveau
if not file_exists:
writer.writeheader()
# écrire les donnees
writer.writerow(data_to_write)
time.sleep(60)
gpio.cleanup()
# Gare un arrêt manuel (Ctrl+C) proprement
except KeyboardInterrupt:
print("\nArrêt du script demandé par l'utilisateur.")
break # Sort de la boucle 'while True'
# Gère les autres erreurs (ex: permission d'écrire, etc.)
except Exception as e:
print(f"Une erreur inattendue est survenue: {e}")
print("Redémarrage de la boucle dans 90 secondes...")
time.sleep(90) # Pause plus longue en cas d'erreur inconnue |