Skip to content

Commit

Permalink
Merge pull request #171 from sanderkob/PR-timezone
Browse files Browse the repository at this point in the history
fix local time zones
  • Loading branch information
arjenhiemstra authored Apr 12, 2023
2 parents 2f64073 + 9eb1634 commit 2efafa8
Show file tree
Hide file tree
Showing 7 changed files with 191 additions and 4 deletions.
9 changes: 8 additions & 1 deletion software/NRG_itho_wifi/main/config/WifiConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ WifiConfig::WifiConfig()
port = 80;
strlcpy(hostname, "", sizeof(hostname));
strlcpy(ntpserver, "pool.ntp.org", sizeof(ntpserver));
strlcpy(timezone, "Europe/Amsterdam", sizeof(timezone));

configLoaded = false;
} // WifiConfig
Expand Down Expand Up @@ -91,6 +92,11 @@ bool WifiConfig::set(JsonObjectConst obj)
updated = true;
strlcpy(ntpserver, obj["ntpserver"], sizeof(ntpserver));
}
if (!obj["timezone"].isNull())
{
updated = true;
strlcpy(timezone, obj["timezone"], sizeof(timezone));
}
return updated;
}

Expand All @@ -107,6 +113,7 @@ void WifiConfig::get(JsonObject obj) const
obj["port"] = port;
obj["hostname"] = hostname;
obj["ntpserver"] = ntpserver;
obj["timezone"] = timezone;
}

void wifiScan()
Expand Down Expand Up @@ -243,4 +250,4 @@ const char *WifiConfig::wl_status_to_name(wl_status_t code) const
}
}
return wl_unknown_msg;
}
}
1 change: 1 addition & 0 deletions software/NRG_itho_wifi/main/config/WifiConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class WifiConfig
uint8_t port;
char hostname[32];
char ntpserver[128];
char timezone[30];
char config_struct_version[4];

mutable bool configLoaded;
Expand Down
4 changes: 4 additions & 0 deletions software/NRG_itho_wifi/main/tasks/task_configandlog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ void TaskConfigAndLog(void *pvParameters)
initFileSystem();
syslog_queue_worker();

//set provisional timezone
setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 1);
tzset();

logInit();
syslog_queue_worker();

Expand Down
107 changes: 107 additions & 0 deletions software/NRG_itho_wifi/main/tasks/task_syscontrol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -540,8 +540,115 @@ void wifiInit()
E_LOG("Setup: Wifi connect STA failed");
setupWiFiAP();
}

configTime(0, 0, wifiConfig.ntpserver);

// set timezone

struct tzLabels
{
const char* tzlabel;
const uint8_t tzindex;
};

const struct tzLabels tzlabels[] {
{"Europe/Amsterdam", 0 },
{"Europe/Andorra", 0 },
{"Europe/Astrakhan", 1 },
{"Europe/Athens", 2 },
{"Europe/Belgrade", 0 },
{"Europe/Berlin", 0 },
{"Europe/Bratislava", 0 },
{"Europe/Brussels", 0 },
{"Europe/Bucharest", 2 },
{"Europe/Budapest", 0 },
{"Europe/Busingen", 0 },
{"Europe/Chisinau", 3 },
{"Europe/Copenhagen", 0 },
{"Europe/Dublin", 4 },
{"Europe/Gibraltar", 0 },
{"Europe/Guernsey", 5 },
{"Europe/Helsinki", 2 },
{"Europe/Isle_of_Man", 5 },
{"Europe/Istanbul", 6 },
{"Europe/Jersey", 5 },
{"Europe/Kaliningrad", 7 },
{"Europe/Kyiv", 2 },
{"Europe/Kirov", 6 },
{"Europe/Lisbon", 8 },
{"Europe/Ljubljana", 0 },
{"Europe/London", 5 },
{"Europe/Luxembourg", 0 },
{"Europe/Madrid", 0 },
{"Europe/Malta", 0 },
{"Europe/Mariehamn", 2 },
{"Europe/Minsk", 6 },
{"Europe/Monaco", 0 },
{"Europe/Moscow", 9 },
{"Europe/Oslo", 0 },
{"Europe/Paris", 0 },
{"Europe/Podgorica", 0 },
{"Europe/Prague", 0 },
{"Europe/Riga", 2 },
{"Europe/Rome", 0 },
{"Europe/Samara", 1 },
{"Europe/San_Marino", 0 },
{"Europe/Sarajevo", 0 },
{"Europe/Saratov", 1 },
{"Europe/Simferopol", 9 },
{"Europe/Skopje", 0 },
{"Europe/Sofia", 2 },
{"Europe/Stockholm", 0 },
{"Europe/Tallinn", 2 },
{"Europe/Tirane", 0 },
{"Europe/Ulyanovsk", 1 },
{"Europe/Uzhgorod", 2 },
{"Europe/Vaduz", 0 },
{"Europe/Vatican", 0 },
{"Europe/Vienna", 0 },
{"Europe/Vilnius", 2 },
{"Europe/Volgograd", 6 },
{"Europe/Warsaw", 0 },
{"Europe/Zagreb", 0 },
{"Europe/Zaporizhzhia", 2 },
{"Europe/Zurich", 0 },
{"Etc/Greenwich", 10 },
{"Etc/Universal", 11 },
};

char tz_strings[][30] =
{
"CET-1CEST,M3.5.0,M10.5.0/3",
"<+04>-4",
"EET-2EEST,M3.5.0/3,M10.5.0/4",
"EET-2EEST,M3.5.0,M10.5.0/3",
"IST-1GMT0,M10.5.0,M3.5.0/1",
"GMT0BST,M3.5.0/1,M10.5.0",
"<+03>-3",
"EET-2",
"WET0WEST,M3.5.0/1,M10.5.0",
"MSK-3",
"GMT0",
"UTC0",
};

const char *tz_string = "CET-1CEST,M3.5.0,M10.5.0/3";

const char* target = wifiConfig.timezone; // the timezone we want to find
for (const auto& label : tzlabels)
{
if (std::strcmp(target, label.tzlabel) == 0)
{
// the timezone matches, so we've found the corresponding index
tz_string = tz_strings [static_cast<int>(label.tzindex)];
break;
}
}

N_LOG("Timezone: %s, specifier %s ", wifiConfig.timezone, tz_string);
setenv("TZ", tz_string, 1);
tzset();

WiFi.scanDelete();
if (WiFi.scanComplete() == -2)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,72 @@ <h1>Wifi setup</h1>
<label for="ntpserver">NTP server</label>
<input id="ntpserver" type="text">
</div>
<div class="pure-control-group">
<label for="timezone">Timezone</label>
<select name="timezone" id="timezone">
<option value="Europe/Amsterdam" selected>Europe/Amsterdam</option>
<option value="Europe/Andorra">Europe/Andorra</option>
<option value="Europe/Athens">Europe/Athens</option>
<option value="Europe/Belgrade">Europe/Belgrade</option>
<option value="Europe/Berlin">Europe/Berlin</option>
<option value="Europe/Bratislava">Europe/Bratislava</option>
<option value="Europe/Brussels">Europe/Brussels</option>
<option value="Europe/Bucharest">Europe/Bucharest</option>
<option value="Europe/Budapest">Europe/Budapest</option>
<option value="Europe/Busingen">Europe/Busingen</option>
<option value="Europe/Chisinau">Europe/Chisinau</option>
<option value="Europe/Copenhagen">Europe/Copenhagen</option>
<option value="Europe/Dublin">Europe/Dublin</option>
<option value="Europe/Gibraltar">Europe/Gibraltar</option>
<option value="Europe/Guernsey">Europe/Guernsey</option>
<option value="Europe/Helsinki">Europe/Helsinki</option>
<option value="Europe/Isle_of_Man">Europe/Isle_of_Man</option>
<option value="Europe/Istanbul">Europe/Istanbul</option>
<option value="Europe/Jersey">Europe/Jersey</option>
<option value="Europe/Kaliningrad">Europe/Kaliningrad</option>
<option value="Europe/Kyiv">Europe/Kyiv</option>
<option value="Europe/Kirov">Europe/Kirov</option>
<option value="Europe/Lisbon">Europe/Lisbon</option>
<option value="Europe/Ljubljana">Europe/Ljubljana</option>
<option value="Europe/London">Europe/London</option>
<option value="Europe/Luxembourg">Europe/Luxembourg</option>
<option value="Europe/Madrid">Europe/Madrid</option>
<option value="Europe/Malta">Europe/Malta</option>
<option value="Europe/Mariehamn">Europe/Mariehamn</option>
<option value="Europe/Minsk">Europe/Minsk</option>
<option value="Europe/Monaco">Europe/Monaco</option>
<option value="Europe/Moscow">Europe/Moscow</option>
<option value="Europe/Oslo">Europe/Oslo</option>
<option value="Europe/Paris">Europe/Paris</option>
<option value="Europe/Podgorica">Europe/Podgorica</option>
<option value="Europe/Prague">Europe/Prague</option>
<option value="Europe/Riga">Europe/Riga</option>
<option value="Europe/Rome">Europe/Rome</option>
<option value="Europe/Samara">Europe/Samara</option>
<option value="Europe/San_Marino">Europe/San_Marino</option>
<option value="Europe/Sarajevo">Europe/Sarajevo</option>
<option value="Europe/Saratov">Europe/Saratov</option>
<option value="Europe/Simferopol">Europe/Simferopol</option>
<option value="Europe/Skopje">Europe/Skopje</option>
<option value="Europe/Sofia">Europe/Sofia</option>
<option value="Europe/Stockholm">Europe/Stockholm</option>
<option value="Europe/Tallinn">Europe/Tallinn</option>
<option value="Europe/Tirane">Europe/Tirane</option>
<option value="Europe/Ulyanovsk">Europe/Ulyanovsk</option>
<option value="Europe/Uzhgorod">Europe/Uzhgorod</option>
<option value="Europe/Vaduz">Europe/Vaduz</option>
<option value="Europe/Vatican">Europe/Vatican</option>
<option value="Europe/Vienna">Europe/Vienna</option>
<option value="Europe/Vilnius">Europe/Vilnius</option>
<option value="Europe/Volgograd">Europe/Volgograd</option>
<option value="Europe/Warsaw">Europe/Warsaw</option>
<option value="Europe/Zagreb">Europe/Zagreb</option>
<option value="Europe/Zaporizhzhia">Europe/Zaporizhzhia</option>
<option value="Europe/Zurich">Europe/Zurich</option>
<option value="Etc/Greenwich">Etc/Greenwich</option>
<option value="Etc/Universal">Etc/Universal</option>
</select>
</div>
</fieldset>
</form>
</div>
Expand All @@ -81,4 +147,4 @@ <h1>Wifi setup</h1>
$(document).ready(function () {
getSettings('wifisetup');
});
</script>
</script>
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,8 @@ $(document).ready(function () {
dns2: $('#dns2').val(),
port: $('#port').val(),
hostname: $('#hostname').val(),
ntpserver: $('#ntpserver').val()
ntpserver: $('#ntpserver').val(),
timezone: $('#timezone').val()
}
}));
update_page('wifisetup');
Expand Down Expand Up @@ -1272,4 +1273,4 @@ function addAllColumnHeaders(jsonVar, selector, appendRow) {

//
// HTML string literals
//
//
1 change: 1 addition & 0 deletions software/NRG_itho_wifi/main/websocket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ void jsonWsSend(const char *rootName)
nested["port"] = wifiConfig.port;
nested["hostname"] = hostName();
nested["ntpserver"] = wifiConfig.ntpserver;
nested["timezone"] = wifiConfig.timezone;
}
else if (strcmp(rootName, "systemsettings") == 0)
{
Expand Down

0 comments on commit 2efafa8

Please sign in to comment.