Added option to substitute missing I2 for Aidon IT meters. Also cleaned up some more UI

This commit is contained in:
Gunnar Skjold
2020-05-04 16:07:23 +02:00
parent dc83853d2e
commit c3c0ca0a1b
15 changed files with 212 additions and 183 deletions

View File

@@ -254,6 +254,14 @@ void AmsConfiguration::setProductionCapacity(uint8_t productionCapacity) {
config.productionCapacity = productionCapacity;
}
bool AmsConfiguration::isSubstituteMissing() {
return config.substituteMissing;
}
void AmsConfiguration::setSubstituteMissing(bool substituteMissing) {
config.substituteMissing = substituteMissing;
}
bool AmsConfiguration::isDebugTelnet() {
return config.debugTelnet;
}
@@ -278,43 +286,43 @@ void AmsConfiguration::setDebugLevel(uint8_t debugLevel) {
config.debugLevel = debugLevel;
}
int AmsConfiguration::getDomoELIDX() {
uint16_t AmsConfiguration::getDomoELIDX() {
return config.domoELIDX;
}
int AmsConfiguration::getDomoVL1IDX() {
uint16_t AmsConfiguration::getDomoVL1IDX() {
return config.domoVL1IDX;
}
int AmsConfiguration::getDomoVL2IDX() {
uint16_t AmsConfiguration::getDomoVL2IDX() {
return config.domoVL2IDX;
}
int AmsConfiguration::getDomoVL3IDX() {
uint16_t AmsConfiguration::getDomoVL3IDX() {
return config.domoVL3IDX;
}
int AmsConfiguration::getDomoCL1IDX() {
uint16_t AmsConfiguration::getDomoCL1IDX() {
return config.domoCL1IDX;
}
void AmsConfiguration::setDomoELIDX(int domoELIDX) {
void AmsConfiguration::setDomoELIDX(uint16_t domoELIDX) {
domoChanged |= config.domoELIDX != domoELIDX;
config.domoELIDX = domoELIDX;
}
void AmsConfiguration::setDomoVL1IDX(int domoVL1IDX) {
void AmsConfiguration::setDomoVL1IDX(uint16_t domoVL1IDX) {
domoChanged |= config.domoVL1IDX != domoVL1IDX;
config.domoVL1IDX = domoVL1IDX;
}
void AmsConfiguration::setDomoVL2IDX(int domoVL2IDX) {
void AmsConfiguration::setDomoVL2IDX(uint16_t domoVL2IDX) {
domoChanged |= config.domoVL2IDX != domoVL2IDX;
config.domoVL2IDX = domoVL2IDX;
}
void AmsConfiguration::setDomoVL3IDX(int domoVL3IDX) {
void AmsConfiguration::setDomoVL3IDX(uint16_t domoVL3IDX) {
domoChanged |= config.domoVL3IDX != domoVL3IDX;
config.domoVL3IDX = domoVL3IDX;
}
void AmsConfiguration::setDomoCL1IDX(int domoCL1IDX) {
void AmsConfiguration::setDomoCL1IDX(uint16_t domoCL1IDX) {
domoChanged |= config.domoCL1IDX != domoCL1IDX;
config.domoCL1IDX = domoCL1IDX;
}
@@ -450,14 +458,14 @@ void AmsConfiguration::setVccMultiplier(double vccMultiplier) {
}
double AmsConfiguration::getVccBootLimit() {
return config.vccBootLimit / 10;
return config.vccBootLimit / 10.0;
}
void AmsConfiguration::setVccBootLimit(double vccBootLimit) {
if(vccBootLimit == 0.0)
config.vccBootLimit = 0;
else
config.vccBootLimit = max(2.5, min(vccBootLimit, 3.5)) * 10;
config.vccBootLimit = max(25, min((int)(vccBootLimit * 10), 35));
}
bool AmsConfiguration::isDomoChanged() {
return domoChanged;
@@ -800,6 +808,7 @@ void AmsConfiguration::print(Print* debugger)
debugger->printf("distSys: %i\r\n", this->getDistributionSystem());
debugger->printf("fuseSize: %i\r\n", this->getMainFuse());
debugger->printf("productionCapacity: %i\r\n", this->getProductionCapacity());
debugger->printf("Substitute missing: %s\r\n", this->isSubstituteMissing() ? "Yes" : "No");
debugger->printf("HAN pin: %i\r\n", this->getHanPin());
debugger->printf("LED pin: %i\r\n", this->getLedPin());
@@ -811,6 +820,10 @@ void AmsConfiguration::print(Print* debugger)
debugger->printf("AP pin: %i\r\n", this->getApPin());
debugger->printf("Temperature pin: %i\r\n", this->getTempSensorPin());
debugger->printf("Vcc pin: %i\r\n", this->getVccPin());
debugger->printf("Vcc multiplier: %f\r\n", this->getVccMultiplier());
debugger->printf("Vcc boot limit: %f\r\n", this->getVccBootLimit());
if(this->getDomoELIDX() > 0) {
debugger->printf("Domoticz ELIDX: %i\r\n", this->getDomoELIDX());
debugger->printf("Domoticz VL1IDX: %i\r\n", this->getDomoVL1IDX());

View File

@@ -28,6 +28,7 @@ struct ConfigObject {
uint8_t distributionSystem;
uint8_t mainFuse;
uint8_t productionCapacity;
bool substituteMissing;
bool debugTelnet;
bool debugSerial;
@@ -46,11 +47,11 @@ struct ConfigObject {
uint16_t vccMultiplier;
uint8_t vccBootLimit;
int domoELIDX;
int domoVL1IDX;
int domoVL2IDX;
int domoVL3IDX;
int domoCL1IDX;
uint16_t domoELIDX;
uint16_t domoVL1IDX;
uint16_t domoVL2IDX;
uint16_t domoVL3IDX;
uint16_t domoCL1IDX;
};
class AmsConfiguration {
@@ -122,6 +123,8 @@ public:
void setMainFuse(uint8_t mainFuse);
uint8_t getProductionCapacity();
void setProductionCapacity(uint8_t productionCapacity);
bool isSubstituteMissing();
void setSubstituteMissing(bool substituteMissing);
bool isDebugTelnet();
void setDebugTelnet(bool debugTelnet);
@@ -161,17 +164,16 @@ public:
void print(Print* debugger);
int getDomoELIDX();
int getDomoVL1IDX();
int getDomoVL2IDX();
int getDomoVL3IDX();
int getDomoCL1IDX();
double getDomoEnergy();
void setDomoELIDX(int domoELIDX);
void setDomoVL1IDX(int domoVL1IDX);
void setDomoVL2IDX(int domoVL2IDX);
void setDomoVL3IDX(int domoVL3IDX);
void setDomoCL1IDX(int domoCL1IDX);
uint16_t getDomoELIDX();
uint16_t getDomoVL1IDX();
uint16_t getDomoVL2IDX();
uint16_t getDomoVL3IDX();
uint16_t getDomoCL1IDX();
void setDomoELIDX(uint16_t domoELIDX);
void setDomoVL1IDX(uint16_t domoVL1IDX);
void setDomoVL2IDX(uint16_t domoVL2IDX);
void setDomoVL3IDX(uint16_t domoVL3IDX);
void setDomoCL1IDX(uint16_t domoCL1IDX);
void clearDomo();
bool isDomoChanged();
@@ -206,6 +208,7 @@ private:
0, // Distribution system
0, // Main fuse
0, // Production capacity
false, // Substitute
false, // Debug telnet
false, // Debug serial
5, // Debug level

View File

@@ -5,7 +5,7 @@
AmsData::AmsData() {}
AmsData::AmsData(int meterType, HanReader& hanReader) {
AmsData::AmsData(int meterType, bool substituteMissing, HanReader& hanReader) {
lastUpdateMillis = millis();
packageTimestamp = hanReader.getPackageTime();
@@ -15,7 +15,7 @@ AmsData::AmsData(int meterType, HanReader& hanReader) {
extractFromKaifa(hanReader, listSize);
break;
case METER_TYPE_AIDON:
extractFromAidon(hanReader, listSize);
extractFromAidon(hanReader, listSize, substituteMissing);
break;
case METER_TYPE_KAMSTRUP:
extractFromKamstrup(hanReader, listSize);
@@ -87,7 +87,7 @@ void AmsData::extractFromKaifa(HanReader& hanReader, int listSize) {
}
}
void AmsData::extractFromAidon(HanReader& hanReader, int listSize) {
void AmsData::extractFromAidon(HanReader& hanReader, int listSize, bool substituteMissing) {
switch(listSize) {
case (int)Aidon::List1:
listType = 1;
@@ -168,7 +168,9 @@ void AmsData::extractFromAidon(HanReader& hanReader, int listSize) {
l1voltage = ((double) hanReader.getInt( (int)Aidon_List3PhaseIT::VoltageL1)) / 10;
l2voltage = ((double) hanReader.getInt( (int)Aidon_List3PhaseIT::VoltageL2)) / 10;
l3voltage = ((double) hanReader.getInt( (int)Aidon_List3PhaseIT::VoltageL3)) / 10;
//l2current = ((activeImportPower * sqrt(3)) - (l1voltage * l1current) - (l3voltage * l3current)) / l2voltage;
if(substituteMissing) {
l2current = ((activeImportPower * sqrt(3)) - (l1voltage * l1current) - (l3voltage * l3current)) / l2voltage;
}
break;
}
}

View File

@@ -12,7 +12,7 @@
class AmsData {
public:
AmsData();
AmsData(int meterType, HanReader& hanReader);
AmsData(int meterType, bool substituteMissing, HanReader& hanReader);
void apply(AmsData& other);
@@ -60,7 +60,7 @@ private:
bool threePhase = false;
void extractFromKaifa(HanReader& hanReader, int listSize);
void extractFromAidon(HanReader& hanReader, int listSize);
void extractFromAidon(HanReader& hanReader, int listSize, bool substituteMissing);
void extractFromKamstrup(HanReader& hanReader, int listSize);
};

View File

@@ -503,7 +503,7 @@ void readHanPort() {
else
hw.ledBlink(LED_INTERNAL, 1);
AmsData data(config.getMeterType(), hanReader);
AmsData data(config.getMeterType(), config.isSubstituteMissing(), hanReader);
if(data.getListType() > 0) {
ws.setData(data);
@@ -525,20 +525,7 @@ void readHanPort() {
// Start DOMOTICZ
//
} else if(config.getMqttPayloadFormat() == 3) {
//
// This part is also publishing standard json message for now. May be removed.
//
StaticJsonDocument<512> json;
hanToJson(json, data, hw, temperature);
if (Debug.isActive(RemoteDebug::INFO)) {
debugI("Sending data to MQTT");
if (Debug.isActive(RemoteDebug::DEBUG)) {
serializeJsonPretty(json, Debug);
}
}
String msg;
serializeJson(json, msg);
mqtt.publish(config.getMqttPublishTopic(), msg.c_str()); // keep for now, this is identical to option 0.
debugI("Sending data to MQTT");
//
// Special MQTT messages for DOMOTIZ (https://www.domoticz.com/wiki/MQTT)
// -All messages should be published to topic "domoticz/in"

View File

@@ -211,6 +211,7 @@ void AmsWebServer::configMeterHtml() {
html.replace("${config.mainFuse" + String(i) + "}", config->getMainFuse() == i ? "selected" : "");
}
html.replace("${config.productionCapacity}", String(config->getProductionCapacity()));
html.replace("${config.substituteMissing}", config->isSubstituteMissing() ? "checked" : "");
server.setContentLength(html.length());
server.send(200, "text/html", html);
@@ -230,7 +231,7 @@ void AmsWebServer::configWifiHtml() {
html.replace("${config.wifiSsid}", config->getWifiSsid());
html.replace("${config.wifiPassword}", config->getWifiPassword());
html.replace("${config.wifiIpType1}", strlen(config->getWifiIp()) > 0 ? "selected" : "");
html.replace("${config.wifiStaticIp}", strlen(config->getWifiIp()) > 0 ? "checked" : "");
html.replace("${config.wifiIp}", config->getWifiIp());
html.replace("${config.wifiGw}", config->getWifiGw());
html.replace("${config.wifiSubnet}", config->getWifiSubnet());
@@ -639,6 +640,7 @@ void AmsWebServer::handleSave() {
config->setDistributionSystem(server.arg("distributionSystem").toInt());
config->setMainFuse(server.arg("mainFuse").toInt());
config->setProductionCapacity(server.arg("productionCapacity").toInt());
config->setSubstituteMissing(server.hasArg("substituteMissing") && server.arg("substituteMissing") == "true");
}
if(server.hasArg("wifiConfig") && server.arg("wifiConfig") == "true") {