mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-23 13:56:10 +02:00
Merge branch 'development03' into hms
# Conflicts: # src/hm/miPayload.h
This commit is contained in:
commit
e503d31cf2
18 changed files with 342 additions and 253 deletions
2
.github/workflows/compile_development.yml
vendored
2
.github/workflows/compile_development.yml
vendored
|
@ -47,7 +47,7 @@ jobs:
|
||||||
run: python convert.py
|
run: python convert.py
|
||||||
|
|
||||||
- name: Run PlatformIO
|
- name: Run PlatformIO
|
||||||
run: pio run -d src --environment esp8266-release --environment esp8285-release --environment esp32-wroom32-release
|
run: pio run -d src --environment esp8266-release --environment esp8266-release-prometheus --environment esp8285-release --environment esp32-wroom32-release --environment esp32-wroom32-release-prometheus
|
||||||
|
|
||||||
- name: Rename Binary files
|
- name: Rename Binary files
|
||||||
id: rename-binary-files
|
id: rename-binary-files
|
||||||
|
|
2
.github/workflows/compile_release.yml
vendored
2
.github/workflows/compile_release.yml
vendored
|
@ -51,7 +51,7 @@ jobs:
|
||||||
run: python convert.py
|
run: python convert.py
|
||||||
|
|
||||||
- name: Run PlatformIO
|
- name: Run PlatformIO
|
||||||
run: pio run -d src --environment esp8266-release --environment esp8285-release --environment esp32-wroom32-release
|
run: pio run -d src --environment esp8266-release --environment esp8266-release-prometheus --environment esp8285-release --environment esp32-wroom32-release --environment esp32-wroom32-release-prometheus
|
||||||
|
|
||||||
- name: Rename Binary files
|
- name: Rename Binary files
|
||||||
id: rename-binary-files
|
id: rename-binary-files
|
||||||
|
|
|
@ -308,6 +308,8 @@ To get the information open the URL `/api/record/info` on your AhoyDTU. The info
|
||||||
| B5r1oJ0A9G | HM-800 | | 1.0.10 | 2021 | | 104 | | |
|
| B5r1oJ0A9G | HM-800 | | 1.0.10 | 2021 | | 104 | | |
|
||||||
| B5r1oJ0A9G | HM-800 | | 1.0.10 | 2021 | | 104 | | |
|
| B5r1oJ0A9G | HM-800 | | 1.0.10 | 2021 | | 104 | | |
|
||||||
| tomquist | TSOL-M1600 | | 1.0.12 | 2020 | 06-24 | 100 | | |
|
| tomquist | TSOL-M1600 | | 1.0.12 | 2020 | 06-24 | 100 | | |
|
||||||
|
| rejoe2 | MI-600 | | 236 | 2018 | 11-27 | 17 | | |
|
||||||
|
| rejoe2 | MI-1500 | | 1.0.12 | 2020 | 06-24 | 100 | | |
|
||||||
| | | | | | | | | |
|
| | | | | | | | | |
|
||||||
|
|
||||||
## Developer Information about Command Queue
|
## Developer Information about Command Queue
|
||||||
|
|
|
@ -56,6 +56,11 @@ def readVersion(path, infile):
|
||||||
src = path + ".pio/build/esp8266-release/firmware.bin"
|
src = path + ".pio/build/esp8266-release/firmware.bin"
|
||||||
dst = path + "firmware/" + versionout
|
dst = path + "firmware/" + versionout
|
||||||
os.rename(src, dst)
|
os.rename(src, dst)
|
||||||
|
|
||||||
|
versionout = version[:-1] + "_" + sha + "_esp8266_prometheus.bin"
|
||||||
|
src = path + ".pio/build/esp8266-release-prometheus/firmware.bin"
|
||||||
|
dst = path + "firmware/" + versionout
|
||||||
|
os.rename(src, dst)
|
||||||
|
|
||||||
versionout = version[:-1] + "_" + sha + "_esp8285.bin"
|
versionout = version[:-1] + "_" + sha + "_esp8285.bin"
|
||||||
src = path + ".pio/build/esp8285-release/firmware.bin"
|
src = path + ".pio/build/esp8285-release/firmware.bin"
|
||||||
|
@ -68,6 +73,11 @@ def readVersion(path, infile):
|
||||||
dst = path + "firmware/" + versionout
|
dst = path + "firmware/" + versionout
|
||||||
os.rename(src, dst)
|
os.rename(src, dst)
|
||||||
|
|
||||||
|
versionout = version[:-1] + "_" + sha + "_esp32_prometheus.bin"
|
||||||
|
src = path + ".pio/build/esp32-wroom32-release-prometheus/firmware.bin"
|
||||||
|
dst = path + "firmware/" + versionout
|
||||||
|
os.rename(src, dst)
|
||||||
|
|
||||||
# other ESP32 bin files
|
# other ESP32 bin files
|
||||||
src = path + ".pio/build/esp32-wroom32-release/"
|
src = path + ".pio/build/esp32-wroom32-release/"
|
||||||
dst = path + "firmware/"
|
dst = path + "firmware/"
|
||||||
|
|
|
@ -2,6 +2,22 @@
|
||||||
|
|
||||||
(starting from release version `0.5.66`)
|
(starting from release version `0.5.66`)
|
||||||
|
|
||||||
|
## 0.5.97
|
||||||
|
* Attention: re-ordered display types, check your settings! #746
|
||||||
|
* improved saving settings of display #747, #746
|
||||||
|
* disabled contrast for Nokia display #746
|
||||||
|
* added Prometheus as compile option #719, #615
|
||||||
|
* update MQTT lib to v1.4.1
|
||||||
|
* limit decimal places to 2 in `live`
|
||||||
|
* added `-DPIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48` to esp8266 debug build #657
|
||||||
|
* a `max-module-power` of `0` disables channel in live view `setup`
|
||||||
|
* merge MI improvements, get firmware information #753
|
||||||
|
|
||||||
|
## 0.5.96
|
||||||
|
* added Nokia display again for ESP8266 #764
|
||||||
|
* changed `var` / `VAr` to SI unit `var` #732
|
||||||
|
* fix MQTT retained flags for totals (P_AC, P_DC) #726, #721
|
||||||
|
|
||||||
## 0.5.95
|
## 0.5.95
|
||||||
* merged #742 MI Improvments
|
* merged #742 MI Improvments
|
||||||
* merged #736 remove obsolete JSON Endpoint
|
* merged #736 remove obsolete JSON Endpoint
|
||||||
|
|
|
@ -368,12 +368,12 @@ class settings {
|
||||||
mCfg.plugin.display.contrast = 60;
|
mCfg.plugin.display.contrast = 60;
|
||||||
mCfg.plugin.display.pxShift = true;
|
mCfg.plugin.display.pxShift = true;
|
||||||
mCfg.plugin.display.rot = 0;
|
mCfg.plugin.display.rot = 0;
|
||||||
mCfg.plugin.display.disp_data = DEF_PIN_OFF; // SDA
|
mCfg.plugin.display.disp_data = DEF_PIN_OFF; // SDA
|
||||||
mCfg.plugin.display.disp_clk = DEF_PIN_OFF; // SCL
|
mCfg.plugin.display.disp_clk = DEF_PIN_OFF; // SCL
|
||||||
mCfg.plugin.display.disp_cs = DEF_PIN_OFF;
|
mCfg.plugin.display.disp_cs = DEF_PIN_OFF;
|
||||||
mCfg.plugin.display.disp_reset = DEF_PIN_OFF;
|
mCfg.plugin.display.disp_reset = DEF_PIN_OFF;
|
||||||
mCfg.plugin.display.disp_busy = DEF_PIN_OFF;
|
mCfg.plugin.display.disp_busy = DEF_PIN_OFF;
|
||||||
mCfg.plugin.display.disp_dc = DEF_PIN_OFF;
|
mCfg.plugin.display.disp_dc = DEF_PIN_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void jsonWifi(JsonObject obj, bool set = false) {
|
void jsonWifi(JsonObject obj, bool set = false) {
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 5
|
#define VERSION_MINOR 5
|
||||||
#define VERSION_PATCH 95
|
#define VERSION_PATCH 97
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -162,26 +162,20 @@ class Inverter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getQueuedCmd() {
|
uint8_t getQueuedCmd() {
|
||||||
if (_commandQueue.empty()) {
|
if (_commandQueue.empty()) {
|
||||||
if (ivGen != IV_MI) {
|
if (ivGen != IV_MI) {
|
||||||
if (getFwVersion() == 0)
|
if (getFwVersion() == 0)
|
||||||
enqueCommand<InfoCommand>(InverterDevInform_All); // firmware version
|
enqueCommand<InfoCommand>(InverterDevInform_All); // firmware version
|
||||||
enqueCommand<InfoCommand>(RealTimeRunData_Debug); // live data
|
enqueCommand<InfoCommand>(RealTimeRunData_Debug); // live data
|
||||||
} else if (ivGen == IV_MI){
|
} else if (ivGen == IV_MI){
|
||||||
|
if (getFwVersion() == 0)
|
||||||
|
enqueCommand<InfoCommand>(InverterDevInform_All); // firmware version; might not work, esp. for 1/2 ch hardware
|
||||||
if (type == INV_TYPE_4CH) {
|
if (type == INV_TYPE_4CH) {
|
||||||
enqueCommand<InfoCommand>(0x36);
|
enqueCommand<InfoCommand>(0x36);
|
||||||
/*for(uint8_t i = 0x36; i <= 0x39; i++) {
|
} else {
|
||||||
enqueCommand<MiInfoCommand>(i); // live data
|
|
||||||
}*/
|
|
||||||
} else if (type == INV_TYPE_2CH) {
|
|
||||||
enqueCommand<InfoCommand>(0x09);
|
|
||||||
//enqueCommand<MiInfoCommand>(0x11);
|
|
||||||
} else if (type == INV_TYPE_1CH) {
|
|
||||||
enqueCommand<InfoCommand>(0x09);
|
enqueCommand<InfoCommand>(0x09);
|
||||||
}
|
}
|
||||||
//if (getFwVersion() == 0)
|
|
||||||
// enqueCommand<MiInfoCommand>(InverterDevInform_All); // firmware version, might not work, esp. for 1/2 ch hardware
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((actPowerLimit == 0xffff) && isConnected)
|
if ((actPowerLimit == 0xffff) && isConnected)
|
||||||
|
|
|
@ -24,13 +24,12 @@ typedef struct {
|
||||||
uint8_t txId;
|
uint8_t txId;
|
||||||
uint8_t invId;
|
uint8_t invId;
|
||||||
uint8_t retransmits;
|
uint8_t retransmits;
|
||||||
|
uint8_t skipfirstrepeat;
|
||||||
bool gotFragment;
|
bool gotFragment;
|
||||||
/*
|
/*
|
||||||
uint8_t data[MAX_PAYLOAD_ENTRIES][MAX_RF_PAYLOAD_SIZE];
|
uint8_t data[MAX_PAYLOAD_ENTRIES][MAX_RF_PAYLOAD_SIZE];
|
||||||
|
|
||||||
uint8_t maxPackId;
|
uint8_t maxPackId;
|
||||||
bool lastFound;
|
bool lastFound;*/
|
||||||
bool gotFragment;*/
|
|
||||||
} miPayload_t;
|
} miPayload_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -94,9 +93,12 @@ class MiPayload {
|
||||||
DBGPRINT(F(") prepareDevInformCmd 0x"));
|
DBGPRINT(F(") prepareDevInformCmd 0x"));
|
||||||
DBGPRINTLN(String(cmd, HEX));
|
DBGPRINTLN(String(cmd, HEX));
|
||||||
uint8_t cmd2 = cmd;
|
uint8_t cmd2 = cmd;
|
||||||
if (cmd == 0x1 ) {
|
if (cmd == 0x1 ) { //0x1
|
||||||
cmd = TX_REQ_INFO;
|
cmd = 0x0f;
|
||||||
cmd2 = 0x00;
|
cmd2 = 0x00;
|
||||||
|
mRadio->sendCmdPacket(iv->radioId.u64, cmd, cmd2, false);
|
||||||
|
} else {
|
||||||
|
mRadio->prepareDevInformCmd(iv->radioId.u64, cmd2, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd);
|
||||||
};
|
};
|
||||||
|
|
||||||
mRadio->prepareDevInformCmd(iv->radioId.u64, cmd2, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd);
|
mRadio->prepareDevInformCmd(iv->radioId.u64, cmd2, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd);
|
||||||
|
@ -119,53 +121,30 @@ class MiPayload {
|
||||||
|
|
||||||
if (p->packet[0] == (0x08 + ALL_FRAMES)) { // 0x88; MI status response to 0x09
|
if (p->packet[0] == (0x08 + ALL_FRAMES)) { // 0x88; MI status response to 0x09
|
||||||
miStsDecode(iv, p);
|
miStsDecode(iv, p);
|
||||||
} else if (p->packet[0] == (0x11 + SINGLE_FRAME)) { // 0x92; MI status response to 0x11
|
}
|
||||||
|
|
||||||
|
else if (p->packet[0] == (0x11 + SINGLE_FRAME)) { // 0x92; MI status response to 0x11
|
||||||
miStsDecode(iv, p, CH2);
|
miStsDecode(iv, p, CH2);
|
||||||
/*} else if (p->packet[0] == (0x09 + ALL_FRAMES)) { // MI data response to 0x09
|
}
|
||||||
mPayload[iv->id].txId = p->packet[0];
|
|
||||||
miDataDecode(iv,p);
|
|
||||||
//iv->setQueuedCmdFinished();
|
|
||||||
if (INV_TYPE_2CH == iv->type) {
|
|
||||||
//mSys->Radio.prepareDevInformCmd(iv->radioId.u64, iv->getQueuedCmd(), mPayload[iv->id].ts, iv->alarmMesIndex, false, 0x11);
|
|
||||||
//mSys->Radio.prepareDevInformCmd(iv->radioId.u64, 0x11, mPayload[iv->id].ts, iv->alarmMesIndex, false, 0x11);
|
|
||||||
} else { // additional check for mPayload[iv->id].stsa == true might be a good idea (request retransmit?)
|
|
||||||
mPayload[iv->id].complete = true;
|
|
||||||
//iv->setQueuedCmdFinished();
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (p->packet[0] == ()) { // MI data response to 0x11
|
else if ( p->packet[0] == 0x09 + ALL_FRAMES ||
|
||||||
mPayload[iv->id].txId = p->packet[0];
|
|
||||||
miDataDecode(iv,p);
|
|
||||||
mStat->rxSuccess++;
|
|
||||||
//iv->setQueuedCmdFinished();*/
|
|
||||||
|
|
||||||
} else if ( p->packet[0] == 0x09 + ALL_FRAMES ||
|
|
||||||
p->packet[0] == 0x11 + ALL_FRAMES ||
|
p->packet[0] == 0x11 + ALL_FRAMES ||
|
||||||
( p->packet[0] >= (0x36 + ALL_FRAMES) && p->packet[0] < (0x39 + SINGLE_FRAME) ) ) { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39
|
( p->packet[0] >= (0x36 + ALL_FRAMES) && p->packet[0] < (0x39 + SINGLE_FRAME) ) ) { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39
|
||||||
mPayload[iv->id].txId = p->packet[0];
|
mPayload[iv->id].txId = p->packet[0];
|
||||||
miDataDecode(iv,p);
|
miDataDecode(iv,p);
|
||||||
//mStat->rxSuccess++;
|
}
|
||||||
//iv->setQueuedCmdFinished();
|
|
||||||
/*if (p->packet[0] < (0x39 + ALL_FRAMES)) {
|
|
||||||
//mSys->Radio.prepareDevInformCmd(iv->radioId.u64, iv->getQueuedCmd(), mPayload[iv->id].ts, iv->alarmMesIndex, false, p->packet[0] + 1 - ALL_FRAMES);
|
|
||||||
//mSys->Radio.prepareDevInformCmd(iv->radioId.u64, p->packet[0] + 1 - ALL_FRAMES, mPayload[iv->id].ts, iv->alarmMesIndex, false, p->packet[0] + 1 - ALL_FRAMES);
|
|
||||||
} else {
|
|
||||||
mPayload[iv->id].complete = true;
|
|
||||||
//iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, CALC_YD_CH0);
|
|
||||||
//iv->setQueuedCmdFinished();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//}
|
else if (p->packet[0] == ( 0x0f + ALL_FRAMES)) {
|
||||||
|
// MI response from get hardware information request
|
||||||
|
record_t<> *rec = iv->getRecordStruct(InverterDevInform_All); // choose the record structure
|
||||||
|
rec->ts = mPayload[iv->id].ts;
|
||||||
|
mPayload[iv->id].gotFragment = true;
|
||||||
|
|
||||||
} else if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command
|
|
||||||
// atm, we just do nothing else than print out what we got...
|
|
||||||
// for decoding see xls- Data collection instructions - #147ff
|
|
||||||
/*
|
/*
|
||||||
Polling the device software and hardware version number command
|
Polling the device software and hardware version number command
|
||||||
start byte Command word routing address target address User data check end byte
|
start byte Command word routing address target address User data check end byte
|
||||||
byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12]
|
byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12]
|
||||||
0x7e 0x0f xx xx xx xx YY YY YY YY 0x00 CRC 0x7f
|
0x7e 0x0f xx xx xx xx YY YY YY YY 0x00 CRC 0x7f
|
||||||
|
|
||||||
Command Receipt - First Frame
|
Command Receipt - First Frame
|
||||||
start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte
|
start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte
|
||||||
byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28]
|
byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28]
|
||||||
|
@ -178,8 +157,41 @@ class MiPayload {
|
||||||
start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data check end byte
|
start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data check end byte
|
||||||
byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[15] byte[16] byte[17] byte[18]
|
byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[15] byte[16] byte[17] byte[18]
|
||||||
0x7e 0x8f YY YY YY YY xx xx xx xx 0x12 APPFW_MINVER HWInfoAddr PNInfoCRC_gusv PNInfoCRC_gusv CRC 0x7f
|
0x7e 0x8f YY YY YY YY xx xx xx xx 0x12 APPFW_MINVER HWInfoAddr PNInfoCRC_gusv PNInfoCRC_gusv CRC 0x7f
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
case InverterDevInform_All:
|
||||||
|
rec->length = (uint8_t)(HMINFO_LIST_LEN);
|
||||||
|
rec->assign = (byteAssign_t *)InfoAssignment;
|
||||||
|
rec->pyldLen = HMINFO_PAYLOAD_LEN;
|
||||||
|
break;
|
||||||
|
const byteAssign_t InfoAssignment[] = {
|
||||||
|
{ FLD_FW_VERSION, UNIT_NONE, CH0, 0, 2, 1 },
|
||||||
|
{ FLD_FW_BUILD_YEAR, UNIT_NONE, CH0, 2, 2, 1 },
|
||||||
|
{ FLD_FW_BUILD_MONTH_DAY, UNIT_NONE, CH0, 4, 2, 1 },
|
||||||
|
{ FLD_FW_BUILD_HOUR_MINUTE, UNIT_NONE, CH0, 6, 2, 1 },
|
||||||
|
{ FLD_HW_ID, UNIT_NONE, CH0, 8, 2, 1 }
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( p->packet[9] == 0x00 ) {//first frame
|
||||||
|
//FLD_FW_VERSION
|
||||||
|
for (uint8_t i = 0; i < 5; i++) {
|
||||||
|
iv->setValue(i, rec, (float) ((p->packet[(12+2*i)] << 8) + p->packet[(13+2*i)])/1);
|
||||||
|
}
|
||||||
|
iv->setQueuedCmdFinished();
|
||||||
|
mStat->rxSuccess++;
|
||||||
|
mRadio->sendCmdPacket(iv->radioId.u64, 0x0f, 0x01, false);
|
||||||
|
} else if ( p->packet[9] == 0x01 ) {//second frame
|
||||||
|
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got 2nd frame (hw info)"));
|
||||||
|
mRadio->sendCmdPacket(iv->radioId.u64, 0x0f, 0x12, false);
|
||||||
|
} else if ( p->packet[9] == 0x12 ) {//3rd frame
|
||||||
|
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got 3rd frame (hw info)"));
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command
|
||||||
|
// atm, we just do nothing else than print out what we got...
|
||||||
|
// for decoding see xls- Data collection instructions - #147ff
|
||||||
mPayload[iv->id].txId = p->packet[0];
|
mPayload[iv->id].txId = p->packet[0];
|
||||||
DPRINTLN(DBG_DEBUG, F("Response from info request received"));
|
DPRINTLN(DBG_DEBUG, F("Response from info request received"));
|
||||||
uint8_t *pid = &p->packet[9];
|
uint8_t *pid = &p->packet[9];
|
||||||
|
@ -195,7 +207,6 @@ class MiPayload {
|
||||||
mPayload[iv->id].len[(*pid & 0x7F) - 1] = p->len - 11;
|
mPayload[iv->id].len[(*pid & 0x7F) - 1] = p->len - 11;
|
||||||
mPayload[iv->id].gotFragment = true;
|
mPayload[iv->id].gotFragment = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*pid & ALL_FRAMES) == ALL_FRAMES) {
|
if ((*pid & ALL_FRAMES) == ALL_FRAMES) {
|
||||||
// Last packet
|
// Last packet
|
||||||
if (((*pid & 0x7f) > mPayload[iv->id].maxPackId) || (MAX_PAYLOAD_ENTRIES == mPayload[iv->id].maxPackId)) {
|
if (((*pid & 0x7f) > mPayload[iv->id].maxPackId) || (MAX_PAYLOAD_ENTRIES == mPayload[iv->id].maxPackId)) {
|
||||||
|
@ -292,7 +303,8 @@ class MiPayload {
|
||||||
if (IV_MI != iv->ivGen) // only process MI inverters
|
if (IV_MI != iv->ivGen) // only process MI inverters
|
||||||
continue; // skip to next inverter
|
continue; // skip to next inverter
|
||||||
|
|
||||||
if ((mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) &&
|
if ( !mPayload[iv->id].complete &&
|
||||||
|
(mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) &&
|
||||||
(mPayload[iv->id].txId < (0x36 + ALL_FRAMES)) &&
|
(mPayload[iv->id].txId < (0x36 + ALL_FRAMES)) &&
|
||||||
(mPayload[iv->id].txId > (0x39 + ALL_FRAMES)) &&
|
(mPayload[iv->id].txId > (0x39 + ALL_FRAMES)) &&
|
||||||
(mPayload[iv->id].txId != (0x09 + ALL_FRAMES)) &&
|
(mPayload[iv->id].txId != (0x09 + ALL_FRAMES)) &&
|
||||||
|
@ -305,6 +317,13 @@ class MiPayload {
|
||||||
continue; // skip to next inverter
|
continue; // skip to next inverter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//delayed next message?
|
||||||
|
//mPayload[iv->id].skipfirstrepeat++;
|
||||||
|
if (mPayload[iv->id].skipfirstrepeat) {
|
||||||
|
mPayload[iv->id].skipfirstrepeat = 0; //reset counter*/
|
||||||
|
continue; // skip to next inverter
|
||||||
|
}
|
||||||
|
|
||||||
if (!mPayload[iv->id].complete) {
|
if (!mPayload[iv->id].complete) {
|
||||||
//DPRINTLN(DBG_INFO, F("Pyld incompl code")); //info for testing only
|
//DPRINTLN(DBG_INFO, F("Pyld incompl code")); //info for testing only
|
||||||
bool crcPass, pyldComplete;
|
bool crcPass, pyldComplete;
|
||||||
|
@ -316,9 +335,12 @@ class MiPayload {
|
||||||
DPRINTLN(DBG_INFO, F("Prevent retransmit on Restart / CleanState_LockAndAlarm..."));
|
DPRINTLN(DBG_INFO, F("Prevent retransmit on Restart / CleanState_LockAndAlarm..."));
|
||||||
mPayload[iv->id].retransmits = mMaxRetrans;
|
mPayload[iv->id].retransmits = mMaxRetrans;
|
||||||
} else if(iv->devControlCmd == ActivePowerContr) {
|
} else if(iv->devControlCmd == ActivePowerContr) {
|
||||||
DPRINTLN(DBG_INFO, F("retransmit power limit"));
|
DPRINT(DBG_INFO, F("(#"));
|
||||||
|
DBGPRINT(String(iv->id));
|
||||||
|
DBGPRINTLN(F(") retransmit power limit"));
|
||||||
mRadio->sendControlPacket(iv->radioId.u64, iv->devControlCmd, iv->powerLimit, true);
|
mRadio->sendControlPacket(iv->radioId.u64, iv->devControlCmd, iv->powerLimit, true);
|
||||||
} else {
|
} else {
|
||||||
|
uint8_t cmd = mPayload[iv->id].txCmd;
|
||||||
if (mPayload[iv->id].retransmits < mMaxRetrans) {
|
if (mPayload[iv->id].retransmits < mMaxRetrans) {
|
||||||
mPayload[iv->id].retransmits++;
|
mPayload[iv->id].retransmits++;
|
||||||
if( !mPayload[iv->id].gotFragment ) {
|
if( !mPayload[iv->id].gotFragment ) {
|
||||||
|
@ -326,22 +348,40 @@ class MiPayload {
|
||||||
DBGPRINT(String(iv->id));
|
DBGPRINT(String(iv->id));
|
||||||
DBGPRINTLN(F(") nothing received"));
|
DBGPRINTLN(F(") nothing received"));
|
||||||
mPayload[iv->id].retransmits = mMaxRetrans;
|
mPayload[iv->id].retransmits = mMaxRetrans;
|
||||||
|
} else if ( cmd == 0x0f ) {
|
||||||
|
//hard/firmware request
|
||||||
|
mRadio->sendCmdPacket(iv->radioId.u64, 0x0f, 0x00, true);
|
||||||
|
//iv->setQueuedCmdFinished();
|
||||||
|
//cmd = iv->getQueuedCmd();
|
||||||
} else {
|
} else {
|
||||||
uint8_t cmd = mPayload[iv->id].txCmd;
|
bool change = false;
|
||||||
if ( cmd >= 0x36 && cmd < 0x39 ) { // MI-1500 Data command
|
if ( cmd >= 0x36 && cmd < 0x39 ) { // MI-1500 Data command
|
||||||
cmd++; // just request the next channel
|
cmd++; // just request the next channel
|
||||||
|
change = true;
|
||||||
} else if ( cmd == 0x09 ) {//MI single or dual channel device
|
} else if ( cmd == 0x09 ) {//MI single or dual channel device
|
||||||
if ( mPayload[iv->id].dataAB[CH1] && iv->type == INV_TYPE_2CH ) {
|
if ( mPayload[iv->id].dataAB[CH1] && iv->type == INV_TYPE_2CH ) {
|
||||||
if (!mPayload[iv->id].stsAB[CH2] || !mPayload[iv->id].dataAB[CH2] )
|
if (!mPayload[iv->id].stsAB[CH2] || !mPayload[iv->id].dataAB[CH2] ) {
|
||||||
cmd = 0x11;
|
cmd = 0x11;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if ( cmd == 0x11) {
|
} else if ( cmd == 0x11) {
|
||||||
if ( mPayload[iv->id].dataAB[CH2] ) { // data is there, but no status
|
if ( mPayload[iv->id].dataAB[CH2] ) { // data is there, but no status
|
||||||
if (!mPayload[iv->id].stsAB[CH1] || !mPayload[iv->id].dataAB[CH1] )
|
if (!mPayload[iv->id].stsAB[CH1] || !mPayload[iv->id].dataAB[CH1] ) {
|
||||||
cmd = 0x09;
|
cmd = 0x09;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") next request is 0x") + String(cmd, HEX));
|
DPRINT(DBG_INFO, F("(#"));
|
||||||
|
DBGPRINT(String(iv->id));
|
||||||
|
DBGPRINT(F(") "));
|
||||||
|
if (change) {
|
||||||
|
DBGPRINT(F("next request is 0x"));
|
||||||
|
} else {
|
||||||
|
DBGPRINT(F("not complete: Request Retransmit 0x"));
|
||||||
|
}
|
||||||
|
DBGPRINTLN(String(cmd, HEX));
|
||||||
//mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd, true);
|
//mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd, true);
|
||||||
mRadio->prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, true, cmd);
|
mRadio->prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, true, cmd);
|
||||||
mPayload[iv->id].txCmd = cmd;
|
mPayload[iv->id].txCmd = cmd;
|
||||||
|
@ -358,12 +398,13 @@ class MiPayload {
|
||||||
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") prepareDevInformCmd 0x") + String(mPayload[iv->id].txCmd, HEX));
|
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") prepareDevInformCmd 0x") + String(mPayload[iv->id].txCmd, HEX));
|
||||||
mRadio->prepareDevInformCmd(iv->radioId.u64, mPayload[iv->id].txCmd, mPayload[iv->id].ts, iv->alarmMesIndex, true);
|
mRadio->prepareDevInformCmd(iv->radioId.u64, mPayload[iv->id].txCmd, mPayload[iv->id].ts, iv->alarmMesIndex, true);
|
||||||
}
|
}
|
||||||
} else { // payload complete
|
}
|
||||||
|
/*else { // payload complete
|
||||||
|
//This tree is not really tested, most likely it's not truly complete....
|
||||||
DPRINTLN(DBG_INFO, F("procPyld: cmd: 0x") + String(mPayload[iv->id].txCmd, HEX));
|
DPRINTLN(DBG_INFO, F("procPyld: cmd: 0x") + String(mPayload[iv->id].txCmd, HEX));
|
||||||
DPRINTLN(DBG_INFO, F("procPyld: txid: 0x") + String(mPayload[iv->id].txId, HEX));
|
DPRINTLN(DBG_INFO, F("procPyld: txid: 0x") + String(mPayload[iv->id].txId, HEX));
|
||||||
//DPRINTLN(DBG_DEBUG, F("procPyld: max: ") + String(mPayload[iv->id].maxPackId));
|
//DPRINTLN(DBG_DEBUG, F("procPyld: max: ") + String(mPayload[iv->id].maxPackId));
|
||||||
//record_t<> *rec = iv->getRecordStruct(mPayload[iv->id].txCmd); // choose the parser
|
//record_t<> *rec = iv->getRecordStruct(mPayload[iv->id].txCmd); // choose the parser
|
||||||
|
|
||||||
mPayload[iv->id].complete = true;
|
mPayload[iv->id].complete = true;
|
||||||
uint8_t ac_pow = 0;
|
uint8_t ac_pow = 0;
|
||||||
//if (mPayload[iv->id].sts[0] == 3) {
|
//if (mPayload[iv->id].sts[0] == 3) {
|
||||||
|
@ -371,62 +412,53 @@ class MiPayload {
|
||||||
//}
|
//}
|
||||||
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser
|
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10));
|
iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10));
|
||||||
|
DPRINTLN(DBG_INFO, F("process: compl. set of msgs detected"));
|
||||||
DPRINTLN(DBG_INFO, F("proces: compl. set of msgs detected"));
|
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0));
|
iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0));
|
||||||
iv->doCalculations();
|
iv->doCalculations();
|
||||||
|
//uint8_t payload[128];
|
||||||
/*uint8_t payload[128];
|
//uint8_t payloadLen = 0;
|
||||||
uint8_t payloadLen = 0;
|
//memset(payload, 0, 128);
|
||||||
|
//for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i++) {
|
||||||
memset(payload, 0, 128);
|
// memcpy(&payload[payloadLen], mPayload[iv->id].data[i], (mPayload[iv->id].len[i]));
|
||||||
|
// payloadLen += (mPayload[iv->id].len[i]);
|
||||||
for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i++) {
|
// yield();
|
||||||
memcpy(&payload[payloadLen], mPayload[iv->id].data[i], (mPayload[iv->id].len[i]));
|
//}
|
||||||
payloadLen += (mPayload[iv->id].len[i]);
|
//payloadLen -= 2;
|
||||||
yield();
|
//if (mSerialDebug) {
|
||||||
}
|
// DPRINT(DBG_INFO, F("Payload (") + String(payloadLen) + "): ");
|
||||||
payloadLen -= 2;
|
// mSys->Radio.dumpBuf(payload, payloadLen);
|
||||||
|
//}
|
||||||
if (mSerialDebug) {
|
//if (NULL == rec) {
|
||||||
DPRINT(DBG_INFO, F("Payload (") + String(payloadLen) + "): ");
|
// DPRINTLN(DBG_ERROR, F("record is NULL!"));
|
||||||
ah::dumpBuf(payload, payloadLen);
|
//} else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) {
|
||||||
}
|
// if (mPayload[iv->id].txId == (TX_REQ_INFO + ALL_FRAMES))
|
||||||
|
// mStat->rxSuccess++;
|
||||||
if (NULL == rec) {
|
// rec->ts = mPayload[iv->id].ts;
|
||||||
DPRINTLN(DBG_ERROR, F("record is NULL!"));
|
// for (uint8_t i = 0; i < rec->length; i++) {
|
||||||
} else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) {
|
// iv->addValue(i, payload, rec);
|
||||||
if (mPayload[iv->id].txId == (TX_REQ_INFO + ALL_FRAMES))
|
// yield();
|
||||||
mStat->rxSuccess++;
|
// }
|
||||||
|
// iv->doCalculations();
|
||||||
rec->ts = mPayload[iv->id].ts;
|
// notify(mPayload[iv->id].txCmd);
|
||||||
for (uint8_t i = 0; i < rec->length; i++) {
|
// if(AlarmData == mPayload[iv->id].txCmd) {
|
||||||
iv->addValue(i, payload, rec);
|
// uint8_t i = 0;
|
||||||
yield();
|
// uint16_t code;
|
||||||
}
|
// uint32_t start, end;
|
||||||
iv->doCalculations();
|
// while(1) {
|
||||||
notify(mPayload[iv->id].txCmd);
|
// code = iv->parseAlarmLog(i++, payload, payloadLen, &start, &end);
|
||||||
|
// if(0 == code)
|
||||||
if(AlarmData == mPayload[iv->id].txCmd) {
|
// break;
|
||||||
uint8_t i = 0;
|
// if (NULL != mCbAlarm)
|
||||||
uint16_t code;
|
// (mCbAlarm)(code, start, end);
|
||||||
uint32_t start, end;
|
// yield();
|
||||||
while(1) {
|
// }
|
||||||
code = iv->parseAlarmLog(i++, payload, payloadLen, &start, &end);
|
// }
|
||||||
if(0 == code)
|
//} else {
|
||||||
break;
|
// DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes"));
|
||||||
if (NULL != mCbAlarm)
|
// mStat->rxFail++;
|
||||||
(mCbAlarm)(code, start, end);
|
//}
|
||||||
yield();
|
//iv->setQueuedCmdFinished();
|
||||||
}
|
//}*/
|
||||||
}
|
|
||||||
} else {
|
|
||||||
DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes"));
|
|
||||||
mStat->rxFail++;
|
|
||||||
}
|
|
||||||
|
|
||||||
iv->setQueuedCmdFinished(); */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
yield();
|
yield();
|
||||||
}
|
}
|
||||||
|
@ -456,29 +488,30 @@ class MiPayload {
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, status);
|
iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if ( !mPayload[iv->id].dataAB[0] || !mPayload[iv->id].dataAB[1] ) {
|
|
||||||
uint8_t cmd = mPayload[iv->id].dataAB[0] ? 0x11 : 0x09;
|
|
||||||
DPRINTLN(DBG_INFO, F("request missing status 0x") + String(cmd, HEX));
|
|
||||||
mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd);
|
|
||||||
mPayload[iv->id].txCmd = cmd;
|
|
||||||
rem: gotFragment should be a better solution
|
|
||||||
} */
|
|
||||||
|
|
||||||
if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){
|
if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){
|
||||||
iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]; // seems there's no status per channel in 3rd gen. models?!?
|
iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]; // seems there's no status per channel in 3rd gen. models?!?
|
||||||
|
|
||||||
DPRINTLN(DBG_INFO, "alarm ID incremented to " + String(iv->alarmMesIndex));
|
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") alarm ID incremented to ") + String(iv->alarmMesIndex));
|
||||||
iv->enqueCommand<InfoCommand>(AlarmData);
|
iv->enqueCommand<InfoCommand>(AlarmData);
|
||||||
}
|
}
|
||||||
|
//mPayload[iv->id].skipfirstrepeat = 1;
|
||||||
if (mPayload[iv->id].stsAB[CH0] && mPayload[iv->id].dataAB[CH0] && !mPayload[iv->id].complete) {
|
if (mPayload[iv->id].stsAB[CH0] && mPayload[iv->id].dataAB[CH0] && !mPayload[iv->id].complete) {
|
||||||
mPayload[iv->id].complete = true;
|
miComplete(iv);
|
||||||
DPRINTLN(DBG_INFO, F("rec. complete set of msgs"));
|
/*mPayload[iv->id].complete = true;
|
||||||
|
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs"));
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0));
|
iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0));
|
||||||
|
//preliminary AC calculation...
|
||||||
|
uint8_t ac_pow = 0;
|
||||||
|
//if (mPayload[iv->id].sts[0] == 3) {
|
||||||
|
ac_pow = calcPowerDcCh0(iv, 0)*9.5;
|
||||||
|
//}
|
||||||
|
iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10));
|
||||||
iv->setQueuedCmdFinished();
|
iv->setQueuedCmdFinished();
|
||||||
iv->doCalculations();
|
iv->doCalculations();
|
||||||
|
mPayload[iv->id].skipfirstrepeat = 0;
|
||||||
notify(mPayload[iv->id].txCmd);
|
notify(mPayload[iv->id].txCmd);
|
||||||
|
yield();*/
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void miDataDecode(Inverter<> *iv, packet_t *p) {
|
void miDataDecode(Inverter<> *iv, packet_t *p) {
|
||||||
|
@ -554,43 +587,30 @@ class MiPayload {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//preliminary AC calculation...
|
|
||||||
uint8_t ac_pow = 0;
|
|
||||||
//if (mPayload[iv->id].sts[0] == 3) {
|
|
||||||
ac_pow = calcPowerDcCh0(iv, 0)*9.5;
|
|
||||||
//}
|
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10));
|
|
||||||
|
|
||||||
if ( mPayload[iv->id].complete || //4ch device
|
if ( mPayload[iv->id].complete || //4ch device
|
||||||
iv->type != INV_TYPE_4CH //other devices
|
(iv->type != INV_TYPE_4CH //other devices
|
||||||
&& mPayload[iv->id].dataAB[CH0]
|
&& mPayload[iv->id].dataAB[CH0]
|
||||||
&& mPayload[iv->id].stsAB[CH0] ) {
|
&& mPayload[iv->id].stsAB[CH0])) {
|
||||||
mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short...
|
miComplete(iv);
|
||||||
DPRINTLN(DBG_INFO, F("rec. complete set of msgs"));
|
/*mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short...
|
||||||
|
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs"));
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0));
|
iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0));
|
||||||
|
//preliminary AC calculation...
|
||||||
|
uint8_t ac_pow = 0;
|
||||||
|
//if (mPayload[iv->id].sts[0] == 3) {
|
||||||
|
ac_pow = calcPowerDcCh0(iv, 0)*9.5;
|
||||||
|
//}
|
||||||
|
iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10));
|
||||||
iv->doCalculations();
|
iv->doCalculations();
|
||||||
/*} else {
|
iv->setQueuedCmdFinished();
|
||||||
//retry to get missing status info for one or two channel devices
|
mStat->rxSuccess++;
|
||||||
DPRINTLN(DBG_INFO, F("request missing data or status 0x") + String(cmd, HEX));
|
yield();
|
||||||
mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd);
|
notify(mPayload[iv->id].txCmd);*/
|
||||||
mPayload[iv->id].txCmd = cmd;
|
|
||||||
//iv->enqueCommand(cmd); // mPayload[iv->id].dataAB[1] ? 0x09 : 0x11)
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
/* should be included in process()
|
|
||||||
else if (mPayload[iv->id].txCmd == 0x09 && iv->type == INV_TYPE_2CH) {
|
|
||||||
uint8_t cmd = 0x11;
|
|
||||||
DPRINTLN(DBG_INFO, F("request second data channel 0x") + String(cmd, HEX));
|
|
||||||
mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd);
|
|
||||||
mPayload[iv->id].txCmd = cmd;
|
|
||||||
mPayload[iv->id].complete = false;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
iv->setQueuedCmdFinished();
|
|
||||||
mStat->rxSuccess++;
|
|
||||||
yield();
|
|
||||||
|
|
||||||
notify(mPayload[iv->id].txCmd);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if(AlarmData == mPayload[iv->id].txCmd) {
|
if(AlarmData == mPayload[iv->id].txCmd) {
|
||||||
|
@ -608,6 +628,24 @@ class MiPayload {
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void miComplete(Inverter<> *iv) {
|
||||||
|
mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short...
|
||||||
|
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs"));
|
||||||
|
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug);
|
||||||
|
iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0));
|
||||||
|
//preliminary AC calculation...
|
||||||
|
uint8_t ac_pow = 0;
|
||||||
|
//if (mPayload[iv->id].sts[0] == 3) {
|
||||||
|
ac_pow = calcPowerDcCh0(iv, 0)*9.5;
|
||||||
|
//}
|
||||||
|
iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10));
|
||||||
|
iv->doCalculations();
|
||||||
|
iv->setQueuedCmdFinished();
|
||||||
|
mStat->rxSuccess++;
|
||||||
|
yield();
|
||||||
|
notify(mPayload[iv->id].txCmd);
|
||||||
|
}
|
||||||
|
|
||||||
bool build(uint8_t id, bool *complete) {
|
bool build(uint8_t id, bool *complete) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("build"));
|
DPRINTLN(DBG_VERBOSE, F("build"));
|
||||||
/*uint16_t crc = 0xffff, crcRcv = 0x0000;
|
/*uint16_t crc = 0xffff, crcRcv = 0x0000;
|
||||||
|
@ -621,7 +659,7 @@ class MiPayload {
|
||||||
//uint8_t cmd = getQueuedCmd();
|
//uint8_t cmd = getQueuedCmd();
|
||||||
if(!*complete) {
|
if(!*complete) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("incomlete, txCmd is 0x") + String(txCmd, HEX)); // + F("cmd is 0x") + String(cmd, HEX));
|
DPRINTLN(DBG_VERBOSE, F("incomlete, txCmd is 0x") + String(txCmd, HEX)); // + F("cmd is 0x") + String(cmd, HEX));
|
||||||
if (txCmd == 0x09 || txCmd == 0x11 || txCmd >= 0x36 && txCmd <= 0x39 )
|
if (txCmd == 0x09 || txCmd == 0x11 || (txCmd >= 0x36 && txCmd <= 0x39))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,7 +673,6 @@ class MiPayload {
|
||||||
}
|
}
|
||||||
yield();
|
yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
return (crc == crcRcv) ? true : false;*/
|
return (crc == crcRcv) ? true : false;*/
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -655,6 +692,7 @@ class MiPayload {
|
||||||
mPayload[id].stsAB[CH1] = true; //required for 1CH and 2CH devices
|
mPayload[id].stsAB[CH1] = true; //required for 1CH and 2CH devices
|
||||||
mPayload[id].stsAB[CH2] = true; //only required for 2CH devices
|
mPayload[id].stsAB[CH2] = true; //only required for 2CH devices
|
||||||
mPayload[id].txCmd = 0;
|
mPayload[id].txCmd = 0;
|
||||||
|
mPayload[id].skipfirstrepeat = 0;
|
||||||
mPayload[id].requested = false;
|
mPayload[id].requested = false;
|
||||||
mPayload[id].ts = *mTimestamp;
|
mPayload[id].ts = *mTimestamp;
|
||||||
mPayload[id].sts[0] = 0; //disable this in case gotFragment is not working
|
mPayload[id].sts[0] = 0; //disable this in case gotFragment is not working
|
||||||
|
@ -665,28 +703,6 @@ class MiPayload {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* template<class T=uint8_t>
|
|
||||||
static T calcMiSts(Inverter<> *iv) {
|
|
||||||
if(NULL != iv) {
|
|
||||||
T result = 0;
|
|
||||||
bool stsComplete = true;
|
|
||||||
uint8_t stsCh;
|
|
||||||
for(uint8_t i = 1; i <= iv->channels; i++) {
|
|
||||||
stsCh = mPayload[iv->id].sts[i];
|
|
||||||
if (!stsCh) {
|
|
||||||
stsComplete = false;
|
|
||||||
} else if ( !result || stsCh < result ) {
|
|
||||||
result = stsCh;
|
|
||||||
if (stsComplete && stsCh > stsComplete) {
|
|
||||||
stsComplete = stsCh;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mPayload[iv->id].sts[0] = stsComplete;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
} */
|
|
||||||
|
|
||||||
IApp *mApp;
|
IApp *mApp;
|
||||||
HMSYSTEM *mSys;
|
HMSYSTEM *mSys;
|
||||||
|
|
|
@ -20,12 +20,12 @@ upload_speed = 921600
|
||||||
;build_flags =
|
;build_flags =
|
||||||
; ;;;;; Possible Debug options ;;;;;;
|
; ;;;;; Possible Debug options ;;;;;;
|
||||||
; https://docs.platformio.org/en/latest/platforms/espressif8266.html#debug-level
|
; https://docs.platformio.org/en/latest/platforms/espressif8266.html#debug-level
|
||||||
;-DDEBUG_ESP_PORT=Serial
|
;-DDEBUG_ESP_PORT=Serial
|
||||||
;-DDEBUG_ESP_CORE
|
;-DDEBUG_ESP_CORE
|
||||||
;-DDEBUG_ESP_WIFI
|
;-DDEBUG_ESP_WIFI
|
||||||
;-DDEBUG_ESP_HTTP_CLIENT
|
;-DDEBUG_ESP_HTTP_CLIENT
|
||||||
;-DDEBUG_ESP_HTTP_SERVER
|
;-DDEBUG_ESP_HTTP_SERVER
|
||||||
;-DDEBUG_ESP_OOM
|
;-DDEBUG_ESP_OOM
|
||||||
|
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
|
|
||||||
|
@ -35,18 +35,18 @@ extra_scripts =
|
||||||
|
|
||||||
lib_deps =
|
lib_deps =
|
||||||
https://github.com/yubox-node-org/ESPAsyncWebServer
|
https://github.com/yubox-node-org/ESPAsyncWebServer
|
||||||
nrf24/RF24
|
nrf24/RF24
|
||||||
paulstoffregen/Time
|
paulstoffregen/Time
|
||||||
https://github.com/bertmelis/espMqttClient#v1.3.3
|
https://github.com/bertmelis/espMqttClient#v1.4.1
|
||||||
bblanchon/ArduinoJson
|
bblanchon/ArduinoJson
|
||||||
https://github.com/JChristensen/Timezone
|
https://github.com/JChristensen/Timezone
|
||||||
olikraus/U8g2
|
olikraus/U8g2
|
||||||
zinggjm/GxEPD2@^1.5.0
|
zinggjm/GxEPD2@^1.5.0
|
||||||
;esp8266/DNSServer
|
;esp8266/DNSServer
|
||||||
;esp8266/EEPROM
|
;esp8266/EEPROM
|
||||||
;esp8266/ESP8266WiFi
|
;esp8266/ESP8266WiFi
|
||||||
;esp8266/SPI
|
;esp8266/SPI
|
||||||
;esp8266/Ticker
|
;esp8266/Ticker
|
||||||
|
|
||||||
|
|
||||||
[env:esp8266-release]
|
[env:esp8266-release]
|
||||||
|
@ -55,8 +55,20 @@ board = esp12e
|
||||||
board_build.f_cpu = 80000000L
|
board_build.f_cpu = 80000000L
|
||||||
build_flags = -D RELEASE
|
build_flags = -D RELEASE
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
;default ; Remove typical terminal control codes from input
|
;default ; Remove typical terminal control codes from input
|
||||||
;time ; Add timestamp with milliseconds for each new line
|
;time ; Add timestamp with milliseconds for each new line
|
||||||
|
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
||||||
|
esp8266_exception_decoder
|
||||||
|
|
||||||
|
|
||||||
|
[env:esp8266-release-prometheus]
|
||||||
|
platform = espressif8266
|
||||||
|
board = esp12e
|
||||||
|
board_build.f_cpu = 80000000L
|
||||||
|
build_flags = -D RELEASE -DENABLE_PROMETHEUS_EP
|
||||||
|
monitor_filters =
|
||||||
|
;default ; Remove typical terminal control codes from input
|
||||||
|
;time ; Add timestamp with milliseconds for each new line
|
||||||
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
||||||
esp8266_exception_decoder
|
esp8266_exception_decoder
|
||||||
|
|
||||||
|
@ -64,11 +76,11 @@ monitor_filters =
|
||||||
platform = espressif8266
|
platform = espressif8266
|
||||||
board = esp12e
|
board = esp12e
|
||||||
board_build.f_cpu = 80000000L
|
board_build.f_cpu = 80000000L
|
||||||
build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_OOM -DDEBUG_ESP_PORT=Serial
|
build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_OOM -DDEBUG_ESP_PORT=Serial -DPIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48
|
||||||
build_type = debug
|
build_type = debug
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
;default ; Remove typical terminal control codes from input
|
;default ; Remove typical terminal control codes from input
|
||||||
time ; Add timestamp with milliseconds for each new line
|
time ; Add timestamp with milliseconds for each new line
|
||||||
log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
||||||
|
|
||||||
[env:esp8285-release]
|
[env:esp8285-release]
|
||||||
|
@ -78,8 +90,8 @@ board_build.ldscript = eagle.flash.1m64.ld
|
||||||
board_build.f_cpu = 80000000L
|
board_build.f_cpu = 80000000L
|
||||||
build_flags = -D RELEASE
|
build_flags = -D RELEASE
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
;default ; Remove typical terminal control codes from input
|
;default ; Remove typical terminal control codes from input
|
||||||
time ; Add timestamp with milliseconds for each new line
|
time ; Add timestamp with milliseconds for each new line
|
||||||
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
||||||
|
|
||||||
[env:esp8285-debug]
|
[env:esp8285-debug]
|
||||||
|
@ -90,8 +102,8 @@ board_build.f_cpu = 80000000L
|
||||||
build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_OOM -DDEBUG_ESP_PORT=Serial
|
build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_OOM -DDEBUG_ESP_PORT=Serial
|
||||||
build_type = debug
|
build_type = debug
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
;default ; Remove typical terminal control codes from input
|
;default ; Remove typical terminal control codes from input
|
||||||
time ; Add timestamp with milliseconds for each new line
|
time ; Add timestamp with milliseconds for each new line
|
||||||
log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
||||||
|
|
||||||
[env:esp32-wroom32-release]
|
[env:esp32-wroom32-release]
|
||||||
|
@ -100,8 +112,19 @@ board = lolin_d32
|
||||||
build_flags = -D RELEASE -std=gnu++14
|
build_flags = -D RELEASE -std=gnu++14
|
||||||
build_unflags = -std=gnu++11
|
build_unflags = -std=gnu++11
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
;default ; Remove typical terminal control codes from input
|
;default ; Remove typical terminal control codes from input
|
||||||
;time ; Add timestamp with milliseconds for each new line
|
;time ; Add timestamp with milliseconds for each new line
|
||||||
|
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
||||||
|
esp32_exception_decoder
|
||||||
|
|
||||||
|
[env:esp32-wroom32-release-prometheus]
|
||||||
|
platform = espressif32
|
||||||
|
board = lolin_d32
|
||||||
|
build_flags = -D RELEASE -std=gnu++14 -DENABLE_PROMETHEUS_EP
|
||||||
|
build_unflags = -std=gnu++11
|
||||||
|
monitor_filters =
|
||||||
|
;default ; Remove typical terminal control codes from input
|
||||||
|
;time ; Add timestamp with milliseconds for each new line
|
||||||
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
||||||
esp32_exception_decoder
|
esp32_exception_decoder
|
||||||
|
|
||||||
|
@ -112,6 +135,6 @@ build_flags = -DDEBUG_LEVEL=DBG_DEBUG -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_
|
||||||
build_unflags = -std=gnu++11
|
build_unflags = -std=gnu++11
|
||||||
build_type = debug
|
build_type = debug
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
;default ; Remove typical terminal control codes from input
|
;default ; Remove typical terminal control codes from input
|
||||||
time ; Add timestamp with milliseconds for each new line
|
time ; Add timestamp with milliseconds for each new line
|
||||||
log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
|
||||||
|
|
|
@ -42,6 +42,7 @@ class Display {
|
||||||
}
|
}
|
||||||
|
|
||||||
void tickerSecond() {
|
void tickerSecond() {
|
||||||
|
loop();
|
||||||
if (mNewPayload || ((++mLoopCnt % 10) == 0)) {
|
if (mNewPayload || ((++mLoopCnt % 10) == 0)) {
|
||||||
mNewPayload = false;
|
mNewPayload = false;
|
||||||
mLoopCnt = 0;
|
mLoopCnt = 0;
|
||||||
|
@ -79,7 +80,7 @@ class Display {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((1 < mCfg->type) && (mCfg->type < 10)) {
|
if ((1 < mCfg->type) && (mCfg->type < 10)) {
|
||||||
mMono.loop(totalPower, totalYieldDay, totalYieldTotal, isprod);
|
mMono.disp(totalPower, totalYieldDay, totalYieldTotal, isprod);
|
||||||
} else if (mCfg->type >= 10) {
|
} else if (mCfg->type >= 10) {
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
mEpaper.loop(totalPower, totalYieldDay, totalYieldTotal, isprod);
|
mEpaper.loop(totalPower, totalYieldDay, totalYieldTotal, isprod);
|
||||||
|
|
|
@ -22,6 +22,7 @@ DisplayMono::DisplayMono() {
|
||||||
_dispY = 0;
|
_dispY = 0;
|
||||||
mTimeout = DISP_DEFAULT_TIMEOUT; // interval at which to power save (milliseconds)
|
mTimeout = DISP_DEFAULT_TIMEOUT; // interval at which to power save (milliseconds)
|
||||||
mUtcTs = NULL;
|
mUtcTs = NULL;
|
||||||
|
mType = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,17 +30,18 @@ DisplayMono::DisplayMono() {
|
||||||
void DisplayMono::init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char* version) {
|
void DisplayMono::init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char* version) {
|
||||||
if ((0 < type) && (type < 4)) {
|
if ((0 < type) && (type < 4)) {
|
||||||
u8g2_cb_t *rot = (u8g2_cb_t *)((rot != 0x00) ? U8G2_R2 : U8G2_R0);
|
u8g2_cb_t *rot = (u8g2_cb_t *)((rot != 0x00) ? U8G2_R2 : U8G2_R0);
|
||||||
|
mType = type;
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case 1:
|
case 1:
|
||||||
mDisplay = new U8G2_PCD8544_84X48_F_4W_HW_SPI(rot, cs, dc, reset);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
mDisplay = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rot, reset, clock, data);
|
mDisplay = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rot, reset, clock, data);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
case 3:
|
case 2:
|
||||||
mDisplay = new U8G2_SH1106_128X64_NONAME_F_HW_I2C(rot, reset, clock, data);
|
mDisplay = new U8G2_SH1106_128X64_NONAME_F_HW_I2C(rot, reset, clock, data);
|
||||||
break;
|
break;
|
||||||
|
case 3:
|
||||||
|
mDisplay = new U8G2_PCD8544_84X48_F_4W_SW_SPI(rot, clock, data, cs, dc, reset);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mUtcTs = utcTs;
|
mUtcTs = utcTs;
|
||||||
|
@ -50,7 +52,8 @@ void DisplayMono::init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_
|
||||||
calcLineHeights();
|
calcLineHeights();
|
||||||
|
|
||||||
mDisplay->clearBuffer();
|
mDisplay->clearBuffer();
|
||||||
mDisplay->setContrast(mLuminance);
|
if (3 != mType)
|
||||||
|
mDisplay->setContrast(mLuminance);
|
||||||
printText("AHOY!", 0, 35);
|
printText("AHOY!", 0, 35);
|
||||||
printText("ahoydtu.de", 2, 20);
|
printText("ahoydtu.de", 2, 20);
|
||||||
printText(version, 3, 46);
|
printText(version, 3, 46);
|
||||||
|
@ -64,15 +67,20 @@ void DisplayMono::config(bool enPowerSafe, bool enScreenSaver, uint8_t lum) {
|
||||||
mLuminance = lum;
|
mLuminance = lum;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayMono::loop(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) {
|
void DisplayMono::loop(void) {
|
||||||
if (mEnPowerSafe)
|
if (mEnPowerSafe)
|
||||||
if(mTimeout != 0)
|
if(mTimeout != 0)
|
||||||
mTimeout--;
|
mTimeout--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayMono::disp(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) {
|
||||||
|
|
||||||
|
|
||||||
mDisplay->clearBuffer();
|
mDisplay->clearBuffer();
|
||||||
|
|
||||||
// set Contrast of the Display to raise the lifetime
|
// set Contrast of the Display to raise the lifetime
|
||||||
mDisplay->setContrast(mLuminance);
|
if (3 != mType)
|
||||||
|
mDisplay->setContrast(mLuminance);
|
||||||
|
|
||||||
if ((totalPower > 0) && (isprod > 0)) {
|
if ((totalPower > 0) && (isprod > 0)) {
|
||||||
mTimeout = DISP_DEFAULT_TIMEOUT;
|
mTimeout = DISP_DEFAULT_TIMEOUT;
|
||||||
|
@ -144,6 +152,6 @@ void DisplayMono::printText(const char* text, uint8_t line, uint8_t dispX) {
|
||||||
}
|
}
|
||||||
setFont(line);
|
setFont(line);
|
||||||
|
|
||||||
dispX += (mEnPowerSafe) ? (_mExtra % 7) : 0;
|
dispX += (mEnScreenSaver) ? (_mExtra % 7) : 0;
|
||||||
mDisplay->drawStr(dispX, mLineOffsets[line], text);
|
mDisplay->drawStr(dispX, mLineOffsets[line], text);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,8 @@ class DisplayMono {
|
||||||
|
|
||||||
void init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char* version);
|
void init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char* version);
|
||||||
void config(bool enPowerSafe, bool enScreenSaver, uint8_t lum);
|
void config(bool enPowerSafe, bool enScreenSaver, uint8_t lum);
|
||||||
void loop(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod);
|
void loop(void);
|
||||||
|
void disp(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void calcLineHeights();
|
void calcLineHeights();
|
||||||
|
@ -20,6 +21,7 @@ class DisplayMono {
|
||||||
|
|
||||||
U8G2* mDisplay;
|
U8G2* mDisplay;
|
||||||
|
|
||||||
|
uint8_t mType;
|
||||||
bool mEnPowerSafe, mEnScreenSaver;
|
bool mEnPowerSafe, mEnScreenSaver;
|
||||||
uint8_t mLuminance;
|
uint8_t mLuminance;
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,16 @@ class PubMqtt {
|
||||||
|
|
||||||
if((strlen(mCfgMqtt->user) > 0) && (strlen(mCfgMqtt->pwd) > 0))
|
if((strlen(mCfgMqtt->user) > 0) && (strlen(mCfgMqtt->pwd) > 0))
|
||||||
mClient.setCredentials(mCfgMqtt->user, mCfgMqtt->pwd);
|
mClient.setCredentials(mCfgMqtt->user, mCfgMqtt->pwd);
|
||||||
snprintf(mClientId, 24, "%s-%s%s%s", mDevName, WiFi.macAddress().substring(9,11).c_str(), WiFi.macAddress().substring(12,14).c_str(), WiFi.macAddress().substring(15,17).c_str());
|
snprintf(mClientId, 26, "%s-", mDevName);
|
||||||
|
uint8_t pos = strlen(mClientId);
|
||||||
|
mClientId[pos++] = WiFi.macAddress().substring( 9, 10).c_str()[0];
|
||||||
|
mClientId[pos++] = WiFi.macAddress().substring(10, 11).c_str()[0];
|
||||||
|
mClientId[pos++] = WiFi.macAddress().substring(12, 13).c_str()[0];
|
||||||
|
mClientId[pos++] = WiFi.macAddress().substring(13, 14).c_str()[0];
|
||||||
|
mClientId[pos++] = WiFi.macAddress().substring(15, 16).c_str()[0];
|
||||||
|
mClientId[pos++] = WiFi.macAddress().substring(16, 17).c_str()[0];
|
||||||
|
mClientId[pos++] = '\0';
|
||||||
|
|
||||||
mClient.setClientId(mClientId);
|
mClient.setClientId(mClientId);
|
||||||
mClient.setServer(mCfgMqtt->broker, mCfgMqtt->port);
|
mClient.setServer(mCfgMqtt->broker, mCfgMqtt->port);
|
||||||
mClient.setWill(mLwtTopic, QOS_0, true, mqttStr[MQTT_STR_LWT_NOT_CONN]);
|
mClient.setWill(mLwtTopic, QOS_0, true, mqttStr[MQTT_STR_LWT_NOT_CONN]);
|
||||||
|
@ -560,11 +569,13 @@ class PubMqtt {
|
||||||
|
|
||||||
if (sendTotals) {
|
if (sendTotals) {
|
||||||
uint8_t fieldId;
|
uint8_t fieldId;
|
||||||
|
bool retained = true;
|
||||||
for (uint8_t i = 0; i < 4; i++) {
|
for (uint8_t i = 0; i < 4; i++) {
|
||||||
switch (i) {
|
switch (i) {
|
||||||
default:
|
default:
|
||||||
case 0:
|
case 0:
|
||||||
fieldId = FLD_PAC;
|
fieldId = FLD_PAC;
|
||||||
|
retained = false;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
fieldId = FLD_YT;
|
fieldId = FLD_YT;
|
||||||
|
@ -574,11 +585,12 @@ class PubMqtt {
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
fieldId = FLD_PDC;
|
fieldId = FLD_PDC;
|
||||||
|
retained = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
snprintf(topic, 32 + MAX_NAME_LENGTH, "total/%s", fields[fieldId]);
|
snprintf(topic, 32 + MAX_NAME_LENGTH, "total/%s", fields[fieldId]);
|
||||||
snprintf(val, 40, "%g", ah::round3(total[i]));
|
snprintf(val, 40, "%g", ah::round3(total[i]));
|
||||||
publish(topic, val, true);
|
publish(topic, val, retained);
|
||||||
}
|
}
|
||||||
RTRDataHasBeenSent = true;
|
RTRDataHasBeenSent = true;
|
||||||
yield();
|
yield();
|
||||||
|
@ -610,7 +622,7 @@ class PubMqtt {
|
||||||
// last will topic and payload must be available trough lifetime of 'espMqttClient'
|
// last will topic and payload must be available trough lifetime of 'espMqttClient'
|
||||||
char mLwtTopic[MQTT_TOPIC_LEN+5];
|
char mLwtTopic[MQTT_TOPIC_LEN+5];
|
||||||
const char *mDevName, *mVersion;
|
const char *mDevName, *mVersion;
|
||||||
char mClientId[24]; // number of chars is limited to 23 up to v3.1 of MQTT
|
char mClientId[26]; // number of chars is limited to 23 up to v3.1 of MQTT
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*__PUB_MQTT_H__*/
|
#endif /*__PUB_MQTT_H__*/
|
||||||
|
|
|
@ -306,8 +306,8 @@ class RestApi {
|
||||||
|
|
||||||
for(uint8_t j = 0; j < iv->channels; j ++) {
|
for(uint8_t j = 0; j < iv->channels; j ++) {
|
||||||
obj2[F("ch_yield_cor")][j] = iv->config->yieldCor[j];
|
obj2[F("ch_yield_cor")][j] = iv->config->yieldCor[j];
|
||||||
obj2[F("ch_max_power")][j] = iv->config->chMaxPwr[j];
|
|
||||||
obj2[F("ch_name")][j] = iv->config->chName[j];
|
obj2[F("ch_name")][j] = iv->config->chName[j];
|
||||||
|
obj2[F("ch_max_pwr")][j] = iv->config->chMaxPwr[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -345,6 +345,7 @@ class RestApi {
|
||||||
// DC
|
// DC
|
||||||
for(uint8_t j = 0; j < iv->channels; j ++) {
|
for(uint8_t j = 0; j < iv->channels; j ++) {
|
||||||
obj[F("ch_name")][j+1] = iv->config->chName[j];
|
obj[F("ch_name")][j+1] = iv->config->chName[j];
|
||||||
|
obj[F("ch_max_pwr")][j+1] = iv->config->chMaxPwr[j];
|
||||||
JsonArray cur = ch.createNestedArray();
|
JsonArray cur = ch.createNestedArray();
|
||||||
for (uint8_t fld = 0; fld < sizeof(dcList); fld++) {
|
for (uint8_t fld = 0; fld < sizeof(dcList); fld++) {
|
||||||
pos = (iv->getPosByChFld((j+1), dcList[fld], rec));
|
pos = (iv->getPosByChFld((j+1), dcList[fld], rec));
|
||||||
|
@ -419,12 +420,12 @@ class RestApi {
|
||||||
obj[F("disp_pxshift")] = (bool)mConfig->plugin.display.pxShift;
|
obj[F("disp_pxshift")] = (bool)mConfig->plugin.display.pxShift;
|
||||||
obj[F("disp_rot")] = (uint8_t)mConfig->plugin.display.rot;
|
obj[F("disp_rot")] = (uint8_t)mConfig->plugin.display.rot;
|
||||||
obj[F("disp_cont")] = (uint8_t)mConfig->plugin.display.contrast;
|
obj[F("disp_cont")] = (uint8_t)mConfig->plugin.display.contrast;
|
||||||
obj[F("disp_clk")] = mConfig->plugin.display.disp_clk;
|
obj[F("disp_clk")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_clk;
|
||||||
obj[F("disp_data")] = mConfig->plugin.display.disp_data;
|
obj[F("disp_data")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_data;
|
||||||
obj[F("disp_cs")] = mConfig->plugin.display.disp_cs;
|
obj[F("disp_cs")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_cs;
|
||||||
obj[F("disp_dc")] = mConfig->plugin.display.disp_dc;
|
obj[F("disp_dc")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_dc;
|
||||||
obj[F("disp_rst")] = mConfig->plugin.display.disp_reset;
|
obj[F("disp_rst")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_reset;
|
||||||
obj[F("disp_bsy")] = mConfig->plugin.display.disp_busy;
|
obj[F("disp_bsy")] = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : mConfig->plugin.display.disp_busy;
|
||||||
}
|
}
|
||||||
|
|
||||||
void getIndex(JsonObject obj) {
|
void getIndex(JsonObject obj) {
|
||||||
|
|
|
@ -140,6 +140,10 @@
|
||||||
<div class="col-12 col-sm-3"></div>
|
<div class="col-12 col-sm-3"></div>
|
||||||
<div class="col-12 col-sm-9"><input type="button" id="btnAdd" class="btn" value="Add Inverter"/></div>
|
<div class="col-12 col-sm-9"><input type="button" id="btnAdd" class="btn" value="Add Inverter"/></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-12 col-sm-3"><p class="subdes">Note</p></div>
|
||||||
|
<div class="col-12 col-sm-9"><p>A 'max module power' value of '0' disables the channel in 'live' view</p></div>
|
||||||
|
</div>
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<div class="col-12 col-sm-3"><p class="subdes">General</p></div>
|
<div class="col-12 col-sm-3"><p class="subdes">General</p></div>
|
||||||
<div class="col-12 col-sm-9"></div>
|
<div class="col-12 col-sm-9"></div>
|
||||||
|
@ -507,7 +511,7 @@
|
||||||
iv.append(mlE("Name*", inp(id + "Name", obj["name"], 16, ["text"], null, "text", "[A-Za-z0-9./#$%&=+_-]+", "Invalid input")));
|
iv.append(mlE("Name*", inp(id + "Name", obj["name"], 16, ["text"], null, "text", "[A-Za-z0-9./#$%&=+_-]+", "Invalid input")));
|
||||||
|
|
||||||
for(var j of [
|
for(var j of [
|
||||||
["ModPwr", "ch_max_power", "Max Module Power (Wp)", 4, "[0-9]+"],
|
["ModPwr", "ch_max_pwr", "Max Module Power (Wp)", 4, "[0-9]+"],
|
||||||
["ModName", "ch_name", "Module Name", 15, null],
|
["ModName", "ch_name", "Module Name", 15, null],
|
||||||
["YieldCor", "ch_yield_cor", "Yield Total Correction [kWh]", 8, "[0-9-]+"]]) {
|
["YieldCor", "ch_yield_cor", "Yield Total Correction [kWh]", 8, "[0-9-]+"]]) {
|
||||||
|
|
||||||
|
@ -662,7 +666,7 @@
|
||||||
var e = document.getElementById("dispPins");
|
var e = document.getElementById("dispPins");
|
||||||
pins = [['clock', 'disp_clk'], ['data', 'disp_data'], ['cs', 'disp_cs'], ['dc', 'disp_dc'], ['reset', 'disp_rst'], ['busy', 'disp_bsy']];
|
pins = [['clock', 'disp_clk'], ['data', 'disp_data'], ['cs', 'disp_cs'], ['dc', 'disp_dc'], ['reset', 'disp_rst'], ['busy', 'disp_bsy']];
|
||||||
for(p of pins) {
|
for(p of pins) {
|
||||||
if(("ESP8266" == type) && p[0] == "cs")
|
if(("ESP8266" == type) && p[0] == "busy")
|
||||||
break;
|
break;
|
||||||
e.append(
|
e.append(
|
||||||
ml("div", {class: "row mb-3"}, [
|
ml("div", {class: "row mb-3"}, [
|
||||||
|
@ -674,11 +678,9 @@
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
var opts = [[0, "None"], [2, "SSD1306 0.96\""], [3, "SH1106 1.3\""]];
|
var opts = [[0, "None"], [1, "SSD1306 0.96\""], [2, "SH1106 1.3\""], [3, "Nokia5110"]];
|
||||||
if("ESP32" == type) {
|
if("ESP32" == type)
|
||||||
opts.push([1, "Nokia5110"]);
|
|
||||||
opts.push([10, "ePaper"]);
|
opts.push([10, "ePaper"]);
|
||||||
}
|
|
||||||
document.getElementById("dispType").append(
|
document.getElementById("dispType").append(
|
||||||
ml("div", {class: "row mb-3"}, [
|
ml("div", {class: "row mb-3"}, [
|
||||||
ml("div", {class: "col-12 col-sm-3 my-2"}, "Type"),
|
ml("div", {class: "col-12 col-sm-3 my-2"}, "Type"),
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
return ml("div", {class: "col-6 col-sm-4 a-c"}, [
|
return ml("div", {class: "col-6 col-sm-4 a-c"}, [
|
||||||
ml("div", {class: "row"},
|
ml("div", {class: "row"},
|
||||||
ml("div", {class: "col"}, [
|
ml("div", {class: "col"}, [
|
||||||
ml("span", {class: "fs-5 fs-md-4"}, String(val)),
|
ml("span", {class: "fs-5 fs-md-4"}, String(Math.round(val * 100) / 100)),
|
||||||
ml("span", {class: "fs-6 fs-md-7 mx-1"}, unit)
|
ml("span", {class: "fs-6 fs-md-7 mx-1"}, unit)
|
||||||
])),
|
])),
|
||||||
ml("div", {class: "row"},
|
ml("div", {class: "row"},
|
||||||
|
@ -49,7 +49,7 @@
|
||||||
return ml("div", {class: "col-6 col-sm-4 col-md-3 mb-2"}, [
|
return ml("div", {class: "col-6 col-sm-4 col-md-3 mb-2"}, [
|
||||||
ml("div", {class: "row"},
|
ml("div", {class: "row"},
|
||||||
ml("div", {class: "col"}, [
|
ml("div", {class: "col"}, [
|
||||||
ml("span", {class: "fs-6"}, String(val)),
|
ml("span", {class: "fs-6"}, String(Math.round(val * 100) / 100)),
|
||||||
ml("span", {class: "fs-8 mx-1"}, unit)
|
ml("span", {class: "fs-8 mx-1"}, unit)
|
||||||
])),
|
])),
|
||||||
ml("div", {class: "row"},
|
ml("div", {class: "row"},
|
||||||
|
@ -94,7 +94,7 @@
|
||||||
total[3] += obj.ch[0][8]; // P_DC
|
total[3] += obj.ch[0][8]; // P_DC
|
||||||
total[4] += obj.ch[0][10]; // Q_AC
|
total[4] += obj.ch[0][10]; // Q_AC
|
||||||
var t = span(" ° C");
|
var t = span(" ° C");
|
||||||
return ml("div", {class: "row"},
|
return ml("div", {class: "row mt-2"},
|
||||||
ml("div", {class: "col"}, [
|
ml("div", {class: "col"}, [
|
||||||
ml("div", {class: "p-2 iv-h"},
|
ml("div", {class: "p-2 iv-h"},
|
||||||
ml("div", {class: "row"}, [
|
ml("div", {class: "row"}, [
|
||||||
|
@ -116,7 +116,7 @@
|
||||||
numMid(obj.ch[0][1], "A", "Current"),
|
numMid(obj.ch[0][1], "A", "Current"),
|
||||||
numMid(obj.ch[0][3], "Hz", "Frequency"),
|
numMid(obj.ch[0][3], "Hz", "Frequency"),
|
||||||
numMid(obj.ch[0][9], "%", "Efficiency"),
|
numMid(obj.ch[0][9], "%", "Efficiency"),
|
||||||
numMid(obj.ch[0][10], "VAr", "Reactive Power"),
|
numMid(obj.ch[0][10], "var", "Reactive Power"),
|
||||||
numMid(obj.ch[0][4], "", "Power Factor")
|
numMid(obj.ch[0][4], "", "Power Factor")
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
@ -128,7 +128,7 @@
|
||||||
return ml("div", {class: "col-12 col-sm-6 col-md-12 mb-2"}, [
|
return ml("div", {class: "col-12 col-sm-6 col-md-12 mb-2"}, [
|
||||||
ml("div", {class: "row"},
|
ml("div", {class: "row"},
|
||||||
ml("div", {class: "col"}, [
|
ml("div", {class: "col"}, [
|
||||||
ml("span", {class: "fs-6 fs-md-7"}, String(val)),
|
ml("span", {class: "fs-6 fs-md-7"}, String(Math.round(val * 100) / 100)),
|
||||||
ml("span", {class: "fs-8 mx-2"}, unit)
|
ml("span", {class: "fs-8 mx-2"}, unit)
|
||||||
])),
|
])),
|
||||||
ml("div", {class: "row"},
|
ml("div", {class: "row"},
|
||||||
|
@ -182,7 +182,8 @@
|
||||||
var name = obj.ch_name[i];
|
var name = obj.ch_name[i];
|
||||||
if(name.length == 0)
|
if(name.length == 0)
|
||||||
name = "CHANNEL " + i;
|
name = "CHANNEL " + i;
|
||||||
chn.push(ch(name, obj.ch[i]));
|
if(obj.ch_max_pwr[i] > 0) // show channel only if max mod pwr
|
||||||
|
chn.push(ch(name, obj.ch[i]));
|
||||||
}
|
}
|
||||||
mIvHtml.push(
|
mIvHtml.push(
|
||||||
ml("div", {}, [
|
ml("div", {}, [
|
||||||
|
@ -216,9 +217,10 @@
|
||||||
mNum = 0;
|
mNum = 0;
|
||||||
total.fill(0);
|
total.fill(0);
|
||||||
for(var i = 0; i < obj.iv.length; i++) {
|
for(var i = 0; i < obj.iv.length; i++) {
|
||||||
if(obj.iv[i])
|
if(obj.iv[i]) {
|
||||||
getAjax("/api/inverter/id/" + i, parseIv);
|
getAjax("/api/inverter/id/" + i, parseIv);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
document.getElementById("refresh").innerHTML = obj["refresh"];
|
document.getElementById("refresh").innerHTML = obj["refresh"];
|
||||||
if(true == exeOnce) {
|
if(true == exeOnce) {
|
||||||
|
|
|
@ -589,13 +589,13 @@ class Web {
|
||||||
mConfig->plugin.display.pxShift = (request->arg("disp_pxshift") == "on");
|
mConfig->plugin.display.pxShift = (request->arg("disp_pxshift") == "on");
|
||||||
mConfig->plugin.display.rot = request->arg("disp_rot").toInt();
|
mConfig->plugin.display.rot = request->arg("disp_rot").toInt();
|
||||||
mConfig->plugin.display.type = request->arg("disp_typ").toInt();
|
mConfig->plugin.display.type = request->arg("disp_typ").toInt();
|
||||||
mConfig->plugin.display.contrast = request->arg("disp_cont").toInt();
|
mConfig->plugin.display.contrast = (mConfig->plugin.display.type == 0) ? 60 : request->arg("disp_cont").toInt();
|
||||||
mConfig->plugin.display.disp_data = request->arg("disp_data").toInt();
|
mConfig->plugin.display.disp_data = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : request->arg("disp_data").toInt();
|
||||||
mConfig->plugin.display.disp_clk = request->arg("disp_clk").toInt();
|
mConfig->plugin.display.disp_clk = (mConfig->plugin.display.type == 0) ? DEF_PIN_OFF : request->arg("disp_clk").toInt();
|
||||||
mConfig->plugin.display.disp_cs = request->arg("disp_cs").toInt();
|
mConfig->plugin.display.disp_cs = (mConfig->plugin.display.type < 3) ? DEF_PIN_OFF : request->arg("disp_cs").toInt();
|
||||||
mConfig->plugin.display.disp_reset = request->arg("disp_rst").toInt();
|
mConfig->plugin.display.disp_reset = (mConfig->plugin.display.type < 3) ? DEF_PIN_OFF : request->arg("disp_rst").toInt();
|
||||||
mConfig->plugin.display.disp_busy = request->arg("disp_bsy").toInt();
|
mConfig->plugin.display.disp_dc = (mConfig->plugin.display.type < 3) ? DEF_PIN_OFF : request->arg("disp_dc").toInt();
|
||||||
mConfig->plugin.display.disp_dc = request->arg("disp_dc").toInt();
|
mConfig->plugin.display.disp_busy = (mConfig->plugin.display.type < 10) ? DEF_PIN_OFF : request->arg("disp_bsy").toInt();
|
||||||
|
|
||||||
mApp->saveSettings();
|
mApp->saveSettings();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue