Updated dependecies and docs

This commit is contained in:
Magnus 2023-02-04 13:30:13 +01:00
parent 433502e7a0
commit 336830e5be
10 changed files with 1047 additions and 880 deletions

View File

@ -281,14 +281,14 @@
</div>
<div class="row mb-3">
<label for="influxdb2-bucket" class="col-sm-2 col-form-label">InfluxDB v2 Bucket</label>
<label for="influxdb2-bucket" class="col-sm-2 col-form-label">InfluxDB v2 Bucket ID</label>
<div class="col-sm-4">
<input type="text" maxlength="50" class="form-control" name="influxdb2-bucket" id="influxdb2-bucket" data-bs-toggle="tooltip" title="Identifier for the data bucket to use">
</div>
</div>
<div class="row mb-3">
<label for="influxdb2-auth" class="col-sm-2 col-form-label">InfluxDB v2 Auth</label>
<label for="influxdb2-auth" class="col-sm-2 col-form-label">InfluxDB v2 Auth Token</label>
<div class="col-sm-4">
<input type="text" maxlength="100" class="form-control" name="influxdb2-auth" id="influxdb2-auth" data-bs-toggle="tooltip" title="Authentication token for accessing data bucket">
</div>

File diff suppressed because one or more lines are too long

View File

@ -102,55 +102,55 @@
#elif ( ESP_DRD_USE_LITTLEFS || ESP_DRD_USE_SPIFFS )
#include <FS.h>
#include <FS.h>
#ifdef ESP32
#ifdef ESP32
#if ESP_DRD_USE_LITTLEFS
// Check cores/esp32/esp_arduino_version.h and cores/esp32/core_version.h
//#if ( ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) ) //(ESP_ARDUINO_VERSION_MAJOR >= 2)
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
#if (DOUBLERESETDETECTOR_DEBUG)
#warning Using ESP32 Core 1.0.6 or 2.0.0+
#if ESP_DRD_USE_LITTLEFS
// Check cores/esp32/esp_arduino_version.h and cores/esp32/core_version.h
//#if ( ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) ) //(ESP_ARDUINO_VERSION_MAJOR >= 2)
#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) )
#if (DOUBLERESETDETECTOR_DEBUG)
#warning Using ESP32 Core 1.0.6 or 2.0.0+
#endif
// The library has been merged into esp32 core from release 1.0.6
#include <LittleFS.h>
#define FileFS LittleFS
#define FS_Name "LittleFS"
#else
#if (DOUBLERESETDETECTOR_DEBUG)
#warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library
#endif
// The library has been merged into esp32 core from release 1.0.6
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
#define FileFS LITTLEFS
#define FS_Name "LittleFS"
#endif
// The library has been merged into esp32 core from release 1.0.6
#include <LittleFS.h>
#define FileFS LittleFS
#define FS_Name "LittleFS"
#else
#if (DOUBLERESETDETECTOR_DEBUG)
#warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library
#endif
// The library has been merged into esp32 core from release 1.0.6
#include <LITTLEFS.h> // https://github.com/lorol/LITTLEFS
#define FileFS LITTLEFS
#define FS_Name "LittleFS"
#include "SPIFFS.h"
// ESP32 core 1.0.4 still uses SPIFFS
#define FileFS SPIFFS
#endif
#else
#include "SPIFFS.h"
// ESP32 core 1.0.4 still uses SPIFFS
#define FileFS SPIFFS
#endif
// From ESP8266 core 2.7.1
#include <LittleFS.h>
#else
// From ESP8266 core 2.7.1
#include <LittleFS.h>
#if ESP_DRD_USE_LITTLEFS
#define FileFS LittleFS
#else
#define FileFS SPIFFS
#endif
#if ESP_DRD_USE_LITTLEFS
#define FileFS LittleFS
#else
#define FileFS SPIFFS
#endif
#endif // #if ESP_DRD_USE_EEPROM
#endif // #if ESP_DRD_USE_EEPROM
#define DRD_FILENAME "/drd.dat"
#define DRD_FILENAME "/drd.dat"
#endif //#if ESP_DRD_USE_EEPROM
@ -171,6 +171,7 @@ class DoubleResetDetector
EEPROM.begin(EEPROM_SIZE);
#elif ( ESP_DRD_USE_LITTLEFS || ESP_DRD_USE_SPIFFS )
// LittleFS / SPIFFS code
if (!FileFS.begin())
{
@ -184,6 +185,7 @@ class DoubleResetDetector
#endif
}
#else
#ifdef ESP8266
//RTC only for ESP8266
@ -264,6 +266,7 @@ class DoubleResetDetector
Serial.printf("EEPROM Flag read = 0x%X\n", DOUBLERESETDETECTOR_FLAG);
#endif
#elif ( ESP_DRD_USE_LITTLEFS || ESP_DRD_USE_SPIFFS )
// LittleFS / SPIFFS code
if (FileFS.exists(DRD_FILENAME))
{
@ -292,6 +295,7 @@ class DoubleResetDetector
file.close();
}
#else
#ifdef ESP8266
//RTC only for ESP8266
@ -340,6 +344,7 @@ class DoubleResetDetector
Serial.println("Saving config file failed");
#endif
}
#else
#ifdef ESP8266
//RTC only for ESP8266

View File

@ -16,7 +16,7 @@
Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager
Licensed under MIT license
Version: 1.11.0
Version: 1.12.1
Version Modified By Date Comments
------- ----------- ---------- -----------
@ -28,6 +28,8 @@
1.10.1 K Hoang 11/02/2022 Add LittleFS support to ESP32-C3. Use core LittleFS instead of Lorol's LITTLEFS for v2.0.0+
1.10.2 K Hoang 13/03/2022 Send CORS header in handleWifiSave() function
1.11.0 K Hoang 09/09/2022 Fix ESP32 chipID and add ESP_getChipOUI()
1.12.0 K Hoang 07/10/2022 Optional display Credentials (SSIDs, PWDs) in Config Portal
1.12.1 K Hoang 25/10/2022 Using random channel for softAP without password. Add astyle using allman style
*****************************************************************************************************************************/
#pragma once
@ -35,7 +37,6 @@
#ifndef ESP_WiFiManager_Impl_h
#define ESP_WiFiManager_Impl_h
//////////////////////////////////////////
ESP_WMParameter::ESP_WMParameter(const char *custom)
@ -51,21 +52,24 @@ ESP_WMParameter::ESP_WMParameter(const char *custom)
//////////////////////////////////////////
ESP_WMParameter::ESP_WMParameter(const char *id, const char *placeholder, const char *defaultValue, const int& length, const char *custom, const int& labelPlacement)
ESP_WMParameter::ESP_WMParameter(const char *id, const char *placeholder, const char *defaultValue, const int& length,
const char *custom, const int& labelPlacement)
{
init(id, placeholder, defaultValue, length, custom, labelPlacement);
}
//////////////////////////////////////////
// New in v1.4.0
ESP_WMParameter::ESP_WMParameter(const WMParam_Data& WMParam_data)
{
init(WMParam_data._id, WMParam_data._placeholder, WMParam_data._value, WMParam_data._length, "", WMParam_data._labelPlacement);
init(WMParam_data._id, WMParam_data._placeholder, WMParam_data._value, WMParam_data._length, "",
WMParam_data._labelPlacement);
}
//////
//////////////////////////////////////////
void ESP_WMParameter::init(const char *id, const char *placeholder, const char *defaultValue, const int& length, const char *custom, const int& labelPlacement)
void ESP_WMParameter::init(const char *id, const char *placeholder, const char *defaultValue, const int& length,
const char *custom, const int& labelPlacement)
{
_WMParam_data._id = id;
_WMParam_data._placeholder = placeholder;
@ -98,7 +102,7 @@ ESP_WMParameter::~ESP_WMParameter()
}
//////////////////////////////////////////
// New in v1.4.0
// Using Struct to get/set whole data at once
void ESP_WMParameter::setWMParam_Data(const WMParam_Data& WMParam_data)
{
@ -115,7 +119,6 @@ void ESP_WMParameter::getWMParam_Data(WMParam_Data &WMParam_data)
memcpy(&WMParam_data, &_WMParam_data, sizeof(WMParam_data));
}
//////
//////////////////////////////////////////
@ -159,6 +162,7 @@ const char* ESP_WMParameter::getCustomHTML()
return _customHTML;
}
//////////////////////////////////////////
//////////////////////////////////////////
/**
@ -170,6 +174,8 @@ ESP_WMParameter** ESP_WiFiManager::getParameters()
return _params;
}
//////////////////////////////////////////
/**
[getParametersCount description]
@access public
@ -215,14 +221,13 @@ ESP_WiFiManager::ESP_WiFiManager(const char *iHostname)
#endif
//WiFi not yet started here, must call WiFi.mode(WIFI_STA) and modify function WiFiGenericClass::mode(wifi_mode_t m) !!!
WiFi.mode(WIFI_STA);
if (iHostname[0] == 0)
{
#ifdef ESP8266
String _hostname = "ESP8266-" + String(ESP.getChipId(), HEX);
#else //ESP32
#else //ESP32
String _hostname = "ESP32-" + String(ESP_getChipId(), HEX);
#endif
@ -249,12 +254,14 @@ ESP_WiFiManager::ESP_WiFiManager(const char *iHostname)
ESP_WiFiManager::~ESP_WiFiManager()
{
#if USE_DYNAMIC_PARAMS
if (_params != NULL)
{
LOGINFO(F("freeing allocated params!"));
free(_params);
}
#endif
if (networkIndices)
@ -266,9 +273,9 @@ ESP_WiFiManager::~ESP_WiFiManager()
//////////////////////////////////////////
#if USE_DYNAMIC_PARAMS
bool ESP_WiFiManager::addParameter(ESP_WMParameter *p)
bool ESP_WiFiManager::addParameter(ESP_WMParameter *p)
#else
void ESP_WiFiManager::addParameter(ESP_WMParameter *p)
void ESP_WiFiManager::addParameter(ESP_WMParameter *p)
#endif
{
#if USE_DYNAMIC_PARAMS
@ -335,7 +342,7 @@ void ESP_WiFiManager::setupConfigPortal()
#ifdef ESP8266
server.reset(new ESP8266WebServer(HTTP_PORT_TO_USE));
#else //ESP32
#else //ESP32
server.reset(new WebServer(HTTP_PORT_TO_USE));
#endif
@ -344,7 +351,8 @@ void ESP_WiFiManager::setupConfigPortal()
// Check (https://github.com/khoih-prog/ESP_WiFiManager/issues/58)
if (_WiFi_AP_IPconfig._ap_static_ip)
{
LOGWARN3(F("Custom AP IP/GW/Subnet = "), _WiFi_AP_IPconfig._ap_static_ip, _WiFi_AP_IPconfig._ap_static_gw, _WiFi_AP_IPconfig._ap_static_sn);
LOGWARN3(F("Custom AP IP/GW/Subnet = "), _WiFi_AP_IPconfig._ap_static_ip, _WiFi_AP_IPconfig._ap_static_gw,
_WiFi_AP_IPconfig._ap_static_sn);
WiFi.softAPConfig(_WiFi_AP_IPconfig._ap_static_ip, _WiFi_AP_IPconfig._ap_static_gw, _WiFi_AP_IPconfig._ap_static_sn);
}
@ -380,11 +388,11 @@ void ESP_WiFiManager::setupConfigPortal()
_apPassword = NULL;
}
LOGWARN1(F("AP PWD ="), _apPassword);
}
// KH, new from v1.0.10 to enable dynamic/random channel
// KH, To enable dynamic/random channel
static int channel;
// Use random channel if _WiFiAPChannel == 0
@ -393,19 +401,9 @@ void ESP_WiFiManager::setupConfigPortal()
else
channel = _WiFiAPChannel;
if (_apPassword != NULL)
{
LOGWARN1(F("AP Channel ="), channel);
LOGWARN1(F("AP Channel ="), channel);
//WiFi.softAP(_apName, _apPassword);//password option
WiFi.softAP(_apName, _apPassword, channel);
}
else
{
// Can't use channel here
WiFi.softAP(_apName);
}
//////
WiFi.softAP(_apName, _apPassword, channel);
delay(500); // Without delay I've seen the IP address blank
@ -420,6 +418,8 @@ void ESP_WiFiManager::setupConfigPortal()
server->on("/r", std::bind(&ESP_WiFiManager::handleReset, this));
server->on("/state", std::bind(&ESP_WiFiManager::handleState, this));
server->on("/scan", std::bind(&ESP_WiFiManager::handleScan, this));
//Microsoft captive portal. Maybe not needed. Might be handled by notFound handler.
server->on("/fwlink", std::bind(&ESP_WiFiManager::handleRoot, this));
server->onNotFound(std::bind(&ESP_WiFiManager::handleNotFound, this));
server->begin(); // Web server start
@ -432,7 +432,7 @@ bool ESP_WiFiManager::autoConnect()
{
#ifdef ESP8266
String ssid = "ESP_" + String(ESP.getChipId());
#else //ESP32
#else //ESP32
String ssid = "ESP_" + String(ESP_getChipId());
#endif
@ -440,6 +440,8 @@ bool ESP_WiFiManager::autoConnect()
return autoConnect(ssid.c_str(), NULL);
}
//////////////////////////////////////////
/* This is not very useful as there has been an assumption that device has to be
told to connect but Wifi already does it's best to connect in background. Calling this
method will block until WiFi connects. Sketch can avoid
@ -447,7 +449,6 @@ bool ESP_WiFiManager::autoConnect()
See some discussion at https://github.com/tzapu/WiFiManager/issues/68
*/
// New in v1.0.11
// To permit autoConnect() to use STA static IP or DHCP IP.
#ifndef AUTOCONNECT_NO_INVALIDATE
#define AUTOCONNECT_NO_INVALIDATE true
@ -471,7 +472,6 @@ bool ESP_WiFiManager::autoConnect(char const *apName, char const *apPassword)
while (millis() - startedAt < 10000)
{
//delay(100);
delay(200);
if (WiFi.status() == WL_CONNECTED)
@ -494,7 +494,7 @@ bool ESP_WiFiManager::startConfigPortal()
{
#ifdef ESP8266
String ssid = "ESP_" + String(ESP.getChipId());
#else //ESP32
#else //ESP32
String ssid = "ESP_" + String(ESP_getChipId());
#endif
ssid.toUpperCase();
@ -521,10 +521,12 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw
{
LOGINFO("SET AP");
WiFi.mode(WIFI_AP); // Dual mode becomes flaky if not connected to a WiFi network.
// Dual mode becomes flaky if not connected to a WiFi network.
// When ESP8266 station is trying to find a target AP, it will scan on every channel,
// that means ESP8266 station is changing its channel to scan. This makes the channel of ESP8266 softAP keep changing too..
// So the connection may break. From http://bbs.espressif.com/viewtopic.php?t=671#p2531
WiFi.mode(WIFI_AP);
}
_apName = apName;
@ -580,6 +582,7 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw
//todo: check if any custom parameters actually exist, and check if they really changed maybe
_savecallback();
}
break;
}
@ -599,7 +602,9 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw
if (stopConfigPortal)
{
LOGERROR("Stop ConfigPortal"); //KH
//TimedOut = false;
LOGERROR("Stop ConfigPortal"); //KH
stopConfigPortal = false;
break;
@ -614,7 +619,7 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw
{
setHostname();
// New v1.0.8 to fix static IP when CP not entered or timed-out
// To fix static IP when CP not entered or timed-out
setWifiStaticIP();
WiFi.begin();
@ -636,6 +641,7 @@ bool ESP_WiFiManager::startConfigPortal(char const *apName, char const *apPassw
void ESP_WiFiManager::setWifiStaticIP()
{
#if USE_CONFIGURABLE_DNS
if (_WiFi_STA_IPconfig._sta_static_ip)
{
LOGWARN(F("Custom STA IP/GW/Subnet"));
@ -645,13 +651,15 @@ void ESP_WiFiManager::setWifiStaticIP()
{
LOGWARN(F("DNS1 and DNS2 set"));
WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn, _WiFi_STA_IPconfig._sta_static_dns1, _WiFi_STA_IPconfig._sta_static_dns2);
WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn,
_WiFi_STA_IPconfig._sta_static_dns1, _WiFi_STA_IPconfig._sta_static_dns2);
}
else if (_WiFi_STA_IPconfig._sta_static_dns1)
{
LOGWARN(F("Only DNS1 set"));
WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn, _WiFi_STA_IPconfig._sta_static_dns1);
WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn,
_WiFi_STA_IPconfig._sta_static_dns1);
}
else
{
@ -659,6 +667,7 @@ void ESP_WiFiManager::setWifiStaticIP()
WiFi.config(_WiFi_STA_IPconfig._sta_static_ip, _WiFi_STA_IPconfig._sta_static_gw, _WiFi_STA_IPconfig._sta_static_sn);
}
//***** End added section for DNS config option *****
LOGINFO1(F("setWifiStaticIP IP ="), WiFi.localIP());
@ -667,7 +676,9 @@ void ESP_WiFiManager::setWifiStaticIP()
{
LOGWARN(F("Can't use Custom STA IP/GW/Subnet"));
}
#else
// check if we've got static_ip settings, if we do, use those.
if (_WiFi_STA_IPconfig._sta_static_ip)
{
@ -675,17 +686,17 @@ void ESP_WiFiManager::setWifiStaticIP()
LOGWARN1(F("Custom STA IP/GW/Subnet : "), WiFi.localIP());
}
#endif
}
//////////////////////////////////////////
// New from v1.1.0
int ESP_WiFiManager::reconnectWifi()
{
int connectResult;
// using user-provided _ssid, _pass in place of system-stored ssid and pass
// using user-provided _ssid, _pass instead of system-stored
if ( ( connectResult = connectWifi(_ssid, _pass) ) != WL_CONNECTED)
{
LOGERROR1(F("Failed to connect to"), _ssid);
@ -699,7 +710,7 @@ int ESP_WiFiManager::reconnectWifi()
LOGERROR1(F("Connected to"), _ssid1);
}
else
LOGERROR1(F("Connected to"), _ssid);
LOGERROR1(F("Connected to"), _ssid);
return connectResult;
}
@ -708,12 +719,11 @@ int ESP_WiFiManager::reconnectWifi()
int ESP_WiFiManager::connectWifi(const String& ssid, const String& pass)
{
//KH, from v1.0.10.
// Add option if didn't input/update SSID/PW => Use the previous saved Credentials.
// But update the Static/DHCP options if changed.
if ( (ssid != "") || ( (ssid == "") && (WiFi_SSID() != "") ) )
{
//fix for auto connect racing issue. Move up from v1.1.0 to avoid resetSettings()
//fix for auto connect racing issue, to avoid resetSettings()
if (WiFi.status() == WL_CONNECTED)
{
LOGWARN(F("Already connected. Bailing out."));
@ -731,7 +741,7 @@ int ESP_WiFiManager::connectWifi(const String& ssid, const String& pass)
setHostname();
// KH, Fix ESP32 staticIP after exiting CP, from v1.0.9
// KH, Fix ESP32 staticIP after exiting CP
#ifdef ESP32
setWifiStaticIP();
#endif
@ -757,6 +767,7 @@ int ESP_WiFiManager::connectWifi(const String& ssid, const String& pass)
}
int connRes = waitForConnectResult();
LOGWARN1("Connection result: ", getStatus(connRes));
//not connected, WPS enabled, no pass - first attempt
@ -789,13 +800,14 @@ uint8_t ESP_WiFiManager::waitForConnectResult()
LOGWARN1(F("Connected after waiting (s) :"), waited / 1000);
LOGWARN1(F("Local ip ="), WiFi.localIP());
// Fix bug from v1.1.0+, connRes is sometimes not correct.
// Fix bug, connRes is sometimes not correct.
//return connRes;
return WiFi.status();
}
else
{
LOGERROR(F("Waiting WiFi connection with time out"));
unsigned long start = millis();
bool keepConnecting = true;
uint8_t status;
@ -803,6 +815,7 @@ uint8_t ESP_WiFiManager::waitForConnectResult()
while (keepConnecting)
{
status = WiFi.status();
if (millis() > start + _connectTimeout)
{
keepConnecting = false;
@ -813,8 +826,10 @@ uint8_t ESP_WiFiManager::waitForConnectResult()
{
keepConnecting = false;
}
delay(100);
}
return status;
}
}
@ -827,7 +842,7 @@ void ESP_WiFiManager::startWPS()
LOGINFO("START WPS");
WiFi.beginWPSConfig();
LOGINFO("END WPS");
#else //ESP32
#else //ESP32
// TODO
LOGINFO("ESP32 WPS TODO");
#endif
@ -843,14 +858,19 @@ const char* ESP_WiFiManager::getStatus(const int& status)
{
case WL_IDLE_STATUS:
return "WL_IDLE_STATUS";
case WL_NO_SSID_AVAIL:
return "WL_NO_SSID_AVAIL";
case WL_CONNECTED:
return "WL_CONNECTED";
case WL_CONNECT_FAILED:
return "WL_CONNECT_FAILED";
case WL_DISCONNECTED:
return "WL_DISCONNECTED";
default:
return "UNKNOWN";
}
@ -880,14 +900,15 @@ void ESP_WiFiManager::resetSettings()
WiFi.disconnect(true);
#else
WiFi.disconnect(true, true);
// New in v1.0.11
// Temporary fix for issue of not clearing WiFi SSID/PW from flash of ESP32
// See https://github.com/khoih-prog/ESP_WiFiManager/issues/25 and https://github.com/espressif/arduino-esp32/issues/400
WiFi.begin("0","0");
WiFi.begin("0", "0");
//////
#endif
delay(200);
return;
}
@ -921,7 +942,7 @@ void ESP_WiFiManager::setDebugOutput(bool debug)
//////////////////////////////////////////
// KH, new from v1.0.10 to enable dynamic/random channel
// KH, To enable dynamic/random channel
int ESP_WiFiManager::setConfigPortalChannel(const int& channel)
{
// If channel < MIN_WIFI_CHANNEL - 1 or channel > MAX_WIFI_CHANNEL => channel = 1
@ -947,7 +968,6 @@ void ESP_WiFiManager::setAPStaticIPConfig(const IPAddress& ip, const IPAddress&
//////////////////////////////////////////
// New in v1.4.0
void ESP_WiFiManager::setAPStaticIPConfig(const WiFi_AP_IPConfig& WM_AP_IPconfig)
{
LOGINFO(F("setAPStaticIPConfig"));
@ -963,7 +983,7 @@ void ESP_WiFiManager::getAPStaticIPConfig(WiFi_AP_IPConfig &WM_AP_IPconfig)
memcpy((void*) &WM_AP_IPconfig, &_WiFi_AP_IPconfig, sizeof(WM_AP_IPconfig));
}
//////
//////////////////////////////////////////
void ESP_WiFiManager::setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn)
@ -975,7 +995,6 @@ void ESP_WiFiManager::setSTAStaticIPConfig(const IPAddress& ip, const IPAddress&
}
//////////////////////////////////////////
// New in v1.4.0
void ESP_WiFiManager::setSTAStaticIPConfig(const WiFi_STA_IPConfig& WM_STA_IPconfig)
{
@ -992,7 +1011,7 @@ void ESP_WiFiManager::getSTAStaticIPConfig(WiFi_STA_IPConfig &WM_STA_IPconfig)
memcpy((void*) &WM_STA_IPconfig, &_WiFi_STA_IPconfig, sizeof(WM_STA_IPconfig));
}
//////
//////////////////////////////////////////
#if USE_CONFIGURABLE_DNS
@ -1060,7 +1079,7 @@ void ESP_WiFiManager::handleRoot()
LOGDEBUG(F("Handle root"));
// Disable _configPortalTimeout when someone accessing Portal to give some time to config
_configPortalTimeout = 0; //KH
_configPortalTimeout = 0; //KH
if (captivePortal())
{
@ -1071,7 +1090,7 @@ void ESP_WiFiManager::handleRoot()
server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE));
#if USING_CORS_FEATURE
// New from v1.1.1, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
// For configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header);
#endif
@ -1123,12 +1142,12 @@ void ESP_WiFiManager::handleWifi()
LOGDEBUG(F("Handle WiFi"));
// Disable _configPortalTimeout when someone accessing Portal to give some time to config
_configPortalTimeout = 0; //KH
_configPortalTimeout = 0; //KH
server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE));
#if USING_CORS_FEATURE
// New from v1.1.1, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
// For configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header);
#endif
@ -1145,7 +1164,7 @@ void ESP_WiFiManager::handleWifi()
page += FPSTR(WM_HTTP_HEAD_END);
page += F("<h2>Configuration</h2>");
// KH, New, v1.0.6+
// KH, New
numberOfNetworks = scanWifiNetworks(&networkIndices);
//Print list of WiFi networks that were found in earlier scan
@ -1155,9 +1174,7 @@ void ESP_WiFiManager::handleWifi()
}
else
{
// From v1.0.10
page += FPSTR(WM_FLDSET_START);
//////
//display networks in page
for (int i = 0; i < numberOfNetworks; i++)
@ -1178,8 +1195,9 @@ void ESP_WiFiManager::handleWifi()
item.replace("{r}", rssiQ);
#ifdef ESP8266
if (WiFi.encryptionType(networkIndices[i]) != ENC_TYPE_NONE)
#else //ESP32
#else //ESP32
if (WiFi.encryptionType(networkIndices[i]) != WIFI_AUTH_OPEN)
#endif
{
@ -1191,18 +1209,28 @@ void ESP_WiFiManager::handleWifi()
}
//LOGDEBUG(item);
page += item;
delay(0);
}
// From v1.0.10
page += FPSTR(WM_FLDSET_END);
//////
page += "<br/>";
}
page += "<small>*Hint: To reuse the saved WiFi credentials, leave SSID and PWD fields empty</small>";
page += FPSTR(WM_HTTP_FORM_START);
#if DISPLAY_STORED_CREDENTIALS_IN_CP
// Populate SSIDs and PWDs if valid
page.replace("[[ssid]]", _ssid );
page.replace("[[pwd]]", _pass );
page.replace("[[ssid1]]", _ssid1 );
page.replace("[[pwd1]]", _pass1 );
#endif
char parLength[2];
page += FPSTR(WM_FLDSET_START);
@ -1216,14 +1244,17 @@ void ESP_WiFiManager::handleWifi()
}
String pitem;
switch (_params[i]->getLabelPlacement())
{
case WFM_LABEL_BEFORE:
pitem = FPSTR(WM_HTTP_FORM_LABEL_BEFORE);
break;
case WFM_LABEL_AFTER:
pitem = FPSTR(WM_HTTP_FORM_LABEL_AFTER);
break;
default:
// WFM_NO_LABEL
pitem = FPSTR(WM_HTTP_FORM_PARAM);
@ -1248,12 +1279,10 @@ void ESP_WiFiManager::handleWifi()
page += pitem;
}
// From v1.0.10
if (_paramsCount > 0)
{
page += FPSTR(WM_FLDSET_END);
}
//////
if (_params[0] != NULL)
{
@ -1262,20 +1291,19 @@ void ESP_WiFiManager::handleWifi()
LOGDEBUG1(F("Static IP ="), _WiFi_STA_IPconfig._sta_static_ip.toString());
// KH, Comment out in v1.0.9 to permit changing from DHCP to static IP, or vice versa
// KH, Comment out to permit changing from DHCP to static IP, or vice versa
// and add staticIP label in CP
// From v1.0.10 to permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used.
// To permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used.
// You'll loose the feature of dynamically changing from DHCP to static IP, or vice versa
// You have to explicitly specify false to disable the feature.
#if !USE_STATIC_IP_CONFIG_IN_CP
if (_WiFi_STA_IPconfig._sta_static_ip)
#endif
{
// From v1.0.10
page += FPSTR(WM_FLDSET_START);
//////
String item = FPSTR(WM_HTTP_FORM_LABEL);
item += FPSTR(WM_HTTP_FORM_PARAM);
@ -1305,7 +1333,7 @@ void ESP_WiFiManager::handleWifi()
item.replace("{l}", "15");
item.replace("{v}", _WiFi_STA_IPconfig._sta_static_sn.toString());
#if USE_CONFIGURABLE_DNS
#if USE_CONFIGURABLE_DNS
//***** Added for DNS address options *****
page += item;
@ -1327,13 +1355,11 @@ void ESP_WiFiManager::handleWifi()
item.replace("{l}", "15");
item.replace("{v}", _WiFi_STA_IPconfig._sta_static_dns2.toString());
//***** End added for DNS address options *****
#endif
#endif
page += item;
// From v1.0.10
page += FPSTR(WM_FLDSET_END);
//////
page += "<br/>";
}
@ -1360,14 +1386,13 @@ void ESP_WiFiManager::handleWifiSave()
_ssid = server->arg("s").c_str();
_pass = server->arg("p").c_str();
// New from v1.1.0
_ssid1 = server->arg("s1").c_str();
_pass1 = server->arg("p1").c_str();
///////////////////////
#if USING_CORS_FEATURE
// New from v1.10.2, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
// For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header);
#endif
@ -1398,9 +1423,7 @@ void ESP_WiFiManager::handleWifiSave()
String value = server->arg(_params[i]->getID()).c_str();
//store it in array
// New in v1.4.0
value.toCharArray(_params[i]->_WMParam_data._value, _params[i]->_WMParam_data._length);
//////
LOGDEBUG2(F("Parameter and value :"), _params[i]->getID(), value);
}
@ -1430,6 +1453,7 @@ void ESP_WiFiManager::handleWifiSave()
}
#if USE_CONFIGURABLE_DNS
//***** Added for DNS Options *****
if (server->arg("dns1") != "")
{
@ -1446,6 +1470,7 @@ void ESP_WiFiManager::handleWifiSave()
LOGDEBUG1(F("New Static DNS2 ="), _WiFi_STA_IPconfig._sta_static_dns2.toString());
}
//***** End added for DNS Options *****
#endif
@ -1459,10 +1484,7 @@ void ESP_WiFiManager::handleWifiSave()
page += FPSTR(WM_HTTP_SAVED);
page.replace("{v}", _apName);
page.replace("{x}", _ssid);
// KH, update from v1.1.0
page.replace("{x1}", _ssid1);
//////
page += FPSTR(WM_HTTP_END);
@ -1486,7 +1508,7 @@ void ESP_WiFiManager::handleServerClose()
server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE));
#if USING_CORS_FEATURE
// New from v1.1.1, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
// For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header);
#endif
@ -1531,12 +1553,12 @@ void ESP_WiFiManager::handleInfo()
LOGDEBUG(F("Info"));
// Disable _configPortalTimeout when someone accessing Portal to give some time to config
_configPortalTimeout = 0; //KH
_configPortalTimeout = 0; //KH
server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE));
#if USING_CORS_FEATURE
// New from v1.1.1, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
// For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header);
#endif
@ -1564,15 +1586,15 @@ void ESP_WiFiManager::handleInfo()
page += F("0x");
#ifdef ESP8266
page += String(ESP.getChipId(), HEX); //ESP.getChipId();
#else //ESP32
page += String(ESP.getChipId(), HEX); //ESP.getChipId();
#else //ESP32
page += String(ESP_getChipId(), HEX); //ESP.getChipId();
page += String(ESP_getChipId(), HEX); //ESP.getChipId();
page += F("</td></tr>");
page += F("<tr><td>Chip OUI</td><td>");
page += F("0x");
page += String(getChipOUI(), HEX); //ESP.getChipId();
page += String(getChipOUI(), HEX); //ESP.getChipId();
page += F("</td></tr>");
page += F("<tr><td>Chip Model</td><td>");
@ -1585,8 +1607,8 @@ void ESP_WiFiManager::handleInfo()
page += F("<tr><td>Flash Chip ID</td><td>");
#ifdef ESP8266
page += String(ESP.getFlashChipId(), HEX); //ESP.getFlashChipId();
#else //ESP32
page += String(ESP.getFlashChipId(), HEX); //ESP.getFlashChipId();
#else //ESP32
// TODO
page += F("TODO");
#endif
@ -1599,7 +1621,7 @@ void ESP_WiFiManager::handleInfo()
#ifdef ESP8266
page += ESP.getFlashChipRealSize();
#else //ESP32
#else //ESP32
// TODO
page += F("TODO");
#endif
@ -1654,7 +1676,7 @@ void ESP_WiFiManager::handleState()
server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE));
#if USING_CORS_FEATURE
// New from v1.1.1, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
// For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header);
#endif
@ -1698,14 +1720,14 @@ void ESP_WiFiManager::handleScan()
LOGDEBUG(F("Scan"));
// Disable _configPortalTimeout when someone accessing Portal to give some time to config
_configPortalTimeout = 0; //KH
_configPortalTimeout = 0; //KH
LOGDEBUG(F("State-Json"));
server->sendHeader(FPSTR(WM_HTTP_CACHE_CONTROL), FPSTR(WM_HTTP_NO_STORE));
#if USING_CORS_FEATURE
// New from v1.1.1, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
// For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
server->sendHeader(FPSTR(WM_HTTP_CORS), _CORS_Header);
#endif
@ -1719,7 +1741,9 @@ void ESP_WiFiManager::handleScan()
//and should be freed when indices no longer required.
n = scanWifiNetworks(&indices);
LOGDEBUG(F("In handleScan, scanWifiNetworks done"));
String page = F("{\"Access_Points\":[");
//display networks in page
@ -1744,8 +1768,9 @@ void ESP_WiFiManager::handleScan()
item.replace("{r}", rssiQ);
#ifdef ESP8266
if (WiFi.encryptionType(indices[i]) != ENC_TYPE_NONE)
#else //ESP32
#else //ESP32
if (WiFi.encryptionType(indices[i]) != WIFI_AUTH_OPEN)
#endif
{
@ -1755,7 +1780,9 @@ void ESP_WiFiManager::handleScan()
{
item.replace("{i}", "false");
}
//LOGDEBUG(item);
page += item;
delay(0);
}
@ -1798,16 +1825,16 @@ void ESP_WiFiManager::handleReset()
LOGDEBUG(F("Sent reset page"));
delay(5000);
// New in v1.0.11
// Temporary fix for issue of not clearing WiFi SSID/PW from flash of ESP32
// See https://github.com/khoih-prog/ESP_WiFiManager/issues/25 and https://github.com/espressif/arduino-esp32/issues/400
resetSettings();
//WiFi.disconnect(true); // Wipe out WiFi credentials.
//////
#ifdef ESP8266
ESP.reset();
#else //ESP32
#else //ESP32
ESP.restart();
#endif
@ -1862,11 +1889,15 @@ bool ESP_WiFiManager::captivePortal()
LOGINFO1(F("Request redirected to captive portal : "), server->client().localIP());
server->sendHeader(F("Location"), (String)F("http://") + toStringIp(server->client().localIP()), true);
server->send(302, FPSTR(WM_HTTP_HEAD_CT2), ""); // Empty content inhibits Content-length header so we have to close the socket ourselves.
// Empty content inhibits Content-length header so we have to close the socket ourselves.
server->send(302, FPSTR(WM_HTTP_HEAD_CT2), "");
server->client().stop(); // Stop is needed because we sent no content length
return true;
}
return false;
}
@ -1889,7 +1920,8 @@ void ESP_WiFiManager::setSaveConfigCallback(void(*func)())
//////////////////////////////////////////
//sets a custom element to add to head, like a new style tag
void ESP_WiFiManager::setCustomHeadElement(const char* element) {
void ESP_WiFiManager::setCustomHeadElement(const char* element)
{
_customHeadElement = element;
}
@ -1919,6 +1951,7 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr)
if (n <= 0)
{
LOGDEBUG(F("No network found"));
return (0);
}
else
@ -1931,6 +1964,7 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr)
{
LOGDEBUG(F("ERROR: Out of memory"));
*indicesptr = NULL;
return (0);
}
@ -1963,12 +1997,14 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr)
if (_removeDuplicateAPs)
{
String cssid;
for (int i = 0; i < n; i++)
{
if (indices[i] == -1)
continue;
cssid = WiFi.SSID(indices[i]);
for (int j = i + 1; j < n; j++)
{
if (cssid == WiFi.SSID(indices[j]))
@ -1995,6 +2031,7 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr)
}
#if (DEBUG_WIFIMGR > 2)
for (int i = 0; i < n; i++)
{
if (indices[i] == -1)
@ -2002,6 +2039,7 @@ int ESP_WiFiManager::scanWifiNetworks(int **indicesptr)
else
Serial.println(WiFi.SSID(indices[i]));
}
#endif
return (n);
@ -2044,6 +2082,7 @@ bool ESP_WiFiManager::isIp(const String& str)
return false;
}
}
return true;
}
@ -2053,6 +2092,7 @@ bool ESP_WiFiManager::isIp(const String& str)
String ESP_WiFiManager::toStringIp(const IPAddress& ip)
{
String res = "";
for (int i = 0; i < 3; i++)
{
res += String((ip >> (8 * i)) & 0xFF) + ".";
@ -2086,7 +2126,9 @@ String ESP_WiFiManager::getStoredWiFiSSID()
else
{
wifi_config_t conf;
esp_wifi_get_config(WIFI_IF_STA, &conf);
return String(reinterpret_cast<char*>(conf.sta.ssid));
}
@ -2103,11 +2145,14 @@ String ESP_WiFiManager::getStoredWiFiPass()
}
wifi_config_t conf;
esp_wifi_get_config(WIFI_IF_STA, &conf);
return String(reinterpret_cast<char*>(conf.sta.password));
}
//////////////////////////////////////////
uint32_t getChipID()
{
uint64_t chipId64 = 0;
@ -2120,6 +2165,8 @@ uint32_t getChipID()
return (uint32_t) (chipId64 & 0xFFFFFF);
}
//////////////////////////////////////////
uint32_t getChipOUI()
{
uint64_t chipId64 = 0;
@ -2132,7 +2179,10 @@ uint32_t getChipOUI()
return (uint32_t) (chipId64 >> 24);
}
#endif
//////////////////////////////////////////
#endif // #ifdef ESP32
//////////////////////////////////////////
#endif //ESP_WiFiManager_Impl_h

View File

@ -16,7 +16,7 @@
Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager
Licensed under MIT license
Version: 1.11.0
Version: 1.12.1
Version Modified By Date Comments
------- ----------- ---------- -----------
@ -28,6 +28,8 @@
1.10.1 K Hoang 11/02/2022 Add LittleFS support to ESP32-C3. Use core LittleFS instead of Lorol's LITTLEFS for v2.0.0+
1.10.2 K Hoang 13/03/2022 Send CORS header in handleWifiSave() function
1.11.0 K Hoang 09/09/2022 Fix ESP32 chipID and add ESP_getChipOUI()
1.12.0 K Hoang 07/10/2022 Optional display Credentials (SSIDs, PWDs) in Config Portal
1.12.1 K Hoang 25/10/2022 Using random channel for softAP without password. Add astyle using allman style
*****************************************************************************************************************************/
#pragma once

View File

@ -16,7 +16,7 @@
Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager
Licensed under MIT license
Version: 1.11.0
Version: 1.12.1
Version Modified By Date Comments
------- ----------- ---------- -----------
@ -28,6 +28,8 @@
1.10.1 K Hoang 11/02/2022 Add LittleFS support to ESP32-C3. Use core LittleFS instead of Lorol's LITTLEFS for v2.0.0+
1.10.2 K Hoang 13/03/2022 Send CORS header in handleWifiSave() function
1.11.0 K Hoang 09/09/2022 Fix ESP32 chipID and add ESP_getChipOUI()
1.12.0 K Hoang 07/10/2022 Optional display Credentials (SSIDs, PWDs) in Config Portal
1.12.1 K Hoang 25/10/2022 Using random channel for softAP without password. Add astyle using allman style
*****************************************************************************************************************************/
#pragma once
@ -35,6 +37,8 @@
#ifndef ESP_WiFiManager_hpp
#define ESP_WiFiManager_hpp
////////////////////////////////////////////////////
#if !( defined(ESP8266) || defined(ESP32) )
#error This code is intended to run on the ESP8266 or ESP32 platform! Please check your Tools->Board setting.
#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
@ -52,9 +56,10 @@
#else
#warning Using ESP32_C3 using core v1.0.6-. To follow library instructions to install esp32-c3 core. Only SPIFFS and EEPROM OK.
#endif
#warning You have to select Flash size 2MB and Minimal APP (1.3MB + 700KB) for some boards
#endif
// #warning You have to select Flash size 2MB and Minimal APP (1.3MB + 700KB) for some boards
#define USING_ESP32_C3 true
#elif ( defined(ARDUINO_ESP32S3_DEV) || defined(ARDUINO_ESP32_S3_BOX) || defined(ARDUINO_TINYS3) || \
defined(ARDUINO_PROS3) || defined(ARDUINO_FEATHERS3) )
@ -64,16 +69,22 @@
#define USING_ESP32_S3 true
#endif
#define ESP_WIFIMANAGER_VERSION "ESP_WiFiManager v1.11.0"
////////////////////////////////////////////////////
#define ESP_WIFIMANAGER_VERSION "ESP_WiFiManager v1.12.1"
#define ESP_WIFIMANAGER_VERSION_MAJOR 1
#define ESP_WIFIMANAGER_VERSION_MINOR 11
#define ESP_WIFIMANAGER_VERSION_PATCH 0
#define ESP_WIFIMANAGER_VERSION_MINOR 12
#define ESP_WIFIMANAGER_VERSION_PATCH 1
#define ESP_WIFIMANAGER_VERSION_INT 1011000
#define ESP_WIFIMANAGER_VERSION_INT 1012001
////////////////////////////////////////////////////
#include "ESP_WiFiManager_Debug.h"
////////////////////////////////////////////////////
#if ( defined(HTTP_PORT) && (HTTP_PORT < 65536) && (HTTP_PORT > 0) )
#if (_WIFIMGR_LOGLEVEL_ > 3)
#warning Using custom HTTP_PORT
@ -88,6 +99,8 @@
#define HTTP_PORT_TO_USE 80
#endif
////////////////////////////////////////////////////
//KH, for ESP32
#ifdef ESP8266
#include <ESP8266WiFi.h>
@ -103,6 +116,8 @@
#undef max
#include <algorithm>
////////////////////////////////////////////////////
//KH, for ESP32
#ifdef ESP8266
extern "C"
@ -127,7 +142,8 @@
#define ESP_getChipOUI() getChipOUI() // ((uint32_t)ESP.getEfuseMac())
#endif
// New in v1.4.0
////////////////////////////////////////////////////
typedef struct
{
IPAddress _ap_static_ip;
@ -136,6 +152,8 @@ typedef struct
} WiFi_AP_IPConfig;
////////////////////////////////////////////////////
// Thanks to @Amorphous for the feature and code
// (https://community.blynk.cc/t/esp-wifimanager-for-esp32-and-esp8266/42257/13)
// To enable to configure from sketch
@ -143,6 +161,8 @@ typedef struct
#define USE_CONFIGURABLE_DNS false
#endif
////////////////////////////////////////////////////
typedef struct
{
IPAddress _sta_static_ip;
@ -151,11 +171,14 @@ typedef struct
IPAddress _sta_static_dns1;
IPAddress _sta_static_dns2;
} WiFi_STA_IPConfig;
//////
#define WFM_LABEL_BEFORE 1
#define WFM_LABEL_AFTER 2
#define WFM_NO_LABEL 0
////////////////////////////////////////////////////
#define WFM_LABEL_BEFORE 1
#define WFM_LABEL_AFTER 2
#define WFM_NO_LABEL 0
////////////////////////////////////////////////////
/** Handle CORS in pages */
// Default false for using only whenever necessary to avoid security issue when using CORS (Cross-Origin Resource Sharing)
@ -165,25 +188,32 @@ typedef struct
#define USING_CORS_FEATURE false
#endif
////////////////////////////////////////////////////
//KH
//Mofidy HTTP_HEAD to WM_HTTP_HEAD_START to avoid conflict in Arduino esp8266 core 2.6.0+
const char WM_HTTP_200[] PROGMEM = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
const char WM_HTTP_HEAD_START[] PROGMEM = "<!DOCTYPE html><html lang='en'><head><meta name='viewport' content='width=device-width, initial-scale=1, user-scalable=no'/><title>{v}</title>";
// KH, update from v1.0.10
////////////////////////////////////////////////////
const char WM_HTTP_STYLE[] PROGMEM = "<style>div{padding:2px;font-size:1em;}body,textarea,input,select{background: 0;border-radius: 0;font: 16px sans-serif;margin: 0}textarea,input,select{outline: 0;font-size: 14px;border: 1px solid #ccc;padding: 8px;width: 90%}.btn a{text-decoration: none}.container{margin: auto;width: 90%}@media(min-width:1200px){.container{margin: auto;width: 30%}}@media(min-width:768px) and (max-width:1200px){.container{margin: auto;width: 50%}}.btn,h2{font-size: 2em}h1{font-size: 3em}.btn{background: #0ae;border-radius: 4px;border: 0;color: #fff;cursor: pointer;display: inline-block;margin: 2px 0;padding: 10px 14px 11px;width: 100%}.btn:hover{background: #09d}.btn:active,.btn:focus{background: #08b}label>*{display: inline}form>*{display: block;margin-bottom: 10px}textarea:focus,input:focus,select:focus{border-color: #5ab}.msg{background: #def;border-left: 5px solid #59d;padding: 1.5em}.q{float: right;width: 64px;text-align: right}.l{background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAALVBMVEX///8EBwfBwsLw8PAzNjaCg4NTVVUjJiZDRUUUFxdiZGSho6OSk5Pg4eFydHTCjaf3AAAAZElEQVQ4je2NSw7AIAhEBamKn97/uMXEGBvozkWb9C2Zx4xzWykBhFAeYp9gkLyZE0zIMno9n4g19hmdY39scwqVkOXaxph0ZCXQcqxSpgQpONa59wkRDOL93eAXvimwlbPbwwVAegLS1HGfZAAAAABJRU5ErkJggg==') no-repeat left center;background-size: 1em}input[type='checkbox']{float: left;width: 20px}.table td{padding:.5em;text-align:left}.table tbody>:nth-child(2n-1){background:#ddd}fieldset{border-radius:0.5rem;margin:0px;}</style>";
//////
// KH, update from v1.1.0
////////////////////////////////////////////////////
const char WM_HTTP_SCRIPT[] PROGMEM = "<script>function c(l){document.getElementById('s').value=l.innerText||l.textContent;document.getElementById('p').focus();document.getElementById('s1').value=l.innerText||l.textContent;document.getElementById('p1').focus();document.getElementById('timezone').value=timezone.name();}</script>";
//////
// From v1.0.9 to permit disable or configure NTP from sketch
////////////////////////////////////////////////////
////////////////////////////////////////////////////
// To permit disable or configure NTP from sketch
#ifndef USE_ESP_WIFIMANAGER_NTP
// From v1.0.6 to enable NTP config
// To enable NTP config
#define USE_ESP_WIFIMANAGER_NTP true
#endif
////////////////////////////////////////////////////
#if USE_ESP_WIFIMANAGER_NTP
#include "utils/TZ.h"
@ -219,38 +249,62 @@ const char WM_HTTP_SCRIPT_NTP[] PROGMEM = "<script>(function(e){var t=function()
const char WM_HTTP_SCRIPT_NTP[] PROGMEM = "";
#endif
// KH, update from v1.0.10
////////////////////////////////////////////////////
////////////////////////////////////////////////////
const char WM_HTTP_HEAD_END[] PROGMEM = "</head><body><div class='container'><div style='text-align:left;display:inline-block;min-width:260px;'>";
const char WM_FLDSET_START[] PROGMEM = "<fieldset>";
const char WM_FLDSET_END[] PROGMEM = "</fieldset>";
//////
////////////////////////////////////////////////////
const char WM_HTTP_PORTAL_OPTIONS[] PROGMEM = "<form action='/wifi' method='get'><button class='btn'>Configuration</button></form><br/><form action='/i' method='get'><button class='btn'>Information</button></form><br/><form action='/close' method='get'><button class='btn'>Exit Portal</button></form><br/>";
const char WM_HTTP_ITEM[] PROGMEM = "<div><a href='#p' onclick='c(this)'>{v}</a>&nbsp;<span class='q {i}'>{r}%</span></div>";
const char JSON_ITEM[] PROGMEM = "{\"SSID\":\"{v}\", \"Encryption\":{i}, \"Quality\":\"{r}\"}";
// KH, update from v1.1.0
const char WM_HTTP_FORM_START[] PROGMEM = "<form method='get' action='wifisave'><fieldset><div><label>SSID</label><input id='s' name='s' length=32 placeholder='SSID'><div></div></div><div><label>Password</label><input id='p' name='p' length=64 placeholder='password'><div></div></div><div><label>SSID1</label><input id='s1' name='s1' length=32 placeholder='SSID1'><div></div></div><div><label>Password</label><input id='p1' name='p1' length=64 placeholder='password1'><div></div></div></fieldset>";
//////
////////////////////////////////////////////////////
// KH, update from v1.12.0
// To permit display stored Credentials on CP
#ifndef DISPLAY_STORED_CREDENTIALS_IN_CP
#define DISPLAY_STORED_CREDENTIALS_IN_CP true
#endif
#if ( (_WIFIMGR_LOGLEVEL_ > 3) && DISPLAY_STORED_CREDENTIALS_IN_CP )
#warning Enable DISPLAY_STORED_CREDENTIALS_IN_CP
#endif
#if DISPLAY_STORED_CREDENTIALS_IN_CP
const char WM_HTTP_FORM_START[] PROGMEM = "<form method='get' action='wifisave'><fieldset><div><label>SSID</label><input value='[[ssid]]' id='s' name='s' length=32 placeholder='SSID'><div></div></div><div><label>Password</label><input value='[[pwd]]' id='p' name='p' length=64 placeholder='password'><div></div></div><div><label>SSID1</label><input value='[[ssid1]]' id='s1' name='s1' length=32 placeholder='SSID1'><div></div></div><div><label>Password</label><input value='[[pwd1]]' id='p1' name='p1' length=64 placeholder='password1'><div></div></div></fieldset>";
#else
const char WM_HTTP_FORM_START[] PROGMEM = "<form method='get' action='wifisave'><fieldset><div><label>SSID</label><input id='s' name='s' length=32 placeholder='SSID'><div></div></div><div><label>Password</label><input id='p' name='p' length=64 placeholder='password'><div></div></div><div><label>SSID1</label><input id='s1' name='s1' length=32 placeholder='SSID1'><div></div></div><div><label>Password</label><input id='p1' name='p1' length=64 placeholder='password1'><div></div></div></fieldset>";
#endif
////////////////////////////////////////////////////
// KH, add from v1.0.10
const char WM_HTTP_FORM_LABEL_BEFORE[] PROGMEM = "<div><label for='{i}'>{p}</label><input id='{i}' name='{n}' length={l} placeholder='{p}' value='{v}' {c}><div></div></div>";
const char WM_HTTP_FORM_LABEL_AFTER[] PROGMEM = "<div><input id='{i}' name='{n}' length={l} placeholder='{p}' value='{v}' {c}><label for='{i}'>{p}</label><div></div></div>";
//////
////////////////////////////////////////////////////
const char WM_HTTP_FORM_LABEL[] PROGMEM = "<label for='{i}'>{p}</label>";
const char WM_HTTP_FORM_PARAM[] PROGMEM = "<input id='{i}' name='{n}' length={l} placeholder='{p}' value='{v}' {c}>";
////////////////////////////////////////////////////
const char WM_HTTP_FORM_END[] PROGMEM = "<button class='btn' type='submit'>Save</button></form>";
// KH, update from v1.1.0
////////////////////////////////////////////////////
const char WM_HTTP_SAVED[] PROGMEM = "<div class='msg'><b>Credentials Saved</b><br>Try connecting ESP to the {x}/{x1} network. Wait around 10 seconds then check <a href='/'>if it's OK.</a> <p/>The {v} AP will run on the same WiFi channel of the {x}/{x1} AP. You may have to manually reconnect to the {v} AP.</div>";
//////
////////////////////////////////////////////////////
const char WM_HTTP_END[] PROGMEM = "</div></body></html>";
//KH, from v1.1.0
////////////////////////////////////////////////////
const char WM_HTTP_HEAD_CL[] PROGMEM = "Content-Length";
const char WM_HTTP_HEAD_CT[] PROGMEM = "text/html";
const char WM_HTTP_HEAD_CT2[] PROGMEM = "text/plain";
@ -264,6 +318,8 @@ const char WM_HTTP_EXPIRES[] PROGMEM = "Expires";
const char WM_HTTP_CORS[] PROGMEM = "Access-Control-Allow-Origin";
const char WM_HTTP_CORS_ALLOW_ALL[] PROGMEM = "*";
////////////////////////////////////////////////////
#if USE_AVAILABLE_PAGES
const char WM_HTTP_AVAILABLE_PAGES[] PROGMEM = "<h3>Available Pages</h3><table class='table'><thead><tr><th>Page</th><th>Function</th></tr></thead><tbody><tr><td><a href='/'>/</a></td><td>Menu page.</td></tr><tr><td><a href='/wifi'>/wifi</a></td><td>Show WiFi scan results and enter WiFi configuration.</td></tr><tr><td><a href='/wifisave'>/wifisave</a></td><td>Save WiFi configuration information and configure device. Needs variables supplied.</td></tr><tr><td><a href='/close'>/close</a></td><td>Close the configuration server and configuration WiFi network.</td></tr><tr><td><a href='/i'>/i</a></td><td>This page.</td></tr><tr><td><a href='/r'>/r</a></td><td>Delete WiFi configuration and reboot. ESP device will not reconnect to a network until new WiFi configuration data is entered.</td></tr><tr><td><a href='/state'>/state</a></td><td>Current device state in JSON format. Interface for programmatic WiFi configuration.</td></tr><tr><td><a href='/scan'>/scan</a></td><td>Run a WiFi scan and return results in JSON format. Interface for programmatic WiFi configuration.</td></tr></table>";
#else
@ -273,8 +329,8 @@ const char WM_HTTP_AVAILABLE_PAGES[] PROGMEM = "";
//KH
#define WIFI_MANAGER_MAX_PARAMS 20
/////////////////////////////////////////////////////////////////////////////
// New in v1.4.0
////////////////////////////////////////////////////
typedef struct
{
const char *_id;
@ -284,7 +340,9 @@ typedef struct
int _labelPlacement;
} WMParam_Data;
//////
////////////////////////////////////////////////////
////////////////////////////////////////////////////
class ESP_WMParameter
{
@ -293,16 +351,12 @@ class ESP_WMParameter
ESP_WMParameter(const char *id, const char *placeholder, const char *defaultValue, const int& length,
const char *custom = "", const int& labelPlacement = WFM_LABEL_BEFORE);
// New in v1.4.0
ESP_WMParameter(const WMParam_Data& WMParam_data);
//////
~ESP_WMParameter();
// New in v1.4.0
void setWMParam_Data(const WMParam_Data& WMParam_data);
void getWMParam_Data(WMParam_Data& WMParam_data);
//////
const char *getID();
const char *getValue();
@ -323,6 +377,8 @@ class ESP_WMParameter
friend class ESP_WiFiManager;
};
////////////////////////////////////////////////////
#define USE_DYNAMIC_PARAMS true
#define DEFAULT_PORTAL_TIMEOUT 60000L
@ -332,6 +388,9 @@ class ESP_WMParameter
#define USE_STATIC_IP_CONFIG_IN_CP true
#endif
////////////////////////////////////////////////////
////////////////////////////////////////////////////
class ESP_WiFiManager
{
public:
@ -340,10 +399,9 @@ class ESP_WiFiManager
~ESP_WiFiManager();
// Update feature from v1.0.11. Can use with STA staticIP now
// Can use with STA staticIP now
bool autoConnect();
bool autoConnect(char const *apName, char const *apPassword = NULL);
//////
//if you want to start the config portal
bool startConfigPortal();
@ -351,6 +409,7 @@ class ESP_WiFiManager
// get the AP name of the config portal, so it can be used in the callback
String getConfigPortalSSID();
// get the AP password of the config portal, so it can be used in the callback
String getConfigPortalPW();
@ -365,30 +424,25 @@ class ESP_WiFiManager
//sets timeout for which to attempt connecting, usefull if you get a lot of failed connects
void setConnectTimeout(const unsigned long& seconds);
void setDebugOutput(bool debug);
//defaults to not showing anything under 8% signal quality if called
void setMinimumSignalQuality(const int& quality = 8);
// KH, new from v1.0.10 to enable dynamic/random channel
// KH, To enable dynamic/random channel
int setConfigPortalChannel(const int& channel = 1);
//////
//sets a custom ip /gateway /subnet configuration
void setAPStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn);
// New in v1.4.0
void setAPStaticIPConfig(const WiFi_AP_IPConfig& WM_AP_IPconfig);
void getAPStaticIPConfig(WiFi_AP_IPConfig& WM_AP_IPconfig);
//////
//sets config for a static IP
void setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn);
// New in v1.4.0
void setSTAStaticIPConfig(const WiFi_STA_IPConfig& WM_STA_IPconfig);
void getSTAStaticIPConfig(WiFi_STA_IPConfig& WM_STA_IPconfig);
//////
#if USE_CONFIGURABLE_DNS
void setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn,
@ -397,50 +451,75 @@ class ESP_WiFiManager
//called when AP mode and config portal is started
void setAPCallback(void(*func)(ESP_WiFiManager*));
//called when settings have been changed and connection was successful
void setSaveConfigCallback(void(*func)());
#if USE_DYNAMIC_PARAMS
//adds a custom parameter
bool addParameter(ESP_WMParameter *p);
bool addParameter(ESP_WMParameter *p);
#else
//adds a custom parameter
void addParameter(ESP_WMParameter *p);
void addParameter(ESP_WMParameter *p);
#endif
//if this is set, it will exit after config, even if connection is unsucessful.
void setBreakAfterConfig(bool shouldBreak);
//if this is set, try WPS setup when starting (this will delay config portal for up to 2 mins)
//TODO
//if this is set, customise style
void setCustomHeadElement(const char* element);
//if this is true, remove duplicated Access Points - defaut true
void setRemoveDuplicateAPs(bool removeDuplicates);
//Scan for WiFiNetworks in range and sort by signal strength
//space for indices array allocated on the heap and should be freed when no longer required
int scanWifiNetworks(int **indicesptr);
////////////////////////////////////////////////////
// KH add to display SSIDs and PWDs in CP
void setCredentials(const char* ssid, const char* pwd, const char* ssid1, const char* pwd1)
{
_ssid = String(ssid);
_pass = String(pwd);
_ssid1 = String(ssid1);
_pass1 = String(pwd1);
}
inline void setCredentials(String & ssid, String & pwd, String & ssid1, String & pwd1)
{
_ssid = ssid;
_pass = pwd;
_ssid1 = ssid1;
_pass1 = pwd1;
}
////////////////////////////////////////////////////
// return SSID of router in STA mode got from config portal. NULL if no user's input //KH
String getSSID()
inline String getSSID()
{
return _ssid;
}
// return password of router in STA mode got from config portal. NULL if no user's input //KH
String getPW()
inline String getPW()
{
return _pass;
}
// New from v1.1.0
// return SSID of router in STA mode got from config portal. NULL if no user's input //KH
String getSSID1()
inline String getSSID1()
{
return _ssid1;
}
// return password of router in STA mode got from config portal. NULL if no user's input //KH
String getPW1()
inline String getPW1()
{
return _pass1;
}
@ -466,9 +545,10 @@ class ESP_WiFiManager
else
return String("");
}
//////
// New from v1.1.1, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
////////////////////////////////////////////////////
// New For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
#if USING_CORS_FEATURE
void setCORSHeader(const char* CORSHeaders)
{
@ -477,12 +557,14 @@ class ESP_WiFiManager
LOGWARN1(F("Set CORS Header to : "), _CORS_Header);
}
const char* getCORSHeader()
inline const char* getCORSHeader()
{
return _CORS_Header;
}
#endif
////////////////////////////////////////////////////
//returns the list of Parameters
ESP_WMParameter** getParameters();
// returns the Parameters Count
@ -495,7 +577,7 @@ class ESP_WiFiManager
String getStoredWiFiPass();
#endif
String WiFi_SSID()
inline String WiFi_SSID()
{
#ifdef ESP8266
return WiFi.SSID();
@ -504,7 +586,7 @@ class ESP_WiFiManager
#endif
}
String WiFi_Pass()
inline String WiFi_Pass()
{
#ifdef ESP8266
return WiFi.psk();
@ -538,18 +620,19 @@ class ESP_WiFiManager
}
}
////////////////////////////////////////////////////
#if USE_ESP_WIFIMANAGER_NTP
String getTimezoneName()
inline String getTimezoneName()
{
return _timezoneName;
}
void setTimezoneName(const String& inTimezoneName)
inline void setTimezoneName(const String& inTimezoneName)
{
_timezoneName = inTimezoneName;
}
//////
//See: https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
// EST5EDT,M3.2.0,M11.1.0 (for America/New_York)
@ -584,10 +667,10 @@ class ESP_WiFiManager
{
return getTZ(timezoneName.c_str());
}
#endif
////////////////////////////////////////////////////
private:
std::unique_ptr<DNSServer> dnsServer;
@ -613,16 +696,18 @@ class ESP_WiFiManager
String _ssid = "";
String _pass = "";
// New from v1.1.0
String _ssid1 = "";
String _pass1 = "";
//////
////////////////////////////////////////////////////
#if USE_ESP_WIFIMANAGER_NTP
// Timezone info
String _timezoneName = "";
#endif
////////////////////////////////////////////////////
unsigned long _configPortalTimeout = 0;
unsigned long _connectTimeout = 0;
@ -631,20 +716,19 @@ class ESP_WiFiManager
int numberOfNetworks;
int *networkIndices;
// KH, new from v1.0.10 to enable dynamic/random channel
// KH, To enable dynamic/random channel
// default to channel 1
#define MIN_WIFI_CHANNEL 1
#define MAX_WIFI_CHANNEL 11 // Channel 12,13 is flaky, because of bad number 13 ;-)
int _WiFiAPChannel = 1;
//////
// New in v1.4.0
WiFi_AP_IPConfig _WiFi_AP_IPconfig;
WiFi_STA_IPConfig _WiFi_STA_IPconfig = { IPAddress(0, 0, 0, 0), IPAddress(192, 168, 2, 1), IPAddress(255, 255, 255, 0),
IPAddress(192, 168, 2, 1), IPAddress(8, 8, 8, 8) };
//////
////////////////////////////////////////////////////
int _paramsCount = 0;
int _minimumQuality = -1;
@ -656,22 +740,14 @@ class ESP_WiFiManager
int status = WL_IDLE_STATUS;
// New from v1.1.0, for configure CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
// For configuring CORS Header, default to WM_HTTP_CORS_ALLOW_ALL = "*"
#if USING_CORS_FEATURE
const char* _CORS_Header = WM_HTTP_CORS_ALLOW_ALL; //"*";
#endif
//////
// New v1.0.8
void setWifiStaticIP();
// New v1.1.0
int reconnectWifi();
//////
// New v1.0.11
int connectWifi(const String& ssid = "", const String& pass = "");
//////
uint8_t waitForConnectResult();
@ -702,7 +778,9 @@ class ESP_WiFiManager
bool _debug = false; //true;
void(*_apcallback) (ESP_WiFiManager*) = NULL;
void(*_savecallback)() = NULL;
void(*_savecallback)() = NULL;
////////////////////////////////////////////////////
#if USE_DYNAMIC_PARAMS
int _max_params;
@ -711,6 +789,8 @@ class ESP_WiFiManager
ESP_WMParameter* _params[WIFI_MANAGER_MAX_PARAMS];
#endif
////////////////////////////////////////////////////
template <typename Generic>
void DEBUG_WM(Generic text);
@ -723,9 +803,12 @@ class ESP_WiFiManager
auto optionalIPFromString(...) -> bool
{
LOGINFO("NO fromString METHOD ON IPAddress, you need ESP8266 core 2.1.0 or newer for Custom IP configuration to work.");
return false;
}
};
////////////////////////////////////////////////////
#endif // ESP_WiFiManager_h

View File

@ -16,7 +16,7 @@
Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager
Licensed under MIT license
Version: 1.11.0
Version: 1.12.1
Version Modified By Date Comments
------- ----------- ---------- -----------
@ -28,6 +28,8 @@
1.10.1 K Hoang 11/02/2022 Add LittleFS support to ESP32-C3. Use core LittleFS instead of Lorol's LITTLEFS for v2.0.0+
1.10.2 K Hoang 13/03/2022 Send CORS header in handleWifiSave() function
1.11.0 K Hoang 09/09/2022 Fix ESP32 chipID and add ESP_getChipOUI()
1.12.0 K Hoang 07/10/2022 Optional display Credentials (SSIDs, PWDs) in Config Portal
1.12.1 K Hoang 25/10/2022 Using random channel for softAP without password. Add astyle using allman style
*****************************************************************************************************************************/
#pragma once
@ -35,12 +37,16 @@
#ifndef ESP_WiFiManager_Debug_H
#define ESP_WiFiManager_Debug_H
//////////////////////////////////////////
#ifdef WIFIMGR_DEBUG_PORT
#define WM_DBG_PORT WIFIMGR_DEBUG_PORT
#else
#define WM_DBG_PORT Serial
#endif
//////////////////////////////////////////
// Change _WIFIMGR_LOGLEVEL_ to set tracing and logging verbosity
// 0: DISABLED: no logging
// 1: ERROR: errors
@ -52,6 +58,8 @@
#define _WIFIMGR_LOGLEVEL_ 0
#endif
//////////////////////////////////////////
const char WM_MARK[] = "[WM] ";
const char WM_SP[] = " ";

View File

@ -71,466 +71,466 @@
////////////////////////////////////////////////////
#define TZ_Africa_Abidjan ("GMT0")
#define TZ_Africa_Accra ("GMT0")
#define TZ_Africa_Addis_Ababa ("EAT-3")
#define TZ_Africa_Algiers ("CET-1")
#define TZ_Africa_Asmara ("EAT-3")
#define TZ_Africa_Bamako ("GMT0")
#define TZ_Africa_Bangui ("WAT-1")
#define TZ_Africa_Banjul ("GMT0")
#define TZ_Africa_Bissau ("GMT0")
#define TZ_Africa_Blantyre ("CAT-2")
#define TZ_Africa_Brazzaville ("WAT-1")
#define TZ_Africa_Bujumbura ("CAT-2")
#define TZ_Africa_Cairo ("EET-2")
#define TZ_Africa_Casablanca ("<+01>-1")
#define TZ_Africa_Ceuta ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Africa_Conakry ("GMT0")
#define TZ_Africa_Dakar ("GMT0")
#define TZ_Africa_Dar_es_Salaam ("EAT-3")
#define TZ_Africa_Djibouti ("EAT-3")
#define TZ_Africa_Douala ("WAT-1")
#define TZ_Africa_El_Aaiun ("<+01>-1")
#define TZ_Africa_Freetown ("GMT0")
#define TZ_Africa_Gaborone ("CAT-2")
#define TZ_Africa_Harare ("CAT-2")
#define TZ_Africa_Johannesburg ("SAST-2")
#define TZ_Africa_Juba ("EAT-3")
#define TZ_Africa_Kampala ("EAT-3")
#define TZ_Africa_Khartoum ("CAT-2")
#define TZ_Africa_Kigali ("CAT-2")
#define TZ_Africa_Kinshasa ("WAT-1")
#define TZ_Africa_Lagos ("WAT-1")
#define TZ_Africa_Libreville ("WAT-1")
#define TZ_Africa_Lome ("GMT0")
#define TZ_Africa_Luanda ("WAT-1")
#define TZ_Africa_Lubumbashi ("CAT-2")
#define TZ_Africa_Lusaka ("CAT-2")
#define TZ_Africa_Malabo ("WAT-1")
#define TZ_Africa_Maputo ("CAT-2")
#define TZ_Africa_Maseru ("SAST-2")
#define TZ_Africa_Mbabane ("SAST-2")
#define TZ_Africa_Mogadishu ("EAT-3")
#define TZ_Africa_Monrovia ("GMT0")
#define TZ_Africa_Nairobi ("EAT-3")
#define TZ_Africa_Ndjamena ("WAT-1")
#define TZ_Africa_Niamey ("WAT-1")
#define TZ_Africa_Nouakchott ("GMT0")
#define TZ_Africa_Ouagadougou ("GMT0")
#define TZ_Africa_PortomNovo ("WAT-1")
#define TZ_Africa_Sao_Tome ("GMT0")
#define TZ_Africa_Tripoli ("EET-2")
#define TZ_Africa_Tunis ("CET-1")
#define TZ_Africa_Windhoek ("CAT-2")
#define TZ_America_Adak ("HST10HDT,M3.2.0,M11.1.0")
#define TZ_America_Anchorage ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Anguilla ("AST4")
#define TZ_America_Antigua ("AST4")
#define TZ_America_Araguaina ("<-03>3")
#define TZ_America_Argentina_Buenos_Aires ("<-03>3")
#define TZ_America_Argentina_Catamarca ("<-03>3")
#define TZ_America_Argentina_Cordoba ("<-03>3")
#define TZ_America_Argentina_Jujuy ("<-03>3")
#define TZ_America_Argentina_La_Rioja ("<-03>3")
#define TZ_America_Argentina_Mendoza ("<-03>3")
#define TZ_America_Argentina_Rio_Gallegos ("<-03>3")
#define TZ_America_Argentina_Salta ("<-03>3")
#define TZ_America_Argentina_San_Juan ("<-03>3")
#define TZ_America_Argentina_San_Luis ("<-03>3")
#define TZ_America_Argentina_Tucuman ("<-03>3")
#define TZ_America_Argentina_Ushuaia ("<-03>3")
#define TZ_America_Aruba ("AST4")
#define TZ_America_Asuncion ("<-04>4<-03>,M10.1.0/0,M3.4.0/0")
#define TZ_America_Atikokan ("EST5")
#define TZ_America_Bahia ("<-03>3")
#define TZ_America_Bahia_Banderas ("CST6CDT,M4.1.0,M10.5.0")
#define TZ_America_Barbados ("AST4")
#define TZ_America_Belem ("<-03>3")
#define TZ_America_Belize ("CST6")
#define TZ_America_BlancmSablon ("AST4")
#define TZ_America_Boa_Vista ("<-04>4")
#define TZ_America_Bogota ("<-05>5")
#define TZ_America_Boise ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Cambridge_Bay ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Campo_Grande ("<-04>4")
#define TZ_America_Cancun ("EST5")
#define TZ_America_Caracas ("<-04>4")
#define TZ_America_Cayenne ("<-03>3")
#define TZ_America_Cayman ("EST5")
#define TZ_America_Chicago ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Chihuahua ("MST7MDT,M4.1.0,M10.5.0")
#define TZ_America_Costa_Rica ("CST6")
#define TZ_America_Creston ("MST7")
#define TZ_America_Cuiaba ("<-04>4")
#define TZ_America_Curacao ("AST4")
#define TZ_America_Danmarkshavn ("GMT0")
#define TZ_America_Dawson ("MST7")
#define TZ_America_Dawson_Creek ("MST7")
#define TZ_America_Denver ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Detroit ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Dominica ("AST4")
#define TZ_America_Edmonton ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Eirunepe ("<-05>5")
#define TZ_America_El_Salvador ("CST6")
#define TZ_America_Fortaleza ("<-03>3")
#define TZ_America_Fort_Nelson ("MST7")
#define TZ_America_Glace_Bay ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Godthab ("<-03>3<-02>,M3.5.0/-2,M10.5.0/-1")
#define TZ_America_Goose_Bay ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Grand_Turk ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Grenada ("AST4")
#define TZ_America_Guadeloupe ("AST4")
#define TZ_America_Guatemala ("CST6")
#define TZ_America_Guayaquil ("<-05>5")
#define TZ_America_Guyana ("<-04>4")
#define TZ_America_Halifax ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Havana ("CST5CDT,M3.2.0/0,M11.1.0/1")
#define TZ_America_Hermosillo ("MST7")
#define TZ_America_Indiana_Indianapolis ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Knox ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Marengo ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Petersburg ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Tell_City ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Vevay ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Vincennes ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Winamac ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Inuvik ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Iqaluit ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Jamaica ("EST5")
#define TZ_America_Juneau ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Kentucky_Louisville ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Kentucky_Monticello ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Kralendijk ("AST4")
#define TZ_America_La_Paz ("<-04>4")
#define TZ_America_Lima ("<-05>5")
#define TZ_America_Los_Angeles ("PST8PDT,M3.2.0,M11.1.0")
#define TZ_America_Lower_Princes ("AST4")
#define TZ_America_Maceio ("<-03>3")
#define TZ_America_Managua ("CST6")
#define TZ_America_Manaus ("<-04>4")
#define TZ_America_Marigot ("AST4")
#define TZ_America_Martinique ("AST4")
#define TZ_America_Matamoros ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Mazatlan ("MST7MDT,M4.1.0,M10.5.0")
#define TZ_America_Menominee ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Merida ("CST6CDT,M4.1.0,M10.5.0")
#define TZ_America_Metlakatla ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Mexico_City ("CST6CDT,M4.1.0,M10.5.0")
#define TZ_America_Miquelon ("<-03>3<-02>,M3.2.0,M11.1.0")
#define TZ_America_Moncton ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Monterrey ("CST6CDT,M4.1.0,M10.5.0")
#define TZ_America_Montevideo ("<-03>3")
#define TZ_America_Montreal ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Montserrat ("AST4")
#define TZ_America_Nassau ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_New_York ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Nipigon ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Nome ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Noronha ("<-02>2")
#define TZ_America_North_Dakota_Beulah ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_North_Dakota_Center ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_North_Dakota_New_Salem ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Ojinaga ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Panama ("EST5")
#define TZ_America_Pangnirtung ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Paramaribo ("<-03>3")
#define TZ_America_Phoenix ("MST7")
#define TZ_America_PortmaumPrince ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Port_of_Spain ("AST4")
#define TZ_America_Porto_Velho ("<-04>4")
#define TZ_America_Puerto_Rico ("AST4")
#define TZ_America_Punta_Arenas ("<-03>3")
#define TZ_America_Rainy_River ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Rankin_Inlet ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Recife ("<-03>3")
#define TZ_America_Regina ("CST6")
#define TZ_America_Resolute ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Rio_Branco ("<-05>5")
#define TZ_America_Santarem ("<-03>3")
#define TZ_America_Santiago ("<-04>4<-03>,M9.1.6/24,M4.1.6/24")
#define TZ_America_Santo_Domingo ("AST4")
#define TZ_America_Sao_Paulo ("<-03>3")
#define TZ_America_Scoresbysund ("<-01>1<+00>,M3.5.0/0,M10.5.0/1")
#define TZ_America_Sitka ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_St_Barthelemy ("AST4")
#define TZ_America_St_Johns ("NST3:30NDT,M3.2.0,M11.1.0")
#define TZ_America_St_Kitts ("AST4")
#define TZ_America_St_Lucia ("AST4")
#define TZ_America_St_Thomas ("AST4")
#define TZ_America_St_Vincent ("AST4")
#define TZ_America_Swift_Current ("CST6")
#define TZ_America_Tegucigalpa ("CST6")
#define TZ_America_Thule ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Thunder_Bay ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Tijuana ("PST8PDT,M3.2.0,M11.1.0")
#define TZ_America_Toronto ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Tortola ("AST4")
#define TZ_America_Vancouver ("PST8PDT,M3.2.0,M11.1.0")
#define TZ_America_Whitehorse ("MST7")
#define TZ_America_Winnipeg ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Yakutat ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Yellowknife ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_Antarctica_Casey ("<+11>-11")
#define TZ_Antarctica_Davis ("<+07>-7")
#define TZ_Antarctica_DumontDUrville ("<+10>-10")
#define TZ_Antarctica_Macquarie ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Antarctica_Mawson ("<+05>-5")
#define TZ_Antarctica_McMurdo ("NZST-12NZDT,M9.5.0,M4.1.0/3")
#define TZ_Antarctica_Palmer ("<-03>3")
#define TZ_Antarctica_Rothera ("<-03>3")
#define TZ_Antarctica_Syowa ("<+03>-3")
#define TZ_Antarctica_Troll ("<+00>0<+02>-2,M3.5.0/1,M10.5.0/3")
#define TZ_Antarctica_Vostok ("<+06>-6")
#define TZ_Arctic_Longyearbyen ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Asia_Aden ("<+03>-3")
#define TZ_Asia_Almaty ("<+06>-6")
#define TZ_Asia_Amman ("EET-2EEST,M3.5.4/24,M10.5.5/1")
#define TZ_Asia_Anadyr ("<+12>-12")
#define TZ_Asia_Aqtau ("<+05>-5")
#define TZ_Asia_Aqtobe ("<+05>-5")
#define TZ_Asia_Ashgabat ("<+05>-5")
#define TZ_Asia_Atyrau ("<+05>-5")
#define TZ_Asia_Baghdad ("<+03>-3")
#define TZ_Asia_Bahrain ("<+03>-3")
#define TZ_Asia_Baku ("<+04>-4")
#define TZ_Asia_Bangkok ("<+07>-7")
#define TZ_Asia_Barnaul ("<+07>-7")
#define TZ_Asia_Beirut ("EET-2EEST,M3.5.0/0,M10.5.0/0")
#define TZ_Asia_Bishkek ("<+06>-6")
#define TZ_Asia_Brunei ("<+08>-8")
#define TZ_Asia_Chita ("<+09>-9")
#define TZ_Asia_Choibalsan ("<+08>-8")
#define TZ_Asia_Colombo ("<+0530>-5:30")
#define TZ_Asia_Damascus ("EET-2EEST,M3.5.5/0,M10.5.5/0")
#define TZ_Asia_Dhaka ("<+06>-6")
#define TZ_Asia_Dili ("<+09>-9")
#define TZ_Asia_Dubai ("<+04>-4")
#define TZ_Asia_Dushanbe ("<+05>-5")
#define TZ_Asia_Famagusta ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Asia_Gaza ("EET-2EEST,M3.4.4/48,M10.4.4/49")
#define TZ_Asia_Hebron ("EET-2EEST,M3.4.4/48,M10.4.4/49")
#define TZ_Asia_Ho_Chi_Minh ("<+07>-7")
#define TZ_Asia_Hong_Kong ("HKT-8")
#define TZ_Asia_Hovd ("<+07>-7")
#define TZ_Asia_Irkutsk ("<+08>-8")
#define TZ_Asia_Jakarta ("WIB-7")
#define TZ_Asia_Jayapura ("WIT-9")
#define TZ_Asia_Jerusalem ("IST-2IDT,M3.4.4/26,M10.5.0")
#define TZ_Asia_Kabul ("<+0430>-4:30")
#define TZ_Asia_Kamchatka ("<+12>-12")
#define TZ_Asia_Karachi ("PKT-5")
#define TZ_Asia_Kathmandu ("<+0545>-5:45")
#define TZ_Asia_Khandyga ("<+09>-9")
#define TZ_Asia_Kolkata ("IST-5:30")
#define TZ_Asia_Krasnoyarsk ("<+07>-7")
#define TZ_Asia_Kuala_Lumpur ("<+08>-8")
#define TZ_Asia_Kuching ("<+08>-8")
#define TZ_Asia_Kuwait ("<+03>-3")
#define TZ_Asia_Macau ("CST-8")
#define TZ_Asia_Magadan ("<+11>-11")
#define TZ_Asia_Makassar ("WITA-8")
#define TZ_Asia_Manila ("PST-8")
#define TZ_Asia_Muscat ("<+04>-4")
#define TZ_Asia_Nicosia ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Asia_Novokuznetsk ("<+07>-7")
#define TZ_Asia_Novosibirsk ("<+07>-7")
#define TZ_Asia_Omsk ("<+06>-6")
#define TZ_Asia_Oral ("<+05>-5")
#define TZ_Asia_Phnom_Penh ("<+07>-7")
#define TZ_Asia_Pontianak ("WIB-7")
#define TZ_Asia_Pyongyang ("KST-9")
#define TZ_Asia_Qatar ("<+03>-3")
#define TZ_Asia_Qyzylorda ("<+05>-5")
#define TZ_Asia_Riyadh ("<+03>-3")
#define TZ_Asia_Sakhalin ("<+11>-11")
#define TZ_Asia_Samarkand ("<+05>-5")
#define TZ_Asia_Seoul ("KST-9")
#define TZ_Asia_Shanghai ("CST-8")
#define TZ_Asia_Singapore ("<+08>-8")
#define TZ_Asia_Srednekolymsk ("<+11>-11")
#define TZ_Asia_Taipei ("CST-8")
#define TZ_Asia_Tashkent ("<+05>-5")
#define TZ_Asia_Tbilisi ("<+04>-4")
#define TZ_Asia_Tehran ("<+0330>-3:30<+0430>,J79/24,J263/24")
#define TZ_Asia_Thimphu ("<+06>-6")
#define TZ_Asia_Tokyo ("JST-9")
#define TZ_Asia_Tomsk ("<+07>-7")
#define TZ_Asia_Ulaanbaatar ("<+08>-8")
#define TZ_Asia_Urumqi ("<+06>-6")
#define TZ_Asia_UstmNera ("<+10>-10")
#define TZ_Asia_Vientiane ("<+07>-7")
#define TZ_Asia_Vladivostok ("<+10>-10")
#define TZ_Asia_Yakutsk ("<+09>-9")
#define TZ_Asia_Yangon ("<+0630>-6:30")
#define TZ_Asia_Yekaterinburg ("<+05>-5")
#define TZ_Asia_Yerevan ("<+04>-4")
#define TZ_Atlantic_Azores ("<-01>1<+00>,M3.5.0/0,M10.5.0/1")
#define TZ_Atlantic_Bermuda ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_Atlantic_Canary ("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Atlantic_Cape_Verde ("<-01>1")
#define TZ_Atlantic_Faroe ("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Atlantic_Madeira ("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Atlantic_Reykjavik ("GMT0")
#define TZ_Atlantic_South_Georgia ("<-02>2")
#define TZ_Atlantic_Stanley ("<-03>3")
#define TZ_Atlantic_St_Helena ("GMT0")
#define TZ_Australia_Adelaide ("ACST-9:30ACDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Brisbane ("AEST-10")
#define TZ_Australia_Broken_Hill ("ACST-9:30ACDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Currie ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Darwin ("ACST-9:30")
#define TZ_Australia_Eucla ("<+0845>-8:45")
#define TZ_Australia_Hobart ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Lindeman ("AEST-10")
#define TZ_Australia_Lord_Howe ("<+1030>-10:30<+11>-11,M10.1.0,M4.1.0")
#define TZ_Australia_Melbourne ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Perth ("AWST-8")
#define TZ_Australia_Sydney ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Europe_Amsterdam ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Andorra ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Astrakhan ("<+04>-4")
#define TZ_Europe_Athens ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Belgrade ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Berlin ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Bratislava ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Brussels ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Bucharest ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Budapest ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Busingen ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Chisinau ("EET-2EEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Copenhagen ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Dublin ("IST-1GMT0,M10.5.0,M3.5.0/1")
#define TZ_Europe_Gibraltar ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Guernsey ("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Helsinki ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Isle_of_Man ("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Istanbul ("<+03>-3")
#define TZ_Europe_Jersey ("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Kaliningrad ("EET-2")
#define TZ_Europe_Kiev ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Kirov ("<+03>-3")
#define TZ_Europe_Lisbon ("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Ljubljana ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_London ("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Luxembourg ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Madrid ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Malta ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Mariehamn ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Minsk ("<+03>-3")
#define TZ_Europe_Monaco ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Moscow ("MSK-3")
#define TZ_Europe_Oslo ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Paris ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Podgorica ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Prague ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Riga ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Rome ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Samara ("<+04>-4")
#define TZ_Europe_San_Marino ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Sarajevo ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Saratov ("<+04>-4")
#define TZ_Europe_Simferopol ("MSK-3")
#define TZ_Europe_Skopje ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Sofia ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Stockholm ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Tallinn ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Tirane ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Ulyanovsk ("<+04>-4")
#define TZ_Europe_Uzhgorod ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Vaduz ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Vatican ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Vienna ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Vilnius ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Volgograd ("<+04>-4")
#define TZ_Europe_Warsaw ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Zagreb ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Zaporozhye ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Zurich ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Indian_Antananarivo ("EAT-3")
#define TZ_Indian_Chagos ("<+06>-6")
#define TZ_Indian_Christmas ("<+07>-7")
#define TZ_Indian_Cocos ("<+0630>-6:30")
#define TZ_Indian_Comoro ("EAT-3")
#define TZ_Indian_Kerguelen ("<+05>-5")
#define TZ_Indian_Mahe ("<+04>-4")
#define TZ_Indian_Maldives ("<+05>-5")
#define TZ_Indian_Mauritius ("<+04>-4")
#define TZ_Indian_Mayotte ("EAT-3")
#define TZ_Indian_Reunion ("<+04>-4")
#define TZ_Pacific_Apia ("<+13>-13<+14>,M9.5.0/3,M4.1.0/4")
#define TZ_Pacific_Auckland ("NZST-12NZDT,M9.5.0,M4.1.0/3")
#define TZ_Pacific_Bougainville ("<+11>-11")
#define TZ_Pacific_Chatham ("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45")
#define TZ_Pacific_Chuuk ("<+10>-10")
#define TZ_Pacific_Easter ("<-06>6<-05>,M9.1.6/22,M4.1.6/22")
#define TZ_Pacific_Efate ("<+11>-11")
#define TZ_Pacific_Enderbury ("<+13>-13")
#define TZ_Pacific_Fakaofo ("<+13>-13")
#define TZ_Pacific_Fiji ("<+12>-12<+13>,M11.2.0,M1.2.3/99")
#define TZ_Pacific_Funafuti ("<+12>-12")
#define TZ_Pacific_Galapagos ("<-06>6")
#define TZ_Pacific_Gambier ("<-09>9")
#define TZ_Pacific_Guadalcanal ("<+11>-11")
#define TZ_Pacific_Guam ("ChST-10")
#define TZ_Pacific_Honolulu ("HST10")
#define TZ_Pacific_Kiritimati ("<+14>-14")
#define TZ_Pacific_Kosrae ("<+11>-11")
#define TZ_Pacific_Kwajalein ("<+12>-12")
#define TZ_Pacific_Majuro ("<+12>-12")
#define TZ_Pacific_Marquesas ("<-0930>9:30")
#define TZ_Pacific_Midway ("SST11")
#define TZ_Pacific_Nauru ("<+12>-12")
#define TZ_Pacific_Niue ("<-11>11")
#define TZ_Pacific_Norfolk ("<+11>-11<+12>,M10.1.0,M4.1.0/3")
#define TZ_Pacific_Noumea ("<+11>-11")
#define TZ_Pacific_Pago_Pago ("SST11")
#define TZ_Pacific_Palau ("<+09>-9")
#define TZ_Pacific_Pitcairn ("<-08>8")
#define TZ_Pacific_Pohnpei ("<+11>-11")
#define TZ_Pacific_Port_Moresby ("<+10>-10")
#define TZ_Pacific_Rarotonga ("<-10>10")
#define TZ_Pacific_Saipan ("ChST-10")
#define TZ_Pacific_Tahiti ("<-10>10")
#define TZ_Pacific_Tarawa ("<+12>-12")
#define TZ_Pacific_Tongatapu ("<+13>-13")
#define TZ_Pacific_Wake ("<+12>-12")
#define TZ_Pacific_Wallis ("<+12>-12")
#define TZ_Etc_GMT ("GMT0")
#define TZ_Etc_GMTm0 ("GMT0")
#define TZ_Etc_GMTm1 ("<+01>-1")
#define TZ_Etc_GMTm2 ("<+02>-2")
#define TZ_Etc_GMTm3 ("<+03>-3")
#define TZ_Etc_GMTm4 ("<+04>-4")
#define TZ_Etc_GMTm5 ("<+05>-5")
#define TZ_Etc_GMTm6 ("<+06>-6")
#define TZ_Etc_GMTm7 ("<+07>-7")
#define TZ_Etc_GMTm8 ("<+08>-8")
#define TZ_Etc_GMTm9 ("<+09>-9")
#define TZ_Etc_GMTm10 ("<+10>-10")
#define TZ_Etc_GMTm11 ("<+11>-11")
#define TZ_Etc_GMTm12 ("<+12>-12")
#define TZ_Etc_GMTm13 ("<+13>-13")
#define TZ_Etc_GMTm14 ("<+14>-14")
#define TZ_Etc_GMT0 ("GMT0")
#define TZ_Etc_GMTp0 ("GMT0")
#define TZ_Etc_GMTp1 ("<-01>1")
#define TZ_Etc_GMTp2 ("<-02>2")
#define TZ_Etc_GMTp3 ("<-03>3")
#define TZ_Etc_GMTp4 ("<-04>4")
#define TZ_Etc_GMTp5 ("<-05>5")
#define TZ_Etc_GMTp6 ("<-06>6")
#define TZ_Etc_GMTp7 ("<-07>7")
#define TZ_Etc_GMTp8 ("<-08>8")
#define TZ_Etc_GMTp9 ("<-09>9")
#define TZ_Etc_GMTp10 ("<-10>10")
#define TZ_Etc_GMTp11 ("<-11>11")
#define TZ_Etc_GMTp12 ("<-12>12")
#define TZ_Etc_UCT ("UTC0")
#define TZ_Etc_UTC ("UTC0")
#define TZ_Etc_Greenwich ("GMT0")
#define TZ_Etc_Universal ("UTC0")
#define TZ_Etc_Zulu ("UTC0")
#define TZ_Africa_Abidjan ("GMT0")
#define TZ_Africa_Accra ("GMT0")
#define TZ_Africa_Addis_Ababa ("EAT-3")
#define TZ_Africa_Algiers ("CET-1")
#define TZ_Africa_Asmara ("EAT-3")
#define TZ_Africa_Bamako ("GMT0")
#define TZ_Africa_Bangui ("WAT-1")
#define TZ_Africa_Banjul ("GMT0")
#define TZ_Africa_Bissau ("GMT0")
#define TZ_Africa_Blantyre ("CAT-2")
#define TZ_Africa_Brazzaville ("WAT-1")
#define TZ_Africa_Bujumbura ("CAT-2")
#define TZ_Africa_Cairo ("EET-2")
#define TZ_Africa_Casablanca ("<+01>-1")
#define TZ_Africa_Ceuta ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Africa_Conakry ("GMT0")
#define TZ_Africa_Dakar ("GMT0")
#define TZ_Africa_Dar_es_Salaam ("EAT-3")
#define TZ_Africa_Djibouti ("EAT-3")
#define TZ_Africa_Douala ("WAT-1")
#define TZ_Africa_El_Aaiun ("<+01>-1")
#define TZ_Africa_Freetown ("GMT0")
#define TZ_Africa_Gaborone ("CAT-2")
#define TZ_Africa_Harare ("CAT-2")
#define TZ_Africa_Johannesburg ("SAST-2")
#define TZ_Africa_Juba ("EAT-3")
#define TZ_Africa_Kampala ("EAT-3")
#define TZ_Africa_Khartoum ("CAT-2")
#define TZ_Africa_Kigali ("CAT-2")
#define TZ_Africa_Kinshasa ("WAT-1")
#define TZ_Africa_Lagos ("WAT-1")
#define TZ_Africa_Libreville ("WAT-1")
#define TZ_Africa_Lome ("GMT0")
#define TZ_Africa_Luanda ("WAT-1")
#define TZ_Africa_Lubumbashi ("CAT-2")
#define TZ_Africa_Lusaka ("CAT-2")
#define TZ_Africa_Malabo ("WAT-1")
#define TZ_Africa_Maputo ("CAT-2")
#define TZ_Africa_Maseru ("SAST-2")
#define TZ_Africa_Mbabane ("SAST-2")
#define TZ_Africa_Mogadishu ("EAT-3")
#define TZ_Africa_Monrovia ("GMT0")
#define TZ_Africa_Nairobi ("EAT-3")
#define TZ_Africa_Ndjamena ("WAT-1")
#define TZ_Africa_Niamey ("WAT-1")
#define TZ_Africa_Nouakchott ("GMT0")
#define TZ_Africa_Ouagadougou ("GMT0")
#define TZ_Africa_PortomNovo ("WAT-1")
#define TZ_Africa_Sao_Tome ("GMT0")
#define TZ_Africa_Tripoli ("EET-2")
#define TZ_Africa_Tunis ("CET-1")
#define TZ_Africa_Windhoek ("CAT-2")
#define TZ_America_Adak ("HST10HDT,M3.2.0,M11.1.0")
#define TZ_America_Anchorage ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Anguilla ("AST4")
#define TZ_America_Antigua ("AST4")
#define TZ_America_Araguaina ("<-03>3")
#define TZ_America_Argentina_Buenos_Aires ("<-03>3")
#define TZ_America_Argentina_Catamarca ("<-03>3")
#define TZ_America_Argentina_Cordoba ("<-03>3")
#define TZ_America_Argentina_Jujuy ("<-03>3")
#define TZ_America_Argentina_La_Rioja ("<-03>3")
#define TZ_America_Argentina_Mendoza ("<-03>3")
#define TZ_America_Argentina_Rio_Gallegos ("<-03>3")
#define TZ_America_Argentina_Salta ("<-03>3")
#define TZ_America_Argentina_San_Juan ("<-03>3")
#define TZ_America_Argentina_San_Luis ("<-03>3")
#define TZ_America_Argentina_Tucuman ("<-03>3")
#define TZ_America_Argentina_Ushuaia ("<-03>3")
#define TZ_America_Aruba ("AST4")
#define TZ_America_Asuncion ("<-04>4<-03>,M10.1.0/0,M3.4.0/0")
#define TZ_America_Atikokan ("EST5")
#define TZ_America_Bahia ("<-03>3")
#define TZ_America_Bahia_Banderas ("CST6CDT,M4.1.0,M10.5.0")
#define TZ_America_Barbados ("AST4")
#define TZ_America_Belem ("<-03>3")
#define TZ_America_Belize ("CST6")
#define TZ_America_BlancmSablon ("AST4")
#define TZ_America_Boa_Vista ("<-04>4")
#define TZ_America_Bogota ("<-05>5")
#define TZ_America_Boise ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Cambridge_Bay ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Campo_Grande ("<-04>4")
#define TZ_America_Cancun ("EST5")
#define TZ_America_Caracas ("<-04>4")
#define TZ_America_Cayenne ("<-03>3")
#define TZ_America_Cayman ("EST5")
#define TZ_America_Chicago ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Chihuahua ("MST7MDT,M4.1.0,M10.5.0")
#define TZ_America_Costa_Rica ("CST6")
#define TZ_America_Creston ("MST7")
#define TZ_America_Cuiaba ("<-04>4")
#define TZ_America_Curacao ("AST4")
#define TZ_America_Danmarkshavn ("GMT0")
#define TZ_America_Dawson ("MST7")
#define TZ_America_Dawson_Creek ("MST7")
#define TZ_America_Denver ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Detroit ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Dominica ("AST4")
#define TZ_America_Edmonton ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Eirunepe ("<-05>5")
#define TZ_America_El_Salvador ("CST6")
#define TZ_America_Fortaleza ("<-03>3")
#define TZ_America_Fort_Nelson ("MST7")
#define TZ_America_Glace_Bay ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Godthab ("<-03>3<-02>,M3.5.0/-2,M10.5.0/-1")
#define TZ_America_Goose_Bay ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Grand_Turk ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Grenada ("AST4")
#define TZ_America_Guadeloupe ("AST4")
#define TZ_America_Guatemala ("CST6")
#define TZ_America_Guayaquil ("<-05>5")
#define TZ_America_Guyana ("<-04>4")
#define TZ_America_Halifax ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Havana ("CST5CDT,M3.2.0/0,M11.1.0/1")
#define TZ_America_Hermosillo ("MST7")
#define TZ_America_Indiana_Indianapolis ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Knox ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Marengo ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Petersburg ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Tell_City ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Vevay ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Vincennes ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Winamac ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Inuvik ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Iqaluit ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Jamaica ("EST5")
#define TZ_America_Juneau ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Kentucky_Louisville ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Kentucky_Monticello ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Kralendijk ("AST4")
#define TZ_America_La_Paz ("<-04>4")
#define TZ_America_Lima ("<-05>5")
#define TZ_America_Los_Angeles ("PST8PDT,M3.2.0,M11.1.0")
#define TZ_America_Lower_Princes ("AST4")
#define TZ_America_Maceio ("<-03>3")
#define TZ_America_Managua ("CST6")
#define TZ_America_Manaus ("<-04>4")
#define TZ_America_Marigot ("AST4")
#define TZ_America_Martinique ("AST4")
#define TZ_America_Matamoros ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Mazatlan ("MST7MDT,M4.1.0,M10.5.0")
#define TZ_America_Menominee ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Merida ("CST6CDT,M4.1.0,M10.5.0")
#define TZ_America_Metlakatla ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Mexico_City ("CST6CDT,M4.1.0,M10.5.0")
#define TZ_America_Miquelon ("<-03>3<-02>,M3.2.0,M11.1.0")
#define TZ_America_Moncton ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Monterrey ("CST6CDT,M4.1.0,M10.5.0")
#define TZ_America_Montevideo ("<-03>3")
#define TZ_America_Montreal ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Montserrat ("AST4")
#define TZ_America_Nassau ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_New_York ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Nipigon ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Nome ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Noronha ("<-02>2")
#define TZ_America_North_Dakota_Beulah ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_North_Dakota_Center ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_North_Dakota_New_Salem ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Ojinaga ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Panama ("EST5")
#define TZ_America_Pangnirtung ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Paramaribo ("<-03>3")
#define TZ_America_Phoenix ("MST7")
#define TZ_America_PortmaumPrince ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Port_of_Spain ("AST4")
#define TZ_America_Porto_Velho ("<-04>4")
#define TZ_America_Puerto_Rico ("AST4")
#define TZ_America_Punta_Arenas ("<-03>3")
#define TZ_America_Rainy_River ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Rankin_Inlet ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Recife ("<-03>3")
#define TZ_America_Regina ("CST6")
#define TZ_America_Resolute ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Rio_Branco ("<-05>5")
#define TZ_America_Santarem ("<-03>3")
#define TZ_America_Santiago ("<-04>4<-03>,M9.1.6/24,M4.1.6/24")
#define TZ_America_Santo_Domingo ("AST4")
#define TZ_America_Sao_Paulo ("<-03>3")
#define TZ_America_Scoresbysund ("<-01>1<+00>,M3.5.0/0,M10.5.0/1")
#define TZ_America_Sitka ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_St_Barthelemy ("AST4")
#define TZ_America_St_Johns ("NST3:30NDT,M3.2.0,M11.1.0")
#define TZ_America_St_Kitts ("AST4")
#define TZ_America_St_Lucia ("AST4")
#define TZ_America_St_Thomas ("AST4")
#define TZ_America_St_Vincent ("AST4")
#define TZ_America_Swift_Current ("CST6")
#define TZ_America_Tegucigalpa ("CST6")
#define TZ_America_Thule ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Thunder_Bay ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Tijuana ("PST8PDT,M3.2.0,M11.1.0")
#define TZ_America_Toronto ("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Tortola ("AST4")
#define TZ_America_Vancouver ("PST8PDT,M3.2.0,M11.1.0")
#define TZ_America_Whitehorse ("MST7")
#define TZ_America_Winnipeg ("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Yakutat ("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Yellowknife ("MST7MDT,M3.2.0,M11.1.0")
#define TZ_Antarctica_Casey ("<+11>-11")
#define TZ_Antarctica_Davis ("<+07>-7")
#define TZ_Antarctica_DumontDUrville ("<+10>-10")
#define TZ_Antarctica_Macquarie ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Antarctica_Mawson ("<+05>-5")
#define TZ_Antarctica_McMurdo ("NZST-12NZDT,M9.5.0,M4.1.0/3")
#define TZ_Antarctica_Palmer ("<-03>3")
#define TZ_Antarctica_Rothera ("<-03>3")
#define TZ_Antarctica_Syowa ("<+03>-3")
#define TZ_Antarctica_Troll ("<+00>0<+02>-2,M3.5.0/1,M10.5.0/3")
#define TZ_Antarctica_Vostok ("<+06>-6")
#define TZ_Arctic_Longyearbyen ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Asia_Aden ("<+03>-3")
#define TZ_Asia_Almaty ("<+06>-6")
#define TZ_Asia_Amman ("EET-2EEST,M3.5.4/24,M10.5.5/1")
#define TZ_Asia_Anadyr ("<+12>-12")
#define TZ_Asia_Aqtau ("<+05>-5")
#define TZ_Asia_Aqtobe ("<+05>-5")
#define TZ_Asia_Ashgabat ("<+05>-5")
#define TZ_Asia_Atyrau ("<+05>-5")
#define TZ_Asia_Baghdad ("<+03>-3")
#define TZ_Asia_Bahrain ("<+03>-3")
#define TZ_Asia_Baku ("<+04>-4")
#define TZ_Asia_Bangkok ("<+07>-7")
#define TZ_Asia_Barnaul ("<+07>-7")
#define TZ_Asia_Beirut ("EET-2EEST,M3.5.0/0,M10.5.0/0")
#define TZ_Asia_Bishkek ("<+06>-6")
#define TZ_Asia_Brunei ("<+08>-8")
#define TZ_Asia_Chita ("<+09>-9")
#define TZ_Asia_Choibalsan ("<+08>-8")
#define TZ_Asia_Colombo ("<+0530>-5:30")
#define TZ_Asia_Damascus ("EET-2EEST,M3.5.5/0,M10.5.5/0")
#define TZ_Asia_Dhaka ("<+06>-6")
#define TZ_Asia_Dili ("<+09>-9")
#define TZ_Asia_Dubai ("<+04>-4")
#define TZ_Asia_Dushanbe ("<+05>-5")
#define TZ_Asia_Famagusta ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Asia_Gaza ("EET-2EEST,M3.4.4/48,M10.4.4/49")
#define TZ_Asia_Hebron ("EET-2EEST,M3.4.4/48,M10.4.4/49")
#define TZ_Asia_Ho_Chi_Minh ("<+07>-7")
#define TZ_Asia_Hong_Kong ("HKT-8")
#define TZ_Asia_Hovd ("<+07>-7")
#define TZ_Asia_Irkutsk ("<+08>-8")
#define TZ_Asia_Jakarta ("WIB-7")
#define TZ_Asia_Jayapura ("WIT-9")
#define TZ_Asia_Jerusalem ("IST-2IDT,M3.4.4/26,M10.5.0")
#define TZ_Asia_Kabul ("<+0430>-4:30")
#define TZ_Asia_Kamchatka ("<+12>-12")
#define TZ_Asia_Karachi ("PKT-5")
#define TZ_Asia_Kathmandu ("<+0545>-5:45")
#define TZ_Asia_Khandyga ("<+09>-9")
#define TZ_Asia_Kolkata ("IST-5:30")
#define TZ_Asia_Krasnoyarsk ("<+07>-7")
#define TZ_Asia_Kuala_Lumpur ("<+08>-8")
#define TZ_Asia_Kuching ("<+08>-8")
#define TZ_Asia_Kuwait ("<+03>-3")
#define TZ_Asia_Macau ("CST-8")
#define TZ_Asia_Magadan ("<+11>-11")
#define TZ_Asia_Makassar ("WITA-8")
#define TZ_Asia_Manila ("PST-8")
#define TZ_Asia_Muscat ("<+04>-4")
#define TZ_Asia_Nicosia ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Asia_Novokuznetsk ("<+07>-7")
#define TZ_Asia_Novosibirsk ("<+07>-7")
#define TZ_Asia_Omsk ("<+06>-6")
#define TZ_Asia_Oral ("<+05>-5")
#define TZ_Asia_Phnom_Penh ("<+07>-7")
#define TZ_Asia_Pontianak ("WIB-7")
#define TZ_Asia_Pyongyang ("KST-9")
#define TZ_Asia_Qatar ("<+03>-3")
#define TZ_Asia_Qyzylorda ("<+05>-5")
#define TZ_Asia_Riyadh ("<+03>-3")
#define TZ_Asia_Sakhalin ("<+11>-11")
#define TZ_Asia_Samarkand ("<+05>-5")
#define TZ_Asia_Seoul ("KST-9")
#define TZ_Asia_Shanghai ("CST-8")
#define TZ_Asia_Singapore ("<+08>-8")
#define TZ_Asia_Srednekolymsk ("<+11>-11")
#define TZ_Asia_Taipei ("CST-8")
#define TZ_Asia_Tashkent ("<+05>-5")
#define TZ_Asia_Tbilisi ("<+04>-4")
#define TZ_Asia_Tehran ("<+0330>-3:30<+0430>,J79/24,J263/24")
#define TZ_Asia_Thimphu ("<+06>-6")
#define TZ_Asia_Tokyo ("JST-9")
#define TZ_Asia_Tomsk ("<+07>-7")
#define TZ_Asia_Ulaanbaatar ("<+08>-8")
#define TZ_Asia_Urumqi ("<+06>-6")
#define TZ_Asia_UstmNera ("<+10>-10")
#define TZ_Asia_Vientiane ("<+07>-7")
#define TZ_Asia_Vladivostok ("<+10>-10")
#define TZ_Asia_Yakutsk ("<+09>-9")
#define TZ_Asia_Yangon ("<+0630>-6:30")
#define TZ_Asia_Yekaterinburg ("<+05>-5")
#define TZ_Asia_Yerevan ("<+04>-4")
#define TZ_Atlantic_Azores ("<-01>1<+00>,M3.5.0/0,M10.5.0/1")
#define TZ_Atlantic_Bermuda ("AST4ADT,M3.2.0,M11.1.0")
#define TZ_Atlantic_Canary ("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Atlantic_Cape_Verde ("<-01>1")
#define TZ_Atlantic_Faroe ("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Atlantic_Madeira ("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Atlantic_Reykjavik ("GMT0")
#define TZ_Atlantic_South_Georgia ("<-02>2")
#define TZ_Atlantic_Stanley ("<-03>3")
#define TZ_Atlantic_St_Helena ("GMT0")
#define TZ_Australia_Adelaide ("ACST-9:30ACDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Brisbane ("AEST-10")
#define TZ_Australia_Broken_Hill ("ACST-9:30ACDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Currie ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Darwin ("ACST-9:30")
#define TZ_Australia_Eucla ("<+0845>-8:45")
#define TZ_Australia_Hobart ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Lindeman ("AEST-10")
#define TZ_Australia_Lord_Howe ("<+1030>-10:30<+11>-11,M10.1.0,M4.1.0")
#define TZ_Australia_Melbourne ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Perth ("AWST-8")
#define TZ_Australia_Sydney ("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Europe_Amsterdam ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Andorra ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Astrakhan ("<+04>-4")
#define TZ_Europe_Athens ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Belgrade ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Berlin ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Bratislava ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Brussels ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Bucharest ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Budapest ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Busingen ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Chisinau ("EET-2EEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Copenhagen ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Dublin ("IST-1GMT0,M10.5.0,M3.5.0/1")
#define TZ_Europe_Gibraltar ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Guernsey ("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Helsinki ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Isle_of_Man ("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Istanbul ("<+03>-3")
#define TZ_Europe_Jersey ("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Kaliningrad ("EET-2")
#define TZ_Europe_Kiev ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Kirov ("<+03>-3")
#define TZ_Europe_Lisbon ("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Ljubljana ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_London ("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Luxembourg ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Madrid ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Malta ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Mariehamn ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Minsk ("<+03>-3")
#define TZ_Europe_Monaco ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Moscow ("MSK-3")
#define TZ_Europe_Oslo ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Paris ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Podgorica ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Prague ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Riga ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Rome ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Samara ("<+04>-4")
#define TZ_Europe_San_Marino ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Sarajevo ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Saratov ("<+04>-4")
#define TZ_Europe_Simferopol ("MSK-3")
#define TZ_Europe_Skopje ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Sofia ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Stockholm ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Tallinn ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Tirane ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Ulyanovsk ("<+04>-4")
#define TZ_Europe_Uzhgorod ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Vaduz ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Vatican ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Vienna ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Vilnius ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Volgograd ("<+04>-4")
#define TZ_Europe_Warsaw ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Zagreb ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Zaporozhye ("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Zurich ("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Indian_Antananarivo ("EAT-3")
#define TZ_Indian_Chagos ("<+06>-6")
#define TZ_Indian_Christmas ("<+07>-7")
#define TZ_Indian_Cocos ("<+0630>-6:30")
#define TZ_Indian_Comoro ("EAT-3")
#define TZ_Indian_Kerguelen ("<+05>-5")
#define TZ_Indian_Mahe ("<+04>-4")
#define TZ_Indian_Maldives ("<+05>-5")
#define TZ_Indian_Mauritius ("<+04>-4")
#define TZ_Indian_Mayotte ("EAT-3")
#define TZ_Indian_Reunion ("<+04>-4")
#define TZ_Pacific_Apia ("<+13>-13<+14>,M9.5.0/3,M4.1.0/4")
#define TZ_Pacific_Auckland ("NZST-12NZDT,M9.5.0,M4.1.0/3")
#define TZ_Pacific_Bougainville ("<+11>-11")
#define TZ_Pacific_Chatham ("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45")
#define TZ_Pacific_Chuuk ("<+10>-10")
#define TZ_Pacific_Easter ("<-06>6<-05>,M9.1.6/22,M4.1.6/22")
#define TZ_Pacific_Efate ("<+11>-11")
#define TZ_Pacific_Enderbury ("<+13>-13")
#define TZ_Pacific_Fakaofo ("<+13>-13")
#define TZ_Pacific_Fiji ("<+12>-12<+13>,M11.2.0,M1.2.3/99")
#define TZ_Pacific_Funafuti ("<+12>-12")
#define TZ_Pacific_Galapagos ("<-06>6")
#define TZ_Pacific_Gambier ("<-09>9")
#define TZ_Pacific_Guadalcanal ("<+11>-11")
#define TZ_Pacific_Guam ("ChST-10")
#define TZ_Pacific_Honolulu ("HST10")
#define TZ_Pacific_Kiritimati ("<+14>-14")
#define TZ_Pacific_Kosrae ("<+11>-11")
#define TZ_Pacific_Kwajalein ("<+12>-12")
#define TZ_Pacific_Majuro ("<+12>-12")
#define TZ_Pacific_Marquesas ("<-0930>9:30")
#define TZ_Pacific_Midway ("SST11")
#define TZ_Pacific_Nauru ("<+12>-12")
#define TZ_Pacific_Niue ("<-11>11")
#define TZ_Pacific_Norfolk ("<+11>-11<+12>,M10.1.0,M4.1.0/3")
#define TZ_Pacific_Noumea ("<+11>-11")
#define TZ_Pacific_Pago_Pago ("SST11")
#define TZ_Pacific_Palau ("<+09>-9")
#define TZ_Pacific_Pitcairn ("<-08>8")
#define TZ_Pacific_Pohnpei ("<+11>-11")
#define TZ_Pacific_Port_Moresby ("<+10>-10")
#define TZ_Pacific_Rarotonga ("<-10>10")
#define TZ_Pacific_Saipan ("ChST-10")
#define TZ_Pacific_Tahiti ("<-10>10")
#define TZ_Pacific_Tarawa ("<+12>-12")
#define TZ_Pacific_Tongatapu ("<+13>-13")
#define TZ_Pacific_Wake ("<+12>-12")
#define TZ_Pacific_Wallis ("<+12>-12")
#define TZ_Etc_GMT ("GMT0")
#define TZ_Etc_GMTm0 ("GMT0")
#define TZ_Etc_GMTm1 ("<+01>-1")
#define TZ_Etc_GMTm2 ("<+02>-2")
#define TZ_Etc_GMTm3 ("<+03>-3")
#define TZ_Etc_GMTm4 ("<+04>-4")
#define TZ_Etc_GMTm5 ("<+05>-5")
#define TZ_Etc_GMTm6 ("<+06>-6")
#define TZ_Etc_GMTm7 ("<+07>-7")
#define TZ_Etc_GMTm8 ("<+08>-8")
#define TZ_Etc_GMTm9 ("<+09>-9")
#define TZ_Etc_GMTm10 ("<+10>-10")
#define TZ_Etc_GMTm11 ("<+11>-11")
#define TZ_Etc_GMTm12 ("<+12>-12")
#define TZ_Etc_GMTm13 ("<+13>-13")
#define TZ_Etc_GMTm14 ("<+14>-14")
#define TZ_Etc_GMT0 ("GMT0")
#define TZ_Etc_GMTp0 ("GMT0")
#define TZ_Etc_GMTp1 ("<-01>1")
#define TZ_Etc_GMTp2 ("<-02>2")
#define TZ_Etc_GMTp3 ("<-03>3")
#define TZ_Etc_GMTp4 ("<-04>4")
#define TZ_Etc_GMTp5 ("<-05>5")
#define TZ_Etc_GMTp6 ("<-06>6")
#define TZ_Etc_GMTp7 ("<-07>7")
#define TZ_Etc_GMTp8 ("<-08>8")
#define TZ_Etc_GMTp9 ("<-09>9")
#define TZ_Etc_GMTp10 ("<-10>10")
#define TZ_Etc_GMTp11 ("<-11>11")
#define TZ_Etc_GMTp12 ("<-12>12")
#define TZ_Etc_UCT ("UTC0")
#define TZ_Etc_UTC ("UTC0")
#define TZ_Etc_Greenwich ("GMT0")
#define TZ_Etc_Universal ("UTC0")
#define TZ_Etc_Zulu ("UTC0")
////////////////////////////////////////////////////////////

View File

@ -15,8 +15,8 @@ include_dir = lib
[common_env_data]
upload_speed = 921600
monitor_speed = 115200
platform = espressif8266 @ 4.0.1
platform32 = espressif32 @ 5.2.0
platform = espressif8266 @ 4.1.0
platform32 = espressif32 @ 6.0.0
framework = arduino
board = d1_mini
build_unflags =
@ -49,13 +49,13 @@ lib_deps =
# https://github.com/mp-se/Arduino-Temperature-Control-Library
# https://github.com/khoih-prog/ESP_WiFiManager
# https://github.com/khoih-prog/ESP_DoubleResetDetector
https://github.com/mp-se/tinyexpr # https://github.com/codeplea/tinyexpr
https://github.com/mp-se/Arduino-Log#1.1.1 # https://github.com/thijse/Arduino-Log
https://github.com/mp-se/ArduinoJson#v6.18.5 # https://github.com/bblanchon/ArduinoJson
https://github.com/mp-se/arduinoCurveFitting#v1.0.6 # https://github.com/Rotario/arduinoCurveFitting
https://github.com/mp-se/arduino-mqtt#v2.5.0 # https://github.com/256dpi/arduino-mqtt
https://github.com/mp-se/tinyexpr#v1.0.0
https://github.com/mp-se/Arduino-Log#1.1.1
https://github.com/mp-se/ArduinoJson#v6.20.0
https://github.com/mp-se/arduinoCurveFitting#v1.0.6
https://github.com/mp-se/arduino-mqtt#v2.5.1
lib_deps32 =
https://github.com/mp-se/NimBLE-Arduino#1.3.8 # https://github.com/h2zero/NimBLE-Arduino
https://github.com/mp-se/NimBLE-Arduino#1.4.1
extra_scripts =
script/copy_firmware.py
script/create_versionjson.py
@ -118,7 +118,7 @@ build_flags =
${common_env_data.build_flags}
-D LOG_LEVEL=4
lib_deps =
https://github.com/mp-se/incbin # https://github.com/graphitemaster/incbin
https://github.com/mp-se/incbin#v1.0.0
https://github.com/bxparks/AUnit#v1.6.1
${common_env_data.lib_deps}
board = ${common_env_data.board}

View File

@ -3,6 +3,25 @@
Releases
########
v1.3.0
======
Issues adressed
++++++++++++++++
* BUG: Clarified that its the bucket ID and auth TOKEN for influxdb (config page)
Other
+++++
* Updated platformio esp8266 to v4.1.0
* Updated platformio esp32 to v6.0.0
* Updated h2zero/NimBLE-Arduino to b 1.4.1
* Updated 256dpi/arduino-mqtt to v2.5.1
* Created tag v1.0.0 for codeplea/tinyexpr to get control over releases
* Created tag v1.0.0 for graphitemaster/incbin to get control over releases
* Updated bblanchon/ArduinoJson to v6.20.0
* Updated khoih-prog/ESP_WiFiManager to v1.12.1
* Updated khoih-prog/ESP_DoubleResetDetector to v1.3.2
v1.2.1
======
@ -12,7 +31,7 @@ Issues adressed
Other
+++++
* Update tinyexpr library to latest baseline. For forumula evaluation.
* Update tinyexpr library to latest baseline (Used for forumula evaluation).
Documentation
+++++++++++++