Browse Source

add CleanState_LockAndAlarm in app.cpp, hmRadio.h, web.cpp

and add Inverter Pulldown to serial.html
pull/328/head
stefan123t 3 years ago
parent
commit
13aa06e5d9
  1. 7
      tools/esp8266/app.cpp
  2. 43
      tools/esp8266/hmRadio.h
  3. 32
      tools/esp8266/html/serial.html
  4. 4
      tools/esp8266/web.cpp

7
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;

43
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) {

32
tools/esp8266/html/serial.html

@ -11,7 +11,7 @@
<div id="content" class="content">
<div class="serial">
<textarea id="serial" cols="80" rows="20" readonly></textarea><br/>
conntected: <span class="dot" id="connected"></span> Uptime: <span id="uptime"></span><input type="button" value="clear" class="btn" id="clear"/> <input type="button" value="autoscroll" class="btn" id="scroll"/>
connected: <span class="dot" id="connected"></span> Uptime: <span id="uptime"></span><input type="button" value="clear" class="btn" id="clear"/> <input type="button" value="autoscroll" class="btn" id="scroll"/>
<br/>
<br/>
@ -20,10 +20,20 @@
<hr>
<h3>handle next buttons with care - test / debug only!!</h3>
<br/>
<label for="iv">Choose your Inverter:</label>
<select name="iv" id="iv">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<br/>
<input type="button" value="power limit 100%" class="btn" id="pwrlim2"/>
<input type="button" value="power limit 10%" class="btn" id="pwrlim"/>
<input type="button" value="Turn Off" class="btn" id="turnoff"/>
<input type="button" value="Turn On" class="btn" id="turnon"/><br/>
<input type="button" value="Turn On" class="btn" id="turnon"/>
<input type="button" value="Clean &amp; Reboot" class="btn" id="clnstate"/>
<br/>
Ctrl result: <span id="result">n/a</span>
</div>
</div>
@ -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;
}
</script>
</body>
</html>

4
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}");

Loading…
Cancel
Save