diff --git a/tools/esp8266/app.cpp b/tools/esp8266/app.cpp index 62636ff0..a2ffc7ec 100644 --- a/tools/esp8266/app.cpp +++ b/tools/esp8266/app.cpp @@ -566,6 +566,11 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) { // uint16_t power_factor = std::stoi(strtok(NULL, "/")); DPRINTLN(DBG_INFO, F("Set Power Factor not implemented for inverter ") + String(iv->id) ); break; + case CleanState_LockAndAlarm: // Clean lock & alarm (+ reboot) + iv->devControlCmd = CleanState_LockAndAlarm; + DPRINTLN(DBG_INFO, F("Clean lock & alarm (+ reboot) for inverter ") + String(iv->id) ); + iv->devControlRequest = true; + break; default: DPRINTLN(DBG_INFO, "Not implemented"); break; diff --git a/tools/esp8266/hmDefines.h b/tools/esp8266/hmDefines.h index c9616228..982d70c8 100644 --- a/tools/esp8266/hmDefines.h +++ b/tools/esp8266/hmDefines.h @@ -26,9 +26,14 @@ enum {FLD_UDC = 0, FLD_IDC, FLD_PDC, FLD_YD, FLD_YW, FLD_YT, FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_T, FLD_PFC, FLD_EFF, FLD_IRR, FLD_PRA,FLD_ALARM_MES_ID,FLD_FW_VERSION,FLD_FW_BUILD_YEAR, FLD_FW_BUILD_MONTH_DAY,FLD_HW_ID,FLD_ACT_PWR_LIMIT,FLD_LAST_ALARM_CODE}; + +enum {FLD_UDC = 0, FLD_IDC, FLD_PDC, FLD_YD, FLD_YW, FLD_YT, + FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_T, FLD_PF, FLD_EFF, + FLD_IRR, FLD_Q,FLD_ALARM_MES_CNT,FLD_FW_VERSION,FLD_FW_BUILD_YEAR, + FLD_FW_BUILD_MONTH_DAY,FLD_HW_ID,FLD_ACT_PWR_LIMIT,FLD_LAST_ALARM_CODE}; const char* const fields[] = {"U_DC", "I_DC", "P_DC", "YieldDay", "YieldWeek", "YieldTotal", - "U_AC", "I_AC", "P_AC", "Freq", "Temp", "PFC", "Efficiency", "Irradiation","P_ACr", + "U_AC", "I_AC", "P_AC", "F_AC", "Temp", "PF_AC", "Efficiency", "Irradiation","Q_AC", "ALARM_MES_ID","FWVersion","FWBuildYear","FWBuildMonthDay","HWPartId","PowerLimit","LastAlarmCode"}; const char* const notAvail = "n/a"; @@ -54,7 +59,7 @@ const byteAssign_fieldDeviceClass deviceFieldAssignment[] = { {FLD_PAC, DEVICE_CLS_PWR, STATE_CLS_MEASUREMENT}, {FLD_F, DEVICE_CLS_FREQ, STATE_CLS_NONE}, {FLD_T, DEVICE_CLS_TEMP, STATE_CLS_MEASUREMENT}, - {FLD_PFC, DEVICE_CLS_NONE, STATE_CLS_NONE}, + {FLD_PF, DEVICE_CLS_NONE, STATE_CLS_NONE}, {FLD_EFF, DEVICE_CLS_NONE, STATE_CLS_NONE}, {FLD_IRR, DEVICE_CLS_NONE, STATE_CLS_NONE} }; @@ -123,8 +128,9 @@ const byteAssign_t hm1chAssignment[] = { { FLD_UAC, UNIT_V, CH0, 14, 2, 10 }, { FLD_IAC, UNIT_A, CH0, 22, 2, 100 }, { FLD_PAC, UNIT_W, CH0, 18, 2, 10 }, - { FLD_PRA, UNIT_VA, CH0, 20, 2, 10 }, + { FLD_Q, UNIT_VA, CH0, 20, 2, 10 }, { FLD_F, UNIT_HZ, CH0, 16, 2, 100 }, + { FLD_PF, UNIT_NONE,CH0, 24, 2, 1000 }, { FLD_PFC, UNIT_PCT, CH0, 24, 2, 10 }, { FLD_T, UNIT_C, CH0, 26, 2, 10 }, { FLD_ALARM_MES_ID, UNIT_NONE, CH0, 28, 2, 1 }, @@ -157,11 +163,11 @@ const byteAssign_t hm2chAssignment[] = { { FLD_UAC, UNIT_V, CH0, 26, 2, 10 }, { FLD_IAC, UNIT_A, CH0, 34, 2, 100 }, { FLD_PAC, UNIT_W, CH0, 30, 2, 10 }, - { FLD_PRA, UNIT_VA, CH0, 32, 2, 10 }, + { FLD_Q, UNIT_VA, CH0, 32, 2, 10 }, { FLD_F, UNIT_HZ, CH0, 28, 2, 100 }, - { FLD_PFC, UNIT_PCT, CH0, 36, 2, 10 }, + { FLD_PF, UNIT_NONE,CH0, 36, 2, 1000 }, { FLD_T, UNIT_C, CH0, 38, 2, 10 }, - { FLD_ALARM_MES_ID, UNIT_NONE, CH0, 40, 2, 1 }, // -> ALARM_MES_CNT??? + { FLD_ALARM_MES_CNT, UNIT_NONE, CH0, 40, 2, 1 }, { FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC }, { FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC }, { FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC }, @@ -206,11 +212,11 @@ const byteAssign_t hm4chAssignment[] = { { FLD_UAC, UNIT_V, CH0, 46, 2, 10 }, { FLD_IAC, UNIT_A, CH0, 54, 2, 100 }, { FLD_PAC, UNIT_W, CH0, 50, 2, 10 }, - { FLD_PRA, UNIT_VA, CH0, 52, 2, 10 }, + { FLD_Q, UNIT_VA, CH0, 52, 2, 10 }, { FLD_F, UNIT_HZ, CH0, 48, 2, 100 }, - { FLD_PFC, UNIT_PCT, CH0, 56, 2, 10 }, + { FLD_PF, UNIT_NONE,CH0, 56, 2, 1000 }, { FLD_T, UNIT_C, CH0, 58, 2, 10 }, - { FLD_ALARM_MES_ID, UNIT_NONE, CH0, 60, 2, 1 }, + { FLD_ALARM_MES_CNT, UNIT_NONE, CH0, 60, 2, 1 }, { FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC }, { FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC }, { FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC }, diff --git a/tools/esp8266/hmInverter.h b/tools/esp8266/hmInverter.h index 08b13c80..8d26838e 100644 --- a/tools/esp8266/hmInverter.h +++ b/tools/esp8266/hmInverter.h @@ -253,7 +253,7 @@ class Inverter { DPRINTLN(DBG_VERBOSE, "add real time"); // get last alarm message index and save it in the inverter object - if (getPosByChFld(0, FLD_ALARM_MES_ID, rec) == pos){ + if (getPosByChFld(0, FLD_ALARM_MES_CNT, rec) == pos){ if (alarmMesIndex < rec->record[pos]){ alarmMesIndex = rec->record[pos]; //enqueCommand(AlarmUpdate); // What is the function of AlarmUpdate? diff --git a/tools/esp8266/hmRadio.h b/tools/esp8266/hmRadio.h index 6a09f6a2..fcaa10bf 100644 --- a/tools/esp8266/hmRadio.h +++ b/tools/esp8266/hmRadio.h @@ -165,22 +165,26 @@ class HmRadio { void sendControlPacket(uint64_t invId, uint8_t cmd, uint16_t *data) { DPRINTLN(DBG_INFO, F("sendControlPacket cmd: ") + String(cmd)); - sendCmdPacket(invId, TX_REQ_DEVCONTROL, ALL_FRAMES, false); // 0x80 implementation as original DTU code + sendCmdPacket(invId, TX_REQ_DEVCONTROL, SINGLE_FRAME, false); // 0x80 implementation as original DTU code??? int cnt = 0; - mTxBuf[10] = cmd; // cmd --> 0x0b => Type_ActivePowerContr, 0 on, 1 off, 2 restart, 12 reactive power, 13 power factor - mTxBuf[10 + (++cnt)] = 0x00; - if (cmd >= ActivePowerContr && cmd <= PFSet){ - mTxBuf[10 + (++cnt)] = ((data[0] * 10) >> 8) & 0xff; // power limit - mTxBuf[10 + (++cnt)] = ((data[0] * 10) ) & 0xff; // power limit - mTxBuf[10 + (++cnt)] = ((data[1] ) >> 8) & 0xff; // setting for persistens handlings - mTxBuf[10 + (++cnt)] = ((data[1] ) ) & 0xff; // setting for persistens handling + mTxBuf[10] = cmd; // cmd --> 0x0b => Type_ActivePowerContr, 0 on, 1 off, 2 restart, 12 reactive power, 13 power factor, 20 CleanState_LockAndAlarm + if (cmd != CleanState_LockAndAlarm) + { + mTxBuf[10 + (++cnt)] = 0x00; + if (cmd >= ActivePowerContr && cmd <= PFSet){ + mTxBuf[10 + (++cnt)] = ((data[0] * 10) >> 8) & 0xff; // power limit + mTxBuf[10 + (++cnt)] = ((data[0] * 10) ) & 0xff; // power limit + mTxBuf[10 + (++cnt)] = ((data[1] ) >> 8) & 0xff; // setting for persistens handlings + mTxBuf[10 + (++cnt)] = ((data[1] ) ) & 0xff; // setting for persistens handling + } + // crc control data + uint16_t crc = Ahoy::crc16(&mTxBuf[10], cnt+1); + mTxBuf[10 + (++cnt)] = (crc >> 8) & 0xff; + mTxBuf[10 + (++cnt)] = (crc ) & 0xff; } - // crc control data - uint16_t crc = Ahoy::crc16(&mTxBuf[10], cnt+1); - mTxBuf[10 + (++cnt)] = (crc >> 8) & 0xff; - mTxBuf[10 + (++cnt)] = (crc ) & 0xff; + // crc over all - cnt +=1; + cnt++; mTxBuf[10 + cnt] = Ahoy::crc8(mTxBuf, 10 + cnt); sendPacket(invId, mTxBuf, 10 + (++cnt), true); diff --git a/tools/esp8266/html/serial.html b/tools/esp8266/html/serial.html index 598f733c..2f9744fc 100644 --- a/tools/esp8266/html/serial.html +++ b/tools/esp8266/html/serial.html @@ -23,7 +23,8 @@ -
+ +
Ctrl result: n/a @@ -93,6 +94,13 @@ e.innerHTML = "Error: " + obj["error"]; } + document.getElementById("cln_lock_and_alarm").addEventListener("click", function() { + var obj = new Object(); + obj.cmd = 20; + obj.tx_request = 81; + getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj)); + }); + document.getElementById("turnon").addEventListener("click", function() { var obj = new Object(); obj.cmd = 0; diff --git a/tools/esp8266/webApi.cpp b/tools/esp8266/webApi.cpp index 6e92b051..21225052 100644 --- a/tools/esp8266/webApi.cpp +++ b/tools/esp8266/webApi.cpp @@ -261,7 +261,7 @@ void webApi::getLive(JsonObject obj) { JsonArray invArr = obj.createNestedArray(F("inverter")); obj["refresh_interval"] = SEND_INTERVAL; - uint8_t list[] = {FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_PFC, FLD_T, FLD_YT, FLD_YD, FLD_PDC, FLD_EFF, FLD_PRA, FLD_ALARM_MES_ID}; + uint8_t list[] = {FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_PF, FLD_T, FLD_YT, FLD_YD, FLD_PDC, FLD_EFF, FLD_Q}; Inverter<> *iv; uint8_t pos; @@ -364,6 +364,15 @@ bool webApi::setCtrl(DynamicJsonDocument jsonIn, JsonObject jsonOut) { else return false; } + else if(CleanState_LockAndAlarm == cmd) { + Inverter<> *iv = getInverter(jsonIn, jsonOut); + if(NULL != iv) { + iv->devControlCmd = CleanState_LockAndAlarm; + iv->devControlRequest = true; + } + else + return false; + } else { jsonOut["error"] = "unknown 'cmd' = " + String(cmd); return false;