mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-23 13:56:10 +02:00
several HMS / HMT related changes
This commit is contained in:
parent
4fd93be575
commit
b8533cc17d
10 changed files with 204 additions and 47 deletions
|
@ -162,7 +162,7 @@ void app::loopStandard(void) {
|
||||||
|
|
||||||
Inverter<> *iv = mSys.findInverter(&p->data[2]);
|
Inverter<> *iv = mSys.findInverter(&p->data[2]);
|
||||||
if(NULL != iv) {
|
if(NULL != iv) {
|
||||||
if(IV_HMS == iv->ivGen)
|
if((iv->ivGen == IV_HMS) || (iv->ivGen == IV_HMT))
|
||||||
mHmsPayload.add(iv, p);
|
mHmsPayload.add(iv, p);
|
||||||
}
|
}
|
||||||
mCmtRadio.mBufCtrl.pop();
|
mCmtRadio.mBufCtrl.pop();
|
||||||
|
@ -405,7 +405,7 @@ void app::tickSend(void) {
|
||||||
else if(iv->ivGen == IV_MI)
|
else if(iv->ivGen == IV_MI)
|
||||||
mMiPayload.ivSend(iv);
|
mMiPayload.ivSend(iv);
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
else if(iv->ivGen == IV_HMS)
|
else if((iv->ivGen == IV_HMS) || (iv->ivGen == IV_HMT))
|
||||||
mHmsPayload.ivSend(iv);
|
mHmsPayload.ivSend(iv);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,9 +129,9 @@ typedef struct {
|
||||||
bool enabled;
|
bool enabled;
|
||||||
char name[MAX_NAME_LENGTH];
|
char name[MAX_NAME_LENGTH];
|
||||||
serial_u serial;
|
serial_u serial;
|
||||||
uint16_t chMaxPwr[4];
|
uint16_t chMaxPwr[6];
|
||||||
int32_t yieldCor[4]; // signed YieldTotal correction value
|
int32_t yieldCor[6]; // signed YieldTotal correction value
|
||||||
char chName[4][MAX_NAME_LENGTH];
|
char chName[6][MAX_NAME_LENGTH];
|
||||||
} cfgIv_t;
|
} cfgIv_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -634,7 +634,7 @@ class settings {
|
||||||
obj[F("en")] = (bool)cfg->enabled;
|
obj[F("en")] = (bool)cfg->enabled;
|
||||||
obj[F("name")] = cfg->name;
|
obj[F("name")] = cfg->name;
|
||||||
obj[F("sn")] = cfg->serial.u64;
|
obj[F("sn")] = cfg->serial.u64;
|
||||||
for(uint8_t i = 0; i < 4; i++) {
|
for(uint8_t i = 0; i < 6; i++) {
|
||||||
obj[F("yield")][i] = cfg->yieldCor[i];
|
obj[F("yield")][i] = cfg->yieldCor[i];
|
||||||
obj[F("pwr")][i] = cfg->chMaxPwr[i];
|
obj[F("pwr")][i] = cfg->chMaxPwr[i];
|
||||||
obj[F("chName")][i] = cfg->chName[i];
|
obj[F("chName")][i] = cfg->chName[i];
|
||||||
|
@ -643,7 +643,7 @@ class settings {
|
||||||
getVal<bool>(obj, F("en"), &cfg->enabled);
|
getVal<bool>(obj, F("en"), &cfg->enabled);
|
||||||
getChar(obj, F("name"), cfg->name, MAX_NAME_LENGTH);
|
getChar(obj, F("name"), cfg->name, MAX_NAME_LENGTH);
|
||||||
getVal<uint64_t>(obj, F("sn"), &cfg->serial.u64);
|
getVal<uint64_t>(obj, F("sn"), &cfg->serial.u64);
|
||||||
for(uint8_t i = 0; i < 4; i++) {
|
for(uint8_t i = 0; i < (sizeof(obj[F("yield")])/sizeof(int32_t)); i++) {
|
||||||
if(obj.containsKey(F("yield"))) cfg->yieldCor[i] = obj[F("yield")][i];
|
if(obj.containsKey(F("yield"))) cfg->yieldCor[i] = obj[F("yield")][i];
|
||||||
if(obj.containsKey(F("pwr"))) cfg->chMaxPwr[i] = obj[F("pwr")][i];
|
if(obj.containsKey(F("pwr"))) cfg->chMaxPwr[i] = obj[F("pwr")][i];
|
||||||
if(obj.containsKey(F("chName"))) snprintf(cfg->chName[i], MAX_NAME_LENGTH, "%s", obj[F("chName")][i].as<const char*>());
|
if(obj.containsKey(F("chName"))) snprintf(cfg->chName[i], MAX_NAME_LENGTH, "%s", obj[F("chName")][i].as<const char*>());
|
||||||
|
|
|
@ -18,13 +18,15 @@ const char* const units[] = {"V", "A", "W", "Wh", "kWh", "Hz", "°C", "%", "var"
|
||||||
|
|
||||||
// field types
|
// field types
|
||||||
enum {FLD_UDC = 0, FLD_IDC, FLD_PDC, FLD_YD, FLD_YW, FLD_YT,
|
enum {FLD_UDC = 0, FLD_IDC, FLD_PDC, FLD_YD, FLD_YW, FLD_YT,
|
||||||
FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_T, FLD_PF, FLD_EFF,
|
FLD_UAC, FLD_UAC_1N, FLD_UAC_2N, FLD_UAC_3N, FLD_UAC_12, FLD_UAC_23, FLD_UAC_31, FLD_IAC,
|
||||||
|
FLD_IAC_1, FLD_IAC_2, FLD_IAC_3, FLD_PAC, FLD_F, FLD_T, FLD_PF, FLD_EFF,
|
||||||
FLD_IRR, FLD_Q, FLD_EVT, FLD_FW_VERSION, FLD_FW_BUILD_YEAR,
|
FLD_IRR, FLD_Q, FLD_EVT, FLD_FW_VERSION, FLD_FW_BUILD_YEAR,
|
||||||
FLD_FW_BUILD_MONTH_DAY, FLD_FW_BUILD_HOUR_MINUTE, FLD_HW_ID,
|
FLD_FW_BUILD_MONTH_DAY, FLD_FW_BUILD_HOUR_MINUTE, FLD_HW_ID,
|
||||||
FLD_ACT_ACTIVE_PWR_LIMIT, /*FLD_ACT_REACTIVE_PWR_LIMIT, FLD_ACT_PF,*/ FLD_LAST_ALARM_CODE};
|
FLD_ACT_ACTIVE_PWR_LIMIT, /*FLD_ACT_REACTIVE_PWR_LIMIT, FLD_ACT_PF,*/ FLD_LAST_ALARM_CODE};
|
||||||
|
|
||||||
const char* const fields[] = {"U_DC", "I_DC", "P_DC", "YieldDay", "YieldWeek", "YieldTotal",
|
const char* const fields[] = {"U_DC", "I_DC", "P_DC", "YieldDay", "YieldWeek", "YieldTotal",
|
||||||
"U_AC", "I_AC", "P_AC", "F_AC", "Temp", "PF_AC", "Efficiency", "Irradiation","Q_AC",
|
"U_AC", "U_AC_1N", "U_AC_2N", "U_AC_3N", "UAC_12", "UAC_23", "UAC_31", "I_AC",
|
||||||
|
"IAC_1", "I_AC_2", "I_AC_3", "P_AC", "F_AC", "Temp", "PF_AC", "Efficiency", "Irradiation","Q_AC",
|
||||||
"ALARM_MES_ID","FWVersion","FWBuildYear","FWBuildMonthDay","FWBuildHourMinute","HWPartId",
|
"ALARM_MES_ID","FWVersion","FWBuildYear","FWBuildMonthDay","FWBuildHourMinute","HWPartId",
|
||||||
"active_PowerLimit", /*"reactivePowerLimit","Powerfactor",*/ "LastAlarmCode"};
|
"active_PowerLimit", /*"reactivePowerLimit","Powerfactor",*/ "LastAlarmCode"};
|
||||||
const char* const notAvail = "n/a";
|
const char* const notAvail = "n/a";
|
||||||
|
@ -67,9 +69,9 @@ enum {CMD_CALC = 0xffff};
|
||||||
|
|
||||||
|
|
||||||
// CH0 is default channel (freq, ac, temp)
|
// CH0 is default channel (freq, ac, temp)
|
||||||
enum {CH0 = 0, CH1, CH2, CH3, CH4};
|
enum {CH0 = 0, CH1, CH2, CH3, CH4, CH5, CH6};
|
||||||
|
|
||||||
enum {INV_TYPE_1CH = 0, INV_TYPE_2CH, INV_TYPE_4CH};
|
enum {INV_TYPE_1CH = 0, INV_TYPE_2CH, INV_TYPE_4CH, INV_TYPE_6CH};
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -445,6 +445,12 @@ class Inverter {
|
||||||
}
|
}
|
||||||
channels = 4;
|
channels = 4;
|
||||||
}
|
}
|
||||||
|
else if (INV_TYPE_6CH == type) {
|
||||||
|
rec->length = (uint8_t)(HMT6CH_LIST_LEN);
|
||||||
|
rec->assign = (byteAssign_t *)hmt6chAssignment;
|
||||||
|
rec->pyldLen = HMT6CH_PAYLOAD_LEN;
|
||||||
|
channels = 6;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
rec->length = 0;
|
rec->length = 0;
|
||||||
rec->assign = NULL;
|
rec->assign = NULL;
|
||||||
|
|
|
@ -29,9 +29,10 @@ class HmSystem {
|
||||||
DBGPRINT("HMS");
|
DBGPRINT("HMS");
|
||||||
else
|
else
|
||||||
DBGPRINT("HM");
|
DBGPRINT("HM");
|
||||||
} else {
|
} else if(iv->config->serial.b[5] == 0x13)
|
||||||
|
DBGPRINT("HMT");
|
||||||
|
else
|
||||||
DBGPRINT(((iv->config->serial.b[4] & 0x03) == 0x01) ? " (2nd Gen) " : " (3rd Gen) ");
|
DBGPRINT(((iv->config->serial.b[4] & 0x03) == 0x01) ? " (2nd Gen) " : " (3rd Gen) ");
|
||||||
}
|
|
||||||
|
|
||||||
DBGPRINTLN(String(iv->config->serial.u64, HEX));
|
DBGPRINTLN(String(iv->config->serial.u64, HEX));
|
||||||
|
|
||||||
|
@ -55,13 +56,21 @@ class HmSystem {
|
||||||
DPRINTLN(DBG_VERBOSE, " " + String(p->config->serial.b[4], HEX));
|
DPRINTLN(DBG_VERBOSE, " " + String(p->config->serial.b[4], HEX));
|
||||||
if((p->config->serial.b[5] == 0x11) || (p->config->serial.b[5] == 0x10)) {
|
if((p->config->serial.b[5] == 0x11) || (p->config->serial.b[5] == 0x10)) {
|
||||||
switch(p->config->serial.b[4]) {
|
switch(p->config->serial.b[4]) {
|
||||||
|
case 0x24: // HMS-500
|
||||||
case 0x22:
|
case 0x22:
|
||||||
case 0x21: p->type = INV_TYPE_1CH; break;
|
case 0x21: p->type = INV_TYPE_1CH;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x44: // HMS-1000
|
||||||
case 0x42:
|
case 0x42:
|
||||||
case 0x41: p->type = INV_TYPE_2CH; break;
|
case 0x41: p->type = INV_TYPE_2CH;
|
||||||
case 0x64: // HMS2000
|
break;
|
||||||
|
|
||||||
|
case 0x64: // HMS-2000
|
||||||
case 0x62:
|
case 0x62:
|
||||||
case 0x61: p->type = INV_TYPE_4CH; break;
|
case 0x61: p->type = INV_TYPE_4CH;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DPRINTLN(DBG_ERROR, F("unknown inverter type"));
|
DPRINTLN(DBG_ERROR, F("unknown inverter type"));
|
||||||
break;
|
break;
|
||||||
|
@ -77,8 +86,10 @@ class HmSystem {
|
||||||
p->ivGen = IV_HM;
|
p->ivGen = IV_HM;
|
||||||
else // MI 2nd Gen
|
else // MI 2nd Gen
|
||||||
p->ivGen = IV_MI;
|
p->ivGen = IV_MI;
|
||||||
}
|
} else if(p->config->serial.b[5] == 0x13) {
|
||||||
else if(p->config->serial.u64 != 0ULL)
|
p->ivGen = IV_HMT;
|
||||||
|
p->type = INV_TYPE_6CH;
|
||||||
|
} else if(p->config->serial.u64 != 0ULL)
|
||||||
DPRINTLN(DBG_ERROR, F("inverter type can't be detected!"));
|
DPRINTLN(DBG_ERROR, F("inverter type can't be detected!"));
|
||||||
|
|
||||||
p->init();
|
p->init();
|
||||||
|
|
|
@ -148,10 +148,10 @@ class MiPayload {
|
||||||
if (cmd == 0x01 || cmd == SystemConfigPara ) { //0x1 and 0x05 for HM-types
|
if (cmd == 0x01 || cmd == SystemConfigPara ) { //0x1 and 0x05 for HM-types
|
||||||
cmd = 0x0f; // for MI, these seem to make part of the Polling the device software and hardware version number command
|
cmd = 0x0f; // for MI, these seem to make part of the Polling the device software and hardware version number command
|
||||||
cmd2 = cmd == SystemConfigPara ? 0x01 : 0x00; //perhaps we can only try to get second frame?
|
cmd2 = cmd == SystemConfigPara ? 0x01 : 0x00; //perhaps we can only try to get second frame?
|
||||||
mRadio.sendCmdPacket(iv->radioId.u64, cmd, cmd2, false, false);
|
mRadio->sendCmdPacket(iv->radioId.u64, cmd, cmd2, false, false);
|
||||||
} else {
|
} 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);
|
||||||
mRadio.sendCmdPacket(iv->radioId.u64, cmd, cmd2, false, false);
|
mRadio->sendCmdPacket(iv->radioId.u64, cmd, cmd2, false, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
mPayload[iv->id].txCmd = cmd;
|
mPayload[iv->id].txCmd = cmd;
|
||||||
|
@ -442,7 +442,7 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
mPayload[iv->id].retransmits = mMaxRetrans;
|
mPayload[iv->id].retransmits = mMaxRetrans;
|
||||||
} else if ( cmd == 0x0f ) {
|
} else if ( cmd == 0x0f ) {
|
||||||
//hard/firmware request
|
//hard/firmware request
|
||||||
mRadio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x00, true, false);
|
mRadio->sendCmdPacket(iv->radioId.u64, 0x0f, 0x00, true, false);
|
||||||
//iv->setQueuedCmdFinished();
|
//iv->setQueuedCmdFinished();
|
||||||
//cmd = iv->getQueuedCmd();
|
//cmd = iv->getQueuedCmd();
|
||||||
} else {
|
} else {
|
||||||
|
@ -479,7 +479,7 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
}
|
}
|
||||||
DBGPRINT(F(" 0x"));
|
DBGPRINT(F(" 0x"));
|
||||||
DBGHEXLN(cmd);
|
DBGHEXLN(cmd);
|
||||||
mRadio.sendCmdPacket(iv->radioId.u64, cmd, cmd, true, false);
|
mRadio->sendCmdPacket(iv->radioId.u64, cmd, cmd, true, false);
|
||||||
//mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, true, cmd);
|
//mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, true, cmd);
|
||||||
yield();
|
yield();
|
||||||
}
|
}
|
||||||
|
@ -497,7 +497,7 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
DBGPRINT(F("prepareDevInformCmd 0x"));
|
DBGPRINT(F("prepareDevInformCmd 0x"));
|
||||||
DBGHEXLN(mPayload[iv->id].txCmd);
|
DBGHEXLN(mPayload[iv->id].txCmd);
|
||||||
//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);
|
||||||
mRadio.sendCmdPacket(iv->radioId.u64, mPayload[iv->id].txCmd, mPayload[iv->id].txCmd, false, false);
|
mRadio->sendCmdPacket(iv->radioId.u64, mPayload[iv->id].txCmd, mPayload[iv->id].txCmd, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*else { // payload complete
|
/*else { // payload complete
|
||||||
|
|
|
@ -9,33 +9,97 @@
|
||||||
#include "../hm/hmDefines.h"
|
#include "../hm/hmDefines.h"
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
// HMS2000
|
// HMS-350, HMS-500
|
||||||
|
//-------------------------------------
|
||||||
|
const byteAssign_t hms1chAssignment[] = {
|
||||||
|
{ FLD_UDC, UNIT_V, CH1, 2, 2, 10 },
|
||||||
|
{ FLD_IDC, UNIT_A, CH1, 4, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH1, 6, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH1, 8, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH1, 12, 2, 1 },
|
||||||
|
{ FLD_IRR, UNIT_PCT, CH1, CALC_IRR_CH, CH1, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UAC, UNIT_V, CH0, 14, 2, 10 },
|
||||||
|
{ FLD_F, UNIT_HZ, CH0, 16, 2, 100 },
|
||||||
|
{ FLD_PAC, UNIT_W, CH0, 18, 2, 10 },
|
||||||
|
{ FLD_Q, UNIT_VAR, CH0, 20, 2, 10 }, // signed!
|
||||||
|
{ FLD_IAC, UNIT_A, CH0, 22, 2, 100 },
|
||||||
|
{ FLD_PF, UNIT_NONE, CH0, 24, 2, 1000 }, // signed!
|
||||||
|
{ FLD_T, UNIT_C, CH0, 26, 2, 10 }, // signed!
|
||||||
|
{ FLD_EVT, UNIT_NONE, CH0, 28, 2, 1 },
|
||||||
|
|
||||||
|
{ FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC },
|
||||||
|
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
|
||||||
|
{ FLD_EFF, UNIT_PCT, CH0, CALC_EFF_CH0, 0, CMD_CALC }
|
||||||
|
};
|
||||||
|
#define HMS1CH_LIST_LEN (sizeof(hms1chAssignment) / sizeof(byteAssign_t))
|
||||||
|
#define HMS1CH_PAYLOAD_LEN 30
|
||||||
|
|
||||||
|
//-------------------------------------
|
||||||
|
// HMS-800, HMS-1000
|
||||||
|
//-------------------------------------
|
||||||
|
const byteAssign_t hms2chAssignment[] = {
|
||||||
|
{ FLD_UDC, UNIT_V, CH1, 2, 2, 10 },
|
||||||
|
{ FLD_IDC, UNIT_A, CH1, 6, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH1, 10, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH1, 14, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH1, 22, 2, 1 },
|
||||||
|
{ FLD_IRR, UNIT_PCT, CH1, CALC_IRR_CH, CH1, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UDC, UNIT_V, CH2, 4, 2, 10 },
|
||||||
|
{ FLD_IDC, UNIT_A, CH2, 8, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH2, 12, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH2, 18, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH2, 24, 2, 1 },
|
||||||
|
{ FLD_IRR, UNIT_PCT, CH2, CALC_IRR_CH, CH2, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UAC, UNIT_V, CH0, 26, 2, 10 },
|
||||||
|
{ FLD_F, UNIT_HZ, CH0, 28, 2, 100 },
|
||||||
|
{ FLD_PAC, UNIT_W, CH0, 30, 2, 10 },
|
||||||
|
{ FLD_Q, UNIT_VAR, CH0, 32, 2, 10 }, // signed!
|
||||||
|
{ FLD_IAC, UNIT_A, CH0, 34, 2, 100 },
|
||||||
|
{ FLD_PF, UNIT_NONE, CH0, 36, 2, 1000 }, // signed!
|
||||||
|
{ FLD_T, UNIT_C, CH0, 38, 2, 10 }, // signed!
|
||||||
|
{ FLD_EVT, UNIT_NONE, CH0, 40, 2, 1 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC },
|
||||||
|
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
|
||||||
|
{ FLD_EFF, UNIT_PCT, CH0, CALC_EFF_CH0, 0, CMD_CALC }
|
||||||
|
};
|
||||||
|
#define HMS2CH_LIST_LEN (sizeof(hms2chAssignment) / sizeof(byteAssign_t))
|
||||||
|
#define HMS2CH_PAYLOAD_LEN 42
|
||||||
|
|
||||||
|
//-------------------------------------
|
||||||
|
// HMS-1800, HMS-2000
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
const byteAssign_t hms4chAssignment[] = {
|
const byteAssign_t hms4chAssignment[] = {
|
||||||
{ FLD_UDC, UNIT_V, CH1, 2, 2, 10 },
|
{ FLD_UDC, UNIT_V, CH1, 2, 2, 10 },
|
||||||
{ FLD_UDC, UNIT_V, CH2, 4, 2, 10 },
|
|
||||||
{ FLD_IDC, UNIT_A, CH1, 6, 2, 100 },
|
{ FLD_IDC, UNIT_A, CH1, 6, 2, 100 },
|
||||||
{ FLD_IDC, UNIT_A, CH2, 8, 2, 100 },
|
|
||||||
{ FLD_PDC, UNIT_W, CH1, 10, 2, 10 },
|
{ FLD_PDC, UNIT_W, CH1, 10, 2, 10 },
|
||||||
{ FLD_PDC, UNIT_W, CH2, 12, 2, 10 },
|
|
||||||
{ FLD_YT, UNIT_KWH, CH1, 14, 4, 1000 },
|
{ FLD_YT, UNIT_KWH, CH1, 14, 4, 1000 },
|
||||||
{ FLD_YT, UNIT_KWH, CH2, 18, 4, 1000 },
|
|
||||||
{ FLD_YD, UNIT_WH, CH1, 22, 2, 1 },
|
{ FLD_YD, UNIT_WH, CH1, 22, 2, 1 },
|
||||||
{ FLD_YD, UNIT_WH, CH2, 24, 2, 1 },
|
|
||||||
{ FLD_IRR, UNIT_PCT, CH1, CALC_IRR_CH, CH1, CMD_CALC },
|
{ FLD_IRR, UNIT_PCT, CH1, CALC_IRR_CH, CH1, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UDC, UNIT_V, CH2, 4, 2, 10 },
|
||||||
|
{ FLD_IDC, UNIT_A, CH2, 8, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH2, 12, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH2, 18, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH2, 24, 2, 1 },
|
||||||
{ FLD_IRR, UNIT_PCT, CH2, CALC_IRR_CH, CH2, CMD_CALC },
|
{ FLD_IRR, UNIT_PCT, CH2, CALC_IRR_CH, CH2, CMD_CALC },
|
||||||
|
|
||||||
{ FLD_UDC, UNIT_V, CH3, 26, 2, 10 },
|
{ FLD_UDC, UNIT_V, CH3, 26, 2, 10 },
|
||||||
{ FLD_UDC, UNIT_V, CH4, 28, 2, 10 },
|
|
||||||
{ FLD_IDC, UNIT_A, CH3, 30, 2, 100 },
|
{ FLD_IDC, UNIT_A, CH3, 30, 2, 100 },
|
||||||
{ FLD_IDC, UNIT_A, CH4, 32, 2, 100 },
|
|
||||||
{ FLD_PDC, UNIT_W, CH3, 34, 2, 10 },
|
{ FLD_PDC, UNIT_W, CH3, 34, 2, 10 },
|
||||||
{ FLD_PDC, UNIT_W, CH4, 36, 2, 10 },
|
|
||||||
{ FLD_YT, UNIT_KWH, CH3, 38, 4, 1000 },
|
{ FLD_YT, UNIT_KWH, CH3, 38, 4, 1000 },
|
||||||
{ FLD_YT, UNIT_KWH, CH4, 42, 4, 1000 },
|
|
||||||
{ FLD_YD, UNIT_WH, CH3, 46, 2, 1 },
|
{ FLD_YD, UNIT_WH, CH3, 46, 2, 1 },
|
||||||
{ FLD_YD, UNIT_WH, CH4, 48, 2, 1 },
|
|
||||||
{ FLD_IRR, UNIT_PCT, CH3, CALC_IRR_CH, CH3, CMD_CALC },
|
{ FLD_IRR, UNIT_PCT, CH3, CALC_IRR_CH, CH3, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UDC, UNIT_V, CH4, 28, 2, 10 },
|
||||||
|
{ FLD_IDC, UNIT_A, CH4, 32, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH4, 36, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH4, 42, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH4, 48, 2, 1 },
|
||||||
{ FLD_IRR, UNIT_PCT, CH4, CALC_IRR_CH, CH4, CMD_CALC },
|
{ FLD_IRR, UNIT_PCT, CH4, CALC_IRR_CH, CH4, CMD_CALC },
|
||||||
|
|
||||||
{ FLD_UAC, UNIT_V, CH0, 50, 2, 10 },
|
{ FLD_UAC, UNIT_V, CH0, 50, 2, 10 },
|
||||||
|
@ -54,4 +118,73 @@ const byteAssign_t hms4chAssignment[] = {
|
||||||
#define HMS4CH_LIST_LEN (sizeof(hms4chAssignment) / sizeof(byteAssign_t))
|
#define HMS4CH_LIST_LEN (sizeof(hms4chAssignment) / sizeof(byteAssign_t))
|
||||||
#define HMS4CH_PAYLOAD_LEN 66
|
#define HMS4CH_PAYLOAD_LEN 66
|
||||||
|
|
||||||
|
//-------------------------------------
|
||||||
|
// HMT-1800, HMT-2250
|
||||||
|
//-------------------------------------
|
||||||
|
const byteAssign_t hmt6chAssignment[] = {
|
||||||
|
{ FLD_UDC, UNIT_V, CH1, 2, 2, 10 },
|
||||||
|
{ FLD_IDC, UNIT_A, CH1, 4, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH1, 8, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH1, 12, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH1, 20, 2, 1 },
|
||||||
|
{ FLD_IRR, UNIT_PCT, CH1, CALC_IRR_CH, CH1, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UDC, UNIT_V, CH2, CALC_UDC_CH, CH1, CMD_CALC },
|
||||||
|
{ FLD_IDC, UNIT_A, CH2, 6, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH2, 10, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH2, 16, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH2, 22, 2, 1 },
|
||||||
|
{ FLD_IRR, UNIT_PCT, CH2, CALC_IRR_CH, CH2, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UDC, UNIT_V, CH3, 24, 2, 10 },
|
||||||
|
{ FLD_IDC, UNIT_A, CH3, 26, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH3, 30, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH3, 34, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH3, 42, 2, 1 },
|
||||||
|
{ FLD_IRR, UNIT_PCT, CH3, CALC_IRR_CH, CH3, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UDC, UNIT_V, CH4, CALC_UDC_CH, CH3, CMD_CALC },
|
||||||
|
{ FLD_IDC, UNIT_A, CH4, 28, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH4, 32, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH4, 38, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH4, 44, 2, 1 },
|
||||||
|
{ FLD_IRR, UNIT_PCT, CH4, CALC_IRR_CH, CH4, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UDC, UNIT_V, CH5, 46, 2, 10 },
|
||||||
|
{ FLD_IDC, UNIT_A, CH5, 48, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH5, 52, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH5, 56, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH5, 64, 2, 1 },
|
||||||
|
{ FLD_IRR, UNIT_PCT, CH5, CALC_IRR_CH, CH5, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UDC, UNIT_V, CH6, CALC_UDC_CH, CH5, CMD_CALC },
|
||||||
|
{ FLD_IDC, UNIT_A, CH6, 50, 2, 100 },
|
||||||
|
{ FLD_PDC, UNIT_W, CH6, 54, 2, 10 },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH6, 60, 4, 1000 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH6, 66, 2, 1 },
|
||||||
|
{ FLD_IRR, UNIT_PCT, CH6, CALC_IRR_CH, CH6, CMD_CALC },
|
||||||
|
|
||||||
|
{ FLD_UAC_1N, UNIT_V, CH0, 68, 2, 10 },
|
||||||
|
{ FLD_UAC_2N, UNIT_V, CH0, 70, 2, 10 },
|
||||||
|
{ FLD_UAC_3N, UNIT_V, CH0, 72, 2, 10 },
|
||||||
|
{ FLD_UAC_12, UNIT_V, CH0, 74, 2, 10 },
|
||||||
|
{ FLD_UAC_23, UNIT_V, CH0, 76, 2, 10 },
|
||||||
|
{ FLD_UAC_31, UNIT_V, CH0, 78, 2, 10 },
|
||||||
|
{ FLD_F, UNIT_HZ, CH0, 80, 2, 100 },
|
||||||
|
{ FLD_PAC, UNIT_W, CH0, 82, 2, 10 },
|
||||||
|
{ FLD_Q, UNIT_VAR, CH0, 84, 2, 10 },
|
||||||
|
{ FLD_IAC_1, UNIT_A, CH0, 86, 2, 100 },
|
||||||
|
{ FLD_IAC_2, UNIT_A, CH0, 88, 2, 100 },
|
||||||
|
{ FLD_IAC_3, UNIT_A, CH0, 90, 2, 100 },
|
||||||
|
{ FLD_PF, UNIT_NONE, CH0, 92, 2, 1000 },
|
||||||
|
{ FLD_T, UNIT_C, CH0, 94, 2, 10 },
|
||||||
|
{ FLD_EVT, UNIT_NONE, CH0, 96, 2, 1 },
|
||||||
|
{ FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC },
|
||||||
|
{ FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC },
|
||||||
|
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
|
||||||
|
{ FLD_EFF, UNIT_PCT, CH0, CALC_EFF_CH0, 0, CMD_CALC }
|
||||||
|
};
|
||||||
|
#define HMT6CH_LIST_LEN (sizeof(hmt6chAssignment) / sizeof(byteAssign_t))
|
||||||
|
#define HMT6CH_PAYLOAD_LEN 98
|
||||||
|
|
||||||
#endif /*__HMS_DEFINES_H__*/
|
#endif /*__HMS_DEFINES_H__*/
|
||||||
|
|
|
@ -80,7 +80,7 @@ class HmsPayload {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ivSend(Inverter<> *iv, bool highPrio = false) {
|
void ivSend(Inverter<> *iv, bool highPrio = false) {
|
||||||
if (IV_HMS != iv->ivGen) // only process HMS inverters
|
if ((IV_HMS != iv->ivGen) && (IV_HMT != iv->ivGen)) // only process HMS inverters
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//if(!highPrio) {
|
//if(!highPrio) {
|
||||||
|
@ -215,7 +215,7 @@ class HmsPayload {
|
||||||
if (NULL == iv)
|
if (NULL == iv)
|
||||||
continue; // skip to next inverter
|
continue; // skip to next inverter
|
||||||
|
|
||||||
if (IV_HMS != iv->ivGen) // only process HMS inverters
|
if ((IV_HMS != iv->ivGen) && (IV_HMT != iv->ivGen)) // only process HMS inverters
|
||||||
continue; // skip to next inverter
|
continue; // skip to next inverter
|
||||||
|
|
||||||
if ((mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) && (0 != mPayload[iv->id].txId)) {
|
if ((mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) && (0 != mPayload[iv->id].txId)) {
|
||||||
|
|
|
@ -410,7 +410,7 @@
|
||||||
[1, "high active"],
|
[1, "high active"],
|
||||||
];
|
];
|
||||||
|
|
||||||
const re = /11[2,4,6][1,2,4].*/;
|
const re = /1[1,3][2,4,6,8][1,2,4].*/;
|
||||||
|
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
for(it of document.getElementsByClassName("s_collapsible")) {
|
for(it of document.getElementsByClassName("s_collapsible")) {
|
||||||
|
@ -432,7 +432,7 @@
|
||||||
|
|
||||||
document.getElementById("btnAdd").addEventListener("click", function() {
|
document.getElementById("btnAdd").addEventListener("click", function() {
|
||||||
if(highestId <= (maxInv-1)) {
|
if(highestId <= (maxInv-1)) {
|
||||||
ivHtml(JSON.parse('{"enabled":true,"name":"","serial":"","channels":4,"ch_max_pwr":[0,0,0,0],"ch_name":["","","",""],"ch_yield_cor":[0,0,0,0]}'), highestId);
|
ivHtml(JSON.parse('{"enabled":true,"name":"","serial":"","channels":6,"ch_max_pwr":[0,0,0,0,0,0],"ch_name":["","","","","",""],"ch_yield_cor":[0,0,0,0,0,0]}'), highestId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -539,7 +539,7 @@
|
||||||
addr.addEventListener(evt, (e) => {
|
addr.addEventListener(evt, (e) => {
|
||||||
var serial = addr.value.substring(0,4);
|
var serial = addr.value.substring(0,4);
|
||||||
var max = 0;
|
var max = 0;
|
||||||
for(var i=0;i<4;i++) {
|
for(var i=0;i<6;i++) {
|
||||||
setHide(id+"ModPwr"+i, true);
|
setHide(id+"ModPwr"+i, true);
|
||||||
setHide(id+"ModName"+i, true);
|
setHide(id+"ModName"+i, true);
|
||||||
setHide(id+"YieldCor"+i, true);
|
setHide(id+"YieldCor"+i, true);
|
||||||
|
@ -549,16 +549,13 @@
|
||||||
setHide("row"+id+"YieldCor", true);
|
setHide("row"+id+"YieldCor", true);
|
||||||
|
|
||||||
if(serial.charAt(0) == 1) {
|
if(serial.charAt(0) == 1) {
|
||||||
if((serial.charAt(1) == 0) || (serial.charAt(1) == 1)) {
|
if((serial.charAt(1) == 0) || (serial.charAt(1) == 1) || (serial.charAt(1) == 3)) {
|
||||||
if((serial.charAt(3) == 1) || (serial.charAt(3) == 2)) {
|
if((serial.charAt(3) == 1) || (serial.charAt(3) == 2) || (serial.charAt(3) == 4)) {
|
||||||
switch(serial.charAt(2)) {
|
switch(serial.charAt(2)) {
|
||||||
case "2": max = 1; break;
|
case "2": max = 1; break;
|
||||||
case "4": max = 2; break;
|
case "4": max = 2; break;
|
||||||
case "6": max = 4; break;
|
case "6": max = 4; break;
|
||||||
}
|
case "8": max = 6; break;
|
||||||
} else if(serial.charAt(2) == 6) {
|
|
||||||
switch(serial.charAt(3)) {
|
|
||||||
case "4": max = 4; break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -487,8 +487,16 @@ class Web {
|
||||||
memset(buf, 0, 20);
|
memset(buf, 0, 20);
|
||||||
iv->config->serial.u64 = ah::Serial2u64(buf);
|
iv->config->serial.u64 = ah::Serial2u64(buf);
|
||||||
switch(iv->config->serial.b[4]) {
|
switch(iv->config->serial.b[4]) {
|
||||||
|
case 0x24:
|
||||||
|
case 0x22:
|
||||||
case 0x21: iv->type = INV_TYPE_1CH; iv->channels = 1; break;
|
case 0x21: iv->type = INV_TYPE_1CH; iv->channels = 1; break;
|
||||||
|
|
||||||
|
case 0x44:
|
||||||
|
case 0x42:
|
||||||
case 0x41: iv->type = INV_TYPE_2CH; iv->channels = 2; break;
|
case 0x41: iv->type = INV_TYPE_2CH; iv->channels = 2; break;
|
||||||
|
|
||||||
|
case 0x64:
|
||||||
|
case 0x62:
|
||||||
case 0x61: iv->type = INV_TYPE_4CH; iv->channels = 4; break;
|
case 0x61: iv->type = INV_TYPE_4CH; iv->channels = 4; break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
@ -497,7 +505,7 @@ class Web {
|
||||||
request->arg("inv" + String(i) + "Name").toCharArray(iv->config->name, MAX_NAME_LENGTH);
|
request->arg("inv" + String(i) + "Name").toCharArray(iv->config->name, MAX_NAME_LENGTH);
|
||||||
|
|
||||||
// max channel power / name
|
// max channel power / name
|
||||||
for (uint8_t j = 0; j < 4; j++) {
|
for (uint8_t j = 0; j < 6; j++) {
|
||||||
iv->config->yieldCor[j] = request->arg("inv" + String(i) + "YieldCor" + String(j)).toInt();
|
iv->config->yieldCor[j] = request->arg("inv" + String(i) + "YieldCor" + String(j)).toInt();
|
||||||
iv->config->chMaxPwr[j] = request->arg("inv" + String(i) + "ModPwr" + String(j)).toInt() & 0xffff;
|
iv->config->chMaxPwr[j] = request->arg("inv" + String(i) + "ModPwr" + String(j)).toInt() & 0xffff;
|
||||||
request->arg("inv" + String(i) + "ModName" + String(j)).toCharArray(iv->config->chName[j], MAX_NAME_LENGTH);
|
request->arg("inv" + String(i) + "ModName" + String(j)).toCharArray(iv->config->chName[j], MAX_NAME_LENGTH);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue