Temps unix : heure d'hiver?

Après avoir résolu le problème de savoir la date et heure unix d'une compilation
https://forum.arduino.cc/t/date-en-temps-unix-resolu/1103916/11

avec le petit programme

include "RTClib.h"

void setup() {
  delay(2000);
  Serial.begin(115200);
  Serial.println("\n");
  DateTime buildTime(__DATE__, __TIME__);
  uint32_t timestamp = buildTime.unixtime();
  Serial.println(timestamp);  }
void loop() {
  // put your main code here, to run repeatedly:

}

J'obtiens 1679260473 soit en utilisant Convertisseur de temps Unix - Time.is](Convertisseur de temps Unix - Time.is)
Sun Mar 19 2023 22:14:33 UTC+0100 (heure normale d’Europe centrale)

Quand je demande la même chose d'un fichier stocké sur le serveur et dont la date est 19/03/2023 21:54:07 dans mon windows mais aussi sur le serveur avec Winscp ce qui donne 1679259247

Y a une heure de décalage..
Une histoire d'heure d'hiver vraissemblablement

Vu que l'heure d'hiver n'existe qu'en hiver.. .
Comment faire pour que mon fichier plus récent ne soit pas plus ancien que le vieux ?

Si je retire une heure au résultat, l'été à chaque démarrage je ferais un update en boucle.
Doit bien y avoir une solution pour que timestamp soit à l'heure en hiver

Salut.

le time_stamp, il devrait être en GMT ou UTC, c'est à dire l'heure de Greenwich, ou plus globalement "heure +0".
C'est un très gros avantage à l'échelle de la planète (c'est une référence commune), et ça commence à gêner quand on arrive à l'échelle locale.

Mon meilleur conseil c'est de la jouer comme le font nos appareils électroniques: récupérer et travailleur sur la donnée reçue "en l'état".
Ensuite, et seulement quand tu as besoin d'un affichage "humain", tu fais la correction nécessaire (d'ailleurs, sauf bêtise, il faudra bientôt passer à l'heure d'été, puis rebelote dans 6 mois).

Si les 2 heures différentes viennent d'un serveur et de ton PC, je me vois mal te conseiller de configurer ton windows en GMT, tu dois plus souvent avoir besoin de l'heure usuelle (GMT+1) pour la vie de tous les jours.

Pour ma station météo, j'ai la chance d'avoir l'opportunité de le traiter directement avec cette formule:

EDIT: script, ça n'est pas un code "arduino"

var CurrentDate = new Date();
var Date_Heure = Utilities.formatDate(CurrentDate, "Europe/Paris","dd/MM/YYYY HH:mm:ss")

comme tu peux voir, la date est reçue en GMT/UTC, et je dois la convertir ensuite pour mes propres besoins.
Peut être existe-t-il une config équivalente du coté du serveur Winscp?

EDIT: depuis le forum, quelques conseils pour manipuler à ta guise la valeur de date. Mais il faudra penser à faire le changement d'heure deux fois par an!

J'ai supprimé mon message car je faisais fausse route.
Aucune plus-value pour le sujet :wink: :wink:
Bonne soirée.

Je ne me rappel plus exactement, mais normalement tu dois pouvoir avec RTCLib dire que tu es à GTM+1, pour les calcules d'heure.

Sur un ESP8266 il y a un moyen de configurer la timezone :

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

Cela permet de configurer la lecture de l'heure courante par NTP, en fixant la timezone :

  • dernier dimanche de mars à 2:00 : GMT+2
  • dernier dimanche d'octobre à 3:00 : GMT+1
#define MAX_SIZE 80

  time_t timestamp = time( NULL );
  char buffer[MAX_SIZE];
  struct tm *pTime = localtime(&timestamp );
  strftime(buffer, MAX_SIZE, "%d/%m/%Y %H:%M:%S", pTime);
  Serial.println(buffer);

L'heure locale française sera affichée.

Normalement, en passant en paramètre ton timestamp à localtime(), l'heure locale correspondante devrait être retournée.

Sûrement...
Mais TIME est défini au moment de la compilation

Je lance le petit programme ci-dessus à 9h 57 j'obtiens 1679306271 qui donne

Mon Mar 20 2023 10:57:51 UTC+0100 (heure normale d’Europe centrale)

je compile un bin à 10h02 le fichier a bien été créé à ‎lundi ‎20 ‎mars ‎2023, ‏‎10:02:26

Je resete l'esp et comme prévu 1679306271 ne change pas

Donc c'est bien dans RTClib qu'il y a un pb

Une idée : l'éternel pb des indices commençant par 0 alors que l'heure 0 n'existe pas ?
Faudrait que je compile à 23h et à 0h pour voir mais les moustachus qui savent regarder dans RTCliv pourront répondre avant ;-))

Avec

#include "RTClib.h"
void setup() {
  delay(2000);
  Serial.begin(115200);
  Serial.println("\n");
  DateTime buildTime(__DATE__, __TIME__);
  uint32_t timestamp = buildTime.unixtime();
  Serial.println(__TIME__);
  Serial.println(timestamp);  }
void loop() {}

J'obtiens
10:20:39
1679307639 ===> Mon Mar 20 2023 11:20:39 UTC+0100 (heure normale d’Europe centrale)

Je ne suis pas sûre d'avoir compris ton explication.

Tu parle du programme montré en #1
Tu lance ton programme à 9h57, RTC te renvois l'heure de cet instant?
Tu re compile ton programme, puis le lance à une heure plus tardive que 9h57?
Tu as compilé ton programme à 10h02, mais il continu d'afficher 9h57?

Oui le programme compile avec __ TIME __ qui est l'heure au moment de la compilation

Donc si l'esp n'a pas de nouvelle compilation il donnera toujours l'heure enregistrée au moment de la compilation.
J'utilise RTClib/RTClib.h at master · adafruit/RTClib · GitHub prise dans le gestionnaire comme version 2.1.1 avec arduino 1.8.19 car c'est à ma connaissance la dernière version portable.

C'est cette qualité qui va me permettre que le programme puisse comparer la version sur le serveur et celle actuelle.

C'est normal, la librairie RTClib ne connais pas les timezones, tandis que la librairie standard, une fois configurée avec configTzTime(), les connaît.

Solution please ?

Retirer 3600 secondes en heure d'hiver et 7200 en heure d'été ? Bof

Régler windows pour qu'il affiche l'heure en GMT ?

Question : pourquoi ne pas travailler avec un numéro de version, directement renseigné dans le code, que tu incrémentes à chaque nouvelle version testée / validée ?
V1.00, V1.01, etc. pour un changement de version mineur
V2.00, V2.01, etc. pour un changement de version majeur

C'est comme cela que tous les développeurs travaillent, jamais avec la date et l'heure de compilation.
Je ne sais pas comment tu gères tes sources, mais avec GIT, il est possible de taguer un logiciel.
Donc, si tu tague chaque version que tu livres, en ayant au préalable renseigné cette version dans le code, tu sais retrouver ensuite pour chaque version les fichiers sources correspondants, faire des comparaisons entre versions, etc.

Regarde ce projet personnel :
https://bitbucket.org/henri_bachetti/mysensors-gate/src/master/
Si tu cliques sur le bouton master, puis sur tags, tu obtiens la liste des tags, et il est possible de visualiser les sources dans les différentes versions.
Dans le code, la version n'est pas renseignée, parce que je n'en ai pas besoin, mais une simple variable suffirait.

Programmer un microcontrôleur n'est qu'un moyen pour moi de répondre à un problème, mes efforts sont ailleurs et utiliser GIT : je n'ai jamais pris le temps de savoir m'en servir.

Utiliser un compteur, j'ai déjà fait mais ce sont deux fichiers à changer à chaque version : le bin et le compteur... Paresse : moteur de trouver par un gros effort au lieu de petits efforts répétitifs

Oui, mais c'est plus rationnel et plus facile. Ce n'est pas grand chose.
Remarque bien que le binaire peut très bien contenir le numéro de version, sous deux formes :

const char *version = "V1.0.0"

Ensuite copier le binaire sur le serveur en le renommant :

sample.V1.0.0.bin

Le serveur a juste à analyser le nom.

J'ai découvert récemment __ FILE __ qui m'a permis de me passer de mettre à chaque fois un serial print compliqué pour savoir quel programme était dans le micro contrôleur. Avec esp32 j'ai le chemin complet, avec ESP8266 je n'ai que le nom du fichier... Je sais pas pourquoi mais je termine son stock d'ESP8266 :-)))

Je vais garder __ DATE __ et __ TIME __ même s'il me faudra corriger le résultat, encore que des mises à jours y en a souvent espacées de moins de 2 heures en été, je fais autre chose... et l'hiver -3600 dans le programme.

Ce qui me plait dans la programmation c'est que même si on loupe on peut corriger sans avoir à refaire. Et je loupe souvent...

Il est possible de calculer le décalage, je l'ai déjà fait :
https://bitbucket.org/henri_bachetti/mysensors-gate/src/master/arduino/mysensors-gate/timedate.cpp

Voir la méthode int GateScheduler::getTimeZoneOffset(time_t utc)

sans vouloir insister, j'ai joint à ma proposition un lien vers des infos pour régler le server Winscp. De là il semble que tu puisses adapter à tes besoins l'heure reçue.
Et ça sera quand même mieux que passer ton windows en GMT (même si c'est effectivement une solution).

Est-ce que j'ai bien compris que 3 éléments distincts vont recevoir ou émettre un time_stamp?

  • le server winscp;
  • le windows de ton pc;
  • ton code arduino
    ?

Timestamp

WinSCP automatically resolves %TIMESTAMP[rel]#format% to a real time (optionally to a past or future time) with the given format. The format may include yyyy for year, mm for month, dd for day, hh for hour, nn for minute and ss for second. For example, the %TIMESTAMP#yyyy-mm-dd% resolves to 2016-06-22 on 22 June 2016. See other formats you can use.

The optional rel part, with syntax [-+]time[YDHNS], produces past (-) or future (+) timestamps. One of the following units must be used: Y (years), D (days), H (hours), N (minutes) or S (seconds). For example, the %TIMESTAMP-1D#yyyy-mm-dd% (the -1D meaning one day in the past) resolves to 2016-06-21 on 22 June 2016.

To use %TIMESTAMP...% on a command-line in a batch file, you need to escape the % by doubling it to %%TIMESTAMP...%%, to avoid a batch file interpreter trying to resolve the variable.

Oui c'est vrai que c'est un serveur Windows.

Merci pour la proposition de règler winSCP en heure GMT mais pour satisfaire mon côté paresseux comme faire pratiqement ?
Un réglage dans dans les propriétés avancées du serveur ?
Pour l'instant j'ai "ajuster l'horodatage distantnaux conventions locales (unix) et Garder l(horodatage distant (unix) est grisé