@ -95,7 +95,7 @@ void app::loopStandard(void) { 
				
			 
			
		
	
		
		
			
				
					 
					 
					            mStat . frmCnt + + ;  
					 
					 
					            mStat . frmCnt + + ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					            Inverter < >  * iv  =  mSys . findInverter ( & p - > packet [ 1 ] ) ;  
					 
					 
					            Inverter < >  * iv  =  mSys . findInverter ( & p - > packet [ 1 ] ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            if ( NULL  = =  iv )  {  
					 
					 
					            if ( NULL  ! =  iv )  {  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					                if ( IV_HM  = =  iv - > ivGen )  
					 
					 
					                if ( IV_HM  = =  iv - > ivGen )  
				
			 
			
		
	
		
		
			
				
					 
					 
					                    mPayload . add ( iv ,  p ) ;  
					 
					 
					                    mPayload . add ( iv ,  p ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					                else  
					 
					 
					                else  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					@ -161,12 +161,14 @@ void app::tickNtpUpdate(void) { 
				
			 
			
		
	
		
		
			
				
					 
					 
					            mMqtt . connect ( ) ;  
					 
					 
					            mMqtt . connect ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					            everySec ( std : : bind ( & PubMqttType : : tickerSecond ,  & mMqtt ) ,  " mqttS " ) ;  
					 
					 
					            everySec ( std : : bind ( & PubMqttType : : tickerSecond ,  & mMqtt ) ,  " mqttS " ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					            everyMin ( std : : bind ( & PubMqttType : : tickerMinute ,  & mMqtt ) ,  " mqttM " ) ;  
					 
					 
					            everyMin ( std : : bind ( & PubMqttType : : tickerMinute ,  & mMqtt ) ,  " mqttM " ) ;  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					            if ( mConfig - > mqtt . rstYieldMidNight )  {  
					 
					 
					            mMqttReconnect  =  false ;  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        everyMin ( std : : bind ( & app : : tickMinute ,  this ) ,  " tMin " ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        if ( mConfig - > inst . rstYieldMidNight )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					            uint32_t  midTrig  =  mTimestamp  -  ( ( mTimestamp  -  1 )  %  86400 )  +  86400 ;  // next midnight
  
					 
					 
					            uint32_t  midTrig  =  mTimestamp  -  ( ( mTimestamp  -  1 )  %  86400 )  +  86400 ;  // next midnight
  
				
			 
			
		
	
		
		
			
				
					 
					 
					            onceAt ( std : : bind ( & app : : tickMidnight ,  this ) ,  midTrig ,  " midNi " ) ;  
					 
					 
					            onceAt ( std : : bind ( & app : : tickMidnight ,  this ) ,  midTrig ,  " midNi " ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					        }  
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					            mMqttReconnect  =  false ;  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					        }  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					        nxtTrig  =  isOK  ?  43200  :  60 ;  // depending on NTP update success check again in 12 h or in 1 min
  
					 
					 
					        nxtTrig  =  isOK  ?  43200  :  60 ;  // depending on NTP update success check again in 12 h or in 1 min
  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					@ -212,7 +214,6 @@ void app::tickIVCommunication(void) { 
				
			 
			
		
	
		
		
			
				
					 
					 
					        if  ( nxtTrig  ! =  0 )  
					 
					 
					        if  ( nxtTrig  ! =  0 )  
				
			 
			
		
	
		
		
			
				
					 
					 
					            onceAt ( std : : bind ( & app : : tickIVCommunication ,  this ) ,  nxtTrig ,  " ivCom " ) ;  
					 
					 
					            onceAt ( std : : bind ( & app : : tickIVCommunication ,  this ) ,  nxtTrig ,  " ivCom " ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					    }  
					 
					 
					    }  
				
			 
			
		
	
		
		
			
				
					 
					 
					    if  ( mMqttEnabled )  
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					 
					 
					    tickComm ( ) ;  
					 
					 
					    tickComm ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					}  
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					@ -225,17 +226,58 @@ void app::tickSun(void) { 
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					//-----------------------------------------------------------------------------
  
					 
					 
					//-----------------------------------------------------------------------------
  
				
			 
			
		
	
		
		
			
				
					 
					 
					void  app : : tickComm ( void )  {  
					 
					 
					void  app : : tickComm ( void )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					    // only used and enabled by MQTT (see setup())
  
					 
					 
					    if ( ! mIVCommunicationOn  & &  ( mConfig - > inst . rstValsCommStop ) )  {  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        Inverter < >  * iv ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        // set values to zero, except yields
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        for  ( uint8_t  id  =  0 ;  id  <  mSys . getNumInverters ( ) ;  id + + )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            iv  =  mSys . getInverterByPos ( id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if  ( NULL  = =  iv )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                continue ;  // skip to next inverter
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            mPayload . zeroInverterValues ( iv ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    if  ( mMqttEnabled )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					        if  ( ! mMqtt . tickerComm ( ! mIVCommunicationOn ) )  
					 
					 
					        if  ( ! mMqtt . tickerComm ( ! mIVCommunicationOn ) )  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					        once ( std : : bind ( & app : : tickComm ,  this ) ,  1 ,  " mqCom " ) ;     // MQTT not connected, retry
  
					 
					 
					            once ( std : : bind ( & app : : tickComm ,  this ) ,  5 ,  " mqCom " ) ;     // MQTT not connected, retry after 5s
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					//-----------------------------------------------------------------------------
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					void  app : : tickMinute ( void )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    if ( mConfig - > inst . rstValsNotAvail )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        Inverter < >  * iv ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        // set values to zero, except yields
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        for  ( uint8_t  id  =  0 ;  id  <  mSys . getNumInverters ( ) ;  id + + )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            iv  =  mSys . getInverterByPos ( id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if  ( NULL  = =  iv )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                continue ;  // skip to next inverter
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            if ( ! iv - > isAvailable ( mTimestamp )  & &  ! iv - > isProducing ( mTimestamp )  & &  iv - > config - > enabled )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					                mPayload . zeroInverterValues ( iv ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    }  
				
			 
			
		
	
		
		
			
				
					 
					 
					}  
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					//-----------------------------------------------------------------------------
  
					 
					 
					//-----------------------------------------------------------------------------
  
				
			 
			
		
	
		
		
			
				
					 
					 
					void  app : : tickMidnight ( void )  {  
					 
					 
					void  app : : tickMidnight ( void )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					    // only used and enabled by MQTT (see setup())
  
					 
					 
					    // only triggered if 'reset values at midnight is enabled' 
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					 
					 
					    uint32_t  nxtTrig  =  mTimestamp  -  ( ( mTimestamp  -  1 )  %  86400 )  +  86400 ;  // next midnight
  
					 
					 
					    uint32_t  nxtTrig  =  mTimestamp  -  ( ( mTimestamp  -  1 )  %  86400 )  +  86400 ;  // next midnight
  
				
			 
			
		
	
		
		
			
				
					 
					 
					    onceAt ( std : : bind ( & app : : tickMidnight ,  this ) ,  nxtTrig ,  " mid2 " ) ;  
					 
					 
					    onceAt ( std : : bind ( & app : : tickMidnight ,  this ) ,  nxtTrig ,  " mid2 " ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					
 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    Inverter < >  * iv ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    // set values to zero, except yield total
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    for  ( uint8_t  id  =  0 ;  id  <  mSys . getNumInverters ( ) ;  id + + )  {  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        iv  =  mSys . getInverterByPos ( id ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        if  ( NULL  = =  iv )  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					            continue ;  // skip to next inverter
  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        mPayload . zeroInverterValues ( iv ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					        mPayload . zeroYieldDay ( iv ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    }  
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					 
					 
					 
					 
					 
					    if  ( mMqttEnabled )  
				
			 
			
		
	
		
		
			
				
					 
					 
					        mMqtt . tickerMidnight ( ) ;  
					 
					 
					        mMqtt . tickerMidnight ( ) ;  
				
			 
			
		
	
		
		
			
				
					 
					 
					}  
					 
					 
					}