From 13aa06e5d9264ff4389494f8d9748c4c1fd22336 Mon Sep 17 00:00:00 2001 From: stefan123t Date: Mon, 3 Oct 2022 23:02:37 +0200 Subject: [PATCH] add CleanState_LockAndAlarm in app.cpp, hmRadio.h, web.cpp and add Inverter Pulldown to serial.html --- tools/esp8266/app.cpp | 7 +++++- tools/esp8266/hmRadio.h | 43 ++++++++++++++++++++++------------ tools/esp8266/html/serial.html | 32 +++++++++++++++++++++++-- tools/esp8266/web.cpp | 4 ++++ 4 files changed, 68 insertions(+), 18 deletions(-) diff --git a/tools/esp8266/app.cpp b/tools/esp8266/app.cpp index 62636ff0..309cade7 100644 --- a/tools/esp8266/app.cpp +++ b/tools/esp8266/app.cpp @@ -328,7 +328,7 @@ void app::processPayload(bool retransmit) { if(mPayload[iv->id].retransmits < mConfig.maxRetransPerPyld) { mPayload[iv->id].retransmits++; if(mPayload[iv->id].maxPackId != 0) { - for(uint8_t i = 0; i < (mPayload[iv->id].maxPackId-1); i ++) { + for(uint8_t i = 0; i < (mPayload[iv->id].maxPackId-1); i++) { if(mPayload[iv->id].len[i] == 0) { if(mConfig.serialDebug) DPRINTLN(DBG_WARN, F("while retrieving data: Frame ") + String(i+1) + F(" missing: Request Retransmit")); @@ -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: // CleanState lock & alarm + iv->devControlCmd = CleanState_LockAndAlarm; + DPRINTLN(DBG_INFO, F("CleanState lock & alarm for inverter ") + String(iv->id) ); + iv->devControlRequest = true; + break; default: DPRINTLN(DBG_INFO, "Not implemented"); break; diff --git a/tools/esp8266/hmRadio.h b/tools/esp8266/hmRadio.h index 6a09f6a2..3d54e70b 100644 --- a/tools/esp8266/hmRadio.h +++ b/tools/esp8266/hmRadio.h @@ -165,25 +165,38 @@ 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); // SINGLE_FRAME 0x81 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) { + // skip user data, append only crc8 + } else { + // append user data and crc16 + 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 + } + // crc16 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; - mTxBuf[10 + cnt] = Ahoy::crc8(mTxBuf, 10 + cnt); + + // crc8 over all + mTxBuf[10 + (++cnt)] = Ahoy::crc8(mTxBuf, 10 + cnt); sendPacket(invId, mTxBuf, 10 + (++cnt), true); + + // Is required to prevent retransmissions without answer. + if (cmd == CleanState_LockAndAlarm || cmd == Restart) + { + DPRINTLN(DBG_INFO, F("TODO: Prevent retransmit after Reboot / CleanState_LockAndAlarm...")); + // if(mPayload[iv->id].retransmits < mConfig.maxRetransPerPyld) + //mPayload[iv->id].retransmits = mConfig.maxRetransPerPyld; + } } void sendTimePacket(uint64_t invId, uint8_t cmd, uint32_t ts, uint16_t alarmMesId) { diff --git a/tools/esp8266/html/serial.html b/tools/esp8266/html/serial.html index 598f733c..7f70ab65 100644 --- a/tools/esp8266/html/serial.html +++ b/tools/esp8266/html/serial.html @@ -11,7 +11,7 @@

- conntected: Uptime: + connected: Uptime:

@@ -20,10 +20,20 @@

handle next buttons with care - test / debug only!!


+ + +
-
+ + +
Ctrl result: n/a
@@ -97,6 +107,7 @@ var obj = new Object(); obj.cmd = 0; obj.tx_request = 81; + obj.inverter = get_selected_iv(); getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj)); }); @@ -104,6 +115,7 @@ var obj = new Object(); obj.cmd = 1; obj.tx_request = 81; + obj.inverter = get_selected_iv(); getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj)); }); @@ -112,6 +124,7 @@ obj.cmd = 11; obj.tx_request = 81; obj.payload = [10, 1]; + obj.inverter = get_selected_iv(); getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj)); }); @@ -120,8 +133,23 @@ obj.cmd = 11; obj.tx_request = 81; obj.payload = [2000, 1]; + obj.inverter = get_selected_iv(); getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj)); }); + + document.getElementById("clnstate").addEventListener("click", function() { + var obj = new Object(); + obj.cmd = 20; + obj.tx_request = 81; + obj.inverter = get_selected_iv(); + getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj)); + }); + + function get_selected_iv() + { + var e = document.getElementById("iv"); + return e.value; + } diff --git a/tools/esp8266/web.cpp b/tools/esp8266/web.cpp index 1aadebc1..858968b8 100644 --- a/tools/esp8266/web.cpp +++ b/tools/esp8266/web.cpp @@ -392,6 +392,10 @@ void web::showWebApi(AsyncWebServerRequest *request) { iv->devControlCmd = TurnOn; iv->devControlRequest = true; // queue it in the request loop } + if (response["cmd"] == (uint8_t)CleanState_LockAndAlarm) { + iv->devControlCmd = CleanState_LockAndAlarm; + iv->devControlRequest = true; // queue it in the request loop + } } } request->send(200, "text/json", "{success:true}");