mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-23 22:06:11 +02:00
commit
abf084fa6e
4 changed files with 81 additions and 15 deletions
|
@ -275,6 +275,21 @@ typedef struct {
|
|||
// 7 = biggest with x inputs
|
||||
|
||||
const devInfo_t devInfo[] = {
|
||||
// MI 2nd gen; only 0x001311 is tested,
|
||||
// others (starting with MI-250) according to https://github.com/lumapu/ahoy/issues/1111#issuecomment-1698100571
|
||||
{ 0x000111, 250 },
|
||||
{ 0x000311, 300 },
|
||||
{ 0x000411, 350 },
|
||||
{ 0x001111, 500 },
|
||||
{ 0x001311, 600 },
|
||||
{ 0x001321, 600 },
|
||||
{ 0x001421, 700 },
|
||||
{ 0x001411, 700 },
|
||||
{ 0x002111, 1000 },
|
||||
{ 0x002311, 1200 },
|
||||
{ 0x002511, 1500 },
|
||||
{ 0x002411, 1500 },
|
||||
|
||||
// MI 3rd gen
|
||||
{ 0x001311, 600 },
|
||||
{ 0x001411, 700 },
|
||||
|
|
|
@ -210,8 +210,13 @@ class Inverter {
|
|||
enqueCommand<InfoCommand>(InverterDevInform_Simple); // hardware version
|
||||
enqueCommand<InfoCommand>(RealTimeRunData_Debug); // live data
|
||||
} else if (ivGen == IV_MI){
|
||||
if (getFwVersion() == 0)
|
||||
enqueCommand<InfoCommand>(InverterDevInform_All); // firmware version; might not work, esp. for 1/2 ch hardware
|
||||
if (getFwVersion() == 0) {
|
||||
enqueCommand<InfoCommand>(InverterDevInform_All); // hard- and firmware version
|
||||
} else {
|
||||
record_t<> *rec = getRecordStruct(InverterDevInform_Simple);
|
||||
if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0)
|
||||
enqueCommand<InfoCommand>(InverterDevInform_All); // hard- and firmware version for missing HW part nr, delivered by frame 1
|
||||
}
|
||||
if (type == INV_TYPE_4CH) {
|
||||
enqueCommand<InfoCommand>(0x36);
|
||||
} else {
|
||||
|
@ -334,6 +339,9 @@ class Inverter {
|
|||
DPRINT(DBG_INFO, "alarm ID incremented to ");
|
||||
DBGPRINTLN(String(alarmMesIndex));
|
||||
enqueCommand<InfoCommand>(AlarmData);
|
||||
// ivSendHighPrio(id);
|
||||
// if(mHighPrioIv == NULL) // process the request immediately if possible
|
||||
// mHighPrioIv = iv;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -347,6 +347,9 @@ class HmPayload {
|
|||
yield();
|
||||
}
|
||||
}
|
||||
if( (InverterDevInform_All == mPayload[iv->id].txCmd) && (mHighPrioIv == NULL) ) // process next request immediately if possible
|
||||
mHighPrioIv = iv;
|
||||
|
||||
} else {
|
||||
DPRINT(DBG_ERROR, F("plausibility check failed, expected "));
|
||||
DBGPRINT(String(rec->pyldLen));
|
||||
|
|
|
@ -193,6 +193,8 @@ class MiPayload {
|
|||
record_t<> *rec = iv->getRecordStruct(InverterDevInform_All); // choose the record structure
|
||||
rec->ts = mPayload[iv->id].ts;
|
||||
mPayload[iv->id].gotFragment = true;
|
||||
if(mHighPrioIv == NULL) // process next request immediately if possible
|
||||
mHighPrioIv = iv;
|
||||
|
||||
/*
|
||||
Polling the device software and hardware version number command
|
||||
|
@ -219,12 +221,13 @@ case InverterDevInform_All:
|
|||
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 }
|
||||
{ FLD_BOOTLOADER_VER, UNIT_NONE, CH0, 8, 2, 1 }
|
||||
};
|
||||
*/
|
||||
|
||||
|
@ -237,27 +240,48 @@ const byteAssign_t InfoAssignment[] = {
|
|||
mPayload[iv->id].gotFragment = true;
|
||||
if(mSerialDebug) {
|
||||
DPRINT_IVID(DBG_INFO, iv->id);
|
||||
DPRINT(DBG_INFO,F("HW_VER is "));
|
||||
DBGPRINTLN(String((p->packet[24] << 8) + p->packet[25]));
|
||||
DPRINT(DBG_INFO,F("HW_VER is "));
|
||||
DBGPRINTLN(String((p->packet[24] << 8) + p->packet[25]));
|
||||
}
|
||||
record_t<> *rec = iv->getRecordStruct(InverterDevInform_Simple); // choose the record structure
|
||||
rec->ts = mPayload[iv->id].ts;
|
||||
iv->setValue(1, rec, (uint32_t) ((p->packet[24] << 8) + p->packet[25])/1);
|
||||
//notify(InverterDevInform_All, iv);
|
||||
//28737
|
||||
} else if ( p->packet[9] == 0x01 || p->packet[9] == 0x10 ) {//second frame for MI, 3rd gen. answers in 0x10
|
||||
DPRINT_IVID(DBG_INFO, iv->id);
|
||||
if ( p->packet[9] == 0x01 ) {
|
||||
DBGPRINTLN(F("got 2nd frame (hw info)"));
|
||||
DPRINT(DBG_INFO,F("HW_PartNo "));
|
||||
DBGPRINTLN(String((uint32_t) (((p->packet[10] << 8) | p->packet[11]) << 8 | p->packet[12]) << 8 | p->packet[13]));
|
||||
/* according to xlsx (different start byte -1!)
|
||||
byte[11] to byte[14] HW_PN
|
||||
byte[15] byte[16] HW_FB_TLmValue
|
||||
byte[17] byte[18] HW_FB_ReSPRT
|
||||
byte[19] byte[20] HW_GridSamp_ResValule
|
||||
byte[21] byte[22] HW_ECapValue
|
||||
byte[23] to byte[26] Matching_APPFW_PN
|
||||
*/
|
||||
|
||||
DPRINT(DBG_INFO,F("HW_PartNo "));
|
||||
DBGPRINTLN(String((uint32_t) (((p->packet[10] << 8) | p->packet[11]) << 8 | p->packet[12]) << 8 | p->packet[13]));
|
||||
mPayload[iv->id].gotFragment = true;
|
||||
iv->setValue(iv->getPosByChFld(0, FLD_YT, rec), rec, (float) ((p->packet[20] << 8) + p->packet[21])/1);
|
||||
record_t<> *rec = iv->getRecordStruct(InverterDevInform_Simple); // choose the record structure
|
||||
rec->ts = mPayload[iv->id].ts;
|
||||
iv->setValue(0, rec, (uint32_t) ((((p->packet[10] << 8) | p->packet[11]) << 8 | p->packet[12]) << 8 | p->packet[13])/1);
|
||||
|
||||
if(mSerialDebug) {
|
||||
DPRINT(DBG_INFO,F("HW_FB_TLmValue "));
|
||||
DBGPRINTLN(String((p->packet[14] << 8) + p->packet[15]));
|
||||
DPRINT(DBG_INFO,F("HW_FB_ReSPRT "));
|
||||
DBGPRINTLN(String((p->packet[16] << 8) + p->packet[17]));
|
||||
DPRINT(DBG_INFO,F("HW_GridSamp_ResValule "));
|
||||
DBGPRINTLN(String((p->packet[18] << 8) + p->packet[19]));
|
||||
DPRINT(DBG_INFO,F("HW_FB_TLmValue "));
|
||||
DBGPRINTLN(String((p->packet[14] << 8) + p->packet[15]));
|
||||
DPRINT(DBG_INFO,F("HW_FB_ReSPRT "));
|
||||
DBGPRINTLN(String((p->packet[16] << 8) + p->packet[17]));
|
||||
DPRINT(DBG_INFO,F("HW_GridSamp_ResValule "));
|
||||
DBGPRINTLN(String((p->packet[18] << 8) + p->packet[19]));
|
||||
DPRINT(DBG_INFO,F("HW_ECapValue "));
|
||||
DBGPRINTLN(String((p->packet[20] << 8) + p->packet[21]));
|
||||
}
|
||||
DPRINT(DBG_INFO,F("Matching_APPFW_PN "));
|
||||
DBGPRINTLN(String((uint32_t) (((p->packet[22] << 8) | p->packet[23]) << 8 | p->packet[24]) << 8 | p->packet[25]));
|
||||
}
|
||||
//notify(InverterDevInform_Simple, iv);
|
||||
notify(InverterDevInform_All, iv);
|
||||
} else {
|
||||
DBGPRINTLN(F("3rd gen. inverter!")); // see table in OpenDTU code, DevInfoParser.cpp devInfo[]
|
||||
}
|
||||
|
@ -265,6 +289,22 @@ const byteAssign_t InfoAssignment[] = {
|
|||
} else if ( p->packet[9] == 0x12 ) {//3rd frame
|
||||
DPRINT_IVID(DBG_INFO, iv->id);
|
||||
DBGPRINTLN(F("got 3rd frame (hw info)"));
|
||||
/* according to xlsx (different start byte -1!)
|
||||
byte[11] byte[12] APPFW_MINVER
|
||||
byte[13] byte[14] HWInfoAddr
|
||||
byte[15] byte[16] PNInfoCRC_gusv
|
||||
byte[15] byte[16] PNInfoCRC_gusv
|
||||
*/
|
||||
if(mSerialDebug) {
|
||||
DPRINT(DBG_INFO,F("APPFW_MINVER "));
|
||||
DBGPRINTLN(String((p->packet[10] << 8) + p->packet[11]));
|
||||
DPRINT(DBG_INFO,F("HWInfoAddr "));
|
||||
DBGPRINTLN(String((p->packet[12] << 8) + p->packet[13]));
|
||||
DPRINT(DBG_INFO,F("PNInfoCRC_gusv "));
|
||||
DBGPRINTLN(String((p->packet[14] << 8) + p->packet[15]));
|
||||
DPRINT(DBG_INFO,F("PNInfoCRC_gusv (pt. 2?) "));
|
||||
DBGPRINTLN(String((p->packet[16] << 8) + p->packet[17]));
|
||||
}
|
||||
iv->setQueuedCmdFinished();
|
||||
mPayload[iv->id].complete = true;
|
||||
mStat->rxSuccess++;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue