Accueil / esp8266 / ESP8266 (Web Serveur – Partie 3) : Récupérer l’heure sur un serveur de temps (NTP)

ESP8266 (Web Serveur – Partie 3) : Récupérer l’heure sur un serveur de temps (NTP)

Dans ce troisième tutoriel consacré à la création d’une interface Web pour des projets DIY à base d’ESP8266, nous allons apprendre comment récupérer l’heure depuis un serveur de temps (à l’aide de la librairie NtpClientLib). La zone de stockage SPIFFS qui équipe la majorité des ESP8266 est très pratique pour stocker des fichiers de configuration ou des mesures. L’Arduino et l’ESP8266 ne disposent pas d’horloge temps réel. On peut ajouter une horloge temps réelle (module RTC, Real Time Clock), ou profiter de la connexion internet de l’ESP8266 pour récupérer l’heure . On pourra ainsi facilement créer un petit système d’acquisition de données avec une base de temps (assez) précise.

Installer les librairie NTPClientLib et Time.

Avec l’ESP8266, on dispose d’une connexion internet permanente. Pour pouvoir récupérer le temps depuis un serveur de temps (serveur NTP, Network Time Protocol), l’ESP8266 doit être connecté à internet. Il n’est donc pas possible de l’utiliser en point d’accès (mode AP). Sauf à gérer une étape d’initialisation durant laquelle vous irez récupérer le temps.

Il est très facile de récupérer le temps sur internet à l’aide de la librairie NTPClientLib développée par gmag11. Pour fonctionner, il faudra également installer et déclarer la librairie TimeLib standard de l’Arduino. Ces deux librairies sont disponibles depuis le gestionnaire de bibliothèque de l’IDE Arduino.

esp8266 ntp server ntpclientlib timelib arduino

Un fois les librairies installées, il ne reste plus qu’à les déclarer dans le sketch.

La librairie NtpClient met à disposition toutes les méthodes nécessaires à la gestion de temps mais elle utilise la librairie TimeLib pour fonctionner. Vous trouverez de nombreux tutoriels (anciens) sur internet qui décodent directement les messages UDP envoyés par le serveur de temps. Avec la librairie développée par gmag11, tout se travaille est devenu inutile.

Avant de pouvoir récupérer le temps sur internet, on doit déjà démarrer l’objet NTP. On le démarre avec la méthode begin() qui prend 3 paramètres dans le setup() :

  • l’URL du serveur de temps. Par défaut, on pourra interroger  pool.ntp.org
  • Décalage horaire qui correspond à votre fuseau horaire
  • Heure d’été. Mettre à True pour gérer le mode heure d’été, heures d’hivers

La méthode setInterval permet de définir la fréquence d’interrogation du serveur de temps. Restez raisonnable, inutile de re-synchroniser l’horloge de l’ESP8266 10 fois par secondes !  Vous allez surcharger inutilement le serveur NTP. Ici, le temps sera re-synchronisé chaque minute (ce qui est déjà beaucoup trop).

On peut créer un fonction callback qui sera appelée à chaque fois qu’un événement se produit (serveur inaccessible, mauvaise URL, demande de temps).

Maintenant que tout est prêt, on peut demander le temps à n’importe quel moment dans tour le code Arduino. La librairie NtpClientLib propose de nombreuses fonctions qui vont nous faciliter le travail en plus de synchroniser le temps avec un serveur NTP :

  • TimeZone (get ou set) : décalage horaire -11 à + 13
  • stop() : arrête la synchronisation du temps
  • Interval (get ou set) : temps en milli-secondes avant la prochaine synchronisation du temps avec le serveur NTP
  • DayLight (get ou set) : gestion de l’heure d’été
  • getTimeStr(temps unix) : permet de convertir directement le temps unix en chaine, pratique pour créer un affichage
  • getDateStr()
  • getDateStr(temps unix) : chaine contenant la date
  • getTimeDateString() : chaine contenant la date et heure
  • getLastNTPSync() : dernière synchronisation

Comme vous pouvez le voir, il existe presque toutes les combinaisons. Seul problème, les chaines ne sont pas (encore) dans un standard ISO. Vous risquez donc de rencontrer des problèmes si vous devez traiter ces dates dans du code navigateur (Javascript). Pour le moment, le mieux est donc de conserver le timestamp unix retourné par la fonction getTime(). Le timestamp (tampon horaire) présente aussi plusieurs avantages :

  • On peut facilement comparer deux dates par une simple soustraction. La différence de temps sera en secondes.
  • C’est un nombre assez court, donc économe en mémoire. C’est important dans un projet Arduino / ESP8266.
  • Il sera facile à traiter dans du code Javascript. La fonction new Date(timestamp) permet de créer une date très simplement.

Il existe  également quelques fonctions bien pratiques pour gérer le système

  • getUptimeString() : durée de fonctionnement de l’ESP8266
  • getUptime() : idem mais sous la forme d’un timestamp Unix
  • getLastBootTime() : temps écoulé depuis le dernier boot de l’ESP8266
  • getFirstSync() : première synchronisation avec le serveur depuis le démarrage

Le temps Unix (Unix timestamp), c’est quoi ?

Le temps unix a débuté le 1er janvier 1970 à minuit. C’est un compteur en secondes. Vous pouvez directement convertir un temps unix dans le code Arduino pour en déduire une date ou une heure (ou le tout) à l’aide des fonctions getTimeStr(temps unix) et getDateStr(temps unix). Il existe également de nombreux convertisseurs sur internet (http://www.unixtimestamp.com/ ou en français http://www.timestamp.fr/).

Serveurs NTP

Voici une petite liste d’autres serveurs de temps (en France et dans le monde). Il en existe des centaines (probablement plus encore !)

http://www.pool.ntp.org/zone/fr, indiquer fr.pool.ntp.org

https://services.renater.fr/ntp/serveurs_francais

Dans le prochain tutoriel, nous utiliserons cette base de temps pour créer un historique des mesures qui servira à la création des graphiques.

 

  • Clemzo

    Bonjour,

    Et merci pour vos très bon articles.

    D’après mes tests, il semble que le paramètre de réglage de la fréquence d’interrogation, s’exprime en secondes.
    Donc un paramètre de 60000 est équivalent à 1000 minutes.

    Cordialement.

    • Bonjour Clemzo. Effectivement, vous avez raison. Merci beaucoup. C’est corrigé.

  • Germán Martín

    Nice article. Regards!

    • Thank you very much. I’m really happy to see you here.