During the last several years, personal computers and smartphones became capable of displaying the local time, correctly adjusted for daylight saving time (DST) – and without requiring human intervention beyond selecting the correct timezone.
Nowadays, there are also some IoT devices, which need to support local time management – displaying it, or otherwise making it available.
Timekeeping is performed using the Internet protocol NTP, which provides the correct UTC. When using a PC or a smartphone, the timezone is usually selected by manual user action.
However, some IoT devices may not have the UI needed for convenient timezone selection. Then it is desirable to support automatic timezone selection as a default.
How to implement automatic timezone selection?
There are some websites, which discover your IP address and provide you with the best guess of your timezone.
Since those websites usually provide the timezone name rather than the string describing the DST transition dates (the so-called tz_string), the next step is to figure out the DST transition dates from the timezone name.
In devices with plenty of memory this is carried out by means of a timezone database.
For example, in Debian/Ubuntu based systems, this database is stored in the /usr/share/zoneinfo directory and occupies 3.5MB (the relevant package in Ubuntu 18.04 is tzdata and its version, as of Nov. 2019, is 2019c-0ubuntu0.18.04).
Memory constrained IoT devices
However, IoT devices are typically based upon memory-constrained controllers and cannot afford to store locally the whole timezone database – just to correctly determine the local time for a single timezone.
Therefore, IoT devices need to access an Internet based service to get the correct timezone information, just as they get UTC time updates using NTP. In other words, those IoT devices effectively outsource the timezone database management.
Internet service for providing the timezone information
An Internet service, for providing the correct tz_string corresponding to a timezone name, needs to keep the timezone database up to date at all times.
I implemented the internet service as follows.
- A machine, running an Ubuntu 18.04 installation with a webserver, is used.
- The Internet service is implmented as a small WSGI-based website. It uses the database mentioned below.
- A script scans the /usr/share/zoneinfo contents and creates a small database for translating timezone names into the corresponding tz_string values.
- There is a mechanism for invoking the above script and restarting the web server each time the tzdata package is updated/installed/re-installed.
Show us the code!
The GitHub project tddpirate/tzdata2tzstring includes redacted versions of both an implementation of the above website and a sample ESP8266 client.
I wish to thank the Python Israel Telegram group members for advice about selecting a Python WSGI framework. I ended up selecting Falcon because benchmarks indicated that it is faster than Flask and Bottle.
The members of the לינוקס Telegram group deserve thanks, too. They helped me find the mechanism for appending my own postprocessing scripts after a Debian/Ubuntu package installation or upgrade.