Browse Source

MI - request firmware infos

pull/753/head
rejoe2 2 years ago
committed by GitHub
parent
commit
ad64d737b7
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      src/hm/hmInverter.h
  2. 82
      src/hm/miPayload.h

14
src/hm/hmInverter.h

@ -161,26 +161,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)

82
src/hm/miPayload.h

@ -24,6 +24,7 @@ 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];
@ -93,12 +94,14 @@ 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;
mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd2, false);
} else {
mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd2, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd);
}; };
mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd2, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd);
mPayload[iv->id].txCmd = cmd; mPayload[iv->id].txCmd = cmd;
if (iv->type == INV_TYPE_1CH || iv->type == INV_TYPE_2CH) { if (iv->type == INV_TYPE_1CH || iv->type == INV_TYPE_2CH) {
mPayload[iv->id].dataAB[CH1] = false; mPayload[iv->id].dataAB[CH1] = false;
@ -154,7 +157,41 @@ class MiPayload {
//iv->setQueuedCmdFinished(); //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;
/*
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++;
mSys->Radio.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)"));
mSys->Radio.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 } 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... // atm, we just do nothing else than print out what we got...
@ -291,7 +328,8 @@ class MiPayload {
if (IV_HM == iv->ivGen) // only process MI inverters if (IV_HM == 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)) &&
@ -304,6 +342,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;
@ -339,6 +384,10 @@ class MiPayload {
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;
} }
} else if ( cmd == 0x0f ) {
//hard/firmware request; might not work, so just one try...
iv->setQueuedCmdFinished();
cmd = iv->getQueuedCmd();
} }
DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") next request is 0x") + String(cmd, HEX)); DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") next request is 0x") + String(cmd, HEX));
//mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd, true); //mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd, true);
@ -357,7 +406,9 @@ 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));
mSys->Radio.prepareDevInformCmd(iv->radioId.u64, mPayload[iv->id].txCmd, mPayload[iv->id].ts, iv->alarmMesIndex, true); mSys->Radio.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));
@ -371,7 +422,7 @@ 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("proces: compl. set of msgs detected")); DPRINTLN(DBG_INFO, F("process: 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();
@ -425,7 +476,7 @@ class MiPayload {
} }
iv->setQueuedCmdFinished(); */ iv->setQueuedCmdFinished(); */
} //}*/
} }
yield(); yield();
} }
@ -466,15 +517,17 @@ class MiPayload {
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; mPayload[iv->id].complete = true;
DPRINTLN(DBG_INFO, F("rec. complete set of msgs")); 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));
iv->setQueuedCmdFinished(); iv->setQueuedCmdFinished();
iv->doCalculations(); iv->doCalculations();
mPayload[iv->id].skipfirstrepeat = 0;
notify(mPayload[iv->id].txCmd); notify(mPayload[iv->id].txCmd);
} }
@ -561,11 +614,11 @@ class MiPayload {
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));
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... mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short...
DPRINTLN(DBG_INFO, F("rec. complete set of msgs")); 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));
iv->doCalculations(); iv->doCalculations();
/*} else { /*} else {
@ -620,7 +673,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;
} }
@ -654,6 +707,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

Loading…
Cancel
Save