mirror of
https://github.com/lumapu/ahoy.git
synced 2025-06-09 06:01:37 +02:00
0.8.910008-zero
This commit is contained in:
parent
1c4a83dfd0
commit
3dfbee82c7
8 changed files with 1204 additions and 716 deletions
35
src/app.cpp
35
src/app.cpp
|
@ -73,9 +73,16 @@ void app::setup() {
|
||||||
|
|
||||||
mCommunication.setup(&mTimestamp, &mConfig->serial.debug, &mConfig->serial.privacyLog, &mConfig->serial.printWholeTrace);
|
mCommunication.setup(&mTimestamp, &mConfig->serial.debug, &mConfig->serial.privacyLog, &mConfig->serial.printWholeTrace);
|
||||||
mCommunication.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2));
|
mCommunication.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2));
|
||||||
#if defined(ENABLE_MQTT)
|
#if defined(PLUGIN_ZEROEXPORT) || defined(ENABLE_MQTT)
|
||||||
mCommunication.addPowerLimitAckListener([this] (Inverter<> *iv) { mMqtt.setPowerLimitAck(iv); });
|
mCommunication.addPowerLimitAckListener([this] (Inverter<> *iv) {
|
||||||
#endif
|
#if defined(PLUGIN_ZEROEXPORT)
|
||||||
|
mZeroExport.resetWaitLimitAck(iv);
|
||||||
|
#endif /*PLUGIN_ZEROEXPORT*/
|
||||||
|
#if defined(ENABLE_MQTT)
|
||||||
|
mMqtt.setPowerLimitAck(iv);
|
||||||
|
#endif
|
||||||
|
});
|
||||||
|
#endif /*defined(PLUGIN_ZEROEXPORT) || defined(ENABLE_MQTT)*/
|
||||||
mSys.setup(&mTimestamp, &mConfig->inst, this);
|
mSys.setup(&mTimestamp, &mConfig->inst, this);
|
||||||
for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) {
|
for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) {
|
||||||
initInverter(i);
|
initInverter(i);
|
||||||
|
@ -124,10 +131,7 @@ void app::setup() {
|
||||||
|
|
||||||
// Plugin ZeroExport
|
// Plugin ZeroExport
|
||||||
#if defined(PLUGIN_ZEROEXPORT)
|
#if defined(PLUGIN_ZEROEXPORT)
|
||||||
// TODO: aufräumen
|
mZeroExport.setup(&mConfig->plugin.zeroExport, &mSys, mConfig, &mApi, &mMqtt);
|
||||||
// if (mConfig->plugin.zeroExport.enabled) {
|
|
||||||
mZeroExport.setup(&mConfig->plugin.zeroExport, &mSys, mConfig, &mApi, &mMqtt);
|
|
||||||
// }
|
|
||||||
#endif
|
#endif
|
||||||
// Plugin ZeroExport - Ende
|
// Plugin ZeroExport - Ende
|
||||||
|
|
||||||
|
@ -216,10 +220,7 @@ void app::regularTickers(void) {
|
||||||
|
|
||||||
// Plugin ZeroExport
|
// Plugin ZeroExport
|
||||||
#if defined(PLUGIN_ZEROEXPORT)
|
#if defined(PLUGIN_ZEROEXPORT)
|
||||||
// TODO: aufräumen
|
everySec(std::bind(&ZeroExportType::tickerSecond, &mZeroExport), "ZeroExport");
|
||||||
// if (mConfig->plugin.zeroExport.enabled) {
|
|
||||||
everySec(std::bind(&ZeroExportType::tickerSecond, &mZeroExport), "ZeroExport");
|
|
||||||
// }
|
|
||||||
#endif
|
#endif
|
||||||
// Plugin ZeroExport - Ende
|
// Plugin ZeroExport - Ende
|
||||||
|
|
||||||
|
@ -479,13 +480,13 @@ void app::tickSend(void) {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Plugin ZeroExport
|
// Plugin ZeroExport
|
||||||
#if defined(PLUGIN_ZEROEXPORT)
|
// #if defined(PLUGIN_ZEROEXPORT)
|
||||||
// TODO: aufräumen
|
// TODO: aufräumen
|
||||||
if(mConfig->nrf.enabled || mConfig->cmt.enabled) {
|
// if(mConfig->nrf.enabled || mConfig->cmt.enabled) {
|
||||||
mZeroExport.loop();
|
// mZeroExport.loop();
|
||||||
// zeroexport();
|
// zeroexport();
|
||||||
}
|
// }
|
||||||
#endif
|
// #endif
|
||||||
// Plugin ZeroExport - Ende
|
// Plugin ZeroExport - Ende
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -548,7 +549,7 @@ void app:: zeroIvValues(bool checkAvail, bool skipYieldDay) {
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void app::resetSystem(void) {
|
void app::resetSystem(void) {
|
||||||
#if defined(PLUGIN_ZEROEXPORT)
|
#if defined(PLUGIN_ZEROEXPORT)
|
||||||
snprintf(mVersion, sizeof(mVersion), "zero-%d.%d.%d", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
|
snprintf(mVersion, sizeof(mVersion), "%d.%d.%d-zero", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
|
||||||
#else
|
#else
|
||||||
snprintf(mVersion, sizeof(mVersion), "%d.%d.%d", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
|
snprintf(mVersion, sizeof(mVersion), "%d.%d.%d", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -186,6 +186,8 @@ typedef struct {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Plugin ZeroExport
|
// Plugin ZeroExport
|
||||||
|
#if defined(PLUGIN_ZEROEXPORT)
|
||||||
|
|
||||||
#define ZEROEXPORT_MAX_GROUPS 6
|
#define ZEROEXPORT_MAX_GROUPS 6
|
||||||
#define ZEROEXPORT_GROUP_MAX_LEN_NAME 25
|
#define ZEROEXPORT_GROUP_MAX_LEN_NAME 25
|
||||||
#define ZEROEXPORT_GROUP_MAX_LEN_PM_URL 100
|
#define ZEROEXPORT_GROUP_MAX_LEN_PM_URL 100
|
||||||
|
@ -196,9 +198,22 @@ typedef struct {
|
||||||
#define ZEROEXPORT_POWERMETER_MAX_ERRORS 5
|
#define ZEROEXPORT_POWERMETER_MAX_ERRORS 5
|
||||||
#define ZEROEXPORT_DEF_INV_WAITINGTIME_MS 10000
|
#define ZEROEXPORT_DEF_INV_WAITINGTIME_MS 10000
|
||||||
|
|
||||||
#if defined(PLUGIN_ZEROEXPORT)
|
|
||||||
enum class zeroExportState : uint8_t {
|
enum class zeroExportState : uint8_t {
|
||||||
RESET, GETPOWERMETER, GETINVERTERDATA, BATTERYPROTECTION, CONTROL, SETCONTROL, FINISH
|
INIT,
|
||||||
|
WAIT,
|
||||||
|
WAITREFRESH,
|
||||||
|
GETINVERTERACKS,
|
||||||
|
GETINVERTERDATA,
|
||||||
|
BATTERYPROTECTION,
|
||||||
|
GETPOWERMETER,
|
||||||
|
CONTROLLER,
|
||||||
|
PROGNOSE,
|
||||||
|
AUFTEILEN,
|
||||||
|
SETLIMIT,
|
||||||
|
SETPOWER,
|
||||||
|
SETREBOOT,
|
||||||
|
FINISH,
|
||||||
|
ERROR
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -246,6 +261,9 @@ typedef struct {
|
||||||
float power;
|
float power;
|
||||||
uint16_t limit;
|
uint16_t limit;
|
||||||
uint16_t limitNew;
|
uint16_t limitNew;
|
||||||
|
bool waitLimitAck;
|
||||||
|
bool waitPowerAck;
|
||||||
|
bool waitRebootAck;
|
||||||
unsigned long limitTsp;
|
unsigned long limitTsp;
|
||||||
float dcVoltage;
|
float dcVoltage;
|
||||||
bool state;
|
bool state;
|
||||||
|
@ -274,9 +292,13 @@ typedef struct {
|
||||||
uint16_t powerMax;
|
uint16_t powerMax;
|
||||||
//
|
//
|
||||||
|
|
||||||
|
zeroExportState stateLast;
|
||||||
zeroExportState state;
|
zeroExportState state;
|
||||||
zeroExportState stateNext;
|
zeroExportState stateNext;
|
||||||
unsigned long lastRun;
|
unsigned long lastRun;
|
||||||
|
unsigned long lastRefresh;
|
||||||
|
// bool waitForAck;
|
||||||
|
|
||||||
float pmPower;
|
float pmPower;
|
||||||
float pmPowerL1;
|
float pmPowerL1;
|
||||||
float pmPowerL2;
|
float pmPowerL2;
|
||||||
|
@ -298,6 +320,8 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool enabled;
|
bool enabled;
|
||||||
|
bool log_over_webserial;
|
||||||
|
bool log_over_mqtt;
|
||||||
zeroExportGroup_t groups[ZEROEXPORT_MAX_GROUPS];
|
zeroExportGroup_t groups[ZEROEXPORT_MAX_GROUPS];
|
||||||
|
|
||||||
|
|
||||||
|
@ -314,6 +338,7 @@ typedef struct {
|
||||||
// double max_power;
|
// double max_power;
|
||||||
// bool two_percent; // ask if not go lower then 2%
|
// bool two_percent; // ask if not go lower then 2%
|
||||||
} zeroExport_t;
|
} zeroExport_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// Plugin ZeroExport - Ende
|
// Plugin ZeroExport - Ende
|
||||||
|
|
||||||
|
@ -624,6 +649,8 @@ class settings {
|
||||||
// Plugin ZeroExport
|
// Plugin ZeroExport
|
||||||
#if defined(PLUGIN_ZEROEXPORT)
|
#if defined(PLUGIN_ZEROEXPORT)
|
||||||
mCfg.plugin.zeroExport.enabled = false;
|
mCfg.plugin.zeroExport.enabled = false;
|
||||||
|
mCfg.plugin.zeroExport.log_over_webserial = false;
|
||||||
|
mCfg.plugin.zeroExport.log_over_mqtt = false;
|
||||||
for(uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
|
for(uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
|
||||||
// General
|
// General
|
||||||
mCfg.plugin.zeroExport.groups[group].enabled = false;
|
mCfg.plugin.zeroExport.groups[group].enabled = false;
|
||||||
|
@ -641,6 +668,10 @@ class settings {
|
||||||
mCfg.plugin.zeroExport.groups[group].inverters[inv].target = -1;
|
mCfg.plugin.zeroExport.groups[group].inverters[inv].target = -1;
|
||||||
mCfg.plugin.zeroExport.groups[group].inverters[inv].powerMin = 10;
|
mCfg.plugin.zeroExport.groups[group].inverters[inv].powerMin = 10;
|
||||||
mCfg.plugin.zeroExport.groups[group].inverters[inv].powerMax = 600;
|
mCfg.plugin.zeroExport.groups[group].inverters[inv].powerMax = 600;
|
||||||
|
//
|
||||||
|
mCfg.plugin.zeroExport.groups[group].inverters[inv].waitLimitAck = false;
|
||||||
|
mCfg.plugin.zeroExport.groups[group].inverters[inv].waitPowerAck = false;
|
||||||
|
mCfg.plugin.zeroExport.groups[group].inverters[inv].waitRebootAck = false;
|
||||||
}
|
}
|
||||||
// Battery
|
// Battery
|
||||||
mCfg.plugin.zeroExport.groups[group].battEnabled = false;
|
mCfg.plugin.zeroExport.groups[group].battEnabled = false;
|
||||||
|
@ -651,9 +682,10 @@ class settings {
|
||||||
mCfg.plugin.zeroExport.groups[group].refresh = 10;
|
mCfg.plugin.zeroExport.groups[group].refresh = 10;
|
||||||
mCfg.plugin.zeroExport.groups[group].powerTolerance = 10;
|
mCfg.plugin.zeroExport.groups[group].powerTolerance = 10;
|
||||||
mCfg.plugin.zeroExport.groups[group].powerMax = 600;
|
mCfg.plugin.zeroExport.groups[group].powerMax = 600;
|
||||||
//
|
//
|
||||||
mCfg.plugin.zeroExport.groups[group].state = zeroExportState::RESET;
|
mCfg.plugin.zeroExport.groups[group].state = zeroExportState::INIT;
|
||||||
mCfg.plugin.zeroExport.groups[group].lastRun = 0;
|
mCfg.plugin.zeroExport.groups[group].lastRun = 0;
|
||||||
|
mCfg.plugin.zeroExport.groups[group].lastRefresh = 0;
|
||||||
mCfg.plugin.zeroExport.groups[group].pmPower = 0;
|
mCfg.plugin.zeroExport.groups[group].pmPower = 0;
|
||||||
mCfg.plugin.zeroExport.groups[group].pmPowerL1 = 0;
|
mCfg.plugin.zeroExport.groups[group].pmPowerL1 = 0;
|
||||||
mCfg.plugin.zeroExport.groups[group].pmPowerL2 = 0;
|
mCfg.plugin.zeroExport.groups[group].pmPowerL2 = 0;
|
||||||
|
@ -1017,6 +1049,8 @@ class settings {
|
||||||
void jsonZeroExport(JsonObject obj, bool set = false) {
|
void jsonZeroExport(JsonObject obj, bool set = false) {
|
||||||
if(set) {
|
if(set) {
|
||||||
obj[F("enabled")] = mCfg.plugin.zeroExport.enabled;
|
obj[F("enabled")] = mCfg.plugin.zeroExport.enabled;
|
||||||
|
obj[F("log_over_webserial")] = mCfg.plugin.zeroExport.log_over_webserial;
|
||||||
|
obj[F("log_over_mqtt")] = mCfg.plugin.zeroExport.log_over_mqtt;
|
||||||
JsonArray grpArr = obj.createNestedArray(F("groups"));
|
JsonArray grpArr = obj.createNestedArray(F("groups"));
|
||||||
for(uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
|
for(uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
|
||||||
jsonZeroExportGroup(grpArr.createNestedObject(), group, set);
|
jsonZeroExportGroup(grpArr.createNestedObject(), group, set);
|
||||||
|
@ -1026,6 +1060,10 @@ class settings {
|
||||||
{
|
{
|
||||||
if (obj.containsKey(F("enabled")))
|
if (obj.containsKey(F("enabled")))
|
||||||
getVal<bool>(obj, F("enabled"), &mCfg.plugin.zeroExport.enabled);
|
getVal<bool>(obj, F("enabled"), &mCfg.plugin.zeroExport.enabled);
|
||||||
|
if (obj.containsKey(F("log_over_webserial")))
|
||||||
|
getVal<bool>(obj, F("log_over_webserial"), &mCfg.plugin.zeroExport.log_over_webserial);
|
||||||
|
if (obj.containsKey(F("log_over_mqtt")))
|
||||||
|
getVal<bool>(obj, F("log_over_mqtt"), &mCfg.plugin.zeroExport.log_over_mqtt);
|
||||||
if (obj.containsKey(F("groups"))) {
|
if (obj.containsKey(F("groups"))) {
|
||||||
for(uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
|
for(uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
|
||||||
jsonZeroExportGroup(obj[F("groups")][group], group, set);
|
jsonZeroExportGroup(obj[F("groups")][group], group, set);
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 8
|
#define VERSION_MINOR 8
|
||||||
#define VERSION_PATCH 910007
|
#define VERSION_PATCH 910008
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -718,6 +718,8 @@ class RestApi {
|
||||||
#if defined(PLUGIN_ZEROEXPORT)
|
#if defined(PLUGIN_ZEROEXPORT)
|
||||||
void getZeroExport(JsonObject obj) {
|
void getZeroExport(JsonObject obj) {
|
||||||
obj[F("enabled")] = (bool) mConfig->plugin.zeroExport.enabled;
|
obj[F("enabled")] = (bool) mConfig->plugin.zeroExport.enabled;
|
||||||
|
obj[F("log_over_webserial")] = (bool) mConfig->plugin.zeroExport.log_over_webserial;
|
||||||
|
obj[F("log_over_mqtt")] = (bool) mConfig->plugin.zeroExport.log_over_mqtt;
|
||||||
// Groups
|
// Groups
|
||||||
obj[F("max_groups")] = ZEROEXPORT_MAX_GROUPS;
|
obj[F("max_groups")] = ZEROEXPORT_MAX_GROUPS;
|
||||||
JsonArray arrGroup = obj.createNestedArray(F("groups"));
|
JsonArray arrGroup = obj.createNestedArray(F("groups"));
|
||||||
|
|
|
@ -314,6 +314,10 @@
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<div class="col-12 col-sm-3 my-2">{#ZE_ENABLED}</div>
|
<div class="col-12 col-sm-3 my-2">{#ZE_ENABLED}</div>
|
||||||
<div class="col-12 col-sm-9"><input type="checkbox" name="ze_enabled"/></div>
|
<div class="col-12 col-sm-9"><input type="checkbox" name="ze_enabled"/></div>
|
||||||
|
<div class="col-12 col-sm-3 my-2">{#ZE_LOG_OVER_WEBSERIAL}</div>
|
||||||
|
<div class="col-12 col-sm-9"><input type="checkbox" name="ze_log_over_webserial"/></div>
|
||||||
|
<div class="col-12 col-sm-3 my-2">{#ZE_LOG_OVER_MQTT}</div>
|
||||||
|
<div class="col-12 col-sm-9"><input type="checkbox" name="ze_log_over_mqtt"/></div>
|
||||||
</div>
|
</div>
|
||||||
<div id="ze_groups"></div>
|
<div id="ze_groups"></div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
@ -1563,7 +1567,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*ENDIF_PLUGIN_ZEROEXPORT*/
|
/*ENDIF_PLUGIN_ZEROEXPORT*/
|
||||||
|
|
||||||
function parseZeroExport(obj, type) {
|
function parseZeroExport(obj, type) {
|
||||||
|
@ -1573,6 +1576,12 @@
|
||||||
// enabled
|
// enabled
|
||||||
document.getElementsByName("ze_enabled")[0].checked = obj["enabled"];
|
document.getElementsByName("ze_enabled")[0].checked = obj["enabled"];
|
||||||
|
|
||||||
|
// log_over_webserial
|
||||||
|
document.getElementsByName("ze_log_over_webserial")[0].checked = obj["log_over_webserial"];
|
||||||
|
|
||||||
|
// log_over_mqtt
|
||||||
|
document.getElementsByName("ze_log_over_mqtt")[0].checked = obj["log_over_mqtt"];
|
||||||
|
|
||||||
// groups
|
// groups
|
||||||
maxGroups = obj["max_groups"];
|
maxGroups = obj["max_groups"];
|
||||||
|
|
||||||
|
|
|
@ -778,6 +778,16 @@
|
||||||
"en": "Enabled",
|
"en": "Enabled",
|
||||||
"de": "Aktiviert"
|
"de": "Aktiviert"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"token": "ZE_LOG_OVER_WEBSERIAL",
|
||||||
|
"en": "Log over Webserial",
|
||||||
|
"de": "Log in Webserial"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"token": "ZE_LOG_OVER_MQTT",
|
||||||
|
"en": "Log over MQTT",
|
||||||
|
"de": "Log in MQTT"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"token": "ZE_GROUP_ENABLED",
|
"token": "ZE_GROUP_ENABLED",
|
||||||
"en": "State:",
|
"en": "State:",
|
||||||
|
|
|
@ -589,6 +589,8 @@ class Web {
|
||||||
// Plugin ZeroExport
|
// Plugin ZeroExport
|
||||||
#if defined(PLUGIN_ZEROEXPORT)
|
#if defined(PLUGIN_ZEROEXPORT)
|
||||||
mConfig->plugin.zeroExport.enabled = (request->arg("ze_enabled") == "on");
|
mConfig->plugin.zeroExport.enabled = (request->arg("ze_enabled") == "on");
|
||||||
|
mConfig->plugin.zeroExport.log_over_webserial = (request->arg("ze_log_over_webserial") == "on");
|
||||||
|
mConfig->plugin.zeroExport.log_over_mqtt = (request->arg("ze_log_over_mqtt") == "on");
|
||||||
// TODO: sortieren
|
// TODO: sortieren
|
||||||
// mConfig->plugin.zeroExport.enabled = (request->arg("en_zeroexport") == "on");
|
// mConfig->plugin.zeroExport.enabled = (request->arg("en_zeroexport") == "on");
|
||||||
// mConfig->plugin.zeroExport.two_percent = (request->arg("two_percent") == "on");
|
// mConfig->plugin.zeroExport.two_percent = (request->arg("two_percent") == "on");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue