@@ -140,48 +140,54 @@ struct Programme {
140140
141141 public: bool start_progr () {
142142 struct tm timeinfo;
143- int heures;
144- int minutes;
145- sscanf (heure_demarrage, " %d:%d" , &heures, &minutes);
146- int heures_fin;
147- int minutes_fin;
143+ memset (&timeinfo, 0 , sizeof (timeinfo));
144+
145+ if (!getLocalTime (&timeinfo)) {
146+ Serial.println (" Échec récupération heure NTP" );
147+ return false ;
148+ }
149+
150+ int heures_debut, minutes_debut;
151+ int heures_fin, minutes_fin;
152+ sscanf (heure_demarrage, " %d:%d" , &heures_debut, &minutes_debut);
148153 sscanf (heure_arret, " %d:%d" , &heures_fin, &minutes_fin);
149154
150155 // si heure_demarrage == heure_arret alors on retourne false
151156 if (strcmp (heure_demarrage, heure_arret) == 0 ) {
152157 return false ;
153158 }
154159
155- // quand c'est l'heure de démarrer le programme
156- // /vérification que le ntp est synchronisé
157- if (getLocalTime ( &timeinfo )) {
158- if ( heures == timeinfo.tm_hour && minutes == timeinfo.tm_min && temperature > gDisplayValues .temperature ) {
159- // demarrage du cooler
160+ // Conversion en minutes depuis minuit pour faciliter les comparaisons
161+ int now_minutes = timeinfo.tm_hour * 60 + timeinfo.tm_min ;
162+ int debut_minutes = heures_debut * 60 + minutes_debut;
163+ int fin_minutes = heures_fin * 60 + minutes_fin;
164+
165+ // Démarrage exact à l'heure programmée
166+ if (heures_debut == timeinfo.tm_hour && minutes_debut == timeinfo.tm_min &&
167+ temperature > gDisplayValues .temperature ) {
160168 commande_run ();
161169 return true ;
162- }
163170 }
164171
165172 // remise en route en cas de reboot et si l'heure est dépassée
166173 // recherche si l'heure est passée
167- bool heure_passee = false ;
168- if (timeinfo.tm_hour > heures || (timeinfo.tm_hour == heures && timeinfo.tm_min > minutes )) {
169- heure_passee = true ;
170- }
171-
172- // recherche si l'heure d'arret est est passée
173- bool heure_arret_passee = false ;
174- if (timeinfo.tm_hour > heures_fin || (timeinfo.tm_hour == heures_fin && timeinfo.tm_min >= minutes_fin )) {
175- heure_arret_passee = true ;
174+ bool dans_plage = false ;
175+ if (fin_minutes > debut_minutes) {
176+ // Plage normale (ex: 08:00 -> 18:00)
177+ dans_plage = (now_minutes > debut_minutes && now_minutes < fin_minutes);
178+ } else {
179+ // Plage qui traverse minuit (ex: 22:00 -> 02:00)
180+ // On est dans la plage si on est après le début OU avant la fin
181+ dans_plage = (now_minutes > debut_minutes || now_minutes < fin_minutes);
176182 }
177183
178- // remise en route en cas de reboot et si l'heure est dépassée
179- if (heure_passee && !heure_arret_passee && temperature > gDisplayValues .temperature ) {
184+ // Remise en route en cas de reboot si on est dans la plage horaire
185+ if (dans_plage && temperature > gDisplayValues .temperature ) {
180186 commande_run ();
181187 return true ;
182188 }
183189
184- // protection fuite mémoire
190+ // Protection fuite mémoire
185191 if (temperature > 500 ) {
186192 savelogs (" -- reboot problème de fuite memoire -- " );
187193 ESP.restart ();
@@ -193,6 +199,13 @@ struct Programme {
193199 // / @return
194200 public: bool stop_progr () {
195201 struct tm timeinfo;
202+ memset (&timeinfo, 0 , sizeof (timeinfo));
203+
204+ if (!getLocalTime (&timeinfo)) {
205+ Serial.println (" Échec récupération heure NTP" );
206+ return false ;
207+ }
208+
196209 int heures ;
197210 int minutes;
198211 // / sécurité temp
0 commit comments