UtilitechAS.amsreader-firmware/src/AmsConfiguration.cpp
2022-03-25 20:37:34 +01:00

1056 lines
28 KiB
C++

#include "AmsConfiguration.h"
bool AmsConfiguration::getSystemConfig(SystemConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_SYSTEM_START, config);
EEPROM.end();
return true;
} else {
return false;
}
}
bool AmsConfiguration::setSystemConfig(SystemConfig& config) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_SYSTEM_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
bool AmsConfiguration::getWiFiConfig(WiFiConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_WIFI_START, config);
EEPROM.end();
return true;
} else {
clearWifi(config);
return false;
}
}
bool AmsConfiguration::setWiFiConfig(WiFiConfig& config) {
WiFiConfig existing;
if(getWiFiConfig(existing)) {
wifiChanged |= strcmp(config.ssid, existing.ssid) != 0;
wifiChanged |= strcmp(config.psk, existing.psk) != 0;
wifiChanged |= strcmp(config.ip, existing.ip) != 0;
if(strlen(config.ip) > 0) {
wifiChanged |= strcmp(config.gateway, existing.gateway) != 0;
wifiChanged |= strcmp(config.subnet, existing.subnet) != 0;
wifiChanged |= strcmp(config.dns1, existing.dns1) != 0;
wifiChanged |= strcmp(config.dns2, existing.dns2) != 0;
}
wifiChanged |= strcmp(config.hostname, existing.hostname) != 0;
wifiChanged |= config.power != existing.power;
} else {
wifiChanged = true;
}
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_WIFI_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
void AmsConfiguration::clearWifi(WiFiConfig& config) {
strcpy(config.ssid, "");
strcpy(config.psk, "");
clearWifiIp(config);
uint16_t chipId;
#if defined(ESP32)
chipId = ESP.getEfuseMac();
#else
chipId = ESP.getChipId();
#endif
strcpy(config.hostname, (String("ams-") + String(chipId, HEX)).c_str());
config.mdns = true;
}
void AmsConfiguration::clearWifiIp(WiFiConfig& config) {
strcpy(config.ip, "");
strcpy(config.gateway, "");
strcpy(config.subnet, "");
strcpy(config.dns1, "");
strcpy(config.dns2, "");
}
bool AmsConfiguration::isWifiChanged() {
return wifiChanged;
}
void AmsConfiguration::ackWifiChange() {
wifiChanged = false;
}
bool AmsConfiguration::getMqttConfig(MqttConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_MQTT_START, config);
EEPROM.end();
return true;
} else {
clearMqtt(config);
return false;
}
}
bool AmsConfiguration::setMqttConfig(MqttConfig& config) {
MqttConfig existing;
if(getMqttConfig(existing)) {
mqttChanged |= strcmp(config.host, existing.host) != 0;
mqttChanged |= config.port != existing.port;
mqttChanged |= strcmp(config.clientId, existing.clientId) != 0;
mqttChanged |= strcmp(config.publishTopic, existing.publishTopic) != 0;
mqttChanged |= strcmp(config.subscribeTopic, existing.subscribeTopic) != 0;
mqttChanged |= strcmp(config.username, existing.username) != 0;
mqttChanged |= strcmp(config.password, existing.password) != 0;
mqttChanged |= config.payloadFormat != existing.payloadFormat;
mqttChanged |= config.ssl != existing.ssl;
} else {
mqttChanged = true;
}
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_MQTT_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
void AmsConfiguration::clearMqtt(MqttConfig& config) {
strcpy(config.host, "");
config.port = 1883;
strcpy(config.clientId, "");
strcpy(config.publishTopic, "");
strcpy(config.subscribeTopic, "");
strcpy(config.username, "");
strcpy(config.password, "");
config.payloadFormat = 0;
config.ssl = false;
}
void AmsConfiguration::setMqttChanged() {
mqttChanged = true;
}
bool AmsConfiguration::isMqttChanged() {
return mqttChanged;
}
void AmsConfiguration::ackMqttChange() {
mqttChanged = false;
}
bool AmsConfiguration::getWebConfig(WebConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_WEB_START, config);
EEPROM.end();
return true;
} else {
clearAuth(config);
return false;
}
}
bool AmsConfiguration::setWebConfig(WebConfig& config) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_WEB_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
void AmsConfiguration::clearAuth(WebConfig& config) {
config.security = 0;
strcpy(config.username, "");
strcpy(config.password, "");
}
bool AmsConfiguration::getMeterConfig(MeterConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_METER_START, config);
EEPROM.end();
return true;
} else {
clearMeter(config);
return false;
}
}
bool AmsConfiguration::setMeterConfig(MeterConfig& config) {
MeterConfig existing;
if(getMeterConfig(existing)) {
meterChanged |= config.baud != existing.baud;
meterChanged |= config.parity != existing.parity;
meterChanged |= config.invert != existing.invert;
meterChanged |= config.distributionSystem != existing.distributionSystem;
meterChanged |= config.mainFuse != existing.mainFuse;
meterChanged |= config.productionCapacity != existing.productionCapacity;
meterChanged |= strcmp((char*) config.encryptionKey, (char*) existing.encryptionKey);
meterChanged |= strcmp((char*) config.authenticationKey, (char*) existing.authenticationKey);
} else {
meterChanged = true;
}
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_METER_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
void AmsConfiguration::clearMeter(MeterConfig& config) {
config.baud = 2400;
config.parity = 11; // 8E1
config.invert = false;
config.distributionSystem = 0;
config.mainFuse = 0;
config.productionCapacity = 0;
memset(config.encryptionKey, 0, 16);
memset(config.authenticationKey, 0, 16);
config.wattageMultiplier = 0;
config.voltageMultiplier = 0;
config.amperageMultiplier = 0;
config.accumulatedMultiplier = 0;
}
bool AmsConfiguration::isMeterChanged() {
return meterChanged;
}
void AmsConfiguration::ackMeterChanged() {
meterChanged = false;
}
bool AmsConfiguration::getDebugConfig(DebugConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_DEBUG_START, config);
EEPROM.end();
return true;
} else {
clearDebug(config);
return false;
}
}
bool AmsConfiguration::setDebugConfig(DebugConfig& config) {
if(!config.serial && !config.telnet)
config.level = 4; // Force warning level when debug is disabled
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_DEBUG_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
void AmsConfiguration::clearDebug(DebugConfig& config) {
config.level = 5;
config.telnet = false;
config.serial = false;
}
bool AmsConfiguration::getDomoticzConfig(DomoticzConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_DOMOTICZ_START, config);
EEPROM.end();
return true;
} else {
clearDomo(config);
return false;
}
}
bool AmsConfiguration::setDomoticzConfig(DomoticzConfig& config) {
DomoticzConfig existing;
if(getDomoticzConfig(existing)) {
domoChanged |= config.elidx != existing.elidx;
domoChanged |= config.vl1idx != existing.vl1idx;
domoChanged |= config.vl2idx != existing.vl2idx;
domoChanged |= config.vl3idx != existing.vl3idx;
domoChanged |= config.cl1idx != existing.cl1idx;
} else {
domoChanged = true;
}
mqttChanged = domoChanged;
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_DOMOTICZ_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
void AmsConfiguration::clearDomo(DomoticzConfig& config) {
config.elidx = 0;
config.vl1idx = 0;
config.vl2idx = 0;
config.vl3idx = 0;
config.cl1idx = 0;
}
bool AmsConfiguration::isDomoChanged() {
return domoChanged;
}
void AmsConfiguration::ackDomoChange() {
domoChanged = false;
}
bool AmsConfiguration::pinUsed(uint8_t pin, GpioConfig& config) {
if(pin == 0xFF)
return false;
return
pin == config.hanPin ||
pin == config.apPin ||
pin == config.ledPin ||
pin == config.ledPinRed ||
pin == config.ledPinGreen ||
pin == config.ledPinBlue ||
pin == config.tempSensorPin ||
pin == config.tempAnalogSensorPin ||
pin == config.vccPin
;
}
bool AmsConfiguration::getGpioConfig(GpioConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_GPIO_START, config);
EEPROM.end();
return true;
} else {
clearGpio(config);
return false;
}
}
bool AmsConfiguration::setGpioConfig(GpioConfig& config) {
GpioConfig existing;
if(getGpioConfig(existing)) {
meterChanged |= config.hanPin != existing.hanPin;
}
/* This currently does not work, as it checks its own pin
if(pinUsed(config.hanPin, config)) {
Serial.println("HAN pin already used");
return false;
}
if(pinUsed(config.apPin, config)) {
Serial.println("AP pin already used");
return false;
}
if(pinUsed(config.ledPin, config)) {
Serial.println("LED pin already used");
return false;
}
if(pinUsed(config.ledPinRed, config)) {
Serial.println("LED RED pin already used");
return false;
}
if(pinUsed(config.ledPinGreen, config)) {
Serial.println("LED GREEN pin already used");
return false;
}
if(pinUsed(config.ledPinBlue, config)) {
Serial.println("LED BLUE pin already used");
return false;
}
if(pinUsed(config.tempSensorPin, config)) {
Serial.println("Temp sensor pin already used");
return false;
}
if(pinUsed(config.tempAnalogSensorPin, config)) {
Serial.println("Analog temp sensor pin already used");
return false;
}
if(pinUsed(config.vccPin, config)) {
Serial.println("Vcc pin already used");
return false;
}
*/
if(config.apPin >= 0)
pinMode(config.apPin, INPUT_PULLUP);
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_GPIO_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
void AmsConfiguration::clearGpio(GpioConfig& config) {
config.hanPin = 3;
config.apPin = 0xFF;
config.ledPin = 0xFF;
config.ledInverted = true;
config.ledPinRed = 0xFF;
config.ledPinGreen = 0xFF;
config.ledPinBlue = 0xFF;
config.ledRgbInverted = true;
config.tempSensorPin = 0xFF;
config.tempAnalogSensorPin = 0xFF;
config.vccPin = 0xFF;
config.vccOffset = 0;
config.vccMultiplier = 1000;
config.vccBootLimit = 0;
config.vccResistorGnd = 0;
config.vccResistorVcc = 0;
}
bool AmsConfiguration::getNtpConfig(NtpConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_NTP_START, config);
EEPROM.end();
return true;
} else {
clearNtp(config);
return false;
}
}
bool AmsConfiguration::setNtpConfig(NtpConfig& config) {
NtpConfig existing;
if(getNtpConfig(existing)) {
if(config.enable != existing.enable) {
if(!existing.enable) {
wifiChanged = true;
} else {
ntpChanged = true;
}
}
ntpChanged |= config.dhcp != existing.dhcp;
ntpChanged |= config.offset != existing.offset;
ntpChanged |= config.summerOffset != existing.summerOffset;
ntpChanged |= strcmp(config.server, existing.server) != 0;
} else {
ntpChanged = true;
}
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_NTP_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
bool AmsConfiguration::isNtpChanged() {
return ntpChanged;
}
void AmsConfiguration::ackNtpChange() {
ntpChanged = false;
}
void AmsConfiguration::clearNtp(NtpConfig& config) {
config.enable = true;
config.dhcp = true;
config.offset = 360;
config.summerOffset = 360;
strcpy(config.server, "pool.ntp.org");
}
bool AmsConfiguration::getEntsoeConfig(EntsoeConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_ENTSOE_START, config);
EEPROM.end();
if(strlen(config.token) != 0 && strlen(config.token) != 36) {
clearEntsoe(config);
}
return true;
} else {
return false;
}
}
bool AmsConfiguration::setEntsoeConfig(EntsoeConfig& config) {
EntsoeConfig existing;
if(getEntsoeConfig(existing)) {
entsoeChanged |= strcmp(config.token, existing.token) != 0;
entsoeChanged |= strcmp(config.area, existing.area) != 0;
entsoeChanged |= strcmp(config.currency, existing.currency) != 0;
entsoeChanged |= config.multiplier != existing.multiplier;
} else {
entsoeChanged = true;
}
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_ENTSOE_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
void AmsConfiguration::clearEntsoe(EntsoeConfig& config) {
strcpy(config.token, "");
strcpy(config.area, "");
strcpy(config.currency, "");
config.multiplier = 1000;
}
bool AmsConfiguration::isEntsoeChanged() {
return entsoeChanged;
}
void AmsConfiguration::ackEntsoeChange() {
entsoeChanged = false;
}
bool AmsConfiguration::getEnergyAccountingConfig(EnergyAccountingConfig& config) {
if(hasConfig()) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_ENERGYACCOUNTING_START, config);
EEPROM.end();
if(config.thresholds[9] != 255) {
clearEnergyAccountingConfig(config);
}
return true;
} else {
return false;
}
}
bool AmsConfiguration::setEnergyAccountingConfig(EnergyAccountingConfig& config) {
EnergyAccountingConfig existing;
if(getEnergyAccountingConfig(existing)) {
for(int i = 0; i < 9; i++) {
if(existing.thresholds[i] != config.thresholds[i]) {
energyAccountingChanged = true;
}
}
config.thresholds[9] = 255;
} else {
energyAccountingChanged = true;
}
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(CONFIG_ENERGYACCOUNTING_START, config);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
void AmsConfiguration::clearEnergyAccountingConfig(EnergyAccountingConfig& config) {
config.thresholds[0] = 5;
config.thresholds[1] = 10;
config.thresholds[2] = 15;
config.thresholds[3] = 20;
config.thresholds[4] = 25;
config.thresholds[5] = 50;
config.thresholds[6] = 75;
config.thresholds[7] = 100;
config.thresholds[8] = 150;
config.thresholds[9] = 255;
}
bool AmsConfiguration::isEnergyAccountingChanged() {
return energyAccountingChanged;
}
void AmsConfiguration::ackEnergyAccountingChange() {
energyAccountingChanged = false;
}
void AmsConfiguration::clear() {
EEPROM.begin(EEPROM_SIZE);
MeterConfig meter;
clearMeter(meter);
EEPROM.put(CONFIG_METER_START, meter);
WiFiConfig wifi;
clearWifi(wifi);
EEPROM.put(CONFIG_WIFI_START, wifi);
MqttConfig mqtt;
clearMqtt(mqtt);
EEPROM.put(CONFIG_MQTT_START, mqtt);
WebConfig web;
clearAuth(web);
EEPROM.put(CONFIG_WEB_START, web);
DomoticzConfig domo;
clearDomo(domo);
EEPROM.put(CONFIG_DOMOTICZ_START, domo);
NtpConfig ntp;
clearNtp(ntp);
EEPROM.put(CONFIG_NTP_START, ntp);
EntsoeConfig entsoe;
clearEntsoe(entsoe);
EEPROM.put(CONFIG_ENTSOE_START, entsoe);
EnergyAccountingConfig eac;
clearEnergyAccountingConfig(eac);
EEPROM.put(CONFIG_ENERGYACCOUNTING_START, eac);
EEPROM.put(EEPROM_CONFIG_ADDRESS, -1);
EEPROM.commit();
EEPROM.end();
}
bool AmsConfiguration::hasConfig() {
if(configVersion == 0) {
EEPROM.begin(EEPROM_SIZE);
configVersion = EEPROM.read(EEPROM_CONFIG_ADDRESS);
EEPROM.end();
}
if(configVersion > EEPROM_CHECK_SUM) {
if(loadFromFs(EEPROM_CHECK_SUM)) {
configVersion = EEPROM_CHECK_SUM;
} else {
configVersion = 0;
}
} else {
switch(configVersion) {
case 86:
configVersion = -1; // Prevent loop
if(relocateConfig86()) {
configVersion = 87;
} else {
configVersion = 0;
return false;
}
case 87:
configVersion = -1; // Prevent loop
if(relocateConfig87()) {
configVersion = 88;
} else {
configVersion = 0;
return false;
}
case 90:
configVersion = -1; // Prevent loop
if(relocateConfig90()) {
configVersion = 91;
} else {
configVersion = 0;
return false;
}
case 91:
configVersion = -1; // Prevent loop
if(relocateConfig91()) {
configVersion = 92;
} else {
configVersion = 0;
return false;
}
case 92:
configVersion = -1; // Prevent loop
if(relocateConfig92()) {
configVersion = 93;
} else {
configVersion = 0;
return false;
}
case 93:
configVersion = -1; // Prevent loop
if(relocateConfig93()) {
configVersion = 94;
} else {
configVersion = 0;
return false;
}
case EEPROM_CHECK_SUM:
return true;
default:
configVersion = 0;
return false;
}
}
return configVersion == EEPROM_CHECK_SUM;
}
int AmsConfiguration::getConfigVersion() {
return configVersion;
}
void AmsConfiguration::loadTempSensors() {
EEPROM.begin(EEPROM_SIZE);
TempSensorConfig* tempSensors[32];
int address = EEPROM_TEMP_CONFIG_ADDRESS;
int c = 0;
int storedCount = EEPROM.read(address++);
Serial.print("Sensors: ");
Serial.println(storedCount);
if(storedCount > 0 && storedCount <= 32) {
for(int i = 0; i < storedCount; i++) {
TempSensorConfig* tsc = new TempSensorConfig();
EEPROM.get(address, *tsc);
if(tsc->address[0] != 0xFF) {
tempSensors[c++] = tsc;
}
address += sizeof(*tsc);
}
}
this->tempSensors = new TempSensorConfig*[c];
for(int i = 0; i < c; i++) {
this->tempSensors[i] = tempSensors[i];
}
tempSensorCount = c;
EEPROM.end();
}
void AmsConfiguration::saveTempSensors() {
int address = EEPROM_TEMP_CONFIG_ADDRESS;
EEPROM.put(address++, tempSensorCount);
for(int i = 0; i < tempSensorCount; i++) {
TempSensorConfig* tsc = tempSensors[i];
if(tsc->address[0] != 0xFF) {
EEPROM.put(address, *tsc);
address += sizeof(*tsc);
}
}
}
bool AmsConfiguration::relocateConfig86() {
MqttConfig86 mqtt86;
MqttConfig mqtt;
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_MQTT_START_86, mqtt86);
strcpy(mqtt.host, mqtt86.host);
mqtt.port = mqtt86.port;
strcpy(mqtt.clientId, mqtt86.clientId);
strcpy(mqtt.publishTopic, mqtt86.publishTopic);
strcpy(mqtt.subscribeTopic, mqtt86.subscribeTopic);
strcpy(mqtt.username, mqtt86.username);
strcpy(mqtt.password, mqtt86.password);
mqtt.payloadFormat = mqtt86.payloadFormat;
mqtt.ssl = mqtt86.ssl;
EEPROM.put(CONFIG_MQTT_START, mqtt);
EEPROM.put(EEPROM_CONFIG_ADDRESS, 87);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
bool AmsConfiguration::relocateConfig87() {
MeterConfig87 meter87;
MeterConfig meter;
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_METER_START_87, meter87);
if(meter87.type < 5) {
meter.baud = 2400;
meter.parity = meter87.type == 3 || meter87.type == 4 ? 3 : 11;
meter.invert = false;
} else {
meter.baud = 115200;
meter.parity = 3;
meter.invert = meter87.type == 6;
}
meter.distributionSystem = meter87.distributionSystem;
meter.mainFuse = meter87.mainFuse;
meter.productionCapacity = meter87.productionCapacity;
EEPROM.put(CONFIG_METER_START, meter);
EEPROM.put(EEPROM_CONFIG_ADDRESS, 88);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
bool AmsConfiguration::relocateConfig90() {
EntsoeConfig entsoe;
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_ENTSOE_START_90, entsoe);
EEPROM.put(CONFIG_ENTSOE_START, entsoe);
EEPROM.put(EEPROM_CONFIG_ADDRESS, 91);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
bool AmsConfiguration::relocateConfig91() {
WiFiConfig91 wifi91;
WiFiConfig wifi;
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_WIFI_START_91, wifi91);
strcpy(wifi.ssid, wifi91.ssid);
strcpy(wifi.psk, wifi91.psk);
strcpy(wifi.ip, wifi91.ip);
strcpy(wifi.gateway, wifi91.gateway);
strcpy(wifi.subnet, wifi91.subnet);
strcpy(wifi.dns1, wifi91.dns1);
strcpy(wifi.dns2, wifi91.dns2);
strcpy(wifi.hostname, wifi91.hostname);
wifi.mdns = wifi91.mdns;
EEPROM.put(CONFIG_WIFI_START, wifi);
EEPROM.put(EEPROM_CONFIG_ADDRESS, 92);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
bool AmsConfiguration::relocateConfig92() {
WiFiConfig wifi;
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_WIFI_START, wifi);
#if defined(ESP32)
wifi.power = 195;
#elif defined(ESP8266)
wifi.power = 205;
#endif
EEPROM.put(CONFIG_WIFI_START, wifi);
EnergyAccountingConfig eac;
clearEnergyAccountingConfig(eac);
EEPROM.put(CONFIG_ENERGYACCOUNTING_START, eac);
EEPROM.put(EEPROM_CONFIG_ADDRESS, 93);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
bool AmsConfiguration::relocateConfig93() {
MeterConfig meter;
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_METER_START_93, meter);
meter.wattageMultiplier = 0;
meter.voltageMultiplier = 0;
meter.amperageMultiplier = 0;
meter.accumulatedMultiplier = 0;
EEPROM.put(CONFIG_METER_START, meter);
EEPROM.put(EEPROM_CONFIG_ADDRESS, 94);
bool ret = EEPROM.commit();
EEPROM.end();
return ret;
}
bool AmsConfiguration::save() {
EEPROM.begin(EEPROM_SIZE);
EEPROM.put(EEPROM_CONFIG_ADDRESS, EEPROM_CHECK_SUM);
saveTempSensors();
bool success = EEPROM.commit();
EEPROM.end();
configVersion = EEPROM_CHECK_SUM;
return success;
}
uint8_t AmsConfiguration::getTempSensorCount() {
return tempSensorCount;
}
TempSensorConfig* AmsConfiguration::getTempSensorConfig(uint8_t address[8]) {
if(tempSensors == NULL)
return NULL;
for(int x = 0; x < tempSensorCount; x++) {
TempSensorConfig *conf = tempSensors[x];
if(isSensorAddressEqual(conf->address, address)) {
return conf;
}
}
return NULL;
}
void AmsConfiguration::updateTempSensorConfig(uint8_t address[8], const char name[32], bool common) {
bool found = false;
if(tempSensors != NULL) {
for(int x = 0; x < tempSensorCount; x++) {
TempSensorConfig *data = tempSensors[x];
if(isSensorAddressEqual(data->address, address)) {
found = true;
strcpy(data->name, name);
data->common = common;
}
}
}
if(!found) {
TempSensorConfig** tempSensors = new TempSensorConfig*[tempSensorCount+1];
if(this->tempSensors != NULL) {
for(int i = 0;i < tempSensorCount; i++) {
tempSensors[i] = this->tempSensors[i];
}
}
TempSensorConfig *data = new TempSensorConfig();
memcpy(data->address, address, 8);
strcpy(data->name, name);
data->common = common;
tempSensors[tempSensorCount++] = data;
if(this->tempSensors != NULL) {
delete this->tempSensors;
}
this->tempSensors = tempSensors;
}
}
bool AmsConfiguration::isSensorAddressEqual(uint8_t a[8], uint8_t b[8]) {
for(int i = 0; i < 8; i++) {
if(a[i] != b[i]) return false;
}
return true;
}
void AmsConfiguration::saveToFs() {
}
bool AmsConfiguration::loadFromFs(uint8_t version) {
return false;
}
void AmsConfiguration::deleteFromFs(uint8_t version) {
}
void AmsConfiguration::print(Print* debugger)
{
debugger->println("-----------------------------------------------");
WiFiConfig wifi;
if(getWiFiConfig(wifi)) {
debugger->println("--WiFi configuration--");
debugger->printf("SSID: '%s'\r\n", wifi.ssid);
debugger->printf("Psk: '%s'\r\n", wifi.psk);
if(strlen(wifi.ip) > 0) {
debugger->printf("IP: '%s'\r\n", wifi.ip);
debugger->printf("Gateway: '%s'\r\n", wifi.gateway);
debugger->printf("Subnet: '%s'\r\n", wifi.subnet);
debugger->printf("DNS1: '%s'\r\n", wifi.dns1);
debugger->printf("DNS2: '%s'\r\n", wifi.dns2);
}
debugger->printf("Hostname: '%s'\r\n", wifi.hostname);
debugger->printf("mDNS: '%s'\r\n", wifi.mdns ? "Yes" : "No");
debugger->println("");
delay(10);
Serial.flush();
}
MqttConfig mqtt;
if(getMqttConfig(mqtt)) {
debugger->println("--MQTT configuration--");
if(strlen(mqtt.host) > 0) {
debugger->printf("Enabled: Yes\r\n");
debugger->printf("Host: '%s'\r\n", mqtt.host);
debugger->printf("Port: %i\r\n", mqtt.port);
debugger->printf("Client ID: '%s'\r\n", mqtt.clientId);
debugger->printf("Publish topic: '%s'\r\n", mqtt.publishTopic);
debugger->printf("Subscribe topic: '%s'\r\n", mqtt.subscribeTopic);
if (strlen(mqtt.username) > 0) {
debugger->printf("Username: '%s'\r\n", mqtt.username);
debugger->printf("Password: '%s'\r\n", mqtt.password);
}
debugger->printf("Payload format: %i\r\n", mqtt.payloadFormat);
debugger->printf("SSL: %s\r\n", mqtt.ssl ? "Yes" : "No");
} else {
debugger->printf("Enabled: No\r\n");
}
debugger->println("");
delay(10);
Serial.flush();
}
WebConfig web;
if(getWebConfig(web)) {
debugger->println("--Web configuration--");
debugger->printf("Security: %i\r\n", web.security);
if (web.security > 0) {
debugger->printf("Username: '%s'\r\n", web.username);
debugger->printf("Password: '%s'\r\n", web.password);
}
debugger->println("");
delay(10);
Serial.flush();
}
MeterConfig meter;
if(getMeterConfig(meter)) {
debugger->println("--Meter configuration--");
debugger->printf("Baud: %i\r\n", meter.baud);
debugger->printf("Parity: %i\r\n", meter.parity);
debugger->printf("Invert serial: %s\r\n", meter.invert ? "Yes" : "No");
debugger->printf("Distribution system: %i\r\n", meter.distributionSystem);
debugger->printf("Main fuse: %i\r\n", meter.mainFuse);
debugger->printf("Production Capacity: %i\r\n", meter.productionCapacity);
debugger->println("");
delay(10);
Serial.flush();
}
GpioConfig gpio;
if(getGpioConfig(gpio)) {
debugger->println("--GPIO configuration--");
debugger->printf("HAN pin: %i\r\n", gpio.hanPin);
debugger->printf("LED pin: %i\r\n", gpio.ledPin);
debugger->printf("LED inverted: %s\r\n", gpio.ledInverted ? "Yes" : "No");
debugger->printf("LED red pin: %i\r\n", gpio.ledPinRed);
debugger->printf("LED green pin: %i\r\n", gpio.ledPinGreen);
debugger->printf("LED blue pin: %i\r\n", gpio.ledPinBlue);
debugger->printf("LED inverted: %s\r\n", gpio.ledRgbInverted ? "Yes" : "No");
debugger->printf("AP pin: %i\r\n", gpio.apPin);
debugger->printf("Temperature pin: %i\r\n", gpio.tempSensorPin);
debugger->printf("Temp analog pin: %i\r\n", gpio.tempAnalogSensorPin);
debugger->printf("Vcc pin: %i\r\n", gpio.vccPin);
if(gpio.vccMultiplier > 0) {
debugger->printf("Vcc multiplier: %f\r\n", gpio.vccMultiplier / 1000.0);
}
if(gpio.vccOffset > 0) {
debugger->printf("Vcc offset: %f\r\n", gpio.vccOffset / 100.0);
}
if(gpio.vccBootLimit > 0) {
debugger->printf("Vcc boot limit: %f\r\n", gpio.vccBootLimit / 10.0);
}
debugger->printf("GND resistor: %i\r\n", gpio.vccResistorGnd);
debugger->printf("Vcc resistor: %i\r\n", gpio.vccResistorVcc);
debugger->println("");
delay(10);
Serial.flush();
}
DomoticzConfig domo;
if(getDomoticzConfig(domo)) {
debugger->println("--Domoticz configuration--");
if(mqtt.payloadFormat == 3 && domo.elidx > 0) {
debugger->printf("Enabled: Yes\r\n");
debugger->printf("Domoticz ELIDX: %i\r\n", domo.elidx);
debugger->printf("Domoticz VL1IDX: %i\r\n", domo.vl1idx);
debugger->printf("Domoticz VL2IDX: %i\r\n", domo.vl2idx);
debugger->printf("Domoticz VL3IDX: %i\r\n", domo.vl3idx);
debugger->printf("Domoticz CL1IDX: %i\r\n", domo.cl1idx);
} else {
debugger->printf("Enabled: No\r\n");
}
debugger->println("");
delay(10);
Serial.flush();
}
NtpConfig ntp;
if(getNtpConfig(ntp)) {
debugger->println("--NTP configuration--");
debugger->printf("Enabled: %s\r\n", ntp.enable ? "Yes" : "No");
if(ntp.enable) {
debugger->printf("Offset: %i\r\n", ntp.offset);
debugger->printf("Summer offset: %i\r\n", ntp.summerOffset);
debugger->printf("Server: %s\r\n", ntp.server);
debugger->printf("DHCP: %s\r\n", ntp.dhcp ? "Yes" : "No");
}
debugger->println("");
delay(10);
Serial.flush();
}
EntsoeConfig entsoe;
if(getEntsoeConfig(entsoe)) {
debugger->println("--ENTSO-E configuration--");
debugger->printf("Token: %s\r\n", entsoe.token);
if(strlen(entsoe.token) > 0) {
debugger->printf("Area: %s\r\n", entsoe.area);
debugger->printf("Currency: %s\r\n", entsoe.currency);
debugger->printf("Multiplier: %f\r\n", entsoe.multiplier / 1000.0);
}
debugger->println("");
delay(10);
Serial.flush();
}
debugger->printf("Temp sensor count: %i\r\n", this->getTempSensorCount());
debugger->println("-----------------------------------------------");
}