Coder Social home page Coder Social logo

ropg / eztime Goto Github PK

View Code? Open in Web Editor NEW
316.0 24.0 90.0 13.36 MB

ezTime — pronounced "Easy Time" — is a very easy to use Arduino time and date library that provides NTP network time lookups, extensive timezone support, formatted time and date strings, user events, millisecond precision and more.

License: MIT License

Makefile 0.34% C++ 91.43% PHP 6.81% Shell 1.41%
time timezones timezone-conversion timestamp events milliseconds ntp ntp-client formatted-output datetime

eztime's People

Contributors

alberto-im avatar bugerdread avatar chinswain avatar clydde avatar durobot avatar koter84 avatar mike-s123 avatar per1234 avatar ropg avatar t1m0thyj avatar wayfarerbasta avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

eztime's Issues

setting time manually when there is no internet

This library is really helpful and great.

I have a master controller in my project which connects to the internet so ezTime works fine with it
however, in my project there are other controllers that doesn't have an internet access, yet depends on the clock for some operations.
What I want to do is, let the controllers connect to the Hub and get some data to be used to set ezTime manually and offline to calculate the time. I can't seem to find a clear answer in the documentation.\

It would be also useful if there is a function in ezTime to return that last pinged Unix Time Stamp may be to pass it to other controllers to calulate time manually without having to sync with ntp server

lastNtpUpdateTime() incorrect.

Shortly after things get started and NTP is updated,

myTz.dateTime(RFC850) produces "Wednesday, 10-Apr-2019 10:30:37 EDT"

but

dateTime(lastNtpUpdateTime(),RFC850) produces "Wednesday, 10-Apr-2019 18:29:37 EDT"

Seems to be a sign issue. EDT is UTC-4, and the reported time is off by 8. Or maybe it's got to do with dateTime(), not lastNtpUpdateTime().

UTC.dateTime(lastNtpUpdateTime(),RFC850) produces the expected result.

Timezones example - timeouts

Hallo Ropg,
thank you for ezTime library!

Right now Im testing it on ESP8266 but I found an issue with Timezones example.

If I change this example to be abe to run on ESP (WiFi.h -> ESP8266WiFi.h, set SSID and PASS), I get following output (debug enabled):

ezTime debug level set to INFO
Waiting for WiFi ... Querying pool.ntp.org ... ERROR: No network
connected
Waiting for time sync
Querying pool.ntp.org ... success (round trip 22 ms)
Received time: Thursday, 20-Dec-18 11:41:07.160 UTC
Time is in sync

UTC:             Thursday, 20-Dec-2018 11:41:07 UTC
Timezone lookup for: Pacific/Auckland ... (round-trip 43 ms)  success.
  Olsen: Pacific/Auckland
  Posix: NZST-12NZDT,M9.5.0,M4.1.0/3
New Zealand:     Friday, 21-Dec-2018 00:41:07 NZDT
Timezone lookup for: de ... ERROR: Timeout
Germany:         Friday, 21-Dec-2018 00:41:09 NZDT
Local (GeoIP):   Timezone lookup for: GeoIP ... ERROR: Timeout
Timeout

I always get New Zealand time correctly, Germany (de) timezone results in timeout in about 50% of tries, I never get GeoIP time - always timeout.

I think this is because of DDOS protection on the server you mentioned in readme: "will only respond to the same IP-number once every three seconds to prevent being used in dDoS attacks", but there is no delay in the example and we are calling setLocation 3 times in a row (from the same IP ofc).

Also if the myTZ.setLocation(F("de")) results in timeout, it shows New Zealand time for germany (as in output above), but this is because myTZ.setLocation(F("de")) is not checked if completed successfully as in "GeoIP part". The myTZ.setLocation(F("Pacific/Auckland")) is also not checked if completed successfully, but from my point of view this is not a problem, it demonstrate that you can but you are not required to check setLocation result in your sketch.

It works as expected when I add two delays this way (which confirms its 99% because of the DDoS protection):

#include <ezTime.h>
#include <ESP8266WiFi.h>

void setup() {

	Serial.begin(115200);
	while (!Serial) { ; }		// wait for Serial port to connect. Needed for native USB port only
        Serial.print(F("\nGood morning :-)"));
	WiFi.begin("your-ssid", "your-password");

	// Uncomment the line below to see what it does behind the scenes
	//setDebug(INFO);
	
	waitForSync();

	Serial.println();
	Serial.println("UTC:             " + UTC.dateTime());

	Timezone myTZ;

	// Provide official timezone names
	// https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
	myTZ.setLocation(F("Pacific/Auckland"));
	Serial.print(F("New Zealand:     "));
	Serial.println(myTZ.dateTime());
        
        // wait a little bit to not trigger DDoS protection on server - see readme
        delay(5000);

	// Or country codes for countries that do not span multiple timezones
	myTZ.setLocation(F("de"));
	Serial.print(F("Germany:         "));
	Serial.println(myTZ.dateTime());	

        // wait a little bit to not trigger DDoS protection on server - see readme
        delay(5000);

	// See if local time can be obtained (does not work in countries that span multiple timezones)
	Serial.print(F("Local (GeoIP):   "));
	if (myTZ.setLocation()) {
		Serial.println(myTZ.dateTime());
	} else {
		Serial.println(errorString());
	}
}

void loop() {
	events();
}

I think the same apply to "EthernetShield" example, as it does the same (calling myTZ.setLocation() 3 times without delay), but I have no HW to test it.

Using country code "za" does not set timezone.setLocation as expected

I'm attempting to build an "always right" NTP based clock with a dot matrix display and have come across the awesome ezTime library which looks perfect for my needs (and way beyond!)

I have run into an issue whereby using a country code does not seem to set my location and hence the relevant timezone info.

I have a test sketch which uses "de" as per the ethernet example sketch which functions fine but when I change only the "de" to "za" I don't get a result returned. Exactly the same happens if I try to use the GeoIP lookup.

I'm in South Africa which has a single time zone of UTC+2.

The below illustrates first the working scenario with a "de" sketch and associated debug output and the second a non-working scenario and associated debug output.

I'm no developer and tend to hack my way through examples of various libraries to put sketches together so it's completely probable that I'm missing something along the way but thought I'd report this anyway,

Working Scenario - "de"

#include <ezTime.h>
#include <ESP8266WiFi.h>          // Replace with WiFi.h for ESP32
#include <ESP8266WebServer.h>     // Replace with WebServer.h for ESP32
#include <AutoConnect.h>

ESP8266WebServer Server;          // Replace with WebServer for ESP32
AutoConnect Portal(Server);

void rootPage() {
  char content[] = "Hello, world ... browse to http://<ip addres>/_ac to configure AP, SSID, password etc. settings";
  Server.send(200, "text/plain", content);
}

void setup() {

  // Set ezTime debug level as required [https://github.com/ropg/ezTime#setdebug]
  setDebug(DEBUG);
  
  // Open serial communications and wait for port to open:
  Serial.begin(115200);

  // wait for serial port to connect. Needed for native USB port only
  while (!Serial) {
    ;
  }

  //Beging Debug Output
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.println("----Debug Begins--------------------------------------------");
  Serial.println();

  // Enable Autoconnect portal and if successful, output Ip to debug
  Server.on("/", rootPage);
  if (Portal.begin()) {
    Serial.println("WiFi connected: " + WiFi.localIP().toString());
  }

  // We're now online
  
  // Wait for ezTime to get its time synchronized and wait 5 seconds
  waitForSync();
  delay(5000);  
  
  // Create a timezonr called myTZ
  Timezone myTZ;

  // Output UTC
  Serial.println();
  Serial.println("<ezTime> UTC: " + UTC.dateTime());
  Serial.println();

  //Set myTZ's location and outpit the result
  myTZ.setLocation(F("de"));
  Serial.print(F("<ezTime> myTZ: "));
  Serial.println(myTZ.dateTime());
  myTZ.getTimezoneName();
  myTZ.getOlson();
  
  //Set NTP update frequency in seconds
  setInterval(60); //[https://github.com/ropg/ezTime#setserver-and-setinterval]
}

void loop() {
  //Handle the Autoconnect client
  Portal.handleClient();
  
  //Handle the ezTmine events //[https://github.com/ropg/ezTime#events]
  events();
}



----Debug Begins--------------------------------------------

[AC] WiFi.config(IP=0.0.0.0, Gateway=0.0.0.0, Subnetmask=0.0.0.0, DNS1=0.0.0.0, DNS2=0.0.0.0)
[AC] DHCP client(STARTED)
[AC] WiFi.begin()
[AC] Connecting.established IP:192.168.0.123
[AC] http server started
WiFi connected: 192.168.0.123
Waiting for time sync
Querying pool.ntp.org ... Received data:
0: 24, 2, 9, EC, 
4: 0, 0, 28, 9B, 
8: 0, 0, 0, 2F, 
12: 55, C7, D6, 62, 
16: E0, 53, 45, A9, 
20: 75, 9F, 5D, 1A, 
24: 0, 0, 0, 0, 
28: 0, 0, 0, 0, 
32: E0, 53, 48, 67, 
36: 8E, E8, 28, 34, 
40: E0, 53, 48, 67, 
44: 8E, EA, DD, 90, 
success (round trip 54 ms)
Received time: Saturday, 06-Apr-19 15:46:47.587 UTC
Set event (#1) to trigger on: Saturday, 06-Apr-2019 16:16:48 UTC
Time is in sync

<ezTime> UTC: Saturday, 06-Apr-2019 15:46:52 UTC

Timezone lookup for: de ... (round-trip 173 ms)  success.
  Olson: Europe/Berlin
  Posix: CET-1CEST,M3.5.0,M10.5.0/3
<ezTime> myTZ: Saturday, 06-Apr-2019 17:46:52 CEST
Deleted event (#1), set for Saturday, 06-Apr-2019 16:16:48 UTC
Set event (#1) to trigger on: Saturday, 06-Apr-2019 15:47:52 UTC

Failing scenario - "za"

#include <ezTime.h>
#include <ESP8266WiFi.h>          // Replace with WiFi.h for ESP32
#include <ESP8266WebServer.h>     // Replace with WebServer.h for ESP32
#include <AutoConnect.h>

ESP8266WebServer Server;          // Replace with WebServer for ESP32
AutoConnect Portal(Server);

void rootPage() {
  char content[] = "Hello, world ... browse to http://<ip addres>/_ac to configure AP, SSID, password etc. settings";
  Server.send(200, "text/plain", content);
}

void setup() {

  // Set ezTime debug level as required [https://github.com/ropg/ezTime#setdebug]
  setDebug(DEBUG);
  
  // Open serial communications and wait for port to open:
  Serial.begin(115200);

  // wait for serial port to connect. Needed for native USB port only
  while (!Serial) {
    ;
  }

  //Beging Debug Output
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.println("----Debug Begins--------------------------------------------");
  Serial.println();

  // Enable Autoconnect portal and if successful, output Ip to debug
  Server.on("/", rootPage);
  if (Portal.begin()) {
    Serial.println("WiFi connected: " + WiFi.localIP().toString());
  }

  // We're now online
  
  // Wait for ezTime to get its time synchronized and wait 5 seconds
  waitForSync();
  delay(5000);  
  
  // Create a timezonr called myTZ
  Timezone myTZ;

  // Output UTC
  Serial.println();
  Serial.println("<ezTime> UTC: " + UTC.dateTime());
  Serial.println();

  //Set myTZ's location and outpit the result
  myTZ.setLocation(F("za"));
  Serial.print(F("<ezTime> myTZ: "));
  Serial.println(myTZ.dateTime());
  myTZ.getTimezoneName();
  myTZ.getOlson();
  
  //Set NTP update frequency in seconds
  setInterval(60); //[https://github.com/ropg/ezTime#setserver-and-setinterval]
}

void loop() {
  //Handle the Autoconnect client
  Portal.handleClient();
  
  //Handle the ezTmine events //[https://github.com/ropg/ezTime#events]
  events();
}


----Debug Begins--------------------------------------------

[AC] WiFi.config(IP=0.0.0.0, Gateway=0.0.0.0, Subnetmask=0.0.0.0, DNS1=0.0.0.0, DNS2=0.0.0.0)
[AC] DHCP client(STARTED)
[AC] WiFi.begin()
[AC] Connecting.established IP:192.168.0.123
[AC] http server started
WiFi connected: 192.168.0.123
Waiting for time sync
Querying pool.ntp.org ... Received data:
0: 24, 2, 9, E9, 
4: 0, 0, 0, 82, 
8: 0, 0, 9, 5D, 
12: C4, 15, BB, 2, 
16: E0, 53, 6A, 85, 
20: B5, 48, 0, BB, 
24: 0, 0, 0, 0, 
28: 0, 0, 0, 0, 
32: E0, 53, 6F, 6E, 
36: C3, 81, FF, 2B, 
40: E0, 53, 6F, 6E, 
44: C3, 82, CC, 2, 
success (round trip 53 ms)
Received time: Saturday, 06-Apr-19 18:33:18.792 UTC
Set event (#1) to trigger on: Saturday, 06-Apr-2019 19:03:19 UTC
Time is in sync

<ezTime> UTC: Saturday, 06-Apr-2019 18:33:23 UTC

Timezone lookup for: za ... (round-trip 504 ms)  <ezTime> myTZ: Saturday, 06-Apr-2019 18:33:24 UTC
Deleted event (#1), set for Saturday, 06-Apr-2019 19:03:19 UTC
Set event (#1) to trigger on: Saturday, 06-Apr-2019 18:34:24 UTC

Incorrect time on WiFi Loss

I've had a few false triggers on setEvent that appear to be due to datetime being incorrect immediately after a WiFi loss and reconnect. On the next update it's corrected (if WiFi is ok) but all of the days event's are triggered.

I'll write a simplified example (with DEBUG level) and post\test tomorrow and leaving it running. I have a timer doing the following every 10 minutes:

 Serial.print("Time: "); Serial.println(myTZ.dateTime());

Output Example 1:

Querying pool.ntp.org ... success (round trip 64 ms)
Received time: Wednesday, 02-Jan-19 18:30:25.098 UTC (internal clock was 33 ms fast)

[0] Heartbeat timeout <-- WiFi Loss and Reconnect
[148] Ready (ping: 31ms).

**Time: Thursday, 21-Feb-2019 10:22:54 GMT**

Querying pool.ntp.org ... success (round trip 55 ms)
Received time: Wednesday, 02-Jan-19 18:31:42.317 UTC (internal clock was 4294973 ms fast)

Time: Wednesday, 02-Jan-2019 18:37:39 GMT

Querying pool.ntp.org ... success (round trip 906 ms)
Received time: Wednesday, 02-Jan-19 18:41:42.331 UTC (internal clock was 425 ms fast)

Output Example 2:

Time: Wednesday, 02-Jan-2019 23:25:20 UTC

[0] Heartbeat timeout <-- WiFi Loss and Reconnect
[148] Ready (ping: 35ms).

**Time: Thursday, 21-Feb-2019 15:16:33 UTC**

Querying pool.ntp.org ... success (round trip 44 ms)
Received time: Wednesday, 02-Jan-19 23:25:21.408 UTC (internal clock was 4294953 ms fast)

Time: Wednesday, 02-Jan-2019 23:25:21 UTC

Querying pool.ntp.org ... ERROR: No network

I am using the default arduino example eztime-ethernetshield. I was using it for longer, however as of today i can not get it to work any more. Arduino SW-version 1.8.10 and eztime 0.7.10.
Serial output:
Ethernet connection ... got DHCP IP: 192.168.2.103

UTC: Thursday, 01-Jan-1970 00:00:08 UTC
New Zealand: Thursday, 01-Jan-1970 00:00:08 UTC
Germany: Thursday, 01-Jan-1970 00:00:13 UTC
Local (GeoIP): No network

Now ezTime will show an NTP sync every 60 seconds

ezTime debug level set to INFO
Querying pool.ntp.org ... ERROR: No network

I tried to set to de.pool.ntp.org and tested it on a mega and an uno with different ethernet shields, with the same result.
I tried with a different code on the same board to access google, which works.
Any idea?

waitForSync is not returning true

Sometimes, after doing a firmware update. waitForSync won't return true. Here is my code.

Timezone US;
...

void setup()
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  Serial.println("Connecting to Wifi");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.println("Connected to " + String(ssid) + " on address: " + WiFi.localIP().toString());

  while (!waitForSync(3))
  {
   Serial.println("Retrying timeSync");
  }
  Serial.println("Got timeSync");
}

void loop() {}

SetLocation for "ie", "uk" and "pt" does not work

Using the timezones examples as base, none of the above return the correct time. They display as UTC, when they should be now UTC + 1

When you enable info serial prints, you see that none of them return a response for the timezone lookup. Setting the country code to "de" works as expected (UTC +2) and returns a response to the timezone lookup.

Setting the timezone in the olson format works as expected ("Europe/Dublin" returns UTC +1)

compileTime() wrong TZ

Compiled a sketch at 6:23 PM EST.

In the sketch, with myTZ.setPosix("EST5EDT,M3.2.0,M11.1.0"),

dateTime(compileTime(),RFC850) produces "Friday, 01-Feb-2019 23:17:55 EST"

So, it seems to be showing the time in UTC, but labeling it as EST.

Problem with using minuteChanged and secondChanged together

Hi

I am writing a program to display he time on an LED matrix. I used secondChanged to blink a colon between the hours and minutes and also manually tracked when the minute changed in order to update the time on the display. That worked fine.

I figured I could simplify things by using minuteChanged to trigger a screen refresh rather than tracking when the minute changed. However, when I use both minuteChanged and secondChanged together I find that secondChanged is being triggered approx 100,000 times per second rather than just once per second.

My questions are:

  1. should the combination of these two functions work as I expect, and there is a bug occurring?
  2. these two functions not designed to work together in the same program?

Thanks
aussieW

error connecting to pool.ntp.org

hi, trying to get this to work but everthing i have tried leaves me with this.

ezTime debug level set to INFO
Waiting for WiFi ... Querying pool.ntp.org ... ERROR: No network
connected
Waiting for time sync
Querying pool.ntp.org ... ERROR: Timeout
Querying pool.ntp.org ... ERROR: Timeout

eztime does not use BST correctly

Today 26th March the time displayed using the ezTime library is one hour ahead for timezone United Kingdom, unfortunately BST does not start in the UK until the last Sunday in March. Last year it was 25th March, this year it is 29th March and next year it will be different again. Is eztTime designed to compensate for this change in the starting (and also ending) dates for BST?

Feature request: expose _last_sync_time

It's great that it's logged in debug output, but it would be useful to be able to know programmatically when the last good network update occurred. Perhaps time_t lastNtpUpdateTime()

strip part of lib with define(s)

Hi,

i see that it's possible to remove some part of code with undef caching things.

i was wondering, if it's possible in the future to do the same with timezone part.
code size it's quite an issue for me, i am trying to make a reef aquarium controller, and pwm+i2c+5 adc+ 2x multiplexer + lcd+ 3*pump with timing + sunset/sunrise/cloud (for lights) and other things eat up a lot of memory. include the fact that i store everything via MQTT, have a websocket for debug, you can imagine that every bYte matter :)

taking out some pieces will greatly help.

tnx!

bool waitForSync should return a value

In successfull cases, synced time, waitForSync() should return a value (true). This return statement is missing in the function, so always false is returned.

timeStatus timeNeedsSync never seted

Thanks for you work!
I think timeNeedsSync status never can be set. I did not find in the code timeNeedsSync and if I disable connection I always see status '2' (timeSet).
Maybe I'm wrong. Sorry for my bad english

makeOrdinalTime return wrong result

The function makeOrdinalTime returns 24th of March 2019 as the last (ordinal 5) Sunday of March. In my calendar the 31st March is th last Sunday. It seams that this is the reason for #31

wrong day for DST change

Hi!

today I detect, that time from ezTime library is invalid. After some investigation I found, that problem is that ezTime thing that I need CET time, but today is last day with CEST
I am set Olsen format "Europe/Prague"
It is converted to POSIX correctly : "CET-1CEST,M3.5.0,M10.5.0/3"
This is correct. Problem is that today (27-Oct-2018) is last weekend on October but not .0 ( =Sunday)
ezTime show Time: Saturday, 27-Oct-2018 12:08:32 CET

Any idea?

Two global timezones?

Is it possible to have multiple global scoped timezones independent of each other?

I have the following code:
'

#include 
#include 
#define CONF_TIMEZONE "Europe/Stockholm"
const char *ssid     = "ssid";
const char *password = "pass";
Timezone tz;
Timezone tempTime;
void setup() {
    Serial.begin(115200);
    Serial.println("Serial run");
    WiFi.begin(ssid, password);
    while( WiFi.status() != WL_CONNECTED ){
        delay( 500 );
        Serial.print ( "." );
    }
    waitForSync();
    tempTime.setLocation(CONF_TIMEZONE );
    tz.setLocation(CONF_TIMEZONE );
    tz.setDefault();
    
    Serial.println("Time: "+tz.dateTime());
	tempTime.setTime(
        12, // H 
        0,  // M
        0,  // S
        1,1,2018
    );
    Serial.println("tz after setting tempTime");
    Serial.println(tz.dateTime());
}

void loop(){ delay(1000); }

After setting time on tempTime, it also changes the time of tz.

The reason is I want to be able to get the unix timestamp a day ahead of current time, while maintaining the current time to output onto a display every second.

I tried creating a new Timezone tempTime, when doing the comparison, but doing that added a delay of more than 1 second.

Can not get network connection for NTP to work, not on WiFi

2:05:06.350 -> 192.168.0.99
12:05:06.385 -> Working ...
12:05:17.380 -> Working 2 ...
12:05:17.380 ->
12:05:17.380 -> Thursday, 01-Jan-70 00:00:11.574 UTC
12:05:17.380 -> Thursday, 01-Jan-70 00:00:11.577 UTC
12:05:17.380 -> Thursday, 01-Jan-70 00:00:11.580 UTC
12:05:17.380 -> Thursday, 01-Jan-70 00:00:11.583 UTC
12:05:17.415 -> Thursday, 01-Jan-70 00:00:11.586 UTC
12:05:17.415 -> Thursday, 01-Jan-70 00:00:11.589 UTC
12:05:17.415 -> Thursday, 01-Jan-70 00:00:11.592 UTC
12:05:17.415 -> Thursday, 01-Jan-70 00:00:11.596 UTC
12:05:17.415 -> Thursday, 01-Jan-70 00:00:11.599 UTC
12:05:17.415 -> Thursday, 01-Jan-70 00:00:11.602 UTC
12:05:17.415 ->
12:05:17.415 -> Those milliseconds between the first and the last line ...
12:05:17.415 ->
12:05:17.415 -> ... most of that is spent sending to the serial port.
12:05:17.415 ->
12:05:17.415 ->
12:05:17.415 ->
12:05:17.415 -> And ezTime is not making those milliseconds up either.
12:05:17.415 ->
12:05:17.415 -> ... Stick around as we do an NTP request every minute.
12:05:17.449 ->
12:05:17.449 -> ezTime debug level set to INFO
12:05:20.804 -> Querying pool.ntp.org ... ERROR: No network
12:05:25.808 -> Querying pool.ntp.org ... ERROR: No network

I have an NTP server at 192.168.0.5, and my IP is 192.168.0.99. Tried the pool.ntp.org site and still no joy.

UNO/Ethernet card.
Suggestions?
Thx,P

Picking up on an event

I am using EZTime together with a DS3231 RTC so that the clock will operate correctly even if there is no network connection. For instances where a network connection is available is there any way to pick up on the event that occurs when an NTP update completes so I can use the new time setting to correct the RTC if necessary.

I currently have the RTC periodically updating the local clock but would like to correct the RTC if a new time is received from the NTP. Using the DEBUG setting I can see the messages
Querying pool.ntp.org ... success (round trip 46 ms)
Received time: Friday, 02-Nov-18 20:32:29.319 UTC (internal clock was 1237 ms fast)
from the DEBUG but I am not sure how to pick up on the events completion.

Hardware is an ESP WROOM 32 module on a custom PCB with DS3231 chip, using the rtc_by_manuka library for the DS3231.

Question: ezTime::setTime() and Arduino::configTime() not the same

While I love ezTime, I am confused how differently it works on an ESP8266 vs the configTime().

While writing in Arduino on a NodeMCU, I falsely assumed that calling ezTime::setTime() would set the system time that the Azure IoT Client SDK would honor. I still had to call the configTime() which grabbed from an NTP service.

From a core perspective, what is the difference between Arduino.h::configTime() and setTime()?

Possible need to clarify where to use setInterval() function to disable updateNTP()

I am using eztime as part of a multitask environment and could not understand why it was not working as expected when trying to disable the default updateNTP event. The problem is that in this case you must use the events function first before you try to disable the updateNTP event as part of the events function is to start updateNTP on the first run through even if you had already called setInterval(0). The problem is exacerbated in a multi task environment where the two tasks are running independantly.

Would help I think to make this clear in the documentation.

Timezones not working

A few days ago this was still working for me, but it stopped working for some reason, even with your simple example. when enabling debugging (INFO), I got the following error:

Timezone lookup for: Pacific/Auckland
ERROR: Data not found

Checking the source, it appears that this library uses https://timezoneapi.io to get the data, which states on their website:

Announcement: As of October 4th, 2018 TimezoneAPI will no longer support free plans. Read more…

That's still 2 weeks from now, so to get more debugging I set debug to DEBUG, and it looks like they have a 301 redirect from the http address to https:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://timezoneapi.io/api/timezone/?Pacific%2FAuckland">here</a>.</p>
</body></html>

so it looks like going forward another method for getting timezones should be used...

Timezone definition incorrect

Hi,

Awesome library, however, this week, a bug was revealed in timezone config.
In the README.md, and also in your lookup server, it is stated that timezone for Berlin/western eu is:

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

However, the actual definition is 'last sunday of the month'. In march 2019, the month had 5 sundays, so the clock on my night table is off for an hour this week.

According to the spec, '5' means 'last of the month', so I've also took the liberty to update the definition in my code to

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

Can you update README.md and probably your server accordingly?

Please issue new release.

I submitted a couple of (accepted) PRs a while back, the main one fixed some summertime issues. Please create a new release. That will fix issues for others, and I won't have to keep a private copy.

Thanks.

User set events not triggering

First, love the library! After reading the docs thoroughly, I have a pretty good handle on how to use everything.

However, the events set by me are not triggering. I've tried a lot

  • setting events to UTS vs myTZ
  • Passing a time_t object vs hr min sec arguments
  • Praying
  • anything else I could think of before posting here

I am using a heltec automation wifi kit 8 esp8266 w/ integrated 128 x 32 px oled display.

In the script, I know that loop keeps looping, because there is a clock that shows the current time on the board's display. Also with the debug set to INFO, I can see the NTP syncs regularly. So events() is being called.

When I set Debug level DEBUG, it does not show my events being created.

The event is supposed to trigger a function that flips a pin and changes the screen. It also sends some data along the serial line to show that the event triggered.

When I run the code below, I get the following, and then nothing when the event should trigger (I should see something on the serial monitor).

Any thoughts?

Serial Output

Serial Connected

WiFi Connected

Waiting for WiFi ... Querying pool.ntp.org ... ERROR: No network
connected
Waiting for time sync
Querying pool.ntp.org ... success (round trip 106 ms)
Received time: Friday, 10-May-19 19:14:21.456 UTC
Time is in sync
Time Synced

Timezone lookup for: America/New_York ... (round-trip 123 ms) success.
Olson: America/New_York
Posix: EST5EDT,M3.2.0,M11.1.0
Friday, 10-May-2019 15:14:21 EDT Timezone Set

Friday, 10-May-2019 15:14:21 EDT Setting the 05:00:00 event
Friday, 10-May-2019 15:14:21 EDT Event set for 11-5-2019 05:00:00

Friday, 10-May-2019 15:14:21 EDT Setting the 10:00:00 event
Friday, 10-May-2019 15:14:21 EDT Event set for 11-5-2019 10:00:00

Friday, 10-May-2019 15:14:21 EDT Setting the 15:16:00 event
Friday, 10-May-2019 15:14:21 EDT Event set for 10-5-2019 15:16:00

Code:

/*
 * A script to automate the actuation of a pin (Normally HIGH, Actuated LOW) for a set duration
 * 
 * The board used is the Heltec WiFi kit 8 (I got mine on amazon)
 * Note - the pinout diagram is all wrong on that particular board.
 * Like, really, really wrong.
 * My pin 12 is "D6"
 * 
 * This script heavily utilizes the ezTime library for time keeping and event setting, 
 * So a big thanks to ropg for such a great library to use!
 * 
 * This script is simplified to show some issues I am having with events
 * 
 * By Andrew Shaw
 */

#include <ezTime.h>
#include <ESP8266WiFi.h>
#include "SSD1306Wire.h"
//#include "config.h"
#include "images.h"
#include "work_config.h"

//Event times, in global scope
uint8_t event1_hour = 5; // 5am
uint8_t event1_min = 0;
uint8_t event2_hour = 10;
uint8_t event2_min = 0;
uint8_t event3_hour = 15; // 3pm
uint8_t event3_min = 16;
uint8_t event_duration = 18000; // Event duration, seconds

//Define which pin the event pin is attached to
uint8_t event_pin = EVENT_PIN;

//Setup wifi credentials from config file.
char ssid[] = WIFI_SSID;
const char password[] = WIFI_PW;

//clearing the display, not going to use it for this sample.
SSD1306Wire display(0x3c, 4, 5, GEOMETRY_128_32);

//Create Timezone from config file, in global scope
Timezone myTZ;
char timezone_name[] = TIMEZONE_NAME;

void setup() {
  setDebug(INFO);
  
  pinMode(event_pin, OUTPUT);
  digitalWrite(event_pin, HIGH);

  Serial.begin(115200);
  while (!Serial) { ; }
  Serial.println("Serial Connected\n");
  
  //Just clearing the display
  pinMode(16, OUTPUT);
  digitalWrite(16, LOW);
  delay(50);
  digitalWrite(16, HIGH);
  display.init();
  display.clear();

  //Connect to WiFi
  WiFi.begin (ssid, password);
  Serial.println("WiFi Connected\n");

  //Sync with NTP Server
  waitForSync();
  Serial.println("Time Synced\n");

  //Set Timezone
  myTZ.setLocation(timezone_name);
  myTZ.setDefault();
  Serial.print(myTZ.dateTime() + "     ");
  Serial.println("Timezone Set\n\n\n");

  //Setting watering events to trigger for first time
  make_next_event(event1_hour, event1_min, 0);
  make_next_event(event2_hour, event2_min, 0);
  make_next_event(event3_hour, event3_min, 0);
}

void idleDisplay() {

  //This is where I have code for the oled display.  not important.

}

void event_cycle(uint8_t hr, uint8_t mn, uint8_t sec){
  Serial.print(myTZ.dateTime() + "     ");
  Serial.println("Executing the " + String(hr) + ":" + String(mn) + ":" + String(sec) + " event");
  
  uint8_t time_left = event_duration; // This will be used to end the event.

  digitalWrite(event_pin, LOW); //Turn on the relay
  
  while (time_left > 0) {
    //delay(1000);
    //Or
    //secondChanged is a boolean value, and is true when the second changes, 
    //but then goes back to false the next time you evaluate it.
    while (!secondChanged()) {
      delay(1);
    }
    time_left--; //decrement time left by one second
  }
  
  digitalWrite(event_pin, HIGH); //Turn off the relay
  
  Serial.print(myTZ.dateTime() + "     ");
  Serial.println("Concluding the " + String(hr) + ":" + String(mn) + ":" + String(sec) + " event");
  
  make_next_event(hr, mn, sec);
  
}

void make_next_event(uint8_t hr, uint8_t mn, uint8_t sec) {
  //makeTime(hour, minute, second, day, month year)
  time_t set_time = makeTime(hr, mn, sec, day(), month(), year());

  if (myTZ.now() >= set_time) { // See if event set time has already elapsed
    set_time += 86400; // 86400 seconds in 1 day
  }

  Serial.print(myTZ.dateTime() + "     ");
  Serial.println("  Setting the " + zeropad(hr, 2) + ":" + zeropad(mn, 2) + ":" + zeropad(sec, 2) + " event");

  //setEvent(function, time_t object)
  uint8_t setEvent(void event_cycle(uint8_t hr, uint8_t mn, uint8_t sec), time_t set_time);
 
  Serial.print(myTZ.dateTime() + "     ");
  Serial.println("  Event set for " + String(day(set_time)) + "-" + String(month(set_time)) + "-" + String(year(set_time)) + " " + zeropad(hr, 2) + ":" + zeropad(mn, 2) + ":" + zeropad(sec, 2) + "\n");
}

void loop() {
  //This is the events for the eztime library
  //Needed to continually sync with NTP and trigger events, such as the watering events and the secondChanged() function
  events();

  //This function happens every time the internal clock's second changes.
  //Unless an event is occuring...
  if (secondChanged()) {
    idleDisplay();

  }
  
  delay(5);

}

events conflicts with AsyncWebServer library

Hi Ron

Thanks for you previous help which looks good, however when I added your library into my main application and added the call to events(); I ran into a conflict with other libraries in my project which is using an ESP32 based project with the Arduino IDE. Looks like the conflict is with additional libraries required by the AsyncWebServer library.

task1.cpp:499:9: error: reference to 'events' is ambiguous

         events.onConnect([](AsyncEventSourceClient *client){

         ^

arduino_build_809613\sketch\task1.cpp:227:19: note: candidates are: AsyncEventSource events

 AsyncEventSource  events("/events");

                   ^

In file included from 
arduino_build_809613\sketch\main_framework.h:147:0,

                 from arduino_build_809613\sketch\task1.cpp:73:

Arduino Sketchbook\libraries\ezTime\src/ezTime.h:177:7: note:                 void ezt::events()

  void events();

       ^

task1.cpp:504:28: error: reference to 'events' is ambiguous

         server.addHandler(&events);

                            ^_

I solved the problem by renaming events to ezEvents in your libraries as they were the easiest to change and last to be added to my application. Is there a better way to do this without changing libraries.

MKR1000 and MKR WiFi1010 - EEPROM

Hello,
As indicate in the Readme file, to use the MKR familly, I commented the two lines :
//#define EZTIME_CACHE_EEPROM
// #define EZTIME_CACHE_NVS

What is the impact of not using the epprom ?

Possible to use standard NTP servers in your library

Dear Sir,
first of all congratulation for your fine work, by making this library.
My question is: Do you support standard NTP servers in your library? For example, I live in Greece, can I use NTP server like: gr.pool.ntp.org ?
Please explain it in details because I am not programmer.

Thanks and Best Regards,
Mike Kranidis

get epoch in millis

What's the correct way to get an epoch time from millis? (as javascript/java System.currentTimeMillis())

i am not 100% sure that it's now()*1000+ms() so i'll like to get confirmation :)

tnx

Spelling of February

In ezTime.h line 86: #define FEBRUARI 2
Should be: #define FEBRUARY 2

Also in keywords.txt

Please document privacy policy

You are offering a service on timezoned.rob.nl so users of your library can find out DST and TZ information.

Please document your privacy policy for information collected on this service as per EU GDPR.

Daily Alarm?

Would it be possible to set a daily repeating alarm without specifying the day, month and year?

I'm using Paul's time and timeAlarm libraries plus some hacky time zone adjustments. (https://github.com/PaulStoffregen/TimeAlarms)

 Alarm.alarmRepeat(8,30,0, MorningAlarm);  // 8:30am every day
 Alarm.alarmRepeat(17,45,0,EveningAlarm);  // 5:45pm every day 

// functions to be called when an alarm triggers:
void MorningAlarm(){
  Serial.println("Alarm: - turn lights off");    
}

void EveningAlarm(){
  Serial.println("Alarm: - turn lights on");           
}

I'm currently trying with this - which triggers continuously when the time arrives. How should I be setting up a daily repeating alarm?

#include <ezTime.h>
#include <WiFi.h>
Timezone myTZ;
void setup() {

  Serial.begin(115200);

  WiFi.begin("", "");

  waitForSync();
  Serial.println();
  Serial.println("UTC:             " + UTC.dateTime());


  myTZ.setLocation(F("gb"));
  Serial.print(F("United Kingdom:         "));
  Serial.println(myTZ.dateTime());
  myTZ.setDefault();

  // Set the event to trigger for the first time
  setEvent( mistOneStart, pumpOn() );
  setEvent( mistOneStop, pumpOff() );
}

void loop() {

  events();

}

void mistOneStart() {
  Serial.print(F("Start! "));
  Serial.println(myTZ.dateTime());
  setEvent( mistOneStart, pumpOn() );
}

time_t pumpOn() {
  int8_t d = myTZ.day() ;
  int8_t m = myTZ.month();
  int16_t y = myTZ.year();

  time_t t = 0;
  t = makeTime(1, 04, 0, d, m, y);
  return t;

}

void mistOneStop() {
  Serial.print(F("Stop! "));
  Serial.println(myTZ.dateTime());
  setEvent( mistOneStop, pumpOff() );
}

time_t pumpOff() {
  int8_t d = myTZ.day() ;
  int8_t m = myTZ.month();
  int16_t y = myTZ.year();

  time_t t = 0;
  t = makeTime(1, 04, 30, d, m, y);
  return t;

}


Changing to DST at wrong time.

Just trying to test out code before a real summertime change.

So, I'm doing testing by setting the TZ string to change to summertime a few minutes in the future, expecting to watch the change. But, when set slightly in the future, it changes immediately. It's not changing at the correct local time.

Right now, it's Monday, 04-Feb-2019, 23:something. (date is M2.1.1, in "Olson speak")

e.g. With the string set to "EST5EDT,M2.1.2/4:13,M11.1.0" (summertime begins at 04:13 tomorrow morning), it actually changes to DST at 23:08 local standard time, which is 5 minutes before when it should change if it were simply using UTC instead of local time! 100% repeatable, I can switch back and forth. If I set the TZ string to 5 hours and 4 minutes ahead of local time, it will change to DST. If I set it to 5 hours and 6 minutes ahead of local time, it will change to standard time.

Weird. I'm not a coder, I only play one on the Internet enough to be dangerous. But, that behavior would make sense if in the relevant routine, instead of subtracting 5 hours (the offset from UTC) from UTC time, you're subtracting 5 minutes (or something like that, my brain is starting to hurt).

Timezone not applying to makeTime

Is this expected behavior? I'm sure I'm doing something silly but If I set up a time_t element it prints without timezone adjustment.

The default timezone works, deconstructing t shows the hour as 21 and the epoch time is correct.

#include <ezTime.h>
#include <WiFi.h>
Timezone myTZ;

void setup() {
  Serial.begin(115200);
  WiFi.begin("", "");
  waitForSync();

  myTZ.setLocation(F("gb"));
  myTZ.setDefault();
  Serial.print("TimeZone: "); Serial.println(dateTime());
  Serial.print("epoch myTZ : "); Serial.println(myTZ.now());
  
  time_t t = 0;
  t = makeTime(21, 45, 00, myTZ.day() , myTZ.month(), myTZ.year());
  Serial.print("Test: "); Serial.println(myTZ.dateTime(t));

  Serial.print("epoch Test : "); Serial.println(t);

  tmElements_t tmTest;
  breakTime(t, tmTest);
  Serial.print("Hour: "); Serial.println(tmTest.Hour);
}

void loop() {

}
TimeZone: Friday, 26-Oct-2018 21:45:27 BST
epoch myTZ : 1540590327

Test: Friday, 26-Oct-2018 20:45:00 BST
epoch Test : 1540590300

Hour: 21

Clock is set to 2036-02-07 about 7:30AM sometimes by sync

Hallo,

I made simple NTP clock using your ezTime library (https://github.com/BugerDread/esp8266-ezTIME-wifi-clock), but I noticed that it sometimes shows wrong time / date randomly. The wrong time / date is always 2036-02-07 about 7:30 (timezone Europe/Prague). So I made a simple sketch sending actual time and ezTime debug data to serial port which I captured to file.

Here is the testing sketch:

#include <ESP8266WiFi.h>
#include <ezTime.h>

// configuration
static const char ourtimezone[] PROGMEM = "Europe/Prague";  //official timezone names https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
static const char dot[] PROGMEM = ".";
#define wifi_ssid             "MikroTik-043865"                //ssid of your WiFi
#define wifi_pwd              "badik2323"                    //password for your WiFi

Timezone myTZ;

int i = 10;
String buf;

void setup() {
  Serial.begin(115200);
  Serial.println(F("\r\n* * * ESP BOOT * * *"));
  setDebug(INFO);
  
  Serial.print(F("# Connecting to WiFi"));
  WiFi.persistent(false);   //dont want to save wifi credentials into flash - it cause just fash wear every power-on, see https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/generic-class.html#persistent
  WiFi.mode(WIFI_STA);      //we want just Wifi client (station), no AP
  WiFi.begin(wifi_ssid, wifi_pwd);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(FPSTR(dot));
  }
  
  Serial.println(F("\r\n# WiFi connected, waiting for sync"));
  waitForSync();
  Serial.println(F("# Setting timezone"));
  if (myTZ.setLocation(FPSTR(ourtimezone))) {
    Serial.println(F("# Timezone lookup OK"));
  } else {
    Serial.println(F("# Timezone lookup error!"));
  }
  
  Serial.println(F("# Setup finished"));
}

void loop() {
  events();
  
  if (secondChanged()) {
    buf = myTZ.dateTime("# Y-m-d H-i-s");
    if (++i >= 10) {
      Serial.print("\r\n" + buf);
      i = 0;
    } else {
      Serial.print(FPSTR(dot));
    }
  }
  
}

Here is the (truncated) log:

# 2019-01-27 16-32-59.........
# 2019-01-27 16-33-09.........
# 2019-01-27 16-33-19.........
# 2019-01-27 16-33-29.........
# 2019-01-27 16-33-39...Querying pool.ntp.org ... success (round trip 55 ms)
Received time: Sunday, 27-Jan-19 15:33:43.071 UTC (internal clock was 15 ms fast)
......
# 2019-01-27 16-33-49.........
# 2019-01-27 16-33-59.........
# 2019-01-27 16-34-09.........
# 2019-01-27 16-34-19.........
# 2019-01-27 16-34-29.........
# 2019-01-27 16-34-39.........
# 2019-01-27 16-34-49.........
# 2019-01-27 16-34-59.........
# 2019-01-27 16-35-09.........
# 2019-01-27 16-35-19.........
# 2019-01-27 16-35-29.........
# 2019-01-27 16-35-39.........
# 2019-01-27 16-35-49.........
# 2019-01-27 16-35-59.........
# 2019-01-27 16-36-09.........
# 2019-01-27 16-36-19.........
# 2019-01-27 16-36-29.........
# 2019-01-27 16-36-39.........
# 2019-01-27 16-36-49.........
# 2019-01-27 16-36-59.........
# 2019-01-27 16-37-09.........
# 2019-01-27 16-37-19.........
# 2019-01-27 16-37-29.........
# 2019-01-27 16-37-39.........
# 2019-01-27 16-37-49.........
# 2019-01-27 16-37-59.........
# 2019-01-27 16-38-09.........
# 2019-01-27 16-38-19.........
# 2019-01-27 16-38-29.........
# 2019-01-27 16-38-39.........
# 2019-01-27 16-38-49.........
# 2019-01-27 16-38-59.........
# 2019-01-27 16-39-09.........
# 2019-01-27 16-39-19.........
# 2019-01-27 16-39-29.........
# 2019-01-27 16-39-39.........
# 2019-01-27 16-39-49.........
# 2019-01-27 16-39-59.........
# 2019-01-27 16-40-09.........
# 2019-01-27 16-40-19.........
# 2019-01-27 16-40-29.........
# 2019-01-27 16-40-39.........
# 2019-01-27 16-40-49.........
# 2019-01-27 16-40-59.........
# 2019-01-27 16-41-09.........
# 2019-01-27 16-41-19.........
# 2019-01-27 16-41-29.........
# 2019-01-27 16-41-39.........
# 2019-01-27 16-41-49.........
# 2019-01-27 16-41-59.........
# 2019-01-27 16-42-09.........
# 2019-01-27 16-42-19.........
# 2019-01-27 16-42-29.........
# 2019-01-27 16-42-39.........
# 2019-01-27 16-42-49.........
# 2019-01-27 16-42-59.........
# 2019-01-27 16-43-09.........
# 2019-01-27 16-43-19.........
# 2019-01-27 16-43-29.........
# 2019-01-27 16-43-39....Querying pool.ntp.org ... success (round trip 43 ms)
Received time: Thursday, 07-Feb-36 06:28:16.021 UTC (internal clock was 503760977 ms fast)
.....
# 2036-02-07 07-28-21.........
# 2036-02-07 07-28-31.........
# 2036-02-07 07-28-41.........
# 2036-02-07 07-28-51.........
# 2036-02-07 07-29-01.........
# 2036-02-07 07-29-11.........
# 2036-02-07 07-29-21.........
# 2036-02-07 07-29-31.........
# 2036-02-07 07-29-41.........
# 2036-02-07 07-29-51.........
# 2036-02-07 07-30-01.........
# 2036-02-07 07-30-11.........
# 2036-02-07 07-30-21.........
# 2036-02-07 07-30-31.........
# 2036-02-07 07-30-41.........
# 2036-02-07 07-30-51.........
# 2036-02-07 07-31-01.........
# 2036-02-07 07-31-11.........
# 2036-02-07 07-31-21.........
# 2036-02-07 07-31-31.........
# 2036-02-07 07-31-41.........
# 2036-02-07 07-31-51.........
# 2036-02-07 07-32-01.........
# 2036-02-07 07-32-11.........
# 2036-02-07 07-32-21.........
# 2036-02-07 07-32-31.........
# 2036-02-07 07-32-41.........
# 2036-02-07 07-32-51.........
# 2036-02-07 07-33-01.........
# 2036-02-07 07-33-11.........
# 2036-02-07 07-33-21.........
# 2036-02-07 07-33-31.........
# 2036-02-07 07-33-41.........
# 2036-02-07 07-33-51.........
# 2036-02-07 07-34-01.........
# 2036-02-07 07-34-11.........
# 2036-02-07 07-34-21.........
# 2036-02-07 07-34-31.........
# 2036-02-07 07-34-41.........
# 2036-02-07 07-34-51.........
# 2036-02-07 07-35-01.........
# 2036-02-07 07-35-11.........
# 2036-02-07 07-35-21.........
# 2036-02-07 07-35-31.........
# 2036-02-07 07-35-41.........
# 2036-02-07 07-35-51.........
# 2036-02-07 07-36-01.........
# 2036-02-07 07-36-11.........
# 2036-02-07 07-36-21.........
# 2036-02-07 07-36-31.........
# 2036-02-07 07-36-41.........
# 2036-02-07 07-36-51.........
# 2036-02-07 07-37-01.........
# 2036-02-07 07-37-11.........
# 2036-02-07 07-37-21.........
# 2036-02-07 07-37-31.........
# 2036-02-07 07-37-41.........
# 2036-02-07 07-37-51.........
# 2036-02-07 07-38-01.........
# 2036-02-07 07-38-11.....Querying pool.ntp.org ... success (round trip 19 ms)
Received time: Sunday, 27-Jan-19 15:53:43.109 UTC (internal clock was 503760912 ms slow)
....
# 2019-01-27 16-53-47.........
# 2019-01-27 16-53-57.........
# 2019-01-27 16-54-07.........
# 2019-01-27 16-54-17.........
# 2019-01-27 16-54-27.........

It occurs sometimes once / twice a day, randomly, it gets fixed after 10minutes as another sync is performed (as visible in the log above).

What can be source of the problem and how to avoid this?

Ggling around I found https://forum.arduino.cc/index.php?topic=92632.0 - maybe same or simmilar problem?

Ofcourse I can provide you with more info, just let me know...

Timezone::dateTime(time_t, ...) shows wrong milliseconds value

  • When using date and time formatting of an argument-passed timestamp, Timezone::dateTime(time_t, ...) would display last read milliseconds instead of zero for the v placeholder.
  • And an option to pass milliseconds along with the timestamp would be very handy. Probably with another overloaded variant of Timezone::dateTime(...).

Although ms-precision datetime formatting is still possible with some string gluing code and maintaining two time formats for both current and variable-based time formatting, it's a pity not having it in such a great library. :)

Timezone date / time functions not working properly with time_t values

The TimeLib library allows using
hour(now()) to get the current hour so it would seem reasonable that local.hour(local.now()) should work as well as hour(now()) (when the local timezone is set to be the default) , but it doesn't.

Based on the above assumption that something like local.hour(local.now()), should work as it is passing in the time_t value from the local timezone object and simply attempting to get the hour in the local timezone,
there appears to be an issue related to using the date / time functions like hour() minute() etc....
when a time_t value is passed in.
Example:
local is not the default timezone.
now() - works as expected and returns the standard unix time_t
local.now() - returns a munged time_t value that is offset by the current local timezone offset.
local.hour() - works as expected and returns the hour in the local timezone

local.hour(local.now()) - returns the hour in UTC timezone not the hour in the local timezone.
local.hour(local.now(), LOCAL_TIME) - same as above
These seem incorrect, as there appears to be no way to get from a time_t value returned by the local timezone object to a local time value.

local.hour(UTC.now(), UTC_TIME) - works as expected and returns the hour in the local timezone

If you set the default timezone to local by using local.setDefault() then:
now() - returns a munged time_t value that is offset by the current local timezone offset.
local.hour(now()) - returns the hour in UTC timezone not the hour in the local timezone
hour(now()) - returns the hour in UTC timezone not the hour in the local timezone

While these examples are very simplistic actual code may do something more like:

t = now();
// other code
hourvalue = hour(t);
minvalue = minute(t);
// or
sprintf(buf, "%02d:%02d:%02d", hour(t), minute(t), second(t));

And that doesn't work with eztime when using something other than the UTC timezone.

It seems that there should be a way to get from a time_t value returned by the timezone object to a local time value using the timezone methods.


I think much of these kinds of issues relate to the issues brought in in issue #10 where the time_t values returned by the timezone objects are not the actual time_t value but rather a munged value for the local timezone.

In this specific case it appears that tzTime() is always called by the various timeszone methods like hour() and when the local_or_utc value indicates the value is LOCAL_TIME, tzTime() flips it to UTC , the UTC time_t value is used and then the UTC time value is returned instead of the local timezone value.
IMO, that is not the expected behavior.

While all this could be fixed to work, even when using munged time_t values, as the code is currently doing,
local.hour(t) or local.hour(local.now()) could work when time_t value was talways he proper unix time_t value.

I think things would get much simpler and become consistent with the way time_t epoch values are supposed to work if all the now() functions always returned the unix time_t value which is the UTC time_t.
Yes there would be some need for internally doing conversions when doing the local value conversions, but that wouldn't need to be exposed to the users.
Everything should still work and be compatible with the TimeLib API.

It would also make now() lightweight and very fast, as it should be.
Currently tzTime() is called 3 or more times just to get a time_t when some thing like local.now() is called which definitely adds in quite a bit of overhead that would go away.
makeTime() and breakTime() should be the expensive functions that deal with all the timezone issues and should be moved to be in the Timezone class which can handle the local timezone conversions.
Then, all the timezone methods like hour() would first call breakTime() which would do the needed timezone offset conversion, then pick out the needed value and return it.
users could call also local.breakTime() to get all the local time values at once if they desired.
makeTime() and breakTime() could be left in the ezt class and call the default timezone version just like some of the other functions.

setLocation issue and offset wrong way? (previously: Seem good, but do not work !?)

Hello,

I have this code :

  Timezone myTZ;
  myTZ.setLocation(F("CET"));
  Serial.print(F("CET:\t\t\t"));
  Serial.println(myTZ.dateTime());
  myTZ.setLocation(F("CEST"));
  Serial.print(F("CEST:\t\t\t"));
  Serial.println(myTZ.dateTime());
  myTZ.setLocation(F("UTC"));
  Serial.print(F("UTC:\t\t\t"));
  Serial.println(myTZ.dateTime());
  myTZ.setLocation(F("Europe/London"));
  Serial.print(F("London:\t\t\t"));
  Serial.println(myTZ.dateTime());
  myTZ.setLocation(F("Europe/Paris"));
  Serial.print(F("France:\t\t\t"));
  Serial.println(myTZ.dateTime());
  myTZ.setPosix("CET+2:00");
  Serial.print(F("France apres ofset:\t"));
  Serial.println(myTZ.dateTime());
  Serial.println("Posix zone : " + myTZ.getPosix());
  Serial.println("Nom de la zone : " + myTZ.getTimezoneName());

It's very strange, the result is :

CET:				Friday, 10-May-2019 23:29:09 UTC
CEST:			Friday, 10-May-2019 23:29:11 UTC
UTC:			Friday, 10-May-2019 23:29:13 UTC
London:			Friday, 10-May-2019 23:29:15 UTC
France:			Friday, 10-May-2019 23:29:17 UTC
France apres ofset:	Friday, 10-May-2019 21:29:17 CET
Posix zone : CET+2:00
Nom de la zone : CET

I do not understand why it's the same hour whatever the location i take !?!?

More fun : actually, there is 2 hours offset as we are in summer (only 1 hour in winter) : so why does it send me 21:29 whereas it's 01:29 am ???
Why is it the same hour in Paris and London whereas it's not the same time zone ???

Does someone have an idea ? or what do i make wrong ?
Thank's again,
Thierry

Wrong begin date of DST

Hello,
I use the library without a network connection. Therfore I defined the POSIX TZ rule like this:

#define CET_POSIX	"CET-1CEST,M3.5.0/02:00:00,M10.5.0/03:00:00"		// Time in Berlin
LOC.setPosix(CET_POSIX);

The last Sunday in March this year will be the 31st. Unfortunatly the DST begin date seems to be already on 24th of March. This could be a similar problem with the POSIX day number like #28

DST ended early in PT

I noticed that DST ended early in my time zone on version 0.7.7.

Possibly related to #11?

Using setLocation("America/Los_Angeles"):

Date Time ezTime
NOV 3 11:00PM 10:00PM
NOV 4 12:00AM 11:00PM
NOV 4 1:00AM 12:00AM
NOV 4 1:00AM 1:00AM
NOV 4 2:00AM 2:00AM

Results from timezoned.rop.nl:2342

Hello, maybe this is not a bug, but I want to understand this.

For "Africa/Casablanca" your answer is: "OK Africa/Casablanca WET0WEST,M3.5.0,M10.5.0/3"

zdump -v Africa/Casablanca (for 2018) results to:

Africa/Casablanca Sun Mar 25 01:59:59 2018 UT = Sun Mar 25 01:59:59 2018 +00 isdst=0 gmtoff=0
Africa/Casablanca Sun Mar 25 02:00:00 2018 UT = Sun Mar 25 03:00:00 2018 +01 isdst=1 gmtoff=3600
Africa/Casablanca Sun May 13 01:59:59 2018 UT = Sun May 13 02:59:59 2018 +01 isdst=1 gmtoff=3600
Africa/Casablanca Sun May 13 02:00:00 2018 UT = Sun May 13 02:00:00 2018 +00 isdst=0 gmtoff=0
Africa/Casablanca Sun Jun 17 01:59:59 2018 UT = Sun Jun 17 01:59:59 2018 +00 isdst=0 gmtoff=0
Africa/Casablanca Sun Jun 17 02:00:00 2018 UT = Sun Jun 17 03:00:00 2018 +01 isdst=1 gmtoff=3600
Africa/Casablanca Fri Oct 26 22:59:59 2018 UT = Fri Oct 26 23:59:59 2018 +01 isdst=1 gmtoff=3600
Africa/Casablanca Fri Oct 26 23:00:00 2018 UT = Sat Oct 27 00:00:00 2018 +01 isdst=0 gmtoff=3600
0

I think POSIX TZ should be: GMT0GMT-1,M3.5.0/02:00:00,M5.3.0/03:00:00,M6.4.0/02:00:00,M10.4.6/00:00:00

Please enlighten me. / Greetings Kai.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.