ESP32,ora solare e ora legale

Ciao a tutti, sono consapevole che l'argomento è trito e ritrito ma nonostante tutto non riesco a farlo funzionare..
Riporto una parte di codice con l'uso della libreria time...
Quello che devo fare è leggere l'ora e temperatura e visualizzarla nella dashboards di Arduino IoT.

const char* ssid = "xxxx";              
const char* password = "yyy"; 
const char* NTP_SERVER = "time.inrim.it";
const char* TZ_INFO    = "CET-1CEST,M3.5.0/2,M10.5.0/3";  // enter your time zone (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)

tm timeinfo;
time_t now;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  dht.begin();
  WiFi.begin(ssid, password);

  Serial.print("Provo a collegarmi al WiFi");
  delay(1500); 

 configTime(0, 0, NTP_SERVER);
  // See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv for Timezone codes for your region
  setenv("TZ", TZ_INFO, 1);
  tzset();
  if (getNTPtime(10)) 
  {  
    // wait up to 10sec to sync
  } 
  else 
  {
    Serial.println("Timer non settato");
    ESP.restart();
  }
  showTime(&timeinfo);
  lastNTPtime = time(&now);
  lastEntryTime = millis();
  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();
delay(2000);'
  getNTPtime(10);
  showTime(&timeinfo);
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  uint8_t ora = timeinfo.tm_hour;
  uint8_t minuti = timeinfo.tm_min;

Quello che succede è che l'ora visualizzata è quella di oggi meno 1-ora....
Dove sbaglio?

Grazie per la pazienza e l'aiuto...

Benny

Quale scheda state usando? ESP32? MKR? Altro?

Ecco un piccolo codice di riferimento (il post è in francese, ma il codice deve essere compresso) per la gestione di un server NTP su ESP32 ➜ Gestion d'un serveur de temps NTP sur ESP32 en WiFi

@J-M-L:

Nel titolo dice ESP32 ... :wink:

Guglielmo

:wink: oops

Troppe istruzioni...

Basta usare l'istruzione configTzTime() passandogli la definizione del timezone e fino a 3 server NTP diversi.
La sincronizzazione del RTC di solito ci mette 2/3 secondi (le prime letture daranno la data 01/01/1970)


const char* TZ_INFO = "CET-1CEST,M3.5.0/2,M10.5.0/3";
.....
void setup() {
  // Sync NTP time
  configTzTime(MYTZ,  "time.inrim.it", "time.google.com", "pool.ntp.org");

Io comunque quando faccio dei log uso sempre solo UTC+1, quindi solo ora solare anche in Estate.

Questo impedisce di avere nei log delle datetime con "buchi" (quando si va da solare a legale) o ancora peggio duplicate (quando si torna da legale a solare), soprattutto se poi i log vanno poi elaborati. A meno che non si registri nel log l'intero Timezone, per cui la "correzione" si può fare automaticamente.

Io invece preferisco registrare il timestamp sempre usando lo unix time (quindi una variabile unsigned long) che è univoco ed indipendente dal time zone.

Se poi c'è la necessità di visualizzarlo in formato "human readable" saranno le impostazioni locali del "client" a determinare la stringa risultante.

1 Like