mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-12 08:26:38 +02:00
add CleanState_LockAndAlarm in app.cpp, hmRadio.h, web.cpp
and add Inverter Pulldown to serial.html
This commit is contained in:
parent
6e1e758fd2
commit
13aa06e5d9
4 changed files with 68 additions and 18 deletions
|
@ -328,7 +328,7 @@ void app::processPayload(bool retransmit) {
|
||||||
if(mPayload[iv->id].retransmits < mConfig.maxRetransPerPyld) {
|
if(mPayload[iv->id].retransmits < mConfig.maxRetransPerPyld) {
|
||||||
mPayload[iv->id].retransmits++;
|
mPayload[iv->id].retransmits++;
|
||||||
if(mPayload[iv->id].maxPackId != 0) {
|
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(mPayload[iv->id].len[i] == 0) {
|
||||||
if(mConfig.serialDebug)
|
if(mConfig.serialDebug)
|
||||||
DPRINTLN(DBG_WARN, F("while retrieving data: Frame ") + String(i+1) + F(" missing: Request Retransmit"));
|
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, "/"));
|
// uint16_t power_factor = std::stoi(strtok(NULL, "/"));
|
||||||
DPRINTLN(DBG_INFO, F("Set Power Factor not implemented for inverter ") + String(iv->id) );
|
DPRINTLN(DBG_INFO, F("Set Power Factor not implemented for inverter ") + String(iv->id) );
|
||||||
break;
|
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:
|
default:
|
||||||
DPRINTLN(DBG_INFO, "Not implemented");
|
DPRINTLN(DBG_INFO, "Not implemented");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -165,25 +165,38 @@ class HmRadio {
|
||||||
|
|
||||||
void sendControlPacket(uint64_t invId, uint8_t cmd, uint16_t *data) {
|
void sendControlPacket(uint64_t invId, uint8_t cmd, uint16_t *data) {
|
||||||
DPRINTLN(DBG_INFO, F("sendControlPacket cmd: ") + String(cmd));
|
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;
|
int cnt = 0;
|
||||||
mTxBuf[10] = cmd; // cmd --> 0x0b => Type_ActivePowerContr, 0 on, 1 off, 2 restart, 12 reactive power, 13 power factor
|
mTxBuf[10] = cmd; // cmd --> 0x0b => Type_ActivePowerContr, 0 on, 1 off, 2 restart, 12 reactive power, 13 power factor, 20 CleanState_LockAndAlarm
|
||||||
mTxBuf[10 + (++cnt)] = 0x00;
|
if (cmd == CleanState_LockAndAlarm) {
|
||||||
if (cmd >= ActivePowerContr && cmd <= PFSet){
|
// skip user data, append only crc8
|
||||||
mTxBuf[10 + (++cnt)] = ((data[0] * 10) >> 8) & 0xff; // power limit
|
} else {
|
||||||
mTxBuf[10 + (++cnt)] = ((data[0] * 10) ) & 0xff; // power limit
|
// append user data and crc16
|
||||||
mTxBuf[10 + (++cnt)] = ((data[1] ) >> 8) & 0xff; // setting for persistens handlings
|
mTxBuf[10 + (++cnt)] = 0x00;
|
||||||
mTxBuf[10 + (++cnt)] = ((data[1] ) ) & 0xff; // setting for persistens handling
|
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);
|
// crc8 over all
|
||||||
mTxBuf[10 + (++cnt)] = (crc >> 8) & 0xff;
|
mTxBuf[10 + (++cnt)] = Ahoy::crc8(mTxBuf, 10 + cnt);
|
||||||
mTxBuf[10 + (++cnt)] = (crc ) & 0xff;
|
|
||||||
// crc over all
|
|
||||||
cnt +=1;
|
|
||||||
mTxBuf[10 + cnt] = Ahoy::crc8(mTxBuf, 10 + cnt);
|
|
||||||
|
|
||||||
sendPacket(invId, mTxBuf, 10 + (++cnt), true);
|
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) {
|
void sendTimePacket(uint64_t invId, uint8_t cmd, uint32_t ts, uint16_t alarmMesId) {
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
<div class="serial">
|
<div class="serial">
|
||||||
<textarea id="serial" cols="80" rows="20" readonly></textarea><br/>
|
<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/>
|
||||||
<br/>
|
<br/>
|
||||||
|
@ -20,10 +20,20 @@
|
||||||
<hr>
|
<hr>
|
||||||
<h3>handle next buttons with care - test / debug only!!</h3>
|
<h3>handle next buttons with care - test / debug only!!</h3>
|
||||||
<br/>
|
<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 100%" class="btn" id="pwrlim2"/>
|
||||||
<input type="button" value="power limit 10%" class="btn" id="pwrlim"/>
|
<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 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 & Reboot" class="btn" id="clnstate"/>
|
||||||
|
<br/>
|
||||||
Ctrl result: <span id="result">n/a</span>
|
Ctrl result: <span id="result">n/a</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -97,6 +107,7 @@
|
||||||
var obj = new Object();
|
var obj = new Object();
|
||||||
obj.cmd = 0;
|
obj.cmd = 0;
|
||||||
obj.tx_request = 81;
|
obj.tx_request = 81;
|
||||||
|
obj.inverter = get_selected_iv();
|
||||||
getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj));
|
getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -104,6 +115,7 @@
|
||||||
var obj = new Object();
|
var obj = new Object();
|
||||||
obj.cmd = 1;
|
obj.cmd = 1;
|
||||||
obj.tx_request = 81;
|
obj.tx_request = 81;
|
||||||
|
obj.inverter = get_selected_iv();
|
||||||
getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj));
|
getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -112,6 +124,7 @@
|
||||||
obj.cmd = 11;
|
obj.cmd = 11;
|
||||||
obj.tx_request = 81;
|
obj.tx_request = 81;
|
||||||
obj.payload = [10, 1];
|
obj.payload = [10, 1];
|
||||||
|
obj.inverter = get_selected_iv();
|
||||||
getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj));
|
getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -120,8 +133,23 @@
|
||||||
obj.cmd = 11;
|
obj.cmd = 11;
|
||||||
obj.tx_request = 81;
|
obj.tx_request = 81;
|
||||||
obj.payload = [2000, 1];
|
obj.payload = [2000, 1];
|
||||||
|
obj.inverter = get_selected_iv();
|
||||||
getAjax("/api/ctrl", ctrlCb, "POST", JSON.stringify(obj));
|
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>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -392,6 +392,10 @@ void web::showWebApi(AsyncWebServerRequest *request) {
|
||||||
iv->devControlCmd = TurnOn;
|
iv->devControlCmd = TurnOn;
|
||||||
iv->devControlRequest = true; // queue it in the request loop
|
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}");
|
request->send(200, "text/json", "{success:true}");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue