diff --git a/src/app.h b/src/app.h index 634696f2..12d03d0b 100644 --- a/src/app.h +++ b/src/app.h @@ -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(); diff --git a/src/appInterface.h b/src/appInterface.h index f2292ec8..92fade46 100644 --- a/src/appInterface.h +++ b/src/appInterface.h @@ -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; diff --git a/src/hm/hmDefines.h b/src/hm/hmDefines.h index 06d0aad0..4287d26e 100644 --- a/src/hm/hmDefines.h +++ b/src/hm/hmDefines.h @@ -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 diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 34d04491..860cf51d 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -541,6 +541,10 @@ class Inverter { rec->length = (uint8_t)(HMS4CH_LIST_LEN); rec->assign = reinterpret_cast(const_cast(hms4chAssignment)); rec->pyldLen = HMS4CH_PAYLOAD_LEN; + } else if(IV_HMT == ivGen){ + rec->length = (uint8_t)(HMT4CH_LIST_LEN); + rec->assign = reinterpret_cast(const_cast(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; } } diff --git a/src/hms/hmsDefines.h b/src/hms/hmsDefines.h index c71aa796..5d6647bb 100644 --- a/src/hms/hmsDefines.h +++ b/src/hms/hmsDefines.h @@ -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 //------------------------------------- diff --git a/src/publisher/pubMqtt.h b/src/publisher/pubMqtt.h index 71f53f7b..f422fad7 100644 --- a/src/publisher/pubMqtt.h +++ b/src/publisher/pubMqtt.h @@ -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; diff --git a/src/publisher/pubMqttIvData.h b/src/publisher/pubMqttIvData.h index 984578ff..afd6165b 100644 --- a/src/publisher/pubMqttIvData.h +++ b/src/publisher/pubMqttIvData.h @@ -27,7 +27,7 @@ class PubMqttIvData { void setup(IApp *app, HMSYSTEM *sys, uint32_t *utcTs, std::queue *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 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(); } }