mirror of
https://github.com/lumapu/ahoy.git
synced 2025-04-29 18:26:21 +02:00
HMT-1600/1800/2000 support
This commit is contained in:
parent
fc61b1a75f
commit
07dfb5fcd3
7 changed files with 92 additions and 19 deletions
|
@ -239,6 +239,14 @@ class app : public IApp, public ah::Scheduler {
|
|||
#endif
|
||||
}
|
||||
|
||||
bool getMqttJsonEnabled() override {
|
||||
#if defined(ENABLE_MQTT)
|
||||
return mMqtt.isJson();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
uint32_t getMqttTxCnt() override {
|
||||
#if defined(ENABLE_MQTT)
|
||||
return mMqtt.getTxCnt();
|
||||
|
|
|
@ -52,6 +52,7 @@ class IApp {
|
|||
virtual bool getSettingsValid() = 0;
|
||||
virtual void setMqttDiscoveryFlag() = 0;
|
||||
virtual bool getMqttIsConnected() = 0;
|
||||
virtual bool getMqttJsonEnabled() = 0;
|
||||
|
||||
virtual bool getNrfEnabled() = 0;
|
||||
virtual bool getCmtEnabled() = 0;
|
||||
|
|
|
@ -62,8 +62,8 @@ enum {FLD_UDC = 0, FLD_IDC, FLD_PDC, FLD_YD, FLD_YW, FLD_YT,
|
|||
FLD_GRID_PROFILE_VERSION, /*FLD_ACT_REACTIVE_PWR_LIMIT, FLD_ACT_PF,*/ FLD_LAST_ALARM_CODE, FLD_MP, FLD_MT};
|
||||
|
||||
const char* const fields[] = {"U_DC", "I_DC", "P_DC", "YieldDay", "YieldWeek", "YieldTotal",
|
||||
"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",
|
||||
"U_AC", "U_AC_1N", "U_AC_2N", "U_AC_3N", "U_AC_12", "U_AC_23", "U_AC_31", "I_AC",
|
||||
"I_AC_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","BootloaderVersion",
|
||||
"active_PowerLimit", "HWPartNumber", "HWVersion", "GridProfileCode",
|
||||
"GridProfileVersion", /*"reactivePowerLimit","Powerfactor",*/ "LastAlarmCode", "MaxPower", "MaxTemp"};
|
||||
|
@ -389,8 +389,11 @@ const devInfo_t devInfo[] = {
|
|||
{ 0x102271, 2000 }, // v2 black backplane, 16A
|
||||
|
||||
// HMT
|
||||
{ 0x103311, 1800 },
|
||||
{ 0x103331, 2250 }
|
||||
{ 0x103241, 1600 }, // -4T
|
||||
{ 0x103251, 1800 }, // -4T
|
||||
{ 0x103271, 2000 }, // -4T
|
||||
{ 0x103311, 1800 }, // -6T
|
||||
{ 0x103331, 2250 } // -6T
|
||||
};
|
||||
|
||||
#define MI_REQ_CH1 0x09
|
||||
|
|
|
@ -541,6 +541,10 @@ class Inverter {
|
|||
rec->length = (uint8_t)(HMS4CH_LIST_LEN);
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(hms4chAssignment));
|
||||
rec->pyldLen = HMS4CH_PAYLOAD_LEN;
|
||||
} else if(IV_HMT == ivGen){
|
||||
rec->length = (uint8_t)(HMT4CH_LIST_LEN);
|
||||
rec->assign = reinterpret_cast<byteAssign_t*>(const_cast<byteAssign_t*>(hmt4chAssignment));
|
||||
rec->pyldLen = HMT4CH_PAYLOAD_LEN;
|
||||
}
|
||||
channels = 4;
|
||||
}
|
||||
|
@ -985,7 +989,7 @@ T calcMaxTempCh0(Inverter<> *iv, uint8_t arg0) {
|
|||
}
|
||||
}
|
||||
if(Temp > maxTemp) {
|
||||
iv->tsMaxTemp = *iv->timestamp;
|
||||
iv->tsMaxTemperature = *iv->Timestamp;
|
||||
return Temp;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -131,6 +131,67 @@ const byteAssign_t hms4chAssignment[] = {
|
|||
#define HMS4CH_LIST_LEN (sizeof(hms4chAssignment) / sizeof(byteAssign_t))
|
||||
#define HMS4CH_PAYLOAD_LEN 66
|
||||
|
||||
//-------------------------------------
|
||||
// HMT-1600, HMT-1800, HMT-2000
|
||||
//-------------------------------------
|
||||
const byteAssign_t hmt4chAssignment[] = {
|
||||
{ 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_MP, UNIT_W, CH1, CALC_MPDC_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_MP, UNIT_W, CH2, CALC_MPDC_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_MP, UNIT_W, CH3, CALC_MPDC_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_MP, UNIT_W, CH4, CALC_MPDC_CH, CH4, 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 },
|
||||
{ FLD_MP, UNIT_W, CH0, CALC_MPAC_CH0, 0, CMD_CALC },
|
||||
{ FLD_MT, UNIT_C, CH0, CALC_MT_CH0, 0, CMD_CALC }
|
||||
};
|
||||
#define HMT4CH_LIST_LEN (sizeof(hmt4chAssignment) / sizeof(byteAssign_t))
|
||||
#define HMT4CH_PAYLOAD_LEN 98 // FIXME
|
||||
|
||||
//-------------------------------------
|
||||
// HMT-1800, HMT-2250
|
||||
//-------------------------------------
|
||||
|
|
|
@ -235,6 +235,10 @@ class PubMqtt {
|
|||
return mRxCnt;
|
||||
}
|
||||
|
||||
inline bool isJson() {
|
||||
return mCfgMqtt->json;
|
||||
}
|
||||
|
||||
void sendDiscoveryConfig(void) {
|
||||
DPRINTLN(DBG_VERBOSE, F("sendMqttDiscoveryConfig"));
|
||||
mDiscovery.running = true;
|
||||
|
|
|
@ -27,7 +27,7 @@ class PubMqttIvData {
|
|||
void setup(IApp *app, HMSYSTEM *sys, uint32_t *utcTs, std::queue<sendListCmdIv> *sendList) {
|
||||
mApp = app;
|
||||
mSys = sys;
|
||||
mJson = json;
|
||||
mJson = app->getMqttJsonEnabled();
|
||||
mUtcTimestamp = utcTs;
|
||||
mSendList = sendList;
|
||||
mState = IDLE;
|
||||
|
@ -213,13 +213,9 @@ class PubMqttIvData {
|
|||
if (mJson && RealTimeRunData_Debug == mCmd) {
|
||||
DynamicJsonDocument doc(300);
|
||||
std::array<char, 300> buf;
|
||||
bool zero = true;
|
||||
|
||||
for (mPos = 0; mPos < rec->length; mPos++) {
|
||||
double value = ah::round3(mIv->getValue(mPos, rec));
|
||||
if (value != 0)
|
||||
zero = false;
|
||||
doc[fields[rec->assign[mPos].fieldId]] = value;
|
||||
doc[fields[rec->assign[mPos].fieldId]] = ah::round3(mIv->getValue(mPos, rec));
|
||||
|
||||
bool publish = false;
|
||||
if (mPos != rec->length - 1) { // not last one
|
||||
|
@ -230,14 +226,10 @@ class PubMqttIvData {
|
|||
|
||||
if (publish) {
|
||||
publish = false;
|
||||
// if next channel or end->publish but not if values are all zero
|
||||
if (!zero)
|
||||
{
|
||||
serializeJson(doc, buf.data(), buf.size());
|
||||
snprintf(mSubTopic.data(), mSubTopic.size(), "%s/ch%d", mIv->config->name, rec->assign[mPos].ch);
|
||||
mPublish(mSubTopic.data(), buf.data(), false, QOS_0);
|
||||
}
|
||||
zero = true;
|
||||
// if next channel or end->publish
|
||||
serializeJson(doc, buf.data(), buf.size());
|
||||
snprintf(mSubTopic.data(), mSubTopic.size(), "%s/ch%d", mIv->config->name, rec->assign[mPos].ch);
|
||||
mPublish(mSubTopic.data(), buf.data(), false, QOS_0);
|
||||
doc.clear();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue