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:
}
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
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!
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 ;-))
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.
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 :
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...
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.
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é