[ESP32] mais pourquoi ma timezone est ignorée ?

Bonjour,

J'ai le code suivant

    /* Initialize time zone (France) */
    setenv("TZ", "GMT0BST,M3.5.0/01,M10.5.0/02",1);    // France
    tzset();

puis ma fonction de test suivante, ou l'argument est passée au format suivant AAAAMMJJ.HHmmSS

void cmd_setdate( const String &arg ){
    struct tm tm;

    tm.tm_year = atoi( arg.substring(0,4).c_str() ) - 1900;
    tm.tm_mon = atoi( arg.substring(4,6).c_str() ) - 1;
    tm.tm_mday = atoi( arg.substring(6,8).c_str() );

    tm.tm_hour = atoi( arg.substring(9,11).c_str() );
    tm.tm_min = atoi( arg.substring(11,13).c_str() );
    tm.tm_sec = atoi( arg.substring(13).c_str() );

    tm.tm_isdst = 0;

    time_t timestamp = mktime( &tm );   // Seg depuis 1900
    struct tm *gmt_tm = gmtime( ×tamp ); // Tm en GMT

    Serial.print( "Setting time to : " );    // Affiche l'heure qui est sensee etre en GMT
    Serial.printf( "%04d/%02d/%02d %02d:%02d:%02d\n",
        gmt_tm->tm_year+1900, gmt_tm->tm_mon+1, gmt_tm->tm_mday,
        gmt_tm->tm_hour, gmt_tm->tm_min, gmt_tm->tm_sec
    );

gmt_tm = localtime( ×tamp );   // Affiche l'heure local
Serial.printf( "%04d/%02d/%02d %02d:%02d:%02d\n",
    gmt_tm->tm_year+1900, gmt_tm->tm_mon+1, gmt_tm->tm_mday,
    gmt_tm->tm_hour, gmt_tm->tm_min, gmt_tm->tm_sec
);
}

Alors du coup, lorsque je donne 20201201.020103

pourquoi il m'affiche : Setting time to : 2020/12/01 02:01:03 locale : 2020/12/01 02:01:03

normalement, la premiere devrait etre 2020/12/01 01:01:03

Bref, qu'est-ce que j'ai oublié ?

Cordialement

Laurent

Essaie ceci :

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

C'est la timezone pour Paris. Et le NTP ne fera pas de mal.

Ok, merci : c'était ca.

Par contre, reste toujours un probleme : il tient compte du dst fournit dans la structure TM plutot que de le calculer en fonction de la date donnée. Ainsi, en mettant DST = 0, on a pour 20201202.030201

01:02:27.182 -> Setting GMT time to : 2020/12/02 02:02:01
01:02:27.182 -> 2020/12/02 03:02:01

alors que 20200702.030201

01:00:51.322 -> Setting GMT time to : 2020/07/02 02:02:01
01:00:51.322 -> 2020/07/02 04:02:01

En fait, je ne sais pas s'il y a une solution propre pour l'éviter. Sinon, je vais calculer une fois un mktime()/gmtime(); juste pour déterminer le DST puis calculer la vraie heure (enfin, pas encore tester).

Pour le NTP, c'est aussi en cours :)

Bon, je vais laisser tomber : il faudrait que je recode plusieurs fonctions de la librairie pour stocker de l’UTC dans la RTC … mais surtout le chip n’est surtout pas prévu pour et donc faudrait que bidouille un max pour garder une certaines cohérences dans la gestion de l’alarme.
Bref, le jeux n’en vaut pas la chandelle : je vais donc y stocker la localtime comme tout le monde.
Après tout, le seul risque est 1 fois dans l’année au passage de l’heure d’été, et je met aussi mon téléphone pour le pas louper le car du ski club :slight_smile:

Salut,

Je rebondis sur ce vieux sujet car je me suis penché sur le NTP … et là surprise, il semblerait que la mise à jour de l’heure ne s’applique pas immédiatement.

Ainsi, avec le code suivant :

configTzTime("CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", "pool.ntp.org");
for(int i=0; i<20; i++){
    time_t timestamp = time( NULL );
    Serial.printf("sys : %s", ctime( &timestamp ));
   delay( 250 );
}

j’obtiens le résultat suivant :

14:47:02.808 -> Time synchronisation requested
14:47:02.808 -> sys : Sun Jan  2 03:04:28 2000
14:47:03.040 -> sys : Sun Jan  2 03:04:28 2000
14:47:03.306 -> sys : Sun Jan  2 03:04:28 2000
14:47:03.538 -> sys : Sun Jan  2 03:04:29 2000
14:47:03.803 -> sys : Sun Jan  2 03:04:29 2000
14:47:04.068 -> sys : Sun Jan  2 03:04:29 2000
14:47:04.301 -> sys : Sun Jan  2 03:04:29 2000
14:47:04.566 -> sys : Sun Jan  2 03:04:30 2000
14:47:04.798 -> sys : Sun Jan  2 03:04:30 2000
14:47:05.063 -> sys : Sun Jan  2 03:04:30 2000
14:47:05.295 -> sys : Sun Jan  2 03:04:30 2000
14:47:05.561 -> sys : Sun Jan  2 03:04:31 2000
14:47:05.793 -> sys : Sun Jan  2 03:04:31 2000
14:47:06.058 -> sys : Sun Jan  2 03:04:31 2000
14:47:06.290 -> sys : Thu Apr 22 14:47:05 2021
14:47:06.555 -> sys : Thu Apr 22 14:47:05 2021
14:47:06.820 -> sys : Thu Apr 22 14:47:05 2021
14:47:07.052 -> sys : Thu Apr 22 14:47:06 2021
14:47:07.317 -> sys : Thu Apr 22 14:47:06 2021
14:47:07.549 -> sys : Thu Apr 22 14:47:06 2021

Soit plus de 3 secondes après :crazy_face:
Comme si le ntp se faisait de manière asynchrone.
Étonnant non ?

Après tout, c’est pas plus mal car ca évite de bloquer le programme si le NTP est long a répondre (DNS, tousa).
Mais comment du coup savoir si l’heure a réelement et mise à jour ?

A+

Bonjour,

Oui c’est une fonction asynchrone, heureusement !

Tu peux utiliser sntp_set_time_sync_notification_cb pour appeler une fonction lorsque la sync est terminée

Merci pour ta réponse :slight_smile:
Du coup, j’ai trouvé la référence : System Time - ESP32 - — ESP-IDF Programming Guide latest documentation

Maintenant, se pose la même question pour MQTT : je vais regardé s’il existe une librairie qui peut aussi le faire en asynchrone (dans le cas contraire, je le lancerai dans une tache dédiée).

[Edit]J’ai trouvé async-mqtt-client qui a l’aire de faire ce que je cherche [/Edit]

Sinon, voila ce que ca donne ca donne :smiley: