[Résolu] - Question sur librairie NtpClientLib

Bonjour,

Je souhaiterais interroger un serveur NTP via mon nodeMCU. J'ai donc téléchargé la lib NtpClientLib pour faire cela.

Tout marche bien, je récupère bien l'heure.

Cependant aujourd'hui, nous venons de passer en heure d'été et j'ai donc un décalage d'une heure par rapport à l'heure officielle française.

Comment remédier à cela ?

Il y a bien un 3eme paramètre dans le constructeur du client NTP :

NTP.begin ("pool.ntp.org", timeZone, false, minutesTimeZone);

qui est un boolean qui indique si l'heure d'été est prise en compte ou non. Mais comment savoir ce paramètre si l'on ne connait pas encore l'heure ?

Merci de votre éclairage sur ce point.

Bon confinement à tous ! )

Aïe …
Typiquement sur un système classique, des fichiers TimeZone sont présents dans l’arborescence système.
/usr/share/zoneinfo/Europe/Paris pour Linux par exemple.
Les fichiers timezone sont exploités par certaines routines de la librairie C, localtime() entre autres.

En ce qui concerne l’ESP32 j’avoue que tu me poses une colle.

Je dirais que si tu comptes simplement obtenir l’heure locale en France, la règle est simple.
Par rapport à l’heure UTC :
Dernier dimanche de mars : décalage de +2 heures.
Dernier dimanche d’octobre : décalage de +1 heure.

Personnellement je récupérerais l’heure UTC et j’ajouterais +1 ou +2 heures en fonction de l’heure récupérée.

Apparemment il existe ceci :

https://platformio.org/lib/show/5438/NTP

En fait jusqu'à présent j'utilisais :

const char* ntpServer = "pool.ntp.org";
  configTime(3600, 0, ntpServer);

Cela suppose de connaître le décalage :confused: il y a une autre possibilité :

const char* ntpServer = "pool.ntp.org";
  configTzTime("CET-1CEST,M3.5.0,M10.5.0/3", ntpServer);

Le paramètre "CET-1CEST,M3.5.0,M10.5.0/3" est celui que me donne mon fichier /usr/share/zoneinfo/Europe/Paris sous Linux.

hbachetti: Apparemment il existe ceci :

https://platformio.org/lib/show/5438/NTP

Hey !! Merci !! ça a l'air de marcher parfaitement même si on ne connait pas le serveur que la lib requête !

En fait je n'utilise aucune librairie. configTime et configTzTime font partie du standard ESP32. Pour ESP8266 je n'ai pas encore regardé.

const char* ntpServer = "pool.ntp.org"; configTzTime("CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", ntpServer);

La TZ string est plus complète que la précédente. https://remotemonitoringsystems.ca/time-zone-abbreviations.php Explications : https://www.di-mgt.com.au/wclock/tz.html

Par contre cela marchera pour récupérer l'heure courante ou récente. Avant, les règles étaient différentes (1977 je crois).

bonjour à tous,

j’utilise l’heure internet pour le reboot de ma Freebox avec un ESP01. Le changement de l’heure d’été/hiver n’est pas un problème cruicial mais j’aurais aimé comprendre de quoi vous parlez!
J’utilise comme base ce programme :

// ESP8266 ESP-01 Internet real time clock
 #include <ESP8266WiFi.h>
#include <WiFiUdp.h>
 
#include <NTPClient.h>               // Include NTPClient library
#include <TimeLib.h>                 // Include Arduino time library
#define relayPin 2    // GPIO2
 
const char *ssid     = "Freebox";
const char *password = "password";
 
WiFiUDP ntpUDP;
 
// 'time.nist.gov' is used (default server) with +1 hour offset (3600 seconds) 60 seconds (60000 milliseconds) update interval
NTPClient timeClient(ntpUDP, "time.nist.gov", 3600, 60000);
 
char Time[] = "TIME:00:00:00";
char Date[] = "DATE:00/00/2000";
byte last_second, second_, minute_, hour_, day_, month_;
int year_;
 
 
void setup() {
 
  Serial.begin(115200);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW);
  
  WiFi.begin(ssid, password);
 
  Serial.print("Connecting.");
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("connected");
 
  timeClient.begin();
}
 
void loop() {
 
  timeClient.update();
  unsigned long unix_epoch = timeClient.getEpochTime();    // Get Unix epoch time from the NTP server
 
  second_ = second(unix_epoch);
  if (last_second != second_) {
 
    minute_ = minute(unix_epoch);
    hour_   = hour(unix_epoch)+1;
    day_    = day(unix_epoch);
    month_  = month(unix_epoch);
    year_   = year(unix_epoch);
 
    Time[12] = second_ % 10 + 48;
    Time[11] = second_ / 10 + 48;
    Time[9]  = minute_ % 10 + 48;
    Time[8]  = minute_ / 10 + 48;
    Time[6]  = hour_   % 10 + 48;
    Time[5]  = hour_   / 10 + 48;
 
    Date[5]  = day_   / 10 + 48;
    Date[6]  = day_   % 10 + 48;
    Date[8]  = month_  / 10 + 48;
    Date[9]  = month_  % 10 + 48;
    Date[13] = (year_   / 10) % 10 + 48;
    Date[14] = year_   % 10 % 10 + 48;
 
    // Send time and date to serial monitor
    Serial.println(Time);
    Serial.println(Date);

    
 if (hour_==04 && minute_==59) {
  digitalWrite(relayPin, HIGH);
  delay(500);
  digitalWrite(relayPin, LOW);
  delay(60000);
 }
 last_second = second_;
  }
 
  delay(200);
 
}

Déjà, je ne comprends pas la construction de l’heure mais…passons.
Ensuite, j’ai bien repéré dans mon programme le “time.nist.gov” dont vous faites allusion. Pour l’heure d’été, j’ai simplement écrit

    hour_   = hour(unix_epoch)+1;

ce qui n’a aucun caractère de changement d’heure automatique.
alors votre solution offre t-elle le changement automatique et si oui comment modifiez vous mon code?
Merci,

Il me semble avoir donné un lien vers une librairie en #3. Essaie les exemples.

salut Henry,

ta mémoire est bonne, tu as bien donné un lien vers une librairie en #3, et d'autres infos en #2 #4 #5 #7. Sauf que je n'ai pas ton niveau en Arduino, ni celui de JML et donc, sauf à avoir l'impression quasi systématique de me prendre un fion à chaque question que je pose, je n'avance pas.

Pour en revenir à nos moutons, votre solution (à Achappard et toi) offre t-elle une mise à jour auto de l'heure d'hiver?

Voir le commentaire #5. Achappard a l'air satisfait. Personnellement j'utilise un ESP32 avec une autre solution.

Oui la lib trouvée par hbachetti en #3 fournie une mise à jour auto de l'heure en fonction de l'heure d'été et d'hivers. Pour la tester j'ai simplement exécuter les scripts d'exemple fournie avec la lib. (Même pas besoin de copier coller ;)