mirror of
https://github.com/lumapu/ahoy.git
synced 2025-06-07 05:01:39 +02:00
0.8.910007-zero
This commit is contained in:
parent
cf52731802
commit
1c4a83dfd0
3 changed files with 40 additions and 23 deletions
|
@ -13,7 +13,7 @@
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 8
|
#define VERSION_MINOR 8
|
||||||
#define VERSION_PATCH 910006
|
#define VERSION_PATCH 910007
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -24,6 +24,11 @@ class ZeroExport {
|
||||||
*/
|
*/
|
||||||
ZeroExport() {
|
ZeroExport() {
|
||||||
mIsInitialized = false;
|
mIsInitialized = false;
|
||||||
|
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
|
||||||
|
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
|
||||||
|
mIv[group][inv] = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,10 +65,13 @@ return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (mCfg->groups[group].state) {
|
switch (mCfg->groups[group].state) {
|
||||||
|
|
||||||
|
|
||||||
case zeroExportState::RESET:
|
case zeroExportState::RESET:
|
||||||
mCfg->groups[group].lastRun = millis();
|
mCfg->groups[group].lastRun = millis();
|
||||||
mCfg->groups[group].state = zeroExportState::GETPOWERMETER;
|
mCfg->groups[group].state = zeroExportState::GETPOWERMETER;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case zeroExportState::GETPOWERMETER:
|
case zeroExportState::GETPOWERMETER:
|
||||||
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
||||||
if (getPowermeterWatts(group)) {
|
if (getPowermeterWatts(group)) {
|
||||||
|
@ -77,6 +85,7 @@ return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case zeroExportState::GETINVERTERDATA:
|
case zeroExportState::GETINVERTERDATA:
|
||||||
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
||||||
if (getInverterData(group)) {
|
if (getInverterData(group)) {
|
||||||
|
@ -90,6 +99,7 @@ return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case zeroExportState::BATTERYPROTECTION:
|
case zeroExportState::BATTERYPROTECTION:
|
||||||
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
||||||
if (batteryProtection(group)) {
|
if (batteryProtection(group)) {
|
||||||
|
@ -103,6 +113,7 @@ return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case zeroExportState::CONTROL:
|
case zeroExportState::CONTROL:
|
||||||
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
||||||
if (controller(group)) {
|
if (controller(group)) {
|
||||||
|
@ -116,6 +127,7 @@ return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case zeroExportState::SETCONTROL:
|
case zeroExportState::SETCONTROL:
|
||||||
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
if ((millis() - mCfg->groups[group].lastRun) > (mCfg->groups[group].refresh * 1000UL)) {
|
||||||
if (setControl(group)) {
|
if (setControl(group)) {
|
||||||
|
@ -129,6 +141,7 @@ return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// TODO: Debug Webserial. Deaktiviert um CPU-Last zu verringern.
|
// TODO: Debug Webserial. Deaktiviert um CPU-Last zu verringern.
|
||||||
DBGPRINTLN(String("ze: "));
|
DBGPRINTLN(String("ze: "));
|
||||||
|
@ -579,10 +592,11 @@ return;
|
||||||
continue;;
|
continue;;
|
||||||
}
|
}
|
||||||
// wenn Inverter nicht produziert -> Daten ignorieren
|
// wenn Inverter nicht produziert -> Daten ignorieren
|
||||||
|
cfgGroupInv->state = iv->isProducing();
|
||||||
logObjInv["Producing"] = iv->isProducing();
|
logObjInv["Producing"] = iv->isProducing();
|
||||||
if (!iv->isProducing()) {
|
// if (!iv->isProducing()) {
|
||||||
continue;;
|
// continue;;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Daten abrufen
|
// Daten abrufen
|
||||||
rec = iv->getRecordStruct(RealTimeRunData_Debug);
|
rec = iv->getRecordStruct(RealTimeRunData_Debug);
|
||||||
|
@ -592,10 +606,6 @@ return;
|
||||||
cfgGroupInv->power = iv->getChannelFieldValue(CH0, FLD_PAC, rec);
|
cfgGroupInv->power = iv->getChannelFieldValue(CH0, FLD_PAC, rec);
|
||||||
logObjInv["P_ac"] = cfgGroupInv->power;
|
logObjInv["P_ac"] = cfgGroupInv->power;
|
||||||
|
|
||||||
//mCfg->groups[group].inverters[inv].limit = iv->actPowerLimit;
|
|
||||||
|
|
||||||
// cfgGroupInv->limitAck = iv->powerLimitAck;
|
|
||||||
|
|
||||||
cfgGroupInv->dcVoltage = iv->getChannelFieldValue(CH1, FLD_UDC, rec);
|
cfgGroupInv->dcVoltage = iv->getChannelFieldValue(CH1, FLD_UDC, rec);
|
||||||
logObjInv["U_dc"] = cfgGroupInv->dcVoltage;
|
logObjInv["U_dc"] = cfgGroupInv->dcVoltage;
|
||||||
// TODO: Eingang muss konfigurierbar sein
|
// TODO: Eingang muss konfigurierbar sein
|
||||||
|
@ -644,21 +654,21 @@ return;
|
||||||
// Config - parameter check
|
// Config - parameter check
|
||||||
if (cfgGroup->battVoltageOn <= cfgGroup->battVoltageOff) {
|
if (cfgGroup->battVoltageOn <= cfgGroup->battVoltageOff) {
|
||||||
cfgGroup->battSwitch = false;
|
cfgGroup->battSwitch = false;
|
||||||
logObj["error"] = "Config - battVoltageOn(" + (String)cfgGroup->battVoltageOn + ") <= battVoltageOff(" + (String)cfgGroup->battVoltageOff + ")";
|
logObj["err"] = "Config - battVoltageOn(" + (String)cfgGroup->battVoltageOn + ") <= battVoltageOff(" + (String)cfgGroup->battVoltageOff + ")";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config - parameter check
|
// Config - parameter check
|
||||||
if (cfgGroup->battVoltageOn <= (cfgGroup->battVoltageOff + 1)) {
|
if (cfgGroup->battVoltageOn <= (cfgGroup->battVoltageOff + 1)) {
|
||||||
cfgGroup->battSwitch = false;
|
cfgGroup->battSwitch = false;
|
||||||
logObj["error"] = "Config - battVoltageOn(" + (String)cfgGroup->battVoltageOn + ") <= battVoltageOff(" + (String)cfgGroup->battVoltageOff + " + 1V)";
|
logObj["err"] = "Config - battVoltageOn(" + (String)cfgGroup->battVoltageOn + ") <= battVoltageOff(" + (String)cfgGroup->battVoltageOff + " + 1V)";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config - parameter check
|
// Config - parameter check
|
||||||
if (cfgGroup->battVoltageOn <= 22) {
|
if (cfgGroup->battVoltageOn <= 22) {
|
||||||
cfgGroup->battSwitch = false;
|
cfgGroup->battSwitch = false;
|
||||||
logObj["error"] = "Config - battVoltageOn(" + (String)cfgGroup->battVoltageOn + ") <= 22V)";
|
logObj["err"] = "Config - battVoltageOn(" + (String)cfgGroup->battVoltageOn + ") <= 22V)";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -848,13 +858,17 @@ return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((cfgGroup->battSwitch) && (!cfgGroupInv->state)) {
|
if ((cfgGroup->battSwitch) && (!cfgGroupInv->state)) {
|
||||||
setPower(&logObj, group, inv, 1);
|
setPower(&logObj, group, inv, true);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!cfgGroup->battSwitch) && (cfgGroupInv->state)) {
|
if ((!cfgGroup->battSwitch) && (cfgGroupInv->state)) {
|
||||||
setPower(&logObj, group, inv, 0);
|
setPower(&logObj, group, inv, false);
|
||||||
return false;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cfgGroupInv->state) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfgGroupInv->power < ivPmin[cfgGroupInv->target]) {
|
if (cfgGroupInv->power < ivPmin[cfgGroupInv->target]) {
|
||||||
|
@ -972,12 +986,6 @@ return;
|
||||||
objLog["grp"] = group;
|
objLog["grp"] = group;
|
||||||
objLog["iv"] = inv;
|
objLog["iv"] = inv;
|
||||||
|
|
||||||
// Reject limit if difference < 5 W
|
|
||||||
if ((cfgGroupInv->limitNew > cfgGroupInv->limit + 5) && (cfgGroupInv->limitNew < cfgGroupInv->limit - 5)) {
|
|
||||||
objLog["err"] = "Diff < 5W";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restriction LimitNew >= Pmin
|
// Restriction LimitNew >= Pmin
|
||||||
if (cfgGroupInv->limitNew < cfgGroupInv->powerMin) {
|
if (cfgGroupInv->limitNew < cfgGroupInv->powerMin) {
|
||||||
cfgGroupInv->limitNew = cfgGroupInv->powerMin;
|
cfgGroupInv->limitNew = cfgGroupInv->powerMin;
|
||||||
|
@ -988,6 +996,12 @@ return;
|
||||||
cfgGroupInv->limitNew = cfgGroupInv->powerMax;
|
cfgGroupInv->limitNew = cfgGroupInv->powerMax;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reject limit if difference < 5 W
|
||||||
|
if ((cfgGroupInv->limitNew > cfgGroupInv->limit + 5) && (cfgGroupInv->limitNew < cfgGroupInv->limit - 5)) {
|
||||||
|
objLog["err"] = "Diff < 5W";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
cfgGroupInv->limit = cfgGroupInv->limitNew;
|
cfgGroupInv->limit = cfgGroupInv->limitNew;
|
||||||
cfgGroupInv->limitTsp = millis();
|
cfgGroupInv->limitTsp = millis();
|
||||||
|
|
||||||
|
@ -1024,7 +1038,7 @@ return;
|
||||||
objLog["iv"] = inv;
|
objLog["iv"] = inv;
|
||||||
|
|
||||||
// cfgGroupInv->limit = cfgGroupInv->limitNew;
|
// cfgGroupInv->limit = cfgGroupInv->limitNew;
|
||||||
cfgGroupInv->limitTsp = millis();
|
cfgGroupInv->limitTsp = millis() + 30000;
|
||||||
|
|
||||||
// objLog["P"] = cfgGroupInv->limit;
|
// objLog["P"] = cfgGroupInv->limit;
|
||||||
objLog["tsp"] = cfgGroupInv->limitTsp;
|
objLog["tsp"] = cfgGroupInv->limitTsp;
|
||||||
|
@ -1058,7 +1072,7 @@ return;
|
||||||
objLog["iv"] = inv;
|
objLog["iv"] = inv;
|
||||||
|
|
||||||
// cfgGroupInv->limit = cfgGroupInv->limitNew;
|
// cfgGroupInv->limit = cfgGroupInv->limitNew;
|
||||||
cfgGroupInv->limitTsp = millis();
|
cfgGroupInv->limitTsp = millis() + 30000;
|
||||||
|
|
||||||
// objLog["P"] = cfgGroupInv->limit;
|
// objLog["P"] = cfgGroupInv->limit;
|
||||||
objLog["tsp"] = cfgGroupInv->limitTsp;
|
objLog["tsp"] = cfgGroupInv->limitTsp;
|
||||||
|
@ -1120,6 +1134,8 @@ return;
|
||||||
StaticJsonDocument<5000> mDocLog;
|
StaticJsonDocument<5000> mDocLog;
|
||||||
JsonObject mLog = mDocLog.to<JsonObject>();
|
JsonObject mLog = mDocLog.to<JsonObject>();
|
||||||
PubMqttType *mMqtt;
|
PubMqttType *mMqtt;
|
||||||
|
|
||||||
|
Inverter<> *mIv[ZEROEXPORT_MAX_GROUPS][ZEROEXPORT_GROUP_MAX_INVERTERS];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1367,6 +1367,7 @@
|
||||||
divRow("{#ZE_GROUP_TAB_BATTERY_BATTENABLED}", cb_battEnabled),
|
divRow("{#ZE_GROUP_TAB_BATTERY_BATTENABLED}", cb_battEnabled),
|
||||||
divRow("{#ZE_GROUP_TAB_BATTERY_BATTVOLTAGEON}", ml("input", {name: "battVoltageOn", class: "text", type: "number", min: "0", max: "100", step: "0.1", value: obj.battVoltageOn}, null)),
|
divRow("{#ZE_GROUP_TAB_BATTERY_BATTVOLTAGEON}", ml("input", {name: "battVoltageOn", class: "text", type: "number", min: "0", max: "100", step: "0.1", value: obj.battVoltageOn}, null)),
|
||||||
divRow("{#ZE_GROUP_TAB_BATTERY_BATTVOLTAGEOFF}", ml("input", {name: "battVoltageOff", class: "text", type: "number", min: "0", max: "100", step: "0.1", value: obj.battVoltageOff}, null)),
|
divRow("{#ZE_GROUP_TAB_BATTERY_BATTVOLTAGEOFF}", ml("input", {name: "battVoltageOff", class: "text", type: "number", min: "0", max: "100", step: "0.1", value: obj.battVoltageOff}, null)),
|
||||||
|
// TODO: Hier muss ein Button hin, mit dem Switch ein/ausgeschaltet werden kann.
|
||||||
]),
|
]),
|
||||||
// Advanced
|
// Advanced
|
||||||
ml("div", {id: "div{#ZE_GROUP_TAB_ADVANCED}", class: "tab-content hide"}, [
|
ml("div", {id: "div{#ZE_GROUP_TAB_ADVANCED}", class: "tab-content hide"}, [
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue