|  |  | @ -46,7 +46,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |         mApi = api; | 
			
		
	
		
			
				
					|  |  |  |         mMqtt = mqtt; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         mIsInitialized = mPowermeter.setup(mCfg); | 
			
		
	
		
			
				
					|  |  |  |         mIsInitialized = mPowermeter.setup(mCfg, &mLog); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     /** loop
 | 
			
		
	
	
		
			
				
					|  |  | @ -79,6 +79,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             mLog["g"] = group; | 
			
		
	
		
			
				
					|  |  |  |             mLog["s"] = (uint8_t)mCfg->groups[group].state; | 
			
		
	
		
			
				
					|  |  |  |             mLog["s2"] = (uint8_t)mCfg->groups[group].stateNext; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             switch (mCfg->groups[group].state) { | 
			
		
	
		
			
				
					|  |  |  |                 case zeroExportState::INIT: | 
			
		
	
	
		
			
				
					|  |  | @ -509,6 +510,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |         if (obj["path"] == "zero" && obj["cmd"] == "set") | 
			
		
	
		
			
				
					|  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |             // "topic":"inverter/zero/set/groups/0/enabled"
 | 
			
		
	
		
			
				
					|  |  |  |             // @TODO: state machine init
 | 
			
		
	
		
			
				
					|  |  |  |             if (topic.indexOf("groups") != -1) { | 
			
		
	
		
			
				
					|  |  |  |                 String i = topic.substring(topic.length() - 10, topic.length() - 8); | 
			
		
	
		
			
				
					|  |  |  |                 uint id = i.toInt(); | 
			
		
	
	
		
			
				
					|  |  | @ -534,6 +536,14 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |      * @returns true/false | 
			
		
	
		
			
				
					|  |  |  |      * @todo getInverterById statt getInverterByPos, dann würde die Variable *iv und die Schleife nicht gebraucht. | 
			
		
	
		
			
				
					|  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     /* EnabledSelected
 | 
			
		
	
		
			
				
					|  |  |  |      * Inverter not enabled -> ignore || Inverter not selected -> ignore | 
			
		
	
		
			
				
					|  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |     bool NotEnabledOrNotSelected(uint8_t group, uint8_t inv) { | 
			
		
	
		
			
				
					|  |  |  |         return !mCfg->groups[group].inverters[inv].enabled || mCfg->groups[group].inverters[inv].id < 0; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     bool groupInit(uint8_t group, unsigned long *tsp, bool *doLog) { | 
			
		
	
		
			
				
					|  |  |  |         uint8_t result = false; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -550,6 +560,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // Search/Set ivPointer
 | 
			
		
	
		
			
				
					|  |  |  |         JsonArray logArr = mLog.createNestedArray("ix"); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) { | 
			
		
	
		
			
				
					|  |  |  |             JsonObject logObj = logArr.createNestedObject(); | 
			
		
	
		
			
				
					|  |  |  |             logObj["i"] = inv; | 
			
		
	
	
		
			
				
					|  |  | @ -557,14 +568,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |             mIv[group][inv] = nullptr; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not enabled -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (!mCfg->groups[group].inverters[inv].enabled) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not selected -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (mCfg->groups[group].inverters[inv].id < 0) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             if (NotEnabledOrNotSelected(group, inv)) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Load Config
 | 
			
		
	
		
			
				
					|  |  |  |             Inverter<> *iv; | 
			
		
	
	
		
			
				
					|  |  | @ -572,14 +576,10 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |                 iv = mSys->getInverterByPos(i); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 // Inverter not configured -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |                 if (iv == NULL) { | 
			
		
	
		
			
				
					|  |  |  |                     continue; | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 if (iv == NULL) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 // Inverter not matching -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |                 if (iv->id != (uint8_t)mCfg->groups[group].inverters[inv].id) { | 
			
		
	
		
			
				
					|  |  |  |                     continue; | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 if (iv->id != (uint8_t)mCfg->groups[group].inverters[inv].id) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 // Save Inverter
 | 
			
		
	
		
			
				
					|  |  |  |                 logObj["pos"] = i; | 
			
		
	
	
		
			
				
					|  |  | @ -663,13 +663,8 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |             logObj["i"] = inv; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not enabled -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (!mCfg->groups[group].inverters[inv].enabled) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not selected -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (mCfg->groups[group].inverters[inv].id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             if (NotEnabledOrNotSelected(group, inv)) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Inverter is not available -> wait
 | 
			
		
	
		
			
				
					|  |  |  |             if (!mIv[group][inv]->isAvailable()) { | 
			
		
	
		
			
				
					|  |  |  |                 logObj["a"] = false; | 
			
		
	
	
		
			
				
					|  |  | @ -720,13 +715,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |             logObj["i"] = inv; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not enabled -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (!mCfg->groups[group].inverters[inv].enabled) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not selected -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (mCfg->groups[group].inverters[inv].id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             if (NotEnabledOrNotSelected(group, inv)) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             if (!mIv[group][inv]->isAvailable()) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
	
		
			
				
					|  |  | @ -829,13 +818,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |                     //                        zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv];
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     // Inverter not enabled -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |                     if (!mCfg->groups[group].inverters[inv].enabled) { | 
			
		
	
		
			
				
					|  |  |  |                         continue; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     // Inverter not selected -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |                     if (mCfg->groups[group].inverters[inv].id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |                         continue; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     if (NotEnabledOrNotSelected(group, inv)) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     // Abbruch weil Inverter nicht verfügbar
 | 
			
		
	
		
			
				
					|  |  |  |                     if (!mIv[group][inv]->isAvailable()) { | 
			
		
	
	
		
			
				
					|  |  | @ -863,13 +846,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |                     //                        zeroExportGroupInverter_t *cfgGroupInv = &mCfg->groups[group].inverters[inv];
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     // Inverter not enabled -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |                     if (!mCfg->groups[group].inverters[inv].enabled) { | 
			
		
	
		
			
				
					|  |  |  |                         continue; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     // Inverter not selected -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |                     if (mCfg->groups[group].inverters[inv].id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |                         continue; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     if (NotEnabledOrNotSelected(group, inv)) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     // Abbruch weil Inverter nicht verfügbar
 | 
			
		
	
		
			
				
					|  |  |  |                     if (!mIv[group][inv]->isAvailable()) { | 
			
		
	
	
		
			
				
					|  |  | @ -906,13 +883,15 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |     bool groupGetPowermeter(uint8_t group, unsigned long *tsp, bool *doLog) { | 
			
		
	
		
			
				
					|  |  |  |         if (mCfg->debug) mLog["t"] = "groupGetPowermeter"; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         mCfg->groups[group].lastRun = *tsp; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         *doLog = true; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         bool result = false; | 
			
		
	
		
			
				
					|  |  |  |         result = mPowermeter.getData(mLog, group); | 
			
		
	
		
			
				
					|  |  |  |          mCfg->groups[group].pmPower = mPowermeter.getDataAVG(group).P; | 
			
		
	
		
			
				
					|  |  |  |          mCfg->groups[group].pmPowerL1 = mPowermeter.getDataAVG(group).P1; | 
			
		
	
		
			
				
					|  |  |  |          mCfg->groups[group].pmPowerL2 = mPowermeter.getDataAVG(group).P2; | 
			
		
	
		
			
				
					|  |  |  |          mCfg->groups[group].pmPowerL3 = mPowermeter.getDataAVG(group).P3; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         if ( | 
			
		
	
		
			
				
					|  |  |  |             (mCfg->groups[group].pmPower == 0) && | 
			
		
	
		
			
				
					|  |  |  |             (mCfg->groups[group].pmPowerL1 == 0) && | 
			
		
	
	
		
			
				
					|  |  | @ -921,6 +900,11 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         mLog["P"] = mCfg->groups[group].pmPower; | 
			
		
	
		
			
				
					|  |  |  |         mLog["P1"] = mCfg->groups[group].pmPowerL1; | 
			
		
	
		
			
				
					|  |  |  |         mLog["P2"] = mCfg->groups[group].pmPowerL2; | 
			
		
	
		
			
				
					|  |  |  |         mLog["P3"] = mCfg->groups[group].pmPowerL3; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         return true; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -1236,13 +1220,8 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |             logObj["i"] = inv; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not enabled -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (!mCfg->groups[group].inverters[inv].enabled) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not selected -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (mCfg->groups[group].inverters[inv].id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             if (NotEnabledOrNotSelected(group, inv)) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             *doLog = true; | 
			
		
	
		
			
				
					|  |  |  |             // Reset
 | 
			
		
	
		
			
				
					|  |  |  |             if ((mCfg->groups[group].inverters[inv].doReboot) && (mCfg->groups[group].inverters[inv].waitRebootAck == 0)) { | 
			
		
	
	
		
			
				
					|  |  | @ -1310,13 +1289,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |             logObj["i"] = inv; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not enabled -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (!mCfg->groups[group].inverters[inv].enabled) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not selected -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (mCfg->groups[group].inverters[inv].id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             if (NotEnabledOrNotSelected(group, inv)) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             if (mCfg->debug) *doLog = true; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -1411,14 +1384,7 @@ class ZeroExport { | 
			
		
	
		
			
				
					|  |  |  |             logObj["i"] = inv; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not enabled -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (!mCfg->groups[group].inverters[inv].enabled) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Inverter not selected -> ignore
 | 
			
		
	
		
			
				
					|  |  |  |             if (mCfg->groups[group].inverters[inv].id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |                 continue; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             if (NotEnabledOrNotSelected(group, inv)) continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // if isOff -> Limit Pmin
 | 
			
		
	
		
			
				
					|  |  |  |             if (!mIv[group][inv]->isProducing()) { | 
			
		
	
	
		
			
				
					|  |  | 
 |