INFO su ora solare/legale da NTPClient

Buongiorno a tutti,
sto usando un ESP8266 che legge l'orario e la data tramite NTPClient ed attualmente mi sta segnando l'ora corretta.
Volevo capire cosa succederà al 31 marzo, quando ci sarà il passaggio all'ora legale: si aggiusterà automaticamente, oppure devo implementare uno script che mi faccia la correzione?
Grazie e buona serata!

Non conosco bene la libreria in questione (che tra l'altro è pure "ridondante" su sistemi ESP), ma se non hai impostato correttamente il timezone dubito che l'ora legale verrà gestita correttamente.

Penso che ti possa bastare provare la libreria "Timezone", la trovi nel Library manager dell'IDE:

image

Io non l'ho mai usata, ma qui spiegano anche come usarla:

Con ESP8266 (ma credo sia la stessa cosa anche con ESP32), NON occorre nessuna libreria per NTP ... inoltre basta settare correttamente la variabile d'ambiente TZ per avere l'ora corretta. A suo tempo avevo fatto questo programmino di prova:

#include <sys/time.h>                   // struct timeval
#include <time.h>                       // time() ctime()       
#include <ESP8266WiFi.h>

#ifdef LED_BUILTIN
#undef LED_BUILTIN
#endif
#define LED_BUILTIN 2

#define NTP0 "0.ch.pool.ntp.org"
#define NTP1 "1.ch.pool.ntp.org"

/*
  Found this reference on setting TZ: http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
*/
#define TZ "CET-1CEST,M3.5.0/2,M10.5.0/3"

// Replace with your network details
const char* ssid     = "xxxxxxxxxxxx";
const char* password = "yyyyyyyyyyyyy";

byte led = 0xff;


int DOW, MONTH, DATE, YEAR, HOUR, MINUTE, SECOND;

int lc = 0;
time_t tnow;
char strftime_buf[64];

//**********************************************************************
//**********************************************************************

void setup(void)
{
  delay(500);
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, led);
  
  Serial.println("Starting...");
  Serial.println("ESP8266_Time_Sync_NTP2.ino");

  WiFi.hostname("ESP8266");

  // Connecting to local WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);


  WiFi.begin(ssid, password);
  delay(10);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(100);
  }

  configTime(TZ, NTP0, NTP1, NULL);
  
  Serial.println("\n WiFi connected");
  Serial.print("MAC: ");
  Serial.println(WiFi.macAddress());
  Serial.print("Server IP:  ");
  Serial.println(WiFi.localIP());
  Serial.println("\n");
  Serial.print("wait for first valid timestamp ");

  while (time(nullptr) < 100000ul)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println(" time synced");
}
//**********************************************************************
//**********************************************************************

void loop()
{
  getDateTime();
  Serial.println(strftime_buf);

  Serial.println("");
  Serial.print(DOW);
  Serial.println("   Day of week");

  Serial.print(HOUR);
  Serial.println("  Hours");
  Serial.print(MINUTE);
  Serial.println("  Minutes");
  Serial.print(SECOND);
  Serial.println("  Seconds");
  Serial.println("\n");
  //
  led = ~led;
  digitalWrite(LED_BUILTIN, led);
  //
  delay(5000);
}

//**********************************************************************
void getDateTime()
{
  struct tm *ti;

  tnow = time(nullptr) + 1;
  strftime(strftime_buf, sizeof(strftime_buf), "%F %T", localtime(&tnow));
  ti = localtime(&tnow);
  DOW = ti->tm_wday;
  YEAR = ti->tm_year + 1900;
  MONTH = ti->tm_mon + 1;
  DATE = ti->tm_mday;
  HOUR  = ti->tm_hour;
  MINUTE  = ti->tm_min;
  SECOND = ti->tm_sec;
}

... e funzionava correttamente, magari puoi provarlo :roll_eyes:

Guglielmo

@cotestatnt: non ne avevamo anche parlato? SI, ora ricordo, in Spam Bar :grin:

2 Likes

Confermo!
Cambia solo l'istruzione necessaria per impostare il timezone


// ESP8266
configTime(TZ, NTP0, NTP1, NULL);

// ESP32
configTzTime(TZ, NTP0, NTP1, NULL);

L'NTP, comunque, porta sempre e solo l'ora solare di Greenwich. Tramite la libreria usata o manualmente, il fuso orario e l'ora legale vanno applicati localmente.

Se imposti il timezone con i dispositivi ESP ci pensa il codice del core e non devi preoccupartene

L'NTP porta il GMT time ... poi, a seconda delle librerie di base o meno (nel caso ESP sono di base), c'è la conversione in ora locale.

Guglielmo

P.S.: mi sono sovrapposto con cotestatnt :grin:

Non lo sapevo, ti ringrazio, perché mi può servire per uno dei miei progetti (che usa un paio di WeMos D1 per cui ESP8266...).

@docdoc: Figurati :slight_smile: ... a suo tempo c'avevo sbattuta abbastanza la testa perché non capivo come si usava quel configTime() ed il TZ ...
... poi, grazie delle note di mamma IBM ... tutto si è chiarito :grin:

Guglielmo

Sei sicuro del /3???...Non è /2 anche quello? Il cambio dell'ora è comunque alle 2 solari!
In realtà anche nel mio orologio NTP ho scritto /3, ma non ho mai verificato che cosa accada in quella notte di Ottobre! Bisognerebbe mettere su un server NTP e provare...

Sono abbastanza sicuro di quella stringa ...

TZ='CET-1CEST,M3.5.0/2,M10.5.0/3'

... the three fields (separate by commas) means:
CET-1CEST tzone name (CET) offset (-1) summer time name (CEST)
M3.5.0/2 time changes to summer-time on March (M3)
last week (5), on Sunday at 2:00 (0/2)
M10.5.0/3 time changes to regular time on October (M10)
last week (5) on Sunday at 3:00 (0/3)

Guglielmo

grazie a tutti!
scusate l'ignoranza, quindi non mi serve la libreria ntpclient per pescare in internet l'orario?
mi basta la libreria esp8266wifi?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.