Split config struct into different sub structs
This commit is contained in:
parent
6bafd734d7
commit
b85c53f476
@ -52,72 +52,98 @@ struct INVERTER_CONFIG_T {
|
||||
};
|
||||
|
||||
struct CONFIG_T {
|
||||
uint32_t Cfg_Version;
|
||||
uint32_t Cfg_SaveCount;
|
||||
struct {
|
||||
uint32_t Version;
|
||||
uint32_t SaveCount;
|
||||
} Cfg;
|
||||
|
||||
char WiFi_Ssid[WIFI_MAX_SSID_STRLEN + 1];
|
||||
char WiFi_Password[WIFI_MAX_PASSWORD_STRLEN + 1];
|
||||
uint8_t WiFi_Ip[4];
|
||||
uint8_t WiFi_Netmask[4];
|
||||
uint8_t WiFi_Gateway[4];
|
||||
uint8_t WiFi_Dns1[4];
|
||||
uint8_t WiFi_Dns2[4];
|
||||
bool WiFi_Dhcp;
|
||||
char WiFi_Hostname[WIFI_MAX_HOSTNAME_STRLEN + 1];
|
||||
uint32_t WiFi_ApTimeout;
|
||||
struct {
|
||||
char Ssid[WIFI_MAX_SSID_STRLEN + 1];
|
||||
char Password[WIFI_MAX_PASSWORD_STRLEN + 1];
|
||||
uint8_t Ip[4];
|
||||
uint8_t Netmask[4];
|
||||
uint8_t Gateway[4];
|
||||
uint8_t Dns1[4];
|
||||
uint8_t Dns2[4];
|
||||
bool Dhcp;
|
||||
char Hostname[WIFI_MAX_HOSTNAME_STRLEN + 1];
|
||||
uint32_t ApTimeout;
|
||||
} WiFi;
|
||||
|
||||
bool Mdns_Enabled;
|
||||
struct {
|
||||
bool Enabled;
|
||||
} Mdns;
|
||||
|
||||
char Ntp_Server[NTP_MAX_SERVER_STRLEN + 1];
|
||||
char Ntp_Timezone[NTP_MAX_TIMEZONE_STRLEN + 1];
|
||||
char Ntp_TimezoneDescr[NTP_MAX_TIMEZONEDESCR_STRLEN + 1];
|
||||
double Ntp_Longitude;
|
||||
double Ntp_Latitude;
|
||||
uint8_t Ntp_SunsetType;
|
||||
struct {
|
||||
char Server[NTP_MAX_SERVER_STRLEN + 1];
|
||||
char Timezone[NTP_MAX_TIMEZONE_STRLEN + 1];
|
||||
char TimezoneDescr[NTP_MAX_TIMEZONEDESCR_STRLEN + 1];
|
||||
double Longitude;
|
||||
double Latitude;
|
||||
uint8_t SunsetType;
|
||||
} Ntp;
|
||||
|
||||
bool Mqtt_Enabled;
|
||||
char Mqtt_Hostname[MQTT_MAX_HOSTNAME_STRLEN + 1];
|
||||
uint32_t Mqtt_Port;
|
||||
char Mqtt_Username[MQTT_MAX_USERNAME_STRLEN + 1];
|
||||
char Mqtt_Password[MQTT_MAX_PASSWORD_STRLEN + 1];
|
||||
char Mqtt_Topic[MQTT_MAX_TOPIC_STRLEN + 1];
|
||||
bool Mqtt_Retain;
|
||||
char Mqtt_LwtTopic[MQTT_MAX_TOPIC_STRLEN + 1];
|
||||
char Mqtt_LwtValue_Online[MQTT_MAX_LWTVALUE_STRLEN + 1];
|
||||
char Mqtt_LwtValue_Offline[MQTT_MAX_LWTVALUE_STRLEN + 1];
|
||||
uint32_t Mqtt_PublishInterval;
|
||||
bool Mqtt_CleanSession;
|
||||
struct {
|
||||
bool Enabled;
|
||||
char Hostname[MQTT_MAX_HOSTNAME_STRLEN + 1];
|
||||
uint32_t Port;
|
||||
char Username[MQTT_MAX_USERNAME_STRLEN + 1];
|
||||
char Password[MQTT_MAX_PASSWORD_STRLEN + 1];
|
||||
char Topic[MQTT_MAX_TOPIC_STRLEN + 1];
|
||||
bool Retain;
|
||||
uint32_t PublishInterval;
|
||||
bool CleanSession;
|
||||
|
||||
bool Mqtt_Hass_Enabled;
|
||||
bool Mqtt_Hass_Retain;
|
||||
char Mqtt_Hass_Topic[MQTT_MAX_TOPIC_STRLEN + 1];
|
||||
bool Mqtt_Hass_IndividualPanels;
|
||||
bool Mqtt_Hass_Expire;
|
||||
struct {
|
||||
char Topic[MQTT_MAX_TOPIC_STRLEN + 1];
|
||||
char Value_Online[MQTT_MAX_LWTVALUE_STRLEN + 1];
|
||||
char Value_Offline[MQTT_MAX_LWTVALUE_STRLEN + 1];
|
||||
} Lwt;
|
||||
|
||||
bool Mqtt_Tls;
|
||||
char Mqtt_RootCaCert[MQTT_MAX_CERT_STRLEN + 1];
|
||||
bool Mqtt_TlsCertLogin;
|
||||
char Mqtt_ClientCert[MQTT_MAX_CERT_STRLEN + 1];
|
||||
char Mqtt_ClientKey[MQTT_MAX_CERT_STRLEN + 1];
|
||||
struct {
|
||||
bool Enabled;
|
||||
bool Retain;
|
||||
char Topic[MQTT_MAX_TOPIC_STRLEN + 1];
|
||||
bool IndividualPanels;
|
||||
bool Expire;
|
||||
} Hass;
|
||||
|
||||
struct {
|
||||
bool Enabled;
|
||||
char RootCaCert[MQTT_MAX_CERT_STRLEN + 1];
|
||||
bool CertLogin;
|
||||
char ClientCert[MQTT_MAX_CERT_STRLEN + 1];
|
||||
char ClientKey[MQTT_MAX_CERT_STRLEN + 1];
|
||||
} Tls;
|
||||
} Mqtt;
|
||||
|
||||
struct {
|
||||
uint64_t Serial;
|
||||
uint32_t PollInterval;
|
||||
struct {
|
||||
uint8_t PaLevel;
|
||||
} Nrf;
|
||||
struct {
|
||||
int8_t PaLevel;
|
||||
uint32_t Frequency;
|
||||
} Cmt;
|
||||
} Dtu;
|
||||
|
||||
struct {
|
||||
char Password[WIFI_MAX_PASSWORD_STRLEN + 1];
|
||||
bool AllowReadonly;
|
||||
} Security;
|
||||
|
||||
struct {
|
||||
bool PowerSafe;
|
||||
bool ScreenSaver;
|
||||
uint8_t Rotation;
|
||||
uint8_t Contrast;
|
||||
uint8_t Language;
|
||||
} Display;
|
||||
|
||||
INVERTER_CONFIG_T Inverter[INV_MAX_COUNT];
|
||||
|
||||
uint64_t Dtu_Serial;
|
||||
uint32_t Dtu_PollInterval;
|
||||
uint8_t Dtu_NrfPaLevel;
|
||||
int8_t Dtu_CmtPaLevel;
|
||||
uint32_t Dtu_CmtFrequency;
|
||||
|
||||
char Security_Password[WIFI_MAX_PASSWORD_STRLEN + 1];
|
||||
bool Security_AllowReadonly;
|
||||
|
||||
char Dev_PinMapping[DEV_MAX_MAPPING_NAME_STRLEN + 1];
|
||||
|
||||
bool Display_PowerSafe;
|
||||
bool Display_ScreenSaver;
|
||||
uint8_t Display_Rotation;
|
||||
uint8_t Display_Contrast;
|
||||
uint8_t Display_Language;
|
||||
};
|
||||
|
||||
class ConfigurationClass {
|
||||
|
||||
@ -21,87 +21,87 @@ bool ConfigurationClass::write()
|
||||
if (!f) {
|
||||
return false;
|
||||
}
|
||||
config.Cfg_SaveCount++;
|
||||
config.Cfg.SaveCount++;
|
||||
|
||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||
|
||||
JsonObject cfg = doc.createNestedObject("cfg");
|
||||
cfg["version"] = config.Cfg_Version;
|
||||
cfg["save_count"] = config.Cfg_SaveCount;
|
||||
cfg["version"] = config.Cfg.Version;
|
||||
cfg["save_count"] = config.Cfg.SaveCount;
|
||||
|
||||
JsonObject wifi = doc.createNestedObject("wifi");
|
||||
wifi["ssid"] = config.WiFi_Ssid;
|
||||
wifi["password"] = config.WiFi_Password;
|
||||
wifi["ip"] = IPAddress(config.WiFi_Ip).toString();
|
||||
wifi["netmask"] = IPAddress(config.WiFi_Netmask).toString();
|
||||
wifi["gateway"] = IPAddress(config.WiFi_Gateway).toString();
|
||||
wifi["dns1"] = IPAddress(config.WiFi_Dns1).toString();
|
||||
wifi["dns2"] = IPAddress(config.WiFi_Dns2).toString();
|
||||
wifi["dhcp"] = config.WiFi_Dhcp;
|
||||
wifi["hostname"] = config.WiFi_Hostname;
|
||||
wifi["aptimeout"] = config.WiFi_ApTimeout;
|
||||
wifi["ssid"] = config.WiFi.Ssid;
|
||||
wifi["password"] = config.WiFi.Password;
|
||||
wifi["ip"] = IPAddress(config.WiFi.Ip).toString();
|
||||
wifi["netmask"] = IPAddress(config.WiFi.Netmask).toString();
|
||||
wifi["gateway"] = IPAddress(config.WiFi.Gateway).toString();
|
||||
wifi["dns1"] = IPAddress(config.WiFi.Dns1).toString();
|
||||
wifi["dns2"] = IPAddress(config.WiFi.Dns2).toString();
|
||||
wifi["dhcp"] = config.WiFi.Dhcp;
|
||||
wifi["hostname"] = config.WiFi.Hostname;
|
||||
wifi["aptimeout"] = config.WiFi.ApTimeout;
|
||||
|
||||
JsonObject mdns = doc.createNestedObject("mdns");
|
||||
mdns["enabled"] = config.Mdns_Enabled;
|
||||
mdns["enabled"] = config.Mdns.Enabled;
|
||||
|
||||
JsonObject ntp = doc.createNestedObject("ntp");
|
||||
ntp["server"] = config.Ntp_Server;
|
||||
ntp["timezone"] = config.Ntp_Timezone;
|
||||
ntp["timezone_descr"] = config.Ntp_TimezoneDescr;
|
||||
ntp["latitude"] = config.Ntp_Latitude;
|
||||
ntp["longitude"] = config.Ntp_Longitude;
|
||||
ntp["sunsettype"] = config.Ntp_SunsetType;
|
||||
ntp["server"] = config.Ntp.Server;
|
||||
ntp["timezone"] = config.Ntp.Timezone;
|
||||
ntp["timezone_descr"] = config.Ntp.TimezoneDescr;
|
||||
ntp["latitude"] = config.Ntp.Latitude;
|
||||
ntp["longitude"] = config.Ntp.Longitude;
|
||||
ntp["sunsettype"] = config.Ntp.SunsetType;
|
||||
|
||||
JsonObject mqtt = doc.createNestedObject("mqtt");
|
||||
mqtt["enabled"] = config.Mqtt_Enabled;
|
||||
mqtt["hostname"] = config.Mqtt_Hostname;
|
||||
mqtt["port"] = config.Mqtt_Port;
|
||||
mqtt["username"] = config.Mqtt_Username;
|
||||
mqtt["password"] = config.Mqtt_Password;
|
||||
mqtt["topic"] = config.Mqtt_Topic;
|
||||
mqtt["retain"] = config.Mqtt_Retain;
|
||||
mqtt["publish_interval"] = config.Mqtt_PublishInterval;
|
||||
mqtt["clean_session"] = config.Mqtt_CleanSession;
|
||||
mqtt["enabled"] = config.Mqtt.Enabled;
|
||||
mqtt["hostname"] = config.Mqtt.Hostname;
|
||||
mqtt["port"] = config.Mqtt.Port;
|
||||
mqtt["username"] = config.Mqtt.Username;
|
||||
mqtt["password"] = config.Mqtt.Password;
|
||||
mqtt["topic"] = config.Mqtt.Topic;
|
||||
mqtt["retain"] = config.Mqtt.Retain;
|
||||
mqtt["publish_interval"] = config.Mqtt.PublishInterval;
|
||||
mqtt["clean_session"] = config.Mqtt.CleanSession;
|
||||
|
||||
JsonObject mqtt_lwt = mqtt.createNestedObject("lwt");
|
||||
mqtt_lwt["topic"] = config.Mqtt_LwtTopic;
|
||||
mqtt_lwt["value_online"] = config.Mqtt_LwtValue_Online;
|
||||
mqtt_lwt["value_offline"] = config.Mqtt_LwtValue_Offline;
|
||||
mqtt_lwt["topic"] = config.Mqtt.Lwt.Topic;
|
||||
mqtt_lwt["value_online"] = config.Mqtt.Lwt.Value_Online;
|
||||
mqtt_lwt["value_offline"] = config.Mqtt.Lwt.Value_Offline;
|
||||
|
||||
JsonObject mqtt_tls = mqtt.createNestedObject("tls");
|
||||
mqtt_tls["enabled"] = config.Mqtt_Tls;
|
||||
mqtt_tls["root_ca_cert"] = config.Mqtt_RootCaCert;
|
||||
mqtt_tls["certlogin"] = config.Mqtt_TlsCertLogin;
|
||||
mqtt_tls["client_cert"] = config.Mqtt_ClientCert;
|
||||
mqtt_tls["client_key"] = config.Mqtt_ClientKey;
|
||||
mqtt_tls["enabled"] = config.Mqtt.Tls.Enabled;
|
||||
mqtt_tls["root_ca_cert"] = config.Mqtt.Tls.RootCaCert;
|
||||
mqtt_tls["certlogin"] = config.Mqtt.Tls.CertLogin;
|
||||
mqtt_tls["client_cert"] = config.Mqtt.Tls.ClientCert;
|
||||
mqtt_tls["client_key"] = config.Mqtt.Tls.ClientKey;
|
||||
|
||||
JsonObject mqtt_hass = mqtt.createNestedObject("hass");
|
||||
mqtt_hass["enabled"] = config.Mqtt_Hass_Enabled;
|
||||
mqtt_hass["retain"] = config.Mqtt_Hass_Retain;
|
||||
mqtt_hass["topic"] = config.Mqtt_Hass_Topic;
|
||||
mqtt_hass["individual_panels"] = config.Mqtt_Hass_IndividualPanels;
|
||||
mqtt_hass["expire"] = config.Mqtt_Hass_Expire;
|
||||
mqtt_hass["enabled"] = config.Mqtt.Hass.Enabled;
|
||||
mqtt_hass["retain"] = config.Mqtt.Hass.Retain;
|
||||
mqtt_hass["topic"] = config.Mqtt.Hass.Topic;
|
||||
mqtt_hass["individual_panels"] = config.Mqtt.Hass.IndividualPanels;
|
||||
mqtt_hass["expire"] = config.Mqtt.Hass.Expire;
|
||||
|
||||
JsonObject dtu = doc.createNestedObject("dtu");
|
||||
dtu["serial"] = config.Dtu_Serial;
|
||||
dtu["poll_interval"] = config.Dtu_PollInterval;
|
||||
dtu["nrf_pa_level"] = config.Dtu_NrfPaLevel;
|
||||
dtu["cmt_pa_level"] = config.Dtu_CmtPaLevel;
|
||||
dtu["cmt_frequency"] = config.Dtu_CmtFrequency;
|
||||
dtu["serial"] = config.Dtu.Serial;
|
||||
dtu["poll_interval"] = config.Dtu.PollInterval;
|
||||
dtu["nrf_pa_level"] = config.Dtu.Nrf.PaLevel;
|
||||
dtu["cmt_pa_level"] = config.Dtu.Cmt.PaLevel;
|
||||
dtu["cmt_frequency"] = config.Dtu.Cmt.Frequency;
|
||||
|
||||
JsonObject security = doc.createNestedObject("security");
|
||||
security["password"] = config.Security_Password;
|
||||
security["allow_readonly"] = config.Security_AllowReadonly;
|
||||
security["password"] = config.Security.Password;
|
||||
security["allow_readonly"] = config.Security.AllowReadonly;
|
||||
|
||||
JsonObject device = doc.createNestedObject("device");
|
||||
device["pinmapping"] = config.Dev_PinMapping;
|
||||
|
||||
JsonObject display = device.createNestedObject("display");
|
||||
display["powersafe"] = config.Display_PowerSafe;
|
||||
display["screensaver"] = config.Display_ScreenSaver;
|
||||
display["rotation"] = config.Display_Rotation;
|
||||
display["contrast"] = config.Display_Contrast;
|
||||
display["language"] = config.Display_Language;
|
||||
display["powersafe"] = config.Display.PowerSafe;
|
||||
display["screensaver"] = config.Display.ScreenSaver;
|
||||
display["rotation"] = config.Display.Rotation;
|
||||
display["contrast"] = config.Display.Contrast;
|
||||
display["language"] = config.Display.Language;
|
||||
|
||||
JsonArray inverters = doc.createNestedArray("inverters");
|
||||
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||
@ -148,113 +148,113 @@ bool ConfigurationClass::read()
|
||||
}
|
||||
|
||||
JsonObject cfg = doc["cfg"];
|
||||
config.Cfg_Version = cfg["version"] | CONFIG_VERSION;
|
||||
config.Cfg_SaveCount = cfg["save_count"] | 0;
|
||||
config.Cfg.Version = cfg["version"] | CONFIG_VERSION;
|
||||
config.Cfg.SaveCount = cfg["save_count"] | 0;
|
||||
|
||||
JsonObject wifi = doc["wifi"];
|
||||
strlcpy(config.WiFi_Ssid, wifi["ssid"] | WIFI_SSID, sizeof(config.WiFi_Ssid));
|
||||
strlcpy(config.WiFi_Password, wifi["password"] | WIFI_PASSWORD, sizeof(config.WiFi_Password));
|
||||
strlcpy(config.WiFi_Hostname, wifi["hostname"] | APP_HOSTNAME, sizeof(config.WiFi_Hostname));
|
||||
strlcpy(config.WiFi.Ssid, wifi["ssid"] | WIFI_SSID, sizeof(config.WiFi.Ssid));
|
||||
strlcpy(config.WiFi.Password, wifi["password"] | WIFI_PASSWORD, sizeof(config.WiFi.Password));
|
||||
strlcpy(config.WiFi.Hostname, wifi["hostname"] | APP_HOSTNAME, sizeof(config.WiFi.Hostname));
|
||||
|
||||
IPAddress wifi_ip;
|
||||
wifi_ip.fromString(wifi["ip"] | "");
|
||||
config.WiFi_Ip[0] = wifi_ip[0];
|
||||
config.WiFi_Ip[1] = wifi_ip[1];
|
||||
config.WiFi_Ip[2] = wifi_ip[2];
|
||||
config.WiFi_Ip[3] = wifi_ip[3];
|
||||
config.WiFi.Ip[0] = wifi_ip[0];
|
||||
config.WiFi.Ip[1] = wifi_ip[1];
|
||||
config.WiFi.Ip[2] = wifi_ip[2];
|
||||
config.WiFi.Ip[3] = wifi_ip[3];
|
||||
|
||||
IPAddress wifi_netmask;
|
||||
wifi_netmask.fromString(wifi["netmask"] | "");
|
||||
config.WiFi_Netmask[0] = wifi_netmask[0];
|
||||
config.WiFi_Netmask[1] = wifi_netmask[1];
|
||||
config.WiFi_Netmask[2] = wifi_netmask[2];
|
||||
config.WiFi_Netmask[3] = wifi_netmask[3];
|
||||
config.WiFi.Netmask[0] = wifi_netmask[0];
|
||||
config.WiFi.Netmask[1] = wifi_netmask[1];
|
||||
config.WiFi.Netmask[2] = wifi_netmask[2];
|
||||
config.WiFi.Netmask[3] = wifi_netmask[3];
|
||||
|
||||
IPAddress wifi_gateway;
|
||||
wifi_gateway.fromString(wifi["gateway"] | "");
|
||||
config.WiFi_Gateway[0] = wifi_gateway[0];
|
||||
config.WiFi_Gateway[1] = wifi_gateway[1];
|
||||
config.WiFi_Gateway[2] = wifi_gateway[2];
|
||||
config.WiFi_Gateway[3] = wifi_gateway[3];
|
||||
config.WiFi.Gateway[0] = wifi_gateway[0];
|
||||
config.WiFi.Gateway[1] = wifi_gateway[1];
|
||||
config.WiFi.Gateway[2] = wifi_gateway[2];
|
||||
config.WiFi.Gateway[3] = wifi_gateway[3];
|
||||
|
||||
IPAddress wifi_dns1;
|
||||
wifi_dns1.fromString(wifi["dns1"] | "");
|
||||
config.WiFi_Dns1[0] = wifi_dns1[0];
|
||||
config.WiFi_Dns1[1] = wifi_dns1[1];
|
||||
config.WiFi_Dns1[2] = wifi_dns1[2];
|
||||
config.WiFi_Dns1[3] = wifi_dns1[3];
|
||||
config.WiFi.Dns1[0] = wifi_dns1[0];
|
||||
config.WiFi.Dns1[1] = wifi_dns1[1];
|
||||
config.WiFi.Dns1[2] = wifi_dns1[2];
|
||||
config.WiFi.Dns1[3] = wifi_dns1[3];
|
||||
|
||||
IPAddress wifi_dns2;
|
||||
wifi_dns2.fromString(wifi["dns2"] | "");
|
||||
config.WiFi_Dns2[0] = wifi_dns2[0];
|
||||
config.WiFi_Dns2[1] = wifi_dns2[1];
|
||||
config.WiFi_Dns2[2] = wifi_dns2[2];
|
||||
config.WiFi_Dns2[3] = wifi_dns2[3];
|
||||
config.WiFi.Dns2[0] = wifi_dns2[0];
|
||||
config.WiFi.Dns2[1] = wifi_dns2[1];
|
||||
config.WiFi.Dns2[2] = wifi_dns2[2];
|
||||
config.WiFi.Dns2[3] = wifi_dns2[3];
|
||||
|
||||
config.WiFi_Dhcp = wifi["dhcp"] | WIFI_DHCP;
|
||||
config.WiFi_ApTimeout = wifi["aptimeout"] | ACCESS_POINT_TIMEOUT;
|
||||
config.WiFi.Dhcp = wifi["dhcp"] | WIFI_DHCP;
|
||||
config.WiFi.ApTimeout = wifi["aptimeout"] | ACCESS_POINT_TIMEOUT;
|
||||
|
||||
JsonObject mdns = doc["mdns"];
|
||||
config.Mdns_Enabled = mdns["enabled"] | MDNS_ENABLED;
|
||||
config.Mdns.Enabled = mdns["enabled"] | MDNS_ENABLED;
|
||||
|
||||
JsonObject ntp = doc["ntp"];
|
||||
strlcpy(config.Ntp_Server, ntp["server"] | NTP_SERVER, sizeof(config.Ntp_Server));
|
||||
strlcpy(config.Ntp_Timezone, ntp["timezone"] | NTP_TIMEZONE, sizeof(config.Ntp_Timezone));
|
||||
strlcpy(config.Ntp_TimezoneDescr, ntp["timezone_descr"] | NTP_TIMEZONEDESCR, sizeof(config.Ntp_TimezoneDescr));
|
||||
config.Ntp_Latitude = ntp["latitude"] | NTP_LATITUDE;
|
||||
config.Ntp_Longitude = ntp["longitude"] | NTP_LONGITUDE;
|
||||
config.Ntp_SunsetType = ntp["sunsettype"] | NTP_SUNSETTYPE;
|
||||
strlcpy(config.Ntp.Server, ntp["server"] | NTP_SERVER, sizeof(config.Ntp.Server));
|
||||
strlcpy(config.Ntp.Timezone, ntp["timezone"] | NTP_TIMEZONE, sizeof(config.Ntp.Timezone));
|
||||
strlcpy(config.Ntp.TimezoneDescr, ntp["timezone_descr"] | NTP_TIMEZONEDESCR, sizeof(config.Ntp.TimezoneDescr));
|
||||
config.Ntp.Latitude = ntp["latitude"] | NTP_LATITUDE;
|
||||
config.Ntp.Longitude = ntp["longitude"] | NTP_LONGITUDE;
|
||||
config.Ntp.SunsetType = ntp["sunsettype"] | NTP_SUNSETTYPE;
|
||||
|
||||
JsonObject mqtt = doc["mqtt"];
|
||||
config.Mqtt_Enabled = mqtt["enabled"] | MQTT_ENABLED;
|
||||
strlcpy(config.Mqtt_Hostname, mqtt["hostname"] | MQTT_HOST, sizeof(config.Mqtt_Hostname));
|
||||
config.Mqtt_Port = mqtt["port"] | MQTT_PORT;
|
||||
strlcpy(config.Mqtt_Username, mqtt["username"] | MQTT_USER, sizeof(config.Mqtt_Username));
|
||||
strlcpy(config.Mqtt_Password, mqtt["password"] | MQTT_PASSWORD, sizeof(config.Mqtt_Password));
|
||||
strlcpy(config.Mqtt_Topic, mqtt["topic"] | MQTT_TOPIC, sizeof(config.Mqtt_Topic));
|
||||
config.Mqtt_Retain = mqtt["retain"] | MQTT_RETAIN;
|
||||
config.Mqtt_PublishInterval = mqtt["publish_interval"] | MQTT_PUBLISH_INTERVAL;
|
||||
config.Mqtt_CleanSession = mqtt["clean_session"] | MQTT_CLEAN_SESSION;
|
||||
config.Mqtt.Enabled = mqtt["enabled"] | MQTT_ENABLED;
|
||||
strlcpy(config.Mqtt.Hostname, mqtt["hostname"] | MQTT_HOST, sizeof(config.Mqtt.Hostname));
|
||||
config.Mqtt.Port = mqtt["port"] | MQTT_PORT;
|
||||
strlcpy(config.Mqtt.Username, mqtt["username"] | MQTT_USER, sizeof(config.Mqtt.Username));
|
||||
strlcpy(config.Mqtt.Password, mqtt["password"] | MQTT_PASSWORD, sizeof(config.Mqtt.Password));
|
||||
strlcpy(config.Mqtt.Topic, mqtt["topic"] | MQTT_TOPIC, sizeof(config.Mqtt.Topic));
|
||||
config.Mqtt.Retain = mqtt["retain"] | MQTT_RETAIN;
|
||||
config.Mqtt.PublishInterval = mqtt["publish_interval"] | MQTT_PUBLISH_INTERVAL;
|
||||
config.Mqtt.CleanSession = mqtt["clean_session"] | MQTT_CLEAN_SESSION;
|
||||
|
||||
JsonObject mqtt_lwt = mqtt["lwt"];
|
||||
strlcpy(config.Mqtt_LwtTopic, mqtt_lwt["topic"] | MQTT_LWT_TOPIC, sizeof(config.Mqtt_LwtTopic));
|
||||
strlcpy(config.Mqtt_LwtValue_Online, mqtt_lwt["value_online"] | MQTT_LWT_ONLINE, sizeof(config.Mqtt_LwtValue_Online));
|
||||
strlcpy(config.Mqtt_LwtValue_Offline, mqtt_lwt["value_offline"] | MQTT_LWT_OFFLINE, sizeof(config.Mqtt_LwtValue_Offline));
|
||||
strlcpy(config.Mqtt.Lwt.Topic, mqtt_lwt["topic"] | MQTT_LWT_TOPIC, sizeof(config.Mqtt.Lwt.Topic));
|
||||
strlcpy(config.Mqtt.Lwt.Value_Online, mqtt_lwt["value_online"] | MQTT_LWT_ONLINE, sizeof(config.Mqtt.Lwt.Value_Online));
|
||||
strlcpy(config.Mqtt.Lwt.Value_Offline, mqtt_lwt["value_offline"] | MQTT_LWT_OFFLINE, sizeof(config.Mqtt.Lwt.Value_Offline));
|
||||
|
||||
JsonObject mqtt_tls = mqtt["tls"];
|
||||
config.Mqtt_Tls = mqtt_tls["enabled"] | MQTT_TLS;
|
||||
strlcpy(config.Mqtt_RootCaCert, mqtt_tls["root_ca_cert"] | MQTT_ROOT_CA_CERT, sizeof(config.Mqtt_RootCaCert));
|
||||
config.Mqtt_TlsCertLogin = mqtt_tls["certlogin"] | MQTT_TLSCERTLOGIN;
|
||||
strlcpy(config.Mqtt_ClientCert, mqtt_tls["client_cert"] | MQTT_TLSCLIENTCERT, sizeof(config.Mqtt_ClientCert));
|
||||
strlcpy(config.Mqtt_ClientKey, mqtt_tls["client_key"] | MQTT_TLSCLIENTKEY, sizeof(config.Mqtt_ClientKey));
|
||||
config.Mqtt.Tls.Enabled = mqtt_tls["enabled"] | MQTT_TLS;
|
||||
strlcpy(config.Mqtt.Tls.RootCaCert, mqtt_tls["root_ca_cert"] | MQTT_ROOT_CA_CERT, sizeof(config.Mqtt.Tls.RootCaCert));
|
||||
config.Mqtt.Tls.CertLogin = mqtt_tls["certlogin"] | MQTT_TLSCERTLOGIN;
|
||||
strlcpy(config.Mqtt.Tls.ClientCert, mqtt_tls["client_cert"] | MQTT_TLSCLIENTCERT, sizeof(config.Mqtt.Tls.ClientCert));
|
||||
strlcpy(config.Mqtt.Tls.ClientKey, mqtt_tls["client_key"] | MQTT_TLSCLIENTKEY, sizeof(config.Mqtt.Tls.ClientKey));
|
||||
|
||||
JsonObject mqtt_hass = mqtt["hass"];
|
||||
config.Mqtt_Hass_Enabled = mqtt_hass["enabled"] | MQTT_HASS_ENABLED;
|
||||
config.Mqtt_Hass_Retain = mqtt_hass["retain"] | MQTT_HASS_RETAIN;
|
||||
config.Mqtt_Hass_Expire = mqtt_hass["expire"] | MQTT_HASS_EXPIRE;
|
||||
config.Mqtt_Hass_IndividualPanels = mqtt_hass["individual_panels"] | MQTT_HASS_INDIVIDUALPANELS;
|
||||
strlcpy(config.Mqtt_Hass_Topic, mqtt_hass["topic"] | MQTT_HASS_TOPIC, sizeof(config.Mqtt_Hass_Topic));
|
||||
config.Mqtt.Hass.Enabled = mqtt_hass["enabled"] | MQTT_HASS_ENABLED;
|
||||
config.Mqtt.Hass.Retain = mqtt_hass["retain"] | MQTT_HASS_RETAIN;
|
||||
config.Mqtt.Hass.Expire = mqtt_hass["expire"] | MQTT_HASS_EXPIRE;
|
||||
config.Mqtt.Hass.IndividualPanels = mqtt_hass["individual_panels"] | MQTT_HASS_INDIVIDUALPANELS;
|
||||
strlcpy(config.Mqtt.Hass.Topic, mqtt_hass["topic"] | MQTT_HASS_TOPIC, sizeof(config.Mqtt.Hass.Topic));
|
||||
|
||||
JsonObject dtu = doc["dtu"];
|
||||
config.Dtu_Serial = dtu["serial"] | DTU_SERIAL;
|
||||
config.Dtu_PollInterval = dtu["poll_interval"] | DTU_POLL_INTERVAL;
|
||||
config.Dtu_NrfPaLevel = dtu["nrf_pa_level"] | DTU_NRF_PA_LEVEL;
|
||||
config.Dtu_CmtPaLevel = dtu["cmt_pa_level"] | DTU_CMT_PA_LEVEL;
|
||||
config.Dtu_CmtFrequency = dtu["cmt_frequency"] | DTU_CMT_FREQUENCY;
|
||||
config.Dtu.Serial = dtu["serial"] | DTU_SERIAL;
|
||||
config.Dtu.PollInterval = dtu["poll_interval"] | DTU_POLL_INTERVAL;
|
||||
config.Dtu.Nrf.PaLevel = dtu["nrf_pa_level"] | DTU_NRF_PA_LEVEL;
|
||||
config.Dtu.Cmt.PaLevel = dtu["cmt_pa_level"] | DTU_CMT_PA_LEVEL;
|
||||
config.Dtu.Cmt.Frequency = dtu["cmt_frequency"] | DTU_CMT_FREQUENCY;
|
||||
|
||||
JsonObject security = doc["security"];
|
||||
strlcpy(config.Security_Password, security["password"] | ACCESS_POINT_PASSWORD, sizeof(config.Security_Password));
|
||||
config.Security_AllowReadonly = security["allow_readonly"] | SECURITY_ALLOW_READONLY;
|
||||
strlcpy(config.Security.Password, security["password"] | ACCESS_POINT_PASSWORD, sizeof(config.Security.Password));
|
||||
config.Security.AllowReadonly = security["allow_readonly"] | SECURITY_ALLOW_READONLY;
|
||||
|
||||
JsonObject device = doc["device"];
|
||||
strlcpy(config.Dev_PinMapping, device["pinmapping"] | DEV_PINMAPPING, sizeof(config.Dev_PinMapping));
|
||||
|
||||
JsonObject display = device["display"];
|
||||
config.Display_PowerSafe = display["powersafe"] | DISPLAY_POWERSAFE;
|
||||
config.Display_ScreenSaver = display["screensaver"] | DISPLAY_SCREENSAVER;
|
||||
config.Display_Rotation = display["rotation"] | DISPLAY_ROTATION;
|
||||
config.Display_Contrast = display["contrast"] | DISPLAY_CONTRAST;
|
||||
config.Display_Language = display["language"] | DISPLAY_LANGUAGE;
|
||||
config.Display.PowerSafe = display["powersafe"] | DISPLAY_POWERSAFE;
|
||||
config.Display.ScreenSaver = display["screensaver"] | DISPLAY_SCREENSAVER;
|
||||
config.Display.Rotation = display["rotation"] | DISPLAY_ROTATION;
|
||||
config.Display.Contrast = display["contrast"] | DISPLAY_CONTRAST;
|
||||
config.Display.Language = display["language"] | DISPLAY_LANGUAGE;
|
||||
|
||||
JsonArray inverters = doc["inverters"];
|
||||
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||
@ -299,7 +299,7 @@ void ConfigurationClass::migrate()
|
||||
return;
|
||||
}
|
||||
|
||||
if (config.Cfg_Version < 0x00011700) {
|
||||
if (config.Cfg.Version < 0x00011700) {
|
||||
JsonArray inverters = doc["inverters"];
|
||||
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||
JsonObject inv = inverters[i].as<JsonObject>();
|
||||
@ -311,19 +311,19 @@ void ConfigurationClass::migrate()
|
||||
}
|
||||
}
|
||||
|
||||
if (config.Cfg_Version < 0x00011800) {
|
||||
if (config.Cfg.Version < 0x00011800) {
|
||||
JsonObject mqtt = doc["mqtt"];
|
||||
config.Mqtt_PublishInterval = mqtt["publish_invterval"];
|
||||
config.Mqtt.PublishInterval = mqtt["publish_invterval"];
|
||||
}
|
||||
|
||||
if (config.Cfg_Version < 0x00011900) {
|
||||
if (config.Cfg.Version < 0x00011900) {
|
||||
JsonObject dtu = doc["dtu"];
|
||||
config.Dtu_NrfPaLevel = dtu["pa_level"];
|
||||
config.Dtu.Nrf.PaLevel = dtu["pa_level"];
|
||||
}
|
||||
|
||||
f.close();
|
||||
|
||||
config.Cfg_Version = CONFIG_VERSION;
|
||||
config.Cfg.Version = CONFIG_VERSION;
|
||||
write();
|
||||
read();
|
||||
}
|
||||
|
||||
@ -46,19 +46,19 @@ void InverterSettingsClass::init()
|
||||
if (PinMapping.isValidCmt2300Config()) {
|
||||
Hoymiles.initCMT(pin.cmt_sdio, pin.cmt_clk, pin.cmt_cs, pin.cmt_fcs, pin.cmt_gpio2, pin.cmt_gpio3);
|
||||
MessageOutput.println(F(" Setting CMT target frequency... "));
|
||||
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu_CmtFrequency);
|
||||
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency);
|
||||
}
|
||||
|
||||
MessageOutput.println(" Setting radio PA level... ");
|
||||
Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu_NrfPaLevel);
|
||||
Hoymiles.getRadioCmt()->setPALevel(config.Dtu_CmtPaLevel);
|
||||
Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu.Nrf.PaLevel);
|
||||
Hoymiles.getRadioCmt()->setPALevel(config.Dtu.Cmt.PaLevel);
|
||||
|
||||
MessageOutput.println(" Setting DTU serial... ");
|
||||
Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu_Serial);
|
||||
Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu_Serial);
|
||||
Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu.Serial);
|
||||
Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu.Serial);
|
||||
|
||||
MessageOutput.println(" Setting poll interval... ");
|
||||
Hoymiles.setPollInterval(config.Dtu_PollInterval);
|
||||
Hoymiles.setPollInterval(config.Dtu.PollInterval);
|
||||
|
||||
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||
if (config.Inverter[i].Serial > 0) {
|
||||
|
||||
@ -52,7 +52,7 @@ void LedSingleClass::loop()
|
||||
}
|
||||
|
||||
struct tm timeinfo;
|
||||
if (getLocalTime(&timeinfo, 5) && (!config.Mqtt_Enabled || (config.Mqtt_Enabled && MqttSettings.getConnected()))) {
|
||||
if (getLocalTime(&timeinfo, 5) && (!config.Mqtt.Enabled || (config.Mqtt.Enabled && MqttSettings.getConnected()))) {
|
||||
_ledState[0] = LedState_t::On;
|
||||
}
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ void MqttHandleDtuClass::loop()
|
||||
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
|
||||
if (millis() - _lastPublish > (config.Mqtt_PublishInterval * 1000)) {
|
||||
if (millis() - _lastPublish > (config.Mqtt.PublishInterval * 1000)) {
|
||||
MqttSettings.publish("dtu/uptime", String(millis() / 1000));
|
||||
MqttSettings.publish("dtu/ip", NetworkSettings.localIP().toString());
|
||||
MqttSettings.publish("dtu/hostname", NetworkSettings.getHostname());
|
||||
|
||||
@ -37,7 +37,7 @@ void MqttHandleHassClass::forceUpdate()
|
||||
|
||||
void MqttHandleHassClass::publishConfig()
|
||||
{
|
||||
if (!Configuration.get().Mqtt_Hass_Enabled) {
|
||||
if (!Configuration.get().Mqtt.Hass.Enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ void MqttHandleHassClass::publishConfig()
|
||||
for (auto& c : inv->Statistics()->getChannelsByType(t)) {
|
||||
for (uint8_t f = 0; f < DEVICE_CLS_ASSIGN_LIST_LEN; f++) {
|
||||
bool clear = false;
|
||||
if (t == TYPE_DC && !config.Mqtt_Hass_IndividualPanels) {
|
||||
if (t == TYPE_DC && !config.Mqtt.Hass.IndividualPanels) {
|
||||
clear = true;
|
||||
}
|
||||
publishField(inv, t, c, deviceFieldAssignment[f], clear);
|
||||
@ -133,8 +133,8 @@ void MqttHandleHassClass::publishField(std::shared_ptr<InverterAbstract> inv, Ch
|
||||
JsonObject deviceObj = root.createNestedObject("dev");
|
||||
createDeviceInfo(deviceObj, inv);
|
||||
|
||||
if (Configuration.get().Mqtt_Hass_Expire) {
|
||||
root["exp_aft"] = Hoymiles.getNumInverters() * max<uint32_t>(Hoymiles.PollInterval(), Configuration.get().Mqtt_PublishInterval) * inv->getReachableThreshold();
|
||||
if (Configuration.get().Mqtt.Hass.Expire) {
|
||||
root["exp_aft"] = Hoymiles.getNumInverters() * max<uint32_t>(Hoymiles.PollInterval(), Configuration.get().Mqtt.PublishInterval) * inv->getReachableThreshold();
|
||||
}
|
||||
if (devCls != 0) {
|
||||
root["dev_cla"] = devCls;
|
||||
@ -266,7 +266,7 @@ void MqttHandleHassClass::createDeviceInfo(JsonObject& object, std::shared_ptr<I
|
||||
|
||||
void MqttHandleHassClass::publish(const String& subtopic, const String& payload)
|
||||
{
|
||||
String topic = Configuration.get().Mqtt_Hass_Topic;
|
||||
String topic = Configuration.get().Mqtt.Hass.Topic;
|
||||
topic += subtopic;
|
||||
MqttSettings.publishGeneric(topic.c_str(), payload.c_str(), Configuration.get().Mqtt_Hass_Retain);
|
||||
MqttSettings.publishGeneric(topic.c_str(), payload.c_str(), Configuration.get().Mqtt.Hass.Retain);
|
||||
}
|
||||
@ -44,7 +44,7 @@ void MqttHandleInverterClass::loop()
|
||||
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
|
||||
if (millis() - _lastPublish > (config.Mqtt_PublishInterval * 1000)) {
|
||||
if (millis() - _lastPublish > (config.Mqtt.PublishInterval * 1000)) {
|
||||
// Loop all inverters
|
||||
for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) {
|
||||
auto inv = Hoymiles.getInverterByPos(i);
|
||||
@ -166,7 +166,7 @@ void MqttHandleInverterClass::onMqttMessage(const espMqttClientTypes::MessagePro
|
||||
char* serial_str;
|
||||
char* subtopic;
|
||||
char* setting;
|
||||
char* rest = &token_topic[strlen(config.Mqtt_Topic)];
|
||||
char* rest = &token_topic[strlen(config.Mqtt.Topic)];
|
||||
|
||||
serial_str = strtok_r(rest, "/", &rest);
|
||||
subtopic = strtok_r(rest, "/", &rest);
|
||||
|
||||
@ -12,7 +12,7 @@ MqttHandleInverterTotalClass MqttHandleInverterTotal;
|
||||
|
||||
void MqttHandleInverterTotalClass::init()
|
||||
{
|
||||
_lastPublish.set(Configuration.get().Mqtt_PublishInterval * 1000);
|
||||
_lastPublish.set(Configuration.get().Mqtt.PublishInterval * 1000);
|
||||
}
|
||||
|
||||
void MqttHandleInverterTotalClass::loop()
|
||||
@ -30,6 +30,6 @@ void MqttHandleInverterTotalClass::loop()
|
||||
MqttSettings.publish("dc/irradiation", String(Datastore.getTotalDcIrradiation(), 3));
|
||||
MqttSettings.publish("dc/is_valid", String(Datastore.getIsAllEnabledReachable()));
|
||||
|
||||
_lastPublish.set(Configuration.get().Mqtt_PublishInterval * 1000);
|
||||
_lastPublish.set(Configuration.get().Mqtt.PublishInterval * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@ -30,7 +30,7 @@ void MqttSettingsClass::onMqttConnect(bool sessionPresent)
|
||||
{
|
||||
MessageOutput.println("Connected to MQTT.");
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
publish(config.Mqtt_LwtTopic, config.Mqtt_LwtValue_Online);
|
||||
publish(config.Mqtt.Lwt.Topic, config.Mqtt.Lwt.Value_Online);
|
||||
|
||||
std::lock_guard<std::mutex> lock(_clientLock);
|
||||
if (mqttClient != nullptr) {
|
||||
@ -99,7 +99,7 @@ void MqttSettingsClass::onMqttMessage(const espMqttClientTypes::MessagePropertie
|
||||
|
||||
void MqttSettingsClass::performConnect()
|
||||
{
|
||||
if (NetworkSettings.isConnected() && Configuration.get().Mqtt_Enabled) {
|
||||
if (NetworkSettings.isConnected() && Configuration.get().Mqtt.Enabled) {
|
||||
using std::placeholders::_1;
|
||||
using std::placeholders::_2;
|
||||
using std::placeholders::_3;
|
||||
@ -114,29 +114,29 @@ void MqttSettingsClass::performConnect()
|
||||
|
||||
MessageOutput.println("Connecting to MQTT...");
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
willTopic = getPrefix() + config.Mqtt_LwtTopic;
|
||||
willTopic = getPrefix() + config.Mqtt.Lwt.Topic;
|
||||
clientId = NetworkSettings.getApName();
|
||||
if (config.Mqtt_Tls) {
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setCACert(config.Mqtt_RootCaCert);
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setServer(config.Mqtt_Hostname, config.Mqtt_Port);
|
||||
if (config.Mqtt_TlsCertLogin) {
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setCertificate(config.Mqtt_ClientCert);
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setPrivateKey(config.Mqtt_ClientKey);
|
||||
if (config.Mqtt.Tls.Enabled) {
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setCACert(config.Mqtt.Tls.RootCaCert);
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setServer(config.Mqtt.Hostname, config.Mqtt.Port);
|
||||
if (config.Mqtt.Tls.CertLogin) {
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setCertificate(config.Mqtt.Tls.ClientCert);
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setPrivateKey(config.Mqtt.Tls.ClientKey);
|
||||
} else {
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setCredentials(config.Mqtt_Username, config.Mqtt_Password);
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setCredentials(config.Mqtt.Username, config.Mqtt.Password);
|
||||
}
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setWill(willTopic.c_str(), 2, config.Mqtt_Retain, config.Mqtt_LwtValue_Offline);
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setWill(willTopic.c_str(), 2, config.Mqtt.Retain, config.Mqtt.Lwt.Value_Offline);
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setClientId(clientId.c_str());
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setCleanSession(config.Mqtt_CleanSession);
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->setCleanSession(config.Mqtt.CleanSession);
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->onConnect(std::bind(&MqttSettingsClass::onMqttConnect, this, _1));
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->onDisconnect(std::bind(&MqttSettingsClass::onMqttDisconnect, this, _1));
|
||||
static_cast<espMqttClientSecure*>(mqttClient)->onMessage(std::bind(&MqttSettingsClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6));
|
||||
} else {
|
||||
static_cast<espMqttClient*>(mqttClient)->setServer(config.Mqtt_Hostname, config.Mqtt_Port);
|
||||
static_cast<espMqttClient*>(mqttClient)->setCredentials(config.Mqtt_Username, config.Mqtt_Password);
|
||||
static_cast<espMqttClient*>(mqttClient)->setWill(willTopic.c_str(), 2, config.Mqtt_Retain, config.Mqtt_LwtValue_Offline);
|
||||
static_cast<espMqttClient*>(mqttClient)->setServer(config.Mqtt.Hostname, config.Mqtt.Port);
|
||||
static_cast<espMqttClient*>(mqttClient)->setCredentials(config.Mqtt.Username, config.Mqtt.Password);
|
||||
static_cast<espMqttClient*>(mqttClient)->setWill(willTopic.c_str(), 2, config.Mqtt.Retain, config.Mqtt.Lwt.Value_Offline);
|
||||
static_cast<espMqttClient*>(mqttClient)->setClientId(clientId.c_str());
|
||||
static_cast<espMqttClient*>(mqttClient)->setCleanSession(config.Mqtt_CleanSession);
|
||||
static_cast<espMqttClient*>(mqttClient)->setCleanSession(config.Mqtt.CleanSession);
|
||||
static_cast<espMqttClient*>(mqttClient)->onConnect(std::bind(&MqttSettingsClass::onMqttConnect, this, _1));
|
||||
static_cast<espMqttClient*>(mqttClient)->onDisconnect(std::bind(&MqttSettingsClass::onMqttDisconnect, this, _1));
|
||||
static_cast<espMqttClient*>(mqttClient)->onMessage(std::bind(&MqttSettingsClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6));
|
||||
@ -148,7 +148,7 @@ void MqttSettingsClass::performConnect()
|
||||
void MqttSettingsClass::performDisconnect()
|
||||
{
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
publish(config.Mqtt_LwtTopic, config.Mqtt_LwtValue_Offline);
|
||||
publish(config.Mqtt.Lwt.Topic, config.Mqtt.Lwt.Value_Offline);
|
||||
std::lock_guard<std::mutex> lock(_clientLock);
|
||||
if (mqttClient == nullptr) {
|
||||
return;
|
||||
@ -177,7 +177,7 @@ bool MqttSettingsClass::getConnected()
|
||||
|
||||
String MqttSettingsClass::getPrefix()
|
||||
{
|
||||
return Configuration.get().Mqtt_Topic;
|
||||
return Configuration.get().Mqtt.Topic;
|
||||
}
|
||||
|
||||
void MqttSettingsClass::publish(const String& subtopic, const String& payload)
|
||||
@ -188,7 +188,7 @@ void MqttSettingsClass::publish(const String& subtopic, const String& payload)
|
||||
String value = payload;
|
||||
value.trim();
|
||||
|
||||
publishGeneric(topic, value, Configuration.get().Mqtt_Retain, 0);
|
||||
publishGeneric(topic, value, Configuration.get().Mqtt.Retain, 0);
|
||||
}
|
||||
|
||||
void MqttSettingsClass::publishGeneric(const String& topic, const String& payload, bool retain, uint8_t qos)
|
||||
@ -216,7 +216,7 @@ void MqttSettingsClass::createMqttClientObject()
|
||||
mqttClient = nullptr;
|
||||
}
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
if (config.Mqtt_Tls) {
|
||||
if (config.Mqtt.Tls.Enabled) {
|
||||
mqttClient = static_cast<MqttClient*>(new espMqttClientSecure);
|
||||
} else {
|
||||
mqttClient = static_cast<MqttClient*>(new espMqttClient);
|
||||
|
||||
@ -113,7 +113,7 @@ void NetworkSettingsClass::raiseEvent(network_event event)
|
||||
|
||||
void NetworkSettingsClass::handleMDNS()
|
||||
{
|
||||
bool mdnsEnabled = Configuration.get().Mdns_Enabled;
|
||||
bool mdnsEnabled = Configuration.get().Mdns.Enabled;
|
||||
|
||||
if (lastMdnsEnabled == mdnsEnabled) {
|
||||
return;
|
||||
@ -146,7 +146,7 @@ void NetworkSettingsClass::setupMode()
|
||||
WiFi.mode(WIFI_AP_STA);
|
||||
String ssidString = getApName();
|
||||
WiFi.softAPConfig(apIp, apIp, apNetmask);
|
||||
WiFi.softAP((const char*)ssidString.c_str(), Configuration.get().Security_Password);
|
||||
WiFi.softAP((const char*)ssidString.c_str(), Configuration.get().Security.Password);
|
||||
dnsServer->setErrorReplyCode(DNSReplyCode::NoError);
|
||||
dnsServer->start(DNS_PORT, "*", WiFi.softAPIP());
|
||||
dnsServerStatus = true;
|
||||
@ -170,7 +170,7 @@ void NetworkSettingsClass::enableAdminMode()
|
||||
{
|
||||
adminEnabled = true;
|
||||
adminTimeoutCounter = 0;
|
||||
adminTimeoutCounterMax = Configuration.get().WiFi_ApTimeout * 60;
|
||||
adminTimeoutCounterMax = Configuration.get().WiFi.ApTimeout * 60;
|
||||
setupMode();
|
||||
}
|
||||
|
||||
@ -255,15 +255,15 @@ void NetworkSettingsClass::loop()
|
||||
void NetworkSettingsClass::applyConfig()
|
||||
{
|
||||
setHostname();
|
||||
if (!strcmp(Configuration.get().WiFi_Ssid, "")) {
|
||||
if (!strcmp(Configuration.get().WiFi.Ssid, "")) {
|
||||
return;
|
||||
}
|
||||
MessageOutput.print("Configuring WiFi STA using ");
|
||||
if (strcmp(WiFi.SSID().c_str(), Configuration.get().WiFi_Ssid) || strcmp(WiFi.psk().c_str(), Configuration.get().WiFi_Password)) {
|
||||
if (strcmp(WiFi.SSID().c_str(), Configuration.get().WiFi.Ssid) || strcmp(WiFi.psk().c_str(), Configuration.get().WiFi.Password)) {
|
||||
MessageOutput.print("new credentials... ");
|
||||
WiFi.begin(
|
||||
Configuration.get().WiFi_Ssid,
|
||||
Configuration.get().WiFi_Password);
|
||||
Configuration.get().WiFi.Ssid,
|
||||
Configuration.get().WiFi.Password);
|
||||
} else {
|
||||
MessageOutput.print("existing credentials... ");
|
||||
WiFi.begin();
|
||||
@ -298,33 +298,33 @@ void NetworkSettingsClass::setHostname()
|
||||
void NetworkSettingsClass::setStaticIp()
|
||||
{
|
||||
if (_networkMode == network_mode::WiFi) {
|
||||
if (Configuration.get().WiFi_Dhcp) {
|
||||
if (Configuration.get().WiFi.Dhcp) {
|
||||
MessageOutput.print("Configuring WiFi STA DHCP IP... ");
|
||||
WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
|
||||
MessageOutput.println("done");
|
||||
} else {
|
||||
MessageOutput.print("Configuring WiFi STA static IP... ");
|
||||
WiFi.config(
|
||||
IPAddress(Configuration.get().WiFi_Ip),
|
||||
IPAddress(Configuration.get().WiFi_Gateway),
|
||||
IPAddress(Configuration.get().WiFi_Netmask),
|
||||
IPAddress(Configuration.get().WiFi_Dns1),
|
||||
IPAddress(Configuration.get().WiFi_Dns2));
|
||||
IPAddress(Configuration.get().WiFi.Ip),
|
||||
IPAddress(Configuration.get().WiFi.Gateway),
|
||||
IPAddress(Configuration.get().WiFi.Netmask),
|
||||
IPAddress(Configuration.get().WiFi.Dns1),
|
||||
IPAddress(Configuration.get().WiFi.Dns2));
|
||||
MessageOutput.println("done");
|
||||
}
|
||||
} else if (_networkMode == network_mode::Ethernet) {
|
||||
if (Configuration.get().WiFi_Dhcp) {
|
||||
if (Configuration.get().WiFi.Ssid) {
|
||||
MessageOutput.print("Configuring Ethernet DHCP IP... ");
|
||||
ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE);
|
||||
MessageOutput.println("done");
|
||||
} else {
|
||||
MessageOutput.print("Configuring Ethernet static IP... ");
|
||||
ETH.config(
|
||||
IPAddress(Configuration.get().WiFi_Ip),
|
||||
IPAddress(Configuration.get().WiFi_Gateway),
|
||||
IPAddress(Configuration.get().WiFi_Netmask),
|
||||
IPAddress(Configuration.get().WiFi_Dns1),
|
||||
IPAddress(Configuration.get().WiFi_Dns2));
|
||||
IPAddress(Configuration.get().WiFi.Ip),
|
||||
IPAddress(Configuration.get().WiFi.Gateway),
|
||||
IPAddress(Configuration.get().WiFi.Netmask),
|
||||
IPAddress(Configuration.get().WiFi.Dns1),
|
||||
IPAddress(Configuration.get().WiFi.Dns2));
|
||||
MessageOutput.println("done");
|
||||
}
|
||||
}
|
||||
@ -408,7 +408,7 @@ String NetworkSettingsClass::getHostname()
|
||||
uint8_t pos = 0;
|
||||
|
||||
uint32_t chipId = Utils::getChipId();
|
||||
snprintf(preparedHostname, WIFI_MAX_HOSTNAME_STRLEN + 1, config.WiFi_Hostname, chipId);
|
||||
snprintf(preparedHostname, WIFI_MAX_HOSTNAME_STRLEN + 1, config.WiFi.Hostname, chipId);
|
||||
|
||||
const char* pC = preparedHostname;
|
||||
while (*pC && pos < WIFI_MAX_HOSTNAME_STRLEN) { // while !null and not over length
|
||||
|
||||
@ -19,12 +19,12 @@ void NtpSettingsClass::init()
|
||||
|
||||
void NtpSettingsClass::setServer()
|
||||
{
|
||||
configTime(0, 0, Configuration.get().Ntp_Server);
|
||||
configTime(0, 0, Configuration.get().Ntp.Server);
|
||||
}
|
||||
|
||||
void NtpSettingsClass::setTimezone()
|
||||
{
|
||||
setenv("TZ", Configuration.get().Ntp_Timezone, 1);
|
||||
setenv("TZ", Configuration.get().Ntp.Timezone, 1);
|
||||
tzset();
|
||||
}
|
||||
|
||||
|
||||
@ -80,7 +80,7 @@ void SunPositionClass::updateSunData()
|
||||
CONFIG_T const& config = Configuration.get();
|
||||
|
||||
double sunset_type;
|
||||
switch (config.Ntp_SunsetType) {
|
||||
switch (config.Ntp.SunsetType) {
|
||||
case 0:
|
||||
sunset_type = SunSet::SUNSET_OFFICIAL;
|
||||
break;
|
||||
@ -98,7 +98,7 @@ void SunPositionClass::updateSunData()
|
||||
int offset = Utils::getTimezoneOffset() / 3600;
|
||||
|
||||
SunSet sun;
|
||||
sun.setPosition(config.Ntp_Latitude, config.Ntp_Longitude, offset);
|
||||
sun.setPosition(config.Ntp.Latitude, config.Ntp.Longitude, offset);
|
||||
sun.setCurrentDate(1900 + timeinfo.tm_year, timeinfo.tm_mon + 1, timeinfo.tm_mday);
|
||||
|
||||
double sunriseRaw = sun.calcCustomSunrise(sunset_type);
|
||||
|
||||
@ -67,7 +67,7 @@ void WebApiClass::loop()
|
||||
bool WebApiClass::checkCredentials(AsyncWebServerRequest* request)
|
||||
{
|
||||
CONFIG_T& config = Configuration.get();
|
||||
if (request->authenticate(AUTH_USERNAME, config.Security_Password)) {
|
||||
if (request->authenticate(AUTH_USERNAME, config.Security.Password)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -85,7 +85,7 @@ bool WebApiClass::checkCredentials(AsyncWebServerRequest* request)
|
||||
bool WebApiClass::checkCredentialsReadonly(AsyncWebServerRequest* request)
|
||||
{
|
||||
CONFIG_T& config = Configuration.get();
|
||||
if (config.Security_AllowReadonly) {
|
||||
if (config.Security.AllowReadonly) {
|
||||
return true;
|
||||
} else {
|
||||
return checkCredentials(request);
|
||||
|
||||
@ -77,11 +77,11 @@ void WebApiDeviceClass::onDeviceAdminGet(AsyncWebServerRequest* request)
|
||||
ledPinObj["led1"] = pin.led[1];
|
||||
|
||||
JsonObject display = root.createNestedObject("display");
|
||||
display["rotation"] = config.Display_Rotation;
|
||||
display["power_safe"] = config.Display_PowerSafe;
|
||||
display["screensaver"] = config.Display_ScreenSaver;
|
||||
display["contrast"] = config.Display_Contrast;
|
||||
display["language"] = config.Display_Language;
|
||||
display["rotation"] = config.Display.Rotation;
|
||||
display["power_safe"] = config.Display.PowerSafe;
|
||||
display["screensaver"] = config.Display.ScreenSaver;
|
||||
display["contrast"] = config.Display.Contrast;
|
||||
display["language"] = config.Display.Language;
|
||||
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
@ -148,17 +148,17 @@ void WebApiDeviceClass::onDeviceAdminPost(AsyncWebServerRequest* request)
|
||||
bool performRestart = root["curPin"]["name"].as<String>() != config.Dev_PinMapping;
|
||||
|
||||
strlcpy(config.Dev_PinMapping, root["curPin"]["name"].as<String>().c_str(), sizeof(config.Dev_PinMapping));
|
||||
config.Display_Rotation = root["display"]["rotation"].as<uint8_t>();
|
||||
config.Display_PowerSafe = root["display"]["power_safe"].as<bool>();
|
||||
config.Display_ScreenSaver = root["display"]["screensaver"].as<bool>();
|
||||
config.Display_Contrast = root["display"]["contrast"].as<uint8_t>();
|
||||
config.Display_Language = root["display"]["language"].as<uint8_t>();
|
||||
config.Display.Rotation = root["display"]["rotation"].as<uint8_t>();
|
||||
config.Display.PowerSafe = root["display"]["power_safe"].as<bool>();
|
||||
config.Display.ScreenSaver = root["display"]["screensaver"].as<bool>();
|
||||
config.Display.Contrast = root["display"]["contrast"].as<uint8_t>();
|
||||
config.Display.Language = root["display"]["language"].as<uint8_t>();
|
||||
|
||||
Display.setOrientation(config.Display_Rotation);
|
||||
Display.enablePowerSafe = config.Display_PowerSafe;
|
||||
Display.enableScreensaver = config.Display_ScreenSaver;
|
||||
Display.setContrast(config.Display_Contrast);
|
||||
Display.setLanguage(config.Display_Language);
|
||||
Display.setOrientation(config.Display.Rotation);
|
||||
Display.enablePowerSafe = config.Display.PowerSafe;
|
||||
Display.enableScreensaver = config.Display.ScreenSaver;
|
||||
Display.setContrast(config.Display.Contrast);
|
||||
Display.setLanguage(config.Display.Language);
|
||||
|
||||
Configuration.write();
|
||||
|
||||
|
||||
@ -36,15 +36,15 @@ void WebApiDtuClass::onDtuAdminGet(AsyncWebServerRequest* request)
|
||||
// DTU Serial is read as HEX
|
||||
char buffer[sizeof(uint64_t) * 8 + 1];
|
||||
snprintf(buffer, sizeof(buffer), "%0x%08x",
|
||||
((uint32_t)((config.Dtu_Serial >> 32) & 0xFFFFFFFF)),
|
||||
((uint32_t)(config.Dtu_Serial & 0xFFFFFFFF)));
|
||||
((uint32_t)((config.Dtu.Serial >> 32) & 0xFFFFFFFF)),
|
||||
((uint32_t)(config.Dtu.Serial & 0xFFFFFFFF)));
|
||||
root["serial"] = buffer;
|
||||
root["pollinterval"] = config.Dtu_PollInterval;
|
||||
root["pollinterval"] = config.Dtu.PollInterval;
|
||||
root["nrf_enabled"] = Hoymiles.getRadioNrf()->isInitialized();
|
||||
root["nrf_palevel"] = config.Dtu_NrfPaLevel;
|
||||
root["nrf_palevel"] = config.Dtu.Nrf.PaLevel;
|
||||
root["cmt_enabled"] = Hoymiles.getRadioCmt()->isInitialized();
|
||||
root["cmt_palevel"] = config.Dtu_CmtPaLevel;
|
||||
root["cmt_frequency"] = config.Dtu_CmtFrequency;
|
||||
root["cmt_palevel"] = config.Dtu.Cmt.PaLevel;
|
||||
root["cmt_frequency"] = config.Dtu.Cmt.Frequency;
|
||||
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
@ -149,11 +149,11 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request)
|
||||
CONFIG_T& config = Configuration.get();
|
||||
|
||||
// Interpret the string as a hex value and convert it to uint64_t
|
||||
config.Dtu_Serial = strtoll(root["serial"].as<String>().c_str(), NULL, 16);
|
||||
config.Dtu_PollInterval = root["pollinterval"].as<uint32_t>();
|
||||
config.Dtu_NrfPaLevel = root["nrf_palevel"].as<uint8_t>();
|
||||
config.Dtu_CmtPaLevel = root["cmt_palevel"].as<int8_t>();
|
||||
config.Dtu_CmtFrequency = root["cmt_frequency"].as<uint32_t>();
|
||||
config.Dtu.Serial = strtoll(root["serial"].as<String>().c_str(), NULL, 16);
|
||||
config.Dtu.PollInterval = root["pollinterval"].as<uint32_t>();
|
||||
config.Dtu.Nrf.PaLevel = root["nrf_palevel"].as<uint8_t>();
|
||||
config.Dtu.Cmt.PaLevel = root["cmt_palevel"].as<int8_t>();
|
||||
config.Dtu.Cmt.Frequency = root["cmt_frequency"].as<uint32_t>();
|
||||
Configuration.write();
|
||||
|
||||
retMsg["type"] = "success";
|
||||
@ -163,10 +163,10 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request)
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
|
||||
Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu_NrfPaLevel);
|
||||
Hoymiles.getRadioCmt()->setPALevel(config.Dtu_CmtPaLevel);
|
||||
Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu_Serial);
|
||||
Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu_Serial);
|
||||
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu_CmtFrequency);
|
||||
Hoymiles.setPollInterval(config.Dtu_PollInterval);
|
||||
Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu.Nrf.PaLevel);
|
||||
Hoymiles.getRadioCmt()->setPALevel(config.Dtu.Cmt.PaLevel);
|
||||
Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu.Serial);
|
||||
Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu.Serial);
|
||||
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency);
|
||||
Hoymiles.setPollInterval(config.Dtu.PollInterval);
|
||||
}
|
||||
@ -36,25 +36,25 @@ void WebApiMqttClass::onMqttStatus(AsyncWebServerRequest* request)
|
||||
JsonObject root = response->getRoot();
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
|
||||
root["mqtt_enabled"] = config.Mqtt_Enabled;
|
||||
root["mqtt_hostname"] = config.Mqtt_Hostname;
|
||||
root["mqtt_port"] = config.Mqtt_Port;
|
||||
root["mqtt_username"] = config.Mqtt_Username;
|
||||
root["mqtt_topic"] = config.Mqtt_Topic;
|
||||
root["mqtt_enabled"] = config.Mqtt.Enabled;
|
||||
root["mqtt_hostname"] = config.Mqtt.Hostname;
|
||||
root["mqtt_port"] = config.Mqtt.Port;
|
||||
root["mqtt_username"] = config.Mqtt.Username;
|
||||
root["mqtt_topic"] = config.Mqtt.Topic;
|
||||
root["mqtt_connected"] = MqttSettings.getConnected();
|
||||
root["mqtt_retain"] = config.Mqtt_Retain;
|
||||
root["mqtt_tls"] = config.Mqtt_Tls;
|
||||
root["mqtt_root_ca_cert_info"] = getTlsCertInfo(config.Mqtt_RootCaCert);
|
||||
root["mqtt_tls_cert_login"] = config.Mqtt_TlsCertLogin;
|
||||
root["mqtt_client_cert_info"] = getTlsCertInfo(config.Mqtt_ClientCert);
|
||||
root["mqtt_lwt_topic"] = String(config.Mqtt_Topic) + config.Mqtt_LwtTopic;
|
||||
root["mqtt_publish_interval"] = config.Mqtt_PublishInterval;
|
||||
root["mqtt_clean_session"] = config.Mqtt_CleanSession;
|
||||
root["mqtt_hass_enabled"] = config.Mqtt_Hass_Enabled;
|
||||
root["mqtt_hass_expire"] = config.Mqtt_Hass_Expire;
|
||||
root["mqtt_hass_retain"] = config.Mqtt_Hass_Retain;
|
||||
root["mqtt_hass_topic"] = config.Mqtt_Hass_Topic;
|
||||
root["mqtt_hass_individualpanels"] = config.Mqtt_Hass_IndividualPanels;
|
||||
root["mqtt_retain"] = config.Mqtt.Retain;
|
||||
root["mqtt_tls"] = config.Mqtt.Tls.Enabled;
|
||||
root["mqtt_root_ca_cert_info"] = getTlsCertInfo(config.Mqtt.Tls.RootCaCert);
|
||||
root["mqtt_tls_cert_login"] = config.Mqtt.Tls.CertLogin;
|
||||
root["mqtt_client_cert_info"] = getTlsCertInfo(config.Mqtt.Tls.ClientCert);
|
||||
root["mqtt_lwt_topic"] = String(config.Mqtt.Topic) + config.Mqtt.Lwt.Topic;
|
||||
root["mqtt_publish_interval"] = config.Mqtt.PublishInterval;
|
||||
root["mqtt_clean_session"] = config.Mqtt.CleanSession;
|
||||
root["mqtt_hass_enabled"] = config.Mqtt.Hass.Enabled;
|
||||
root["mqtt_hass_expire"] = config.Mqtt.Hass.Expire;
|
||||
root["mqtt_hass_retain"] = config.Mqtt.Hass.Retain;
|
||||
root["mqtt_hass_topic"] = config.Mqtt.Hass.Topic;
|
||||
root["mqtt_hass_individualpanels"] = config.Mqtt.Hass.IndividualPanels;
|
||||
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
@ -70,28 +70,28 @@ void WebApiMqttClass::onMqttAdminGet(AsyncWebServerRequest* request)
|
||||
JsonObject root = response->getRoot();
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
|
||||
root["mqtt_enabled"] = config.Mqtt_Enabled;
|
||||
root["mqtt_hostname"] = config.Mqtt_Hostname;
|
||||
root["mqtt_port"] = config.Mqtt_Port;
|
||||
root["mqtt_username"] = config.Mqtt_Username;
|
||||
root["mqtt_password"] = config.Mqtt_Password;
|
||||
root["mqtt_topic"] = config.Mqtt_Topic;
|
||||
root["mqtt_retain"] = config.Mqtt_Retain;
|
||||
root["mqtt_tls"] = config.Mqtt_Tls;
|
||||
root["mqtt_root_ca_cert"] = config.Mqtt_RootCaCert;
|
||||
root["mqtt_tls_cert_login"] = config.Mqtt_TlsCertLogin;
|
||||
root["mqtt_client_cert"] = config.Mqtt_ClientCert;
|
||||
root["mqtt_client_key"] = config.Mqtt_ClientKey;
|
||||
root["mqtt_lwt_topic"] = config.Mqtt_LwtTopic;
|
||||
root["mqtt_lwt_online"] = config.Mqtt_LwtValue_Online;
|
||||
root["mqtt_lwt_offline"] = config.Mqtt_LwtValue_Offline;
|
||||
root["mqtt_publish_interval"] = config.Mqtt_PublishInterval;
|
||||
root["mqtt_clean_session"] = config.Mqtt_CleanSession;
|
||||
root["mqtt_hass_enabled"] = config.Mqtt_Hass_Enabled;
|
||||
root["mqtt_hass_expire"] = config.Mqtt_Hass_Expire;
|
||||
root["mqtt_hass_retain"] = config.Mqtt_Hass_Retain;
|
||||
root["mqtt_hass_topic"] = config.Mqtt_Hass_Topic;
|
||||
root["mqtt_hass_individualpanels"] = config.Mqtt_Hass_IndividualPanels;
|
||||
root["mqtt_enabled"] = config.Mqtt.Enabled;
|
||||
root["mqtt_hostname"] = config.Mqtt.Hostname;
|
||||
root["mqtt_port"] = config.Mqtt.Port;
|
||||
root["mqtt_username"] = config.Mqtt.Username;
|
||||
root["mqtt_password"] = config.Mqtt.Password;
|
||||
root["mqtt_topic"] = config.Mqtt.Topic;
|
||||
root["mqtt_retain"] = config.Mqtt.Retain;
|
||||
root["mqtt_tls"] = config.Mqtt.Tls.Enabled;
|
||||
root["mqtt_root_ca_cert"] = config.Mqtt.Tls.RootCaCert;
|
||||
root["mqtt_tls_cert_login"] = config.Mqtt.Tls.CertLogin;
|
||||
root["mqtt_client_cert"] = config.Mqtt.Tls.ClientCert;
|
||||
root["mqtt_client_key"] = config.Mqtt.Tls.ClientKey;
|
||||
root["mqtt_lwt_topic"] = config.Mqtt.Lwt.Topic;
|
||||
root["mqtt_lwt_online"] = config.Mqtt.CleanSession;
|
||||
root["mqtt_lwt_offline"] = config.Mqtt.Lwt.Value_Offline;
|
||||
root["mqtt_publish_interval"] = config.Mqtt.PublishInterval;
|
||||
root["mqtt_clean_session"] = config.Mqtt.CleanSession;
|
||||
root["mqtt_hass_enabled"] = config.Mqtt.Hass.Enabled;
|
||||
root["mqtt_hass_expire"] = config.Mqtt.Hass.Expire;
|
||||
root["mqtt_hass_retain"] = config.Mqtt.Hass.Retain;
|
||||
root["mqtt_hass_topic"] = config.Mqtt.Hass.Topic;
|
||||
root["mqtt_hass_individualpanels"] = config.Mqtt.Hass.IndividualPanels;
|
||||
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
@ -300,28 +300,28 @@ void WebApiMqttClass::onMqttAdminPost(AsyncWebServerRequest* request)
|
||||
}
|
||||
|
||||
CONFIG_T& config = Configuration.get();
|
||||
config.Mqtt_Enabled = root["mqtt_enabled"].as<bool>();
|
||||
config.Mqtt_Retain = root["mqtt_retain"].as<bool>();
|
||||
config.Mqtt_Tls = root["mqtt_tls"].as<bool>();
|
||||
strlcpy(config.Mqtt_RootCaCert, root["mqtt_root_ca_cert"].as<String>().c_str(), sizeof(config.Mqtt_RootCaCert));
|
||||
config.Mqtt_TlsCertLogin = root["mqtt_tls_cert_login"].as<bool>();
|
||||
strlcpy(config.Mqtt_ClientCert, root["mqtt_client_cert"].as<String>().c_str(), sizeof(config.Mqtt_ClientCert));
|
||||
strlcpy(config.Mqtt_ClientKey, root["mqtt_client_key"].as<String>().c_str(), sizeof(config.Mqtt_ClientKey));
|
||||
config.Mqtt_Port = root["mqtt_port"].as<uint>();
|
||||
strlcpy(config.Mqtt_Hostname, root["mqtt_hostname"].as<String>().c_str(), sizeof(config.Mqtt_Hostname));
|
||||
strlcpy(config.Mqtt_Username, root["mqtt_username"].as<String>().c_str(), sizeof(config.Mqtt_Username));
|
||||
strlcpy(config.Mqtt_Password, root["mqtt_password"].as<String>().c_str(), sizeof(config.Mqtt_Password));
|
||||
strlcpy(config.Mqtt_Topic, root["mqtt_topic"].as<String>().c_str(), sizeof(config.Mqtt_Topic));
|
||||
strlcpy(config.Mqtt_LwtTopic, root["mqtt_lwt_topic"].as<String>().c_str(), sizeof(config.Mqtt_LwtTopic));
|
||||
strlcpy(config.Mqtt_LwtValue_Online, root["mqtt_lwt_online"].as<String>().c_str(), sizeof(config.Mqtt_LwtValue_Online));
|
||||
strlcpy(config.Mqtt_LwtValue_Offline, root["mqtt_lwt_offline"].as<String>().c_str(), sizeof(config.Mqtt_LwtValue_Offline));
|
||||
config.Mqtt_PublishInterval = root["mqtt_publish_interval"].as<uint32_t>();
|
||||
config.Mqtt_CleanSession = root["mqtt_clean_session"].as<bool>();
|
||||
config.Mqtt_Hass_Enabled = root["mqtt_hass_enabled"].as<bool>();
|
||||
config.Mqtt_Hass_Expire = root["mqtt_hass_expire"].as<bool>();
|
||||
config.Mqtt_Hass_Retain = root["mqtt_hass_retain"].as<bool>();
|
||||
config.Mqtt_Hass_IndividualPanels = root["mqtt_hass_individualpanels"].as<bool>();
|
||||
strlcpy(config.Mqtt_Hass_Topic, root["mqtt_hass_topic"].as<String>().c_str(), sizeof(config.Mqtt_Hass_Topic));
|
||||
config.Mqtt.Enabled = root["mqtt_enabled"].as<bool>();
|
||||
config.Mqtt.Retain = root["mqtt_retain"].as<bool>();
|
||||
config.Mqtt.Tls.Enabled = root["mqtt_tls"].as<bool>();
|
||||
strlcpy(config.Mqtt.Tls.RootCaCert, root["mqtt_root_ca_cert"].as<String>().c_str(), sizeof(config.Mqtt.Tls.RootCaCert));
|
||||
config.Mqtt.Tls.CertLogin = root["mqtt_tls_cert_login"].as<bool>();
|
||||
strlcpy(config.Mqtt.Tls.ClientCert, root["mqtt_client_cert"].as<String>().c_str(), sizeof(config.Mqtt.Tls.ClientCert));
|
||||
strlcpy(config.Mqtt.Tls.ClientKey, root["mqtt_client_key"].as<String>().c_str(), sizeof(config.Mqtt.Tls.ClientKey));
|
||||
config.Mqtt.Port = root["mqtt_port"].as<uint>();
|
||||
strlcpy(config.Mqtt.Hostname, root["mqtt_hostname"].as<String>().c_str(), sizeof(config.Mqtt.Hostname));
|
||||
strlcpy(config.Mqtt.Username, root["mqtt_username"].as<String>().c_str(), sizeof(config.Mqtt.Username));
|
||||
strlcpy(config.Mqtt.Password, root["mqtt_password"].as<String>().c_str(), sizeof(config.Mqtt.Password));
|
||||
strlcpy(config.Mqtt.Topic, root["mqtt_topic"].as<String>().c_str(), sizeof(config.Mqtt.Topic));
|
||||
strlcpy(config.Mqtt.Lwt.Topic, root["mqtt_lwt_topic"].as<String>().c_str(), sizeof(config.Mqtt.Lwt.Topic));
|
||||
strlcpy(config.Mqtt.Lwt.Value_Online, root["mqtt_lwt_online"].as<String>().c_str(), sizeof(config.Mqtt.Lwt.Value_Online));
|
||||
strlcpy(config.Mqtt.Lwt.Value_Offline, root["mqtt_lwt_offline"].as<String>().c_str(), sizeof(config.Mqtt.Lwt.Value_Offline));
|
||||
config.Mqtt.PublishInterval = root["mqtt_publish_interval"].as<uint32_t>();
|
||||
config.Mqtt.CleanSession = root["mqtt_clean_session"].as<bool>();
|
||||
config.Mqtt.Hass.Enabled = root["mqtt_hass_enabled"].as<bool>();
|
||||
config.Mqtt.Hass.Expire = root["mqtt_hass_expire"].as<bool>();
|
||||
config.Mqtt.Hass.Retain = root["mqtt_hass_retain"].as<bool>();
|
||||
config.Mqtt.Hass.IndividualPanels = root["mqtt_hass_individualpanels"].as<bool>();
|
||||
strlcpy(config.Mqtt.Hass.Topic, root["mqtt_hass_topic"].as<String>().c_str(), sizeof(config.Mqtt.Hass.Topic));
|
||||
Configuration.write();
|
||||
|
||||
retMsg["type"] = "success";
|
||||
|
||||
@ -66,17 +66,17 @@ void WebApiNetworkClass::onNetworkAdminGet(AsyncWebServerRequest* request)
|
||||
JsonObject root = response->getRoot();
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
|
||||
root["hostname"] = config.WiFi_Hostname;
|
||||
root["dhcp"] = config.WiFi_Dhcp;
|
||||
root["ipaddress"] = IPAddress(config.WiFi_Ip).toString();
|
||||
root["netmask"] = IPAddress(config.WiFi_Netmask).toString();
|
||||
root["gateway"] = IPAddress(config.WiFi_Gateway).toString();
|
||||
root["dns1"] = IPAddress(config.WiFi_Dns1).toString();
|
||||
root["dns2"] = IPAddress(config.WiFi_Dns2).toString();
|
||||
root["ssid"] = config.WiFi_Ssid;
|
||||
root["password"] = config.WiFi_Password;
|
||||
root["aptimeout"] = config.WiFi_ApTimeout;
|
||||
root["mdnsenabled"] = config.Mdns_Enabled;
|
||||
root["hostname"] = config.WiFi.Hostname;
|
||||
root["dhcp"] = config.WiFi.Dhcp;
|
||||
root["ipaddress"] = IPAddress(config.WiFi.Ip).toString();
|
||||
root["netmask"] = IPAddress(config.WiFi.Netmask).toString();
|
||||
root["gateway"] = IPAddress(config.WiFi.Gateway).toString();
|
||||
root["dns1"] = IPAddress(config.WiFi.Dns1).toString();
|
||||
root["dns2"] = IPAddress(config.WiFi.Dns2).toString();
|
||||
root["ssid"] = config.WiFi.Ssid;
|
||||
root["password"] = config.WiFi.Password;
|
||||
root["aptimeout"] = config.WiFi.ApTimeout;
|
||||
root["mdnsenabled"] = config.Mdns.Enabled;
|
||||
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
@ -208,36 +208,36 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request)
|
||||
}
|
||||
|
||||
CONFIG_T& config = Configuration.get();
|
||||
config.WiFi_Ip[0] = ipaddress[0];
|
||||
config.WiFi_Ip[1] = ipaddress[1];
|
||||
config.WiFi_Ip[2] = ipaddress[2];
|
||||
config.WiFi_Ip[3] = ipaddress[3];
|
||||
config.WiFi_Netmask[0] = netmask[0];
|
||||
config.WiFi_Netmask[1] = netmask[1];
|
||||
config.WiFi_Netmask[2] = netmask[2];
|
||||
config.WiFi_Netmask[3] = netmask[3];
|
||||
config.WiFi_Gateway[0] = gateway[0];
|
||||
config.WiFi_Gateway[1] = gateway[1];
|
||||
config.WiFi_Gateway[2] = gateway[2];
|
||||
config.WiFi_Gateway[3] = gateway[3];
|
||||
config.WiFi_Dns1[0] = dns1[0];
|
||||
config.WiFi_Dns1[1] = dns1[1];
|
||||
config.WiFi_Dns1[2] = dns1[2];
|
||||
config.WiFi_Dns1[3] = dns1[3];
|
||||
config.WiFi_Dns2[0] = dns2[0];
|
||||
config.WiFi_Dns2[1] = dns2[1];
|
||||
config.WiFi_Dns2[2] = dns2[2];
|
||||
config.WiFi_Dns2[3] = dns2[3];
|
||||
strlcpy(config.WiFi_Ssid, root["ssid"].as<String>().c_str(), sizeof(config.WiFi_Ssid));
|
||||
strlcpy(config.WiFi_Password, root["password"].as<String>().c_str(), sizeof(config.WiFi_Password));
|
||||
strlcpy(config.WiFi_Hostname, root["hostname"].as<String>().c_str(), sizeof(config.WiFi_Hostname));
|
||||
config.WiFi.Ip[0] = ipaddress[0];
|
||||
config.WiFi.Ip[1] = ipaddress[1];
|
||||
config.WiFi.Ip[2] = ipaddress[2];
|
||||
config.WiFi.Ip[3] = ipaddress[3];
|
||||
config.WiFi.Netmask[0] = netmask[0];
|
||||
config.WiFi.Netmask[1] = netmask[1];
|
||||
config.WiFi.Netmask[2] = netmask[2];
|
||||
config.WiFi.Netmask[3] = netmask[3];
|
||||
config.WiFi.Gateway[0] = gateway[0];
|
||||
config.WiFi.Gateway[1] = gateway[1];
|
||||
config.WiFi.Gateway[2] = gateway[2];
|
||||
config.WiFi.Gateway[3] = gateway[3];
|
||||
config.WiFi.Dns1[0] = dns1[0];
|
||||
config.WiFi.Dns1[1] = dns1[1];
|
||||
config.WiFi.Dns1[2] = dns1[2];
|
||||
config.WiFi.Dns1[3] = dns1[3];
|
||||
config.WiFi.Dns2[0] = dns2[0];
|
||||
config.WiFi.Dns2[1] = dns2[1];
|
||||
config.WiFi.Dns2[2] = dns2[2];
|
||||
config.WiFi.Dns2[3] = dns2[3];
|
||||
strlcpy(config.WiFi.Ssid, root["ssid"].as<String>().c_str(), sizeof(config.WiFi.Ssid));
|
||||
strlcpy(config.WiFi.Password, root["password"].as<String>().c_str(), sizeof(config.WiFi.Password));
|
||||
strlcpy(config.WiFi.Hostname, root["hostname"].as<String>().c_str(), sizeof(config.WiFi.Hostname));
|
||||
if (root["dhcp"].as<bool>()) {
|
||||
config.WiFi_Dhcp = true;
|
||||
config.WiFi.Dhcp = true;
|
||||
} else {
|
||||
config.WiFi_Dhcp = false;
|
||||
config.WiFi.Dhcp = false;
|
||||
}
|
||||
config.WiFi_ApTimeout = root["aptimeout"].as<uint>();
|
||||
config.Mdns_Enabled = root["mdnsenabled"].as<bool>();
|
||||
config.WiFi.ApTimeout = root["aptimeout"].as<uint>();
|
||||
config.Mdns.Enabled = root["mdnsenabled"].as<bool>();
|
||||
Configuration.write();
|
||||
|
||||
retMsg["type"] = "success";
|
||||
|
||||
@ -38,9 +38,9 @@ void WebApiNtpClass::onNtpStatus(AsyncWebServerRequest* request)
|
||||
JsonObject root = response->getRoot();
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
|
||||
root["ntp_server"] = config.Ntp_Server;
|
||||
root["ntp_timezone"] = config.Ntp_Timezone;
|
||||
root["ntp_timezone_descr"] = config.Ntp_TimezoneDescr;
|
||||
root["ntp_server"] = config.Ntp.Server;
|
||||
root["ntp_timezone"] = config.Ntp.Timezone;
|
||||
root["ntp_timezone_descr"] = config.Ntp.TimezoneDescr;
|
||||
|
||||
struct tm timeinfo;
|
||||
if (!getLocalTime(&timeinfo, 5)) {
|
||||
@ -83,12 +83,12 @@ void WebApiNtpClass::onNtpAdminGet(AsyncWebServerRequest* request)
|
||||
JsonObject root = response->getRoot();
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
|
||||
root["ntp_server"] = config.Ntp_Server;
|
||||
root["ntp_timezone"] = config.Ntp_Timezone;
|
||||
root["ntp_timezone_descr"] = config.Ntp_TimezoneDescr;
|
||||
root["longitude"] = config.Ntp_Longitude;
|
||||
root["latitude"] = config.Ntp_Latitude;
|
||||
root["sunsettype"] = config.Ntp_SunsetType;
|
||||
root["ntp_server"] = config.Ntp.Server;
|
||||
root["ntp_timezone"] = config.Ntp.Timezone;
|
||||
root["ntp_timezone_descr"] = config.Ntp.TimezoneDescr;
|
||||
root["longitude"] = config.Ntp.Longitude;
|
||||
root["latitude"] = config.Ntp.Latitude;
|
||||
root["sunsettype"] = config.Ntp.SunsetType;
|
||||
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
@ -173,12 +173,12 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request)
|
||||
}
|
||||
|
||||
CONFIG_T& config = Configuration.get();
|
||||
strlcpy(config.Ntp_Server, root["ntp_server"].as<String>().c_str(), sizeof(config.Ntp_Server));
|
||||
strlcpy(config.Ntp_Timezone, root["ntp_timezone"].as<String>().c_str(), sizeof(config.Ntp_Timezone));
|
||||
strlcpy(config.Ntp_TimezoneDescr, root["ntp_timezone_descr"].as<String>().c_str(), sizeof(config.Ntp_TimezoneDescr));
|
||||
config.Ntp_Latitude = root["latitude"].as<double>();
|
||||
config.Ntp_Longitude = root["longitude"].as<double>();
|
||||
config.Ntp_SunsetType = root["sunsettype"].as<uint8_t>();
|
||||
strlcpy(config.Ntp.Server, root["ntp_server"].as<String>().c_str(), sizeof(config.Ntp.Server));
|
||||
strlcpy(config.Ntp.Timezone, root["ntp_timezone"].as<String>().c_str(), sizeof(config.Ntp.Timezone));
|
||||
strlcpy(config.Ntp.TimezoneDescr, root["ntp_timezone_descr"].as<String>().c_str(), sizeof(config.Ntp.TimezoneDescr));
|
||||
config.Ntp.Latitude = root["latitude"].as<double>();
|
||||
config.Ntp.Longitude = root["longitude"].as<double>();
|
||||
config.Ntp.SunsetType = root["sunsettype"].as<uint8_t>();
|
||||
Configuration.write();
|
||||
|
||||
retMsg["type"] = "success";
|
||||
|
||||
@ -34,8 +34,8 @@ void WebApiSecurityClass::onSecurityGet(AsyncWebServerRequest* request)
|
||||
JsonObject root = response->getRoot();
|
||||
const CONFIG_T& config = Configuration.get();
|
||||
|
||||
root["password"] = config.Security_Password;
|
||||
root["allow_readonly"] = config.Security_AllowReadonly;
|
||||
root["password"] = config.Security.Password;
|
||||
root["allow_readonly"] = config.Security.AllowReadonly;
|
||||
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
@ -99,8 +99,8 @@ void WebApiSecurityClass::onSecurityPost(AsyncWebServerRequest* request)
|
||||
}
|
||||
|
||||
CONFIG_T& config = Configuration.get();
|
||||
strlcpy(config.Security_Password, root["password"].as<String>().c_str(), sizeof(config.Security_Password));
|
||||
config.Security_AllowReadonly = root["allow_readonly"].as<bool>();
|
||||
strlcpy(config.Security.Password, root["password"].as<String>().c_str(), sizeof(config.Security.Password));
|
||||
config.Security.AllowReadonly = root["allow_readonly"].as<bool>();
|
||||
Configuration.write();
|
||||
|
||||
retMsg["type"] = "success";
|
||||
|
||||
@ -61,7 +61,7 @@ void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request)
|
||||
reason = ResetReason.get_reset_reason_verbose(1);
|
||||
root["resetreason_1"] = reason;
|
||||
|
||||
root["cfgsavecount"] = Configuration.get().Cfg_SaveCount;
|
||||
root["cfgsavecount"] = Configuration.get().Cfg.SaveCount;
|
||||
|
||||
char version[16];
|
||||
snprintf(version, sizeof(version), "%d.%d.%d", CONFIG_VERSION >> 24 & 0xff, CONFIG_VERSION >> 16 & 0xff, CONFIG_VERSION >> 8 & 0xff);
|
||||
|
||||
@ -26,10 +26,10 @@ void WebApiWsConsoleClass::loop()
|
||||
if (millis() - _lastWsCleanup > 1000) {
|
||||
_ws.cleanupClients();
|
||||
|
||||
if (Configuration.get().Security_AllowReadonly) {
|
||||
if (Configuration.get().Security.AllowReadonly) {
|
||||
_ws.setAuthentication("", "");
|
||||
} else {
|
||||
_ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security_Password);
|
||||
_ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security.Password);
|
||||
}
|
||||
|
||||
_lastWsCleanup = millis();
|
||||
|
||||
@ -71,10 +71,10 @@ void WebApiWsLiveClass::loop()
|
||||
if (buffer) {
|
||||
serializeJson(root, buffer);
|
||||
|
||||
if (Configuration.get().Security_AllowReadonly) {
|
||||
if (Configuration.get().Security.AllowReadonly) {
|
||||
_ws.setAuthentication("", "");
|
||||
} else {
|
||||
_ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security_Password);
|
||||
_ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security.Password);
|
||||
}
|
||||
|
||||
_ws.textAll(buffer);
|
||||
@ -172,7 +172,7 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root)
|
||||
struct tm timeinfo;
|
||||
hintObj["time_sync"] = !getLocalTime(&timeinfo, 5);
|
||||
hintObj["radio_problem"] = (Hoymiles.getRadioNrf()->isInitialized() && (!Hoymiles.getRadioNrf()->isConnected() || !Hoymiles.getRadioNrf()->isPVariant())) || (Hoymiles.getRadioCmt()->isInitialized() && (!Hoymiles.getRadioCmt()->isConnected()));
|
||||
if (!strcmp(Configuration.get().Security_Password, ACCESS_POINT_PASSWORD)) {
|
||||
if (!strcmp(Configuration.get().Security.Password, ACCESS_POINT_PASSWORD)) {
|
||||
hintObj["default_password"] = true;
|
||||
} else {
|
||||
hintObj["default_password"] = false;
|
||||
|
||||
16
src/main.cpp
16
src/main.cpp
@ -61,7 +61,7 @@ void setup()
|
||||
MessageOutput.print("failed... ");
|
||||
}
|
||||
}
|
||||
if (Configuration.get().Cfg_Version != CONFIG_VERSION) {
|
||||
if (Configuration.get().Cfg.Version != CONFIG_VERSION) {
|
||||
MessageOutput.print("migrated... ");
|
||||
Configuration.migrate();
|
||||
}
|
||||
@ -116,11 +116,11 @@ void setup()
|
||||
pin.display_clk,
|
||||
pin.display_cs,
|
||||
pin.display_reset);
|
||||
Display.setOrientation(config.Display_Rotation);
|
||||
Display.enablePowerSafe = config.Display_PowerSafe;
|
||||
Display.enableScreensaver = config.Display_ScreenSaver;
|
||||
Display.setContrast(config.Display_Contrast);
|
||||
Display.setLanguage(config.Display_Language);
|
||||
Display.setOrientation(config.Display.Rotation);
|
||||
Display.enablePowerSafe = config.Display.PowerSafe;
|
||||
Display.enableScreensaver = config.Display.ScreenSaver;
|
||||
Display.setContrast(config.Display.Contrast);
|
||||
Display.setLanguage(config.Display.Language);
|
||||
Display.setStartupDisplay();
|
||||
MessageOutput.println("done");
|
||||
|
||||
@ -131,13 +131,13 @@ void setup()
|
||||
|
||||
// Check for default DTU serial
|
||||
MessageOutput.print("Check for default DTU serial... ");
|
||||
if (config.Dtu_Serial == DTU_SERIAL) {
|
||||
if (config.Dtu.Serial == DTU_SERIAL) {
|
||||
MessageOutput.print("generate serial based on ESP chip id: ");
|
||||
uint64_t dtuId = Utils::generateDtuSerial();
|
||||
MessageOutput.printf("%0x%08x... ",
|
||||
((uint32_t)((dtuId >> 32) & 0xFFFFFFFF)),
|
||||
((uint32_t)(dtuId & 0xFFFFFFFF)));
|
||||
config.Dtu_Serial = dtuId;
|
||||
config.Dtu.Serial = dtuId;
|
||||
Configuration.write();
|
||||
}
|
||||
MessageOutput.println("done");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user