ESP32,ora solare e ora legale

Ciao,
buona domenica!

Una domandina: sto usando la libreria time.h con ESP32 per ricavare l'ora dal web. Il sito utilizzato è pool.ntp.org.
Oggi ho notato che l'ora è rimasta invariata, cioè non è 'passata' a ora solare.
Allora ho provato ad utilizzare in modo esplicito i server italiani con it.pool.ntp.org ma il risultato non cambia. Un po' me l'aspettavo perchè comunque , collegandomi all'indirizzo pool.ntp.org dall'italia, se non i server italiani , sicuramente vengono usati server europei.
Quindi, nonostante si parla di abolirla (2020), devo gestirla io lato software?

grazie

Non credo che i server NTP tengano conto dell'ora legale e devi fare tu l'aggiustamento della data/ora :wink:

Guglielmo

Quindi pc e telefoni che aggiornano l’ora dal web , calcolano internamente l’ora solare?
Forse non usano server NTP.
Sai se è così?
Mi ricordo che su un antifurto paradox, nelle varie impostazioni c’era anche da inserire data di inizio/fine ora solare, ma non andava in rete e quindi lo comprendo.
Se è come dici tu, vuol dire che per 6 mesi l’anno tutti i server NTP sono in difetto di un’ora! Pazzesco!

Veramente i server NTP dovrebbero dare l’ora UTC … a cui tu puoi dare un offset, funzione della TZ dove ti trovi. ::slight_smile:

Anzi, da una ricerca appena fatta trovo:

NTP does not recognize time zones. It uses times based on UTC. Time zone is handled by OS

…quindi, come ricordavo, il server NTP ti da l’ora UTC e poi sta a te modificarla in funtione del TZ e del DST.

Guglielmo

Per queste malipolazioni ti consiglio lo studio delle varie funzioni di <time.h>, che trovi in AVR libc (… che è sempre inclusa automaticamente dall’IDE per Arduino).

Guglielmo

Edit: mmmm … tu però sei sotto ESP32, quindi niente AVR libc … però la <time.h> è uno standard e doversti poterla includere anche nell’ambiente ESP32 … spero ::slight_smile:

Ottimo! Grazie!

Si, sotto esp la includi tranquillamente.
Non ho visto se c’è già qualche funzione a riguardo .
Ora ricontrollo.

wipity:
Non ho visto se c’è già qualche funzione a riguardo .

Nella versione per AVR, se vai a vedere, SI, nella versione per ESP32 non te lo so dire ... ::slight_smile:

Guglielmo

L’ESP8266 ha una libreria che ne tiene conto che si aggiorna da sola ai server NTP, credo anche l’ESP32 ma non so come.

Devi definire la cosiddetta TimeZone che per il nostro fuso è questa, identica a quella usata sotto Linux
#define TZ “CET-1CEST,M3.5.0/2,M10.5.0/3”
che tiene conto dei cambiamenti tra gli orari invernale e estivo.

Il seguente sketch è per ESP8266

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

void setup(void)
{

  Serial.begin(115200);

  if (Serial.available())
  {

    Serial.println("Starting...");
    Serial.println("ESP8266_Time_Sync.ino");
  }
  // set up TimeZone in local environment
  setenv("TZ", TZ, 3);
  tzset();



  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(100);
  }

  configTime(0, 0, NTP0, NTP1);
  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");
  delay(1000);
}

//**********************************************************************
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;
}

credo che l’istruzione da usare ogni tanto, ad esempio di notte, sia

configTime(0, 0, NTP0, NTP1);

In alternativa, fatto a manina :slight_smile: , dai un'occhiata qui

Federico

Ringrazio tutti per le risposte, ho visto il link ma, come per magia(!), l'ora è corretta!
Senza aggiungere niente al codice.
Credo ci sia qualche differenza nel giorno in cui effettivamente cambia l'ora, forse per semplicità è stata gestita 'mensilmente' .
Purtroppo non ho visto quando è cambiata ma ho controllato oggi ed è corretta.
Credo appunto sia stata aggiornata al cambio del mese.
Grazie

Mi pare molto strano che si sia aggiornata al cambio del mese, ma tu che impostazione di Time Zone hai messo?

Per la cronaca, la stringa che ti ha indicato zoomx contiene tutte le informazioni necessarie alla gestione della TZ, in questo caso per l’Italia/Roma:

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

CET = lo Standard Time quando non è presente l’ora legale (Central Europan Time)
-1 = indica 1 ora ad Est di Greenwich (quindi CET = GMT+1 = UTC+1)
CEST = lo Standard Time quando è presente l’ora legale (Central Europan Summer Time) con spostamento di 1 ora (default)
M3.5.0 = quando inizia l’ora legale, ossia a Marzo (3) nell’ultima Domenica (5)
/2 = l’ora locale di quanto inizia l’ora legale (le 2 di notte)
M10.5.0 = quando termina l’ora legale, ossia a Ottobre (10) nell’ultima Domenica (5)
/3 = l’ora locale di quanto termina l’ora legale (le 3 di notte)

Non ho controllato 'bene' la libreria 'time.h' su cui lavora l'esp32, usando quella e seguendo lo sketch d'esempio, imposto l'indirizzo del server NTP dove fare la richiesta e poi con la funzione della lib 'printLocalTime()' ottengo l'ora.
Prima usavo il server pool.ntp.org , poi ho provato ad usare i server italiani con it.pool.ntp.org ma non era cambiato nulla.

Domanda: scrivi M10.5.0 come Ottobre(10) nell'ultima Domenica(5)...forse dico una castroneria, ma il (5) è inteso come quinta domenica del mese? Perchè se così fosse, il 3 di Novembre era Domenica e capita che qualche mese dell'anno abbia 5 domeniche. Lo interpreto come 'la prima domenica utile alla fine del mese' . Il 27 di ottobre era domenica ed era 'utile' al cambio dell'ora per gli umani, ma per le macchine usare la 5a diventerebbe più semplice perchè la 4a potrebbe avvenire in anticipo.
In più, non impostando un giorno preciso ma restando in uno standard di 'mese' e 'giorno della settimana' risulterebbe sicuramente più facile da gestire.
Non saprei se con questo ragionamento il cambio ora venga perso se per forza di cose cambia il mese da 10 a 11 e quindi il giorno della settimana ritorna ad essere conteggiato come 1a del mese 11...

Mi viene a questo punto da credere che le impostazioni siano esattamente come dici tu, ma il cambio ora sia avvenuto il 3 di Novembre.
Purtroppo ora sono su un terminale dove non ho le librerie e l'ide, stasera controllo, ma secondo te il ragionamento torna?

il (5) è inteso come ultima settimana
esempio

M10.5.0/3
M mese - settimana . giorno / ora
mese va da 1 a 12
settimana va 1 a 5 ( con 5 si intende sempre l'ultima settimana indipendentemente da quante ce ne sono in quel mese)
giorno va da 0 a 6 ( 0 = domenica )
/3 è l'ora

@wipity
tutti i server ntp forniscono la stessa ora UTC, cambiare server serve solo ad avere una risposta più veloce o a distribuire il carico delle richieste, ecco perchè iniziano con pool.
Se l’ora risulta non aggiornata può essere che la connessione sia fallita o che ci sia stato un errore di comunicazione, capita perché si basa su protocollo UDP.
Prima di usare le funzioni di sistema usavo del codice scritto apposta, si trova in rete e forse anche fra gli esempi e ogni tanto capitava che il pacchetto ricevuto non aveva la lunghezza giusta, mi pare 48 bit, oppure che non si riceveva risposta e il pacchetto era andato perso. Oppure un problema nel WiFi.

Chi ha scritto le funzioni per ESP32 ed ESP8266 ha intelligentemente usato lo standard usato nei sistemi Unix/Linux.

Io sull'ESP uso questa libreria:

Preleva in automatico l'ora della tua zona e con tanto di ora legale se necessario.

@zoomx
L’errore di scambio dati o di connessione lo escluderei perché ero in debug e la connessione avveniva regolarmente, l’ora la aggiorno regolarmente tramite web e quindi a debug vedo se va a buon fine.
Le verifiche le ho fatte i giorni 27,28 e 29 ottobre,poi non ho controllato fino a dopo il 3 novembre.
Credo sia cambiata con il mese.
Ho guardato nel file time.h ma è un po’ difficile per me da capire, credo usi funzioni standard per la gestione del tempo, ma sono nuove per me...
Comunque, l’ora si è aggiornata, quindi la gestione è presente, devo solo capire ‘dov’è ‘ per capire come è impostata
Grazie

I server NTP forniscono sempre l'ora UTC, il calcolo del fuso e dell'orario estivo viene fatto in locale.
Evidentemente, se non ci sono stati errori di comunicazione, è fallito il calcolo in locale.

Ok, purtroppo non riesco a capire dove esattamente fa il calcolo, e suppongo lo faccia in automatico visto che io non ho impostato niente al riguardo.
Studierò meglio la libreria, grazie

Ho riletto e cercato di comprendere la libreria ma non ne esco fuori....

L'esempio che sto usando è questo:

e immagino che la libreria 'time.h' a cui punta sia questa:

https://github.com/espressif/arduino-esp32/blob/master/tools/sdk/include/newlib/time.h

ma a parte abbia delle difficoltà a comprenderla essendo poco commentata ed essendo io poco preparato, non riesco a trovare qualche parte inerente il cambio dell'ora.

Ripeto, l'ora si è poi aggiornata, purtroppo non so di preciso quando e quindi non ho un riferimento.

Lo sketch di esempio è stato modificato rimuovendo la disconnessione wifi e facendo aggiornare l'ora ogni 10 minuti.
Questo perchè mi serve di mantenere la connessione wifi attiva, quindi non voglio disconnettermi, e non mi costa niente se ogni 10 minuti mantengo l'ora aggiornata.
Al momento non è prioritario il cambio ora, ho ancora 6 mesi( :o ), ma oltre al fatto di esser sicuro come gestire questo cambio, è mio interesse capire dove e come avviene 'dietro le quinte' !
Grazie per l'interessamento.