|  |  | @ -186,6 +186,8 @@ typedef struct { | 
			
		
	
		
			
				
					|  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | // Plugin ZeroExport
 | 
			
		
	
		
			
				
					|  |  |  | #if defined(PLUGIN_ZEROEXPORT) | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #define ZEROEXPORT_MAX_GROUPS                       6 | 
			
		
	
		
			
				
					|  |  |  | #define ZEROEXPORT_GROUP_MAX_LEN_NAME              25 | 
			
		
	
		
			
				
					|  |  |  | #define ZEROEXPORT_GROUP_MAX_LEN_PM_URL           100 | 
			
		
	
	
		
			
				
					|  |  | @ -196,9 +198,22 @@ typedef struct { | 
			
		
	
		
			
				
					|  |  |  | #define ZEROEXPORT_POWERMETER_MAX_ERRORS            5 | 
			
		
	
		
			
				
					|  |  |  | #define ZEROEXPORT_DEF_INV_WAITINGTIME_MS       10000 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #if defined(PLUGIN_ZEROEXPORT) | 
			
		
	
		
			
				
					|  |  |  | enum class zeroExportState : uint8_t { | 
			
		
	
		
			
				
					|  |  |  |      RESET, GETPOWERMETER, GETINVERTERDATA, BATTERYPROTECTION, CONTROL, SETCONTROL, FINISH | 
			
		
	
		
			
				
					|  |  |  |     INIT, | 
			
		
	
		
			
				
					|  |  |  |     WAIT, | 
			
		
	
		
			
				
					|  |  |  |     WAITREFRESH, | 
			
		
	
		
			
				
					|  |  |  |     GETINVERTERACKS, | 
			
		
	
		
			
				
					|  |  |  |     GETINVERTERDATA, | 
			
		
	
		
			
				
					|  |  |  |     BATTERYPROTECTION, | 
			
		
	
		
			
				
					|  |  |  |     GETPOWERMETER, | 
			
		
	
		
			
				
					|  |  |  | 	CONTROLLER, | 
			
		
	
		
			
				
					|  |  |  | 	PROGNOSE, | 
			
		
	
		
			
				
					|  |  |  | 	AUFTEILEN, | 
			
		
	
		
			
				
					|  |  |  | 	SETLIMIT, | 
			
		
	
		
			
				
					|  |  |  | 	SETPOWER, | 
			
		
	
		
			
				
					|  |  |  | 	SETREBOOT, | 
			
		
	
		
			
				
					|  |  |  |     FINISH, | 
			
		
	
		
			
				
					|  |  |  |     ERROR | 
			
		
	
		
			
				
					|  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | typedef enum { | 
			
		
	
	
		
			
				
					|  |  | @ -246,6 +261,9 @@ typedef struct { | 
			
		
	
		
			
				
					|  |  |  |     float power; | 
			
		
	
		
			
				
					|  |  |  |     uint16_t limit; | 
			
		
	
		
			
				
					|  |  |  |     uint16_t limitNew; | 
			
		
	
		
			
				
					|  |  |  |     bool waitLimitAck; | 
			
		
	
		
			
				
					|  |  |  |     bool waitPowerAck; | 
			
		
	
		
			
				
					|  |  |  |     bool waitRebootAck; | 
			
		
	
		
			
				
					|  |  |  |     unsigned long limitTsp; | 
			
		
	
		
			
				
					|  |  |  |     float dcVoltage; | 
			
		
	
		
			
				
					|  |  |  |     bool state; | 
			
		
	
	
		
			
				
					|  |  | @ -274,9 +292,13 @@ typedef struct { | 
			
		
	
		
			
				
					|  |  |  |     uint16_t powerMax; | 
			
		
	
		
			
				
					|  |  |  |     //
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     zeroExportState stateLast; | 
			
		
	
		
			
				
					|  |  |  |     zeroExportState state; | 
			
		
	
		
			
				
					|  |  |  |     zeroExportState stateNext; | 
			
		
	
		
			
				
					|  |  |  |     unsigned long lastRun; | 
			
		
	
		
			
				
					|  |  |  |     unsigned long lastRefresh; | 
			
		
	
		
			
				
					|  |  |  | //    bool waitForAck;
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     float pmPower; | 
			
		
	
		
			
				
					|  |  |  |     float pmPowerL1; | 
			
		
	
		
			
				
					|  |  |  |     float pmPowerL2; | 
			
		
	
	
		
			
				
					|  |  | @ -298,6 +320,8 @@ typedef struct { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | typedef struct { | 
			
		
	
		
			
				
					|  |  |  |     bool enabled; | 
			
		
	
		
			
				
					|  |  |  |     bool log_over_webserial; | 
			
		
	
		
			
				
					|  |  |  |     bool log_over_mqtt; | 
			
		
	
		
			
				
					|  |  |  |     zeroExportGroup_t groups[ZEROEXPORT_MAX_GROUPS]; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -314,6 +338,7 @@ typedef struct { | 
			
		
	
		
			
				
					|  |  |  | //    double max_power;
 | 
			
		
	
		
			
				
					|  |  |  | //    bool two_percent;   // ask if not go lower then 2%
 | 
			
		
	
		
			
				
					|  |  |  | } zeroExport_t; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  | // Plugin ZeroExport - Ende
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -624,6 +649,8 @@ class settings { | 
			
		
	
		
			
				
					|  |  |  |             // Plugin ZeroExport
 | 
			
		
	
		
			
				
					|  |  |  |             #if defined(PLUGIN_ZEROEXPORT) | 
			
		
	
		
			
				
					|  |  |  |             mCfg.plugin.zeroExport.enabled = false; | 
			
		
	
		
			
				
					|  |  |  |             mCfg.plugin.zeroExport.log_over_webserial = false; | 
			
		
	
		
			
				
					|  |  |  |             mCfg.plugin.zeroExport.log_over_mqtt = false; | 
			
		
	
		
			
				
					|  |  |  |             for(uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { | 
			
		
	
		
			
				
					|  |  |  |                 // General
 | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].enabled = false; | 
			
		
	
	
		
			
				
					|  |  | @ -641,6 +668,10 @@ class settings { | 
			
		
	
		
			
				
					|  |  |  |                     mCfg.plugin.zeroExport.groups[group].inverters[inv].target = -1; | 
			
		
	
		
			
				
					|  |  |  |                     mCfg.plugin.zeroExport.groups[group].inverters[inv].powerMin = 10; | 
			
		
	
		
			
				
					|  |  |  |                     mCfg.plugin.zeroExport.groups[group].inverters[inv].powerMax = 600; | 
			
		
	
		
			
				
					|  |  |  |                     //
 | 
			
		
	
		
			
				
					|  |  |  |                     mCfg.plugin.zeroExport.groups[group].inverters[inv].waitLimitAck = false; | 
			
		
	
		
			
				
					|  |  |  |                     mCfg.plugin.zeroExport.groups[group].inverters[inv].waitPowerAck = false; | 
			
		
	
		
			
				
					|  |  |  |                     mCfg.plugin.zeroExport.groups[group].inverters[inv].waitRebootAck = false; | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 // Battery
 | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].battEnabled = false; | 
			
		
	
	
		
			
				
					|  |  | @ -651,9 +682,10 @@ class settings { | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].refresh = 10; | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].powerTolerance = 10; | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].powerMax = 600; | 
			
		
	
		
			
				
					|  |  |  | //
 | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].state = zeroExportState::RESET; | 
			
		
	
		
			
				
					|  |  |  |                 //
 | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].state = zeroExportState::INIT; | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].lastRun = 0; | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].lastRefresh = 0; | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].pmPower = 0; | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].pmPowerL1 = 0; | 
			
		
	
		
			
				
					|  |  |  |                 mCfg.plugin.zeroExport.groups[group].pmPowerL2 = 0; | 
			
		
	
	
		
			
				
					|  |  | @ -1017,6 +1049,8 @@ class settings { | 
			
		
	
		
			
				
					|  |  |  |         void jsonZeroExport(JsonObject obj, bool set = false) { | 
			
		
	
		
			
				
					|  |  |  |             if(set) { | 
			
		
	
		
			
				
					|  |  |  |                 obj[F("enabled")] = mCfg.plugin.zeroExport.enabled; | 
			
		
	
		
			
				
					|  |  |  |                 obj[F("log_over_webserial")] = mCfg.plugin.zeroExport.log_over_webserial; | 
			
		
	
		
			
				
					|  |  |  |                 obj[F("log_over_mqtt")] = mCfg.plugin.zeroExport.log_over_mqtt; | 
			
		
	
		
			
				
					|  |  |  |                 JsonArray grpArr = obj.createNestedArray(F("groups")); | 
			
		
	
		
			
				
					|  |  |  |                 for(uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { | 
			
		
	
		
			
				
					|  |  |  |                     jsonZeroExportGroup(grpArr.createNestedObject(), group, set); | 
			
		
	
	
		
			
				
					|  |  | @ -1026,6 +1060,10 @@ class settings { | 
			
		
	
		
			
				
					|  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |                 if (obj.containsKey(F("enabled"))) | 
			
		
	
		
			
				
					|  |  |  |                     getVal<bool>(obj, F("enabled"), &mCfg.plugin.zeroExport.enabled); | 
			
		
	
		
			
				
					|  |  |  |                 if (obj.containsKey(F("log_over_webserial"))) | 
			
		
	
		
			
				
					|  |  |  |                     getVal<bool>(obj, F("log_over_webserial"), &mCfg.plugin.zeroExport.log_over_webserial); | 
			
		
	
		
			
				
					|  |  |  |                 if (obj.containsKey(F("log_over_mqtt"))) | 
			
		
	
		
			
				
					|  |  |  |                     getVal<bool>(obj, F("log_over_mqtt"), &mCfg.plugin.zeroExport.log_over_mqtt); | 
			
		
	
		
			
				
					|  |  |  |                 if (obj.containsKey(F("groups"))) { | 
			
		
	
		
			
				
					|  |  |  |                     for(uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) { | 
			
		
	
		
			
				
					|  |  |  |                         jsonZeroExportGroup(obj[F("groups")][group], group, set); | 
			
		
	
	
		
			
				
					|  |  | 
 |