@ -9,8 +9,8 @@ 
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "app.h"  
			
		
	
		
			
				
					# include  <ArduinoJson.h>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  <ArduinoJson.h>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					app : : app ( )  {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -27,7 +27,6 @@ app::app() { 
			
		
	
		
			
				
					    mShouldReboot  =  false ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : setup ( uint32_t  timeout )  {  
			
		
	
		
			
				
					    DPRINTLN ( DBG_VERBOSE ,  F ( " app::setup " ) ) ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -82,7 +81,6 @@ void app::loop(void) { 
			
		
	
		
			
				
					        ESP . restart ( ) ;  
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     
			
		
	
		
			
				
					    mSys - > Radio . loop ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    yield ( ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -100,24 +98,26 @@ void app::loop(void) { 
			
		
	
		
			
				
					                    DPRINT ( DBG_INFO ,  " RX  "  +  String ( len )  +  " B Ch "  +  String ( p - > rxCh )  +  "  |  " ) ;  
			
		
	
		
			
				
					                    mSys - > Radio . dumpBuf ( NULL ,  p - > packet ,  len ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                mStat . frmCnt + + ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( 0  ! =  len )  {  
			
		
	
		
			
				
					                    Inverter < >  * iv  =  mSys - > findInverter ( & p - > packet [ 1 ] ) ;  
			
		
	
		
			
				
					                    if ( ( NULL  ! =  iv )  & &  ( p - > packet [ 0 ]  = =  ( TX_REQ_INFO  +  0x80 ) ) )  {  // response from get information command
  
			
		
	
		
			
				
					                    if  ( ( NULL  ! =  iv )  & &  ( p - > packet [ 0 ]  = =  ( TX_REQ_INFO  +  ALL_FRAMES ) ) )   // response from get information command
  
			
		
	
		
			
				
					                    {  
			
		
	
		
			
				
					                        mPayload [ iv - > id ] . txId  =  p - > packet [ 0 ] ;  
			
		
	
		
			
				
					                        DPRINTLN ( DBG_DEBUG ,  F ( " Response from info request received " ) ) ;  
			
		
	
		
			
				
					                        uint8_t  * pid  =  & p - > packet [ 9 ] ;  
			
		
	
		
			
				
					                        if  ( * pid  = =  0x00 )  
			
		
	
		
			
				
					                            DPRINT ( DBG_DEBUG ,  " fragment number zero received and ignored " ) ;  
			
		
	
		
			
				
					                        else  {  
			
		
	
		
			
				
					                        if  ( * pid  = =  0x00 )  {   
			
		
	
		
			
				
					                            DPRINT ( DBG_DEBUG ,  F ( " fragment number zero received and ignored " ) ) ;  
			
		
	
		
			
				
					                        }  else  {  
			
		
	
		
			
				
					                            DPRINTLN ( DBG_DEBUG ,  " PID: 0x "  +  String ( * pid ,  HEX ) ) ;  
			
		
	
		
			
				
					                            if  ( ( * pid  &  0x7F )  <  5 )  {  
			
		
	
		
			
				
					                                memcpy ( mPayload [ iv - > id ] . data [ ( * pid  &  0x7F )  -  1 ] ,  & p - > packet [ 10 ] ,  len  -  11 ) ;  
			
		
	
		
			
				
					                                mPayload [ iv - > id ] . len [ ( * pid  &  0x7F )  -  1 ]  =  len  -  11 ;  
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            if  ( ( * pid  &  0x80 )  = =  0x80 )  {  
			
		
	
		
			
				
					                            if  ( ( * pid  &  ALL_FRAMES )  = =  ALL_FRAMES )  {  
			
		
	
		
			
				
					                                // Last packet
  
			
		
	
		
			
				
					                                if  ( ( * pid  &  0x7f )  >  mPayload [ iv - > id ] . maxPackId )  {  
			
		
	
		
			
				
					                                    mPayload [ iv - > id ] . maxPackId  =  ( * pid  &  0x7f ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -127,15 +127,16 @@ void app::loop(void) { 
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                    if ( ( NULL  ! =  iv )  & &  ( p - > packet [ 0 ]  = =  ( TX_REQ_DEVCONTROL  +  0x80 ) ) )  { // response from dev control command
  
			
		
	
		
			
				
					                        mPayload [ iv - > id ] . txId  =  p - > packet [ 0 ] ;   
			
		
	
		
			
				
					                    if   ( ( NULL  ! =  iv )  & &  ( p - > packet [ 0 ]  = =  ( TX_REQ_DEVCONTROL  +  ALL_FRAMES ) ) )   // response from dev control command
  
			
		
	
		
			
				
					                    {  
			
		
	
		
			
				
					                        DPRINTLN ( DBG_DEBUG ,  F ( " Response from devcontrol request received " ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                        mPayload [ iv - > id ] . txId  =  p - > packet [ 0 ] ;  
			
		
	
		
			
				
					                        iv - > devControlRequest  =  false ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                        if  ( ( p - > packet [ 12 ]  = =  ActivePowerContr )  & &  ( p - > packet [ 13 ]  = =  0x00 ) )  {  
			
		
	
		
			
				
					                            if  ( p - > packet [ 10 ]  = =  0x00  & &  p - > packet [ 11 ]  = =  0x00 )  
			
		
	
		
			
				
					                                DPRINTLN ( DBG_INFO ,  F ( " Inverter  " )  +  String ( iv - > id )  +  F ( "  has accepted power limit set point  " )  +  String ( iv - > powerLimit [ 0 ] )  +  F ( "  with PowerLimitControl  " )   +  String ( iv - > powerLimit [ 1 ] ) ) ;  
			
		
	
		
			
				
					                            else  
			
		
	
		
			
				
					                                DPRINTLN ( DBG_INFO ,  F ( " Inverter  " )  +  String ( iv - > id )  +  F ( "  has NOT accepted power limit set point " )  +  String ( iv - > powerLimit [ 0 ] )  +  F ( "  with PowerLimitControl  " )   +  String ( iv - > powerLimit [ 1 ] ) ) ;  
			
		
	
		
			
				
					                            String  msg  =  ( p - > packet [ 10 ]  = =  0x00  & &  p - > packet [ 11 ]  = =  0x00 )  ?  " "  :  " NOT  " ;  
			
		
	
		
			
				
					                            DPRINTLN ( DBG_INFO ,  F ( " Inverter  " )  +  String ( iv - > id )  +  F ( "  has  " )  +  msg  +  F ( " accepted power limit set point  " )  +  String ( iv - > powerLimit [ 0 ] )  +  F ( "  with PowerLimitControl  " )  +  String ( iv - > powerLimit [ 1 ] ) ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                        iv - > devControlCmd  =  Init ;  
			
		
	
		
			
				
					                    }  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -145,7 +146,6 @@ void app::loop(void) { 
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					        yield ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( rxRdy )  {  
			
		
	
		
			
				
					            processPayload ( true ) ;  
			
		
	
		
			
				
					        }  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -267,6 +267,7 @@ void app::loop(void) { 
			
		
	
		
			
				
					                        DPRINTLN ( DBG_DEBUG ,  F ( " app:loop WiFi WiFi.status  " )  +  String ( WiFi . status ( ) ) ) ;  
			
		
	
		
			
				
					                        DPRINTLN ( DBG_INFO ,  F ( " Requesting Inverter SN  " )  +  String ( iv - > serial . u64 ,  HEX ) ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    if  ( iv - > devControlRequest )  {  
			
		
	
		
			
				
					                        if  ( mConfig . serialDebug )  
			
		
	
		
			
				
					                            DPRINTLN ( DBG_INFO ,  F ( " Devcontrol request  " )  +  String ( iv - > devControlCmd )  +  F ( "  power limit  " )  +  String ( iv - > powerLimit [ 0 ] ) ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -274,30 +275,26 @@ void app::loop(void) { 
			
		
	
		
			
				
					                        mPayload [ iv - > id ] . txCmd  =  iv - > devControlCmd ;  
			
		
	
		
			
				
					                        iv - > clearCmdQueue ( ) ;  
			
		
	
		
			
				
					                        iv - > enqueCommand < InfoCommand > ( SystemConfigPara ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                    else  {  
			
		
	
		
			
				
					                    }  else  {  
			
		
	
		
			
				
					                        uint8_t  cmd  =  iv - > getQueuedCmd ( ) ;  
			
		
	
		
			
				
					                        mSys - > Radio . sendTimePacket ( iv - > radioId . u64 ,  cmd ,  mPayload [ iv - > id ] . ts ,  iv - > alarmMesIndex ) ;  
			
		
	
		
			
				
					                        mPayload [ iv - > id ] . txCmd  =  cmd ;  
			
		
	
		
			
				
					                        mRxTicker  =  0 ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            else  if ( mConfig . serialDebug )  
			
		
	
		
			
				
					            }  else  if  ( mConfig . serialDebug )  
			
		
	
		
			
				
					                DPRINTLN ( DBG_WARN ,  F ( " Time not set or it is night time, therefore no communication to the inverter! " ) ) ;  
			
		
	
		
			
				
					            yield ( ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : handleIntr ( void )  {  
			
		
	
		
			
				
					    DPRINTLN ( DBG_VERBOSE ,  F ( " app::handleIntr " ) ) ;  
			
		
	
		
			
				
					    mSys - > Radio . handleIntr ( ) ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					bool  app : : buildPayload ( uint8_t  id )  {  
			
		
	
		
			
				
					    DPRINTLN ( DBG_VERBOSE ,  F ( " app::buildPayload " ) ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -309,23 +306,18 @@ bool app::buildPayload(uint8_t id) { 
			
		
	
		
			
				
					        if  ( mPayload [ id ] . len [ i ]  >  0 )  {  
			
		
	
		
			
				
					            if  ( i  = =  ( mPayload [ id ] . maxPackId  -  1 ) )  {  
			
		
	
		
			
				
					                crc  =  ah : : crc16 ( mPayload [ id ] . data [ i ] ,  mPayload [ id ] . len [ i ]  -  2 ,  crc ) ;  
			
		
	
		
			
				
					                crcRcv  =  ( mPayload [ id ] . data [ i ] [ mPayload [ id ] . len [ i ]  -  2 ]  < <  8 )  
			
		
	
		
			
				
					                    |  ( mPayload [ id ] . data [ i ] [ mPayload [ id ] . len [ i ]  -  1 ] ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            else  
			
		
	
		
			
				
					                crcRcv  =  ( mPayload [ id ] . data [ i ] [ mPayload [ id ] . len [ i ]  -  2 ]  < <  8 )  |  ( mPayload [ id ] . data [ i ] [ mPayload [ id ] . len [ i ]  -  1 ] ) ;  
			
		
	
		
			
				
					            }  else  
			
		
	
		
			
				
					                crc  =  ah : : crc16 ( mPayload [ id ] . data [ i ] ,  mPayload [ id ] . len [ i ] ,  crc ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					        yield ( ) ;  
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					    if ( crc  = =  crcRcv )  
			
		
	
		
			
				
					        return  true ;  
			
		
	
		
			
				
					    return  false ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    return  ( crc  = =  crcRcv )  ?  true  :  false ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : processPayload ( bool  retransmit )  {  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# ifdef __MQTT_AFTER_RX__  
			
		
	
		
			
				
					    boolean  doMQTT  =  false ;  
			
		
	
		
			
				
					# endif  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -334,14 +326,15 @@ void app::processPayload(bool retransmit) { 
			
		
	
		
			
				
					    for  ( uint8_t  id  =  0 ;  id  <  mSys - > getNumInverters ( ) ;  id + + )  {  
			
		
	
		
			
				
					        Inverter < >  * iv  =  mSys - > getInverterByPos ( id ) ;  
			
		
	
		
			
				
					        if  ( NULL  ! =  iv )  {  
			
		
	
		
			
				
					            if ( ( mPayload [ iv - > id ] . txId  ! =  ( TX_REQ_INFO  +  0x80 ) )  & &  ( 0  ! =  mPayload [ iv - > id ] . txId ) )  {  
			
		
	
		
			
				
					            if   ( ( mPayload [ iv - > id ] . txId  ! =  ( TX_REQ_INFO  +  ALL_FRAMES ) )  & &  ( 0  ! =  mPayload [ iv - > id ] . txId ) )  {  
			
		
	
		
			
				
					                // no processing needed if txId is not 0x95
  
			
		
	
		
			
				
					                // DPRINTLN(DBG_INFO, F("processPayload - set complete, txId: ") + String(mPayload[iv->id].txId, HEX));
  
			
		
	
		
			
				
					                mPayload [ iv - > id ] . complete  =  true ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( ! mPayload [ iv - > id ] . complete )  {  
			
		
	
		
			
				
					                if ( ! buildPayload ( iv - > id ) )  {  // payload not complete
  
			
		
	
		
			
				
					                if  ( ! buildPayload ( iv - > id ) )   // payload not complete
  
			
		
	
		
			
				
					                {  
			
		
	
		
			
				
					                    if  ( mPayload [ iv - > id ] . requested )  {  
			
		
	
		
			
				
					                        if  ( retransmit )  {  
			
		
	
		
			
				
					                            if  ( iv - > devControlCmd  = =  Restart  | |  iv - > devControlCmd  = =  CleanState_LockAndAlarm )  {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -361,8 +354,7 @@ void app::processPayload(bool retransmit) { 
			
		
	
		
			
				
					                                            }  
			
		
	
		
			
				
					                                            yield ( ) ;  
			
		
	
		
			
				
					                                        }  
			
		
	
		
			
				
					                                    }  
			
		
	
		
			
				
					                                    else  {  
			
		
	
		
			
				
					                                    }  else  {  
			
		
	
		
			
				
					                                        if  ( mConfig . serialDebug )  
			
		
	
		
			
				
					                                            DPRINTLN ( DBG_WARN ,  F ( " while retrieving data: last frame missing: Request Retransmit " ) ) ;  
			
		
	
		
			
				
					                                        if  ( 0x00  ! =  mLastPacketId )  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -377,8 +369,7 @@ void app::processPayload(bool retransmit) { 
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                else  {  // payload complete
  
			
		
	
		
			
				
					                }  else  {   // payload complete
  
			
		
	
		
			
				
					                    DPRINTLN ( DBG_INFO ,  F ( " procPyld: cmd:   " )  +  String ( mPayload [ iv - > id ] . txCmd ) ) ;  
			
		
	
		
			
				
					                    DPRINTLN ( DBG_INFO ,  F ( " procPyld: txid: 0x " )  +  String ( mPayload [ iv - > id ] . txId ,  HEX ) ) ;  
			
		
	
		
			
				
					                    DPRINTLN ( DBG_DEBUG ,  F ( " procPyld: max:   " )  +  String ( mPayload [ iv - > id ] . maxPackId ) ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -402,9 +393,9 @@ void app::processPayload(bool retransmit) { 
			
		
	
		
			
				
					                        mSys - > Radio . dumpBuf ( NULL ,  payload ,  payloadLen ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    if ( NULL  = =  rec )  
			
		
	
		
			
				
					                    if   ( NULL  = =  rec )  {   
			
		
	
		
			
				
					                        DPRINTLN ( DBG_ERROR ,  F ( " record is NULL! " ) ) ;  
			
		
	
		
			
				
					                    else  if ( ( rec - > pyldLen  = =  payloadLen )  | |  ( 0  = =  rec - > pyldLen ) )  {  
			
		
	
		
			
				
					                    }  else  if   ( ( rec - > pyldLen  = =  payloadLen )  | |  ( 0  = =  rec - > pyldLen ) )  {  
			
		
	
		
			
				
					                        if  ( mPayload [ iv - > id ] . txId  = =  ( TX_REQ_INFO  +  0x80 ) )  
			
		
	
		
			
				
					                            mStat . rxSuccess + + ;  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -432,10 +423,18 @@ void app::processPayload(bool retransmit) { 
			
		
	
		
			
				
					                                            if  ( recRealtime  = =  rec )  {  
			
		
	
		
			
				
					                                                if  ( CH0  = =  rec - > assign [ i ] . ch )  {  
			
		
	
		
			
				
					                                                    switch  ( rec - > assign [ i ] . fieldId )  {  
			
		
	
		
			
				
					                                                        case  FLD_PAC :  total [ 0 ]  + =  iv - > getValue ( i ,  rec ) ;  break ;  
			
		
	
		
			
				
					                                                        case  FLD_YT :   total [ 1 ]  + =  iv - > getValue ( i ,  rec ) ;  break ;  
			
		
	
		
			
				
					                                                        case  FLD_YD :   total [ 2 ]  + =  iv - > getValue ( i ,  rec ) ;  break ;  
			
		
	
		
			
				
					                                                        case  FLD_PDC :  total [ 3 ]  + =  iv - > getValue ( i ,  rec ) ;  break ;  
			
		
	
		
			
				
					                                                        case  FLD_PAC :  
			
		
	
		
			
				
					                                                            total [ 0 ]  + =  iv - > getValue ( i ,  rec ) ;  
			
		
	
		
			
				
					                                                            break ;  
			
		
	
		
			
				
					                                                        case  FLD_YT :  
			
		
	
		
			
				
					                                                            total [ 1 ]  + =  iv - > getValue ( i ,  rec ) ;  
			
		
	
		
			
				
					                                                            break ;  
			
		
	
		
			
				
					                                                        case  FLD_YD :  
			
		
	
		
			
				
					                                                            total [ 2 ]  + =  iv - > getValue ( i ,  rec ) ;  
			
		
	
		
			
				
					                                                            break ;  
			
		
	
		
			
				
					                                                        case  FLD_PDC :  
			
		
	
		
			
				
					                                                            total [ 3 ]  + =  iv - > getValue ( i ,  rec ) ;  
			
		
	
		
			
				
					                                                            break ;  
			
		
	
		
			
				
					                                                    }  
			
		
	
		
			
				
					                                                }  
			
		
	
		
			
				
					                                            }  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -444,18 +443,19 @@ void app::processPayload(bool retransmit) { 
			
		
	
		
			
				
					                                                snprintf ( topic ,  32  +  MAX_NAME_LENGTH ,  " %s/available_text " ,  iv - > name ) ;  
			
		
	
		
			
				
					                                                snprintf ( val ,  32 ,  DEF_MQTT_IV_MESSAGE_INVERTER_AVAIL_AND_PRODUCED ) ;  
			
		
	
		
			
				
					                                                mMqtt . sendMsg ( topic ,  val ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                                                snprintf ( topic ,  32  +  MAX_NAME_LENGTH ,  " %s/available " ,  iv - > name ) ;  
			
		
	
		
			
				
					                                                snprintf ( val ,  32 ,  " 2 " ) ;  
			
		
	
		
			
				
					                                                mMqtt . sendMsg ( topic ,  val ) ;  
			
		
	
		
			
				
					                                            }  else  {  
			
		
	
		
			
				
					                                                snprintf ( topic ,  32  +  MAX_NAME_LENGTH ,  " %s/available_text " ,  iv - > name ) ;  
			
		
	
		
			
				
					                                                snprintf ( val ,  32 ,  DEF_MQTT_IV_MESSAGE_INVERTER_AVAIL_AND_NOT_PRODUCED ) ;  
			
		
	
		
			
				
					                                                mMqtt . sendMsg ( topic ,  val ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                                                snprintf ( topic ,  32  +  MAX_NAME_LENGTH ,  " %s/available " ,  iv - > name ) ;  
			
		
	
		
			
				
					                                                snprintf ( val ,  32 ,  " 1 " ) ;  
			
		
	
		
			
				
					                                                mMqtt . sendMsg ( topic ,  val ) ;  
			
		
	
		
			
				
					                                            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                                            mMqtt . sendMsg ( topic ,  val ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                                            snprintf ( topic ,  32  +  MAX_NAME_LENGTH ,  " %s/last_success " ,  iv - > name ) ;  
			
		
	
		
			
				
					                                            snprintf ( val ,  48 ,  " %i " ,  iv - > getLastTs ( rec )  *  1000 ) ;  
			
		
	
		
			
				
					                                            mMqtt . sendMsg ( topic ,  val ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -472,10 +472,18 @@ void app::processPayload(bool retransmit) { 
			
		
	
		
			
				
					                                    uint8_t  fieldId  =  0 ;  
			
		
	
		
			
				
					                                    for  ( uint8_t  i  =  0 ;  i  <  4 ;  i + + )  {  
			
		
	
		
			
				
					                                        switch  ( i )  {  
			
		
	
		
			
				
					                                            case  0 :  fieldId  =  FLD_PAC ;  break ;  
			
		
	
		
			
				
					                                            case  1 :  fieldId  =  FLD_YT ;   break ;  
			
		
	
		
			
				
					                                            case  2 :  fieldId  =  FLD_YD ;   break ;  
			
		
	
		
			
				
					                                            case  3 :  fieldId  =  FLD_PDC ;  break ;  
			
		
	
		
			
				
					                                            case  0 :  
			
		
	
		
			
				
					                                                fieldId  =  FLD_PAC ;  
			
		
	
		
			
				
					                                                break ;  
			
		
	
		
			
				
					                                            case  1 :  
			
		
	
		
			
				
					                                                fieldId  =  FLD_YT ;  
			
		
	
		
			
				
					                                                break ;  
			
		
	
		
			
				
					                                            case  2 :  
			
		
	
		
			
				
					                                                fieldId  =  FLD_YD ;  
			
		
	
		
			
				
					                                                break ;  
			
		
	
		
			
				
					                                            case  3 :  
			
		
	
		
			
				
					                                                fieldId  =  FLD_PDC ;  
			
		
	
		
			
				
					                                                break ;  
			
		
	
		
			
				
					                                        }  
			
		
	
		
			
				
					                                        snprintf ( topic ,  32  +  MAX_NAME_LENGTH ,  " total/%s " ,  fields [ fieldId ] ) ;  
			
		
	
		
			
				
					                                        snprintf ( val ,  10 ,  " %.3f " ,  total [ i ] ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -484,8 +492,7 @@ void app::processPayload(bool retransmit) { 
			
		
	
		
			
				
					                                }  
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                    else  {  
			
		
	
		
			
				
					                    }  else  {  
			
		
	
		
			
				
					                        DPRINTLN ( DBG_ERROR ,  F ( " plausibility check failed, expected  " )  +  String ( rec - > pyldLen )  +  F ( "  bytes " ) ) ;  
			
		
	
		
			
				
					                        mStat . rxFail + + ;  
			
		
	
		
			
				
					                    }  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -514,7 +521,6 @@ void app::processPayload(bool retransmit) { 
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : cbMqtt ( char  * topic ,  byte  * payload ,  unsigned  int  length )  {  
			
		
	
		
			
				
					    // callback handling on subscribed devcontrol topic
  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -522,18 +528,21 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) { 
			
		
	
		
			
				
					    // subcribed topics are mTopic + "/devcontrol/#" where # is <inverter_id>/<subcmd in dec>
  
			
		
	
		
			
				
					    // eg. mypvsolar/devcontrol/1/11 with payload "400" --> inverter 1 active power limit 400 Watt
  
			
		
	
		
			
				
					    const  char  * token  =  strtok ( topic ,  " / " ) ;  
			
		
	
		
			
				
					    while  ( token  ! =  NULL )  
			
		
	
		
			
				
					    {     
			
		
	
		
			
				
					    while  ( token  ! =  NULL )  {  
			
		
	
		
			
				
					        if  ( strcmp ( token ,  " devcontrol " )  = =  0 )  {  
			
		
	
		
			
				
					            token  =  strtok ( NULL ,  " / " ) ;  
			
		
	
		
			
				
					            uint8_t  iv_id  =  std : : stoi ( token ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( iv_id  > =  0  & &  iv_id  < =  MAX_NUM_INVERTERS )  {  
			
		
	
		
			
				
					                Inverter < >  * iv  =  this - > mSys - > getInverterByPos ( iv_id ) ;  
			
		
	
		
			
				
					                if  ( NULL  ! =  iv )  {  
			
		
	
		
			
				
					                    if  ( ! iv - > devControlRequest )  {  // still pending
  
			
		
	
		
			
				
					                    if  ( ! iv - > devControlRequest )   // still pending
  
			
		
	
		
			
				
					                    {  
			
		
	
		
			
				
					                        token  =  strtok ( NULL ,  " / " ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                        switch  ( std : : stoi ( token ) )  {  
			
		
	
		
			
				
					                            case  ActivePowerContr :   // Active Power Control
  
			
		
	
		
			
				
					                            // Active Power Control
  
			
		
	
		
			
				
					                            case  ActivePowerContr :  
			
		
	
		
			
				
					                                token  =  strtok ( NULL ,  " / " ) ;   // get ControlMode aka "PowerPF.Desc" in DTU-Pro Code from topic string
  
			
		
	
		
			
				
					                                if  ( token  = =  NULL )           // default via mqtt ommit the LimitControlMode
  
			
		
	
		
			
				
					                                    iv - > powerLimit [ 1 ]  =  AbsolutNonPersistent ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -543,32 +552,42 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) { 
			
		
	
		
			
				
					                                    if  ( iv - > powerLimit [ 1 ]  > =  AbsolutNonPersistent  & &  iv - > powerLimit [ 1 ]  < =  RelativPersistent )  {  
			
		
	
		
			
				
					                                        iv - > devControlCmd  =  ActivePowerContr ;  
			
		
	
		
			
				
					                                        iv - > powerLimit [ 0 ]  =  std : : stoi ( std : : string ( ( char  * ) payload ,  ( unsigned  int ) length ) ) ;   // THX to @silversurfer
  
			
		
	
		
			
				
					                                        if  ( iv - > powerLimit [ 1 ]  &  0x0001 )  
			
		
	
		
			
				
					                                        /*if (iv->powerLimit[1] & 0x0001)
  
			
		
	
		
			
				
					                                            DPRINTLN ( DBG_INFO ,  F ( " Power limit for inverter  " )  +  String ( iv - > id )  +  F ( "  set to  " )  +  String ( iv - > powerLimit [ 0 ] )  +  F ( " % " ) ) ;  
			
		
	
		
			
				
					                                        else  
			
		
	
		
			
				
					                                            DPRINTLN ( DBG_INFO ,  F ( " Power limit for inverter  " )  +  String ( iv - > id )  +  F ( "  set to  " )  +  String ( iv - > powerLimit [ 0 ] )  +  F ( " W " )  ) ;  
			
		
	
		
			
				
					                                            DPRINTLN ( DBG_INFO ,  F ( " Power limit for inverter  " )  +  String ( iv - > id )  +  F ( "  set to  " )  +  String ( iv - > powerLimit [ 0 ] )  +  F ( " W " ) ) ; */  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                                        DPRINTLN ( DBG_INFO ,  F ( " Power limit for inverter  " )  +  String ( iv - > id )  +  F ( "  set to  " )  +  String ( iv - > powerLimit [ 0 ] )  +  F ( ( iv - > powerLimit [ 1 ]  &  0x0001 )  ?  " % "  :  " W " ) ) ;  
			
		
	
		
			
				
					                                    }  
			
		
	
		
			
				
					                                    iv - > devControlRequest  =  true ;  
			
		
	
		
			
				
					                                }  else  {  
			
		
	
		
			
				
					                                    DPRINTLN ( DBG_INFO ,  F ( " Invalid mqtt payload recevied:  " )  +  String ( ( char  * ) payload ) ) ;  
			
		
	
		
			
				
					                                }  
			
		
	
		
			
				
					                                break ;  
			
		
	
		
			
				
					                            case  TurnOn :  // Turn On
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            // Turn On
  
			
		
	
		
			
				
					                            case  TurnOn :  
			
		
	
		
			
				
					                                iv - > devControlCmd  =  TurnOn ;  
			
		
	
		
			
				
					                                DPRINTLN ( DBG_INFO ,  F ( " Turn on inverter  " )  +  String ( iv - > id ) ) ;  
			
		
	
		
			
				
					                                iv - > devControlRequest  =  true ;  
			
		
	
		
			
				
					                                break ;  
			
		
	
		
			
				
					                            case  TurnOff :  // Turn Off
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            // Turn Off
  
			
		
	
		
			
				
					                            case  TurnOff :  
			
		
	
		
			
				
					                                iv - > devControlCmd  =  TurnOff ;  
			
		
	
		
			
				
					                                DPRINTLN ( DBG_INFO ,  F ( " Turn off inverter  " )  +  String ( iv - > id ) ) ;  
			
		
	
		
			
				
					                                iv - > devControlRequest  =  true ;  
			
		
	
		
			
				
					                                break ;  
			
		
	
		
			
				
					                            case  Restart :  // Restart
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            // Restart
  
			
		
	
		
			
				
					                            case  Restart :  
			
		
	
		
			
				
					                                iv - > devControlCmd  =  Restart ;  
			
		
	
		
			
				
					                                DPRINTLN ( DBG_INFO ,  F ( " Restart inverter  " )  +  String ( iv - > id ) ) ;  
			
		
	
		
			
				
					                                iv - > devControlRequest  =  true ;  
			
		
	
		
			
				
					                                break ;  
			
		
	
		
			
				
					                            case  ReactivePowerContr :  // Reactive Power Control
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            // Reactive Power Control
  
			
		
	
		
			
				
					                            case  ReactivePowerContr :  
			
		
	
		
			
				
					                                iv - > devControlCmd  =  ReactivePowerContr ;  
			
		
	
		
			
				
					                                if  ( true )  {   // if (std::stoi((char*)payload) > 0) error handling powerlimit needed?
  
			
		
	
		
			
				
					                                    iv - > devControlCmd  =  ReactivePowerContr ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -578,16 +597,21 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) { 
			
		
	
		
			
				
					                                    iv - > devControlRequest  =  true ;  
			
		
	
		
			
				
					                                }  
			
		
	
		
			
				
					                                break ;  
			
		
	
		
			
				
					                            case  PFSet :  // Set Power Factor
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            // Set Power Factor
  
			
		
	
		
			
				
					                            case  PFSet :  
			
		
	
		
			
				
					                                // iv->devControlCmd = PFSet;
  
			
		
	
		
			
				
					                                // uint16_t power_factor = std::stoi(strtok(NULL, "/"));
  
			
		
	
		
			
				
					                                DPRINTLN ( DBG_INFO ,  F ( " Set Power Factor not implemented for inverter  " )  +  String ( iv - > id ) ) ;  
			
		
	
		
			
				
					                                break ;  
			
		
	
		
			
				
					                            case  CleanState_LockAndAlarm :  // CleanState lock & alarm
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            // CleanState lock & alarm
  
			
		
	
		
			
				
					                            case  CleanState_LockAndAlarm :  
			
		
	
		
			
				
					                                iv - > devControlCmd  =  CleanState_LockAndAlarm ;  
			
		
	
		
			
				
					                                DPRINTLN ( DBG_INFO ,  F ( " CleanState lock & alarm for inverter  " )  +  String ( iv - > id ) ) ;  
			
		
	
		
			
				
					                                iv - > devControlRequest  =  true ;  
			
		
	
		
			
				
					                                break ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            default :  
			
		
	
		
			
				
					                                DPRINTLN ( DBG_INFO ,  " Not implemented " ) ;  
			
		
	
		
			
				
					                                break ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -602,13 +626,11 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) { 
			
		
	
		
			
				
					    DPRINTLN ( DBG_INFO ,  F ( " app::cbMqtt finished " ) ) ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					bool  app : : getWifiApActive ( void )  {  
			
		
	
		
			
				
					    return  mWifi - > getApActive ( ) ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : scanAvailNetworks ( void )  {  
			
		
	
		
			
				
					    mWifi - > scanAvailNetworks ( ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -620,7 +642,6 @@ void app::getAvailNetworks(JsonObject obj) { 
			
		
	
		
			
				
					    mWifi - > getAvailNetworks ( obj ) ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : sendMqttDiscoveryConfig ( void )  {  
			
		
	
		
			
				
					    DPRINTLN ( DBG_VERBOSE ,  F ( " app::sendMqttDiscoveryConfig " ) ) ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -679,7 +700,6 @@ void app::sendMqttDiscoveryConfig(void) { 
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					const  char  * app : : getFieldDeviceClass ( uint8_t  fieldId )  {  
			
		
	
		
			
				
					    uint8_t  pos  =  0 ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -690,7 +710,6 @@ const char* app::getFieldDeviceClass(uint8_t fieldId) { 
			
		
	
		
			
				
					    return  ( pos  > =  DEVICE_CLS_ASSIGN_LIST_LEN )  ?  NULL  :  deviceClasses [ deviceFieldAssignment [ pos ] . deviceClsId ] ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					const  char  * app : : getFieldStateClass ( uint8_t  fieldId )  {  
			
		
	
		
			
				
					    uint8_t  pos  =  0 ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -701,7 +720,6 @@ const char* app::getFieldStateClass(uint8_t fieldId) { 
			
		
	
		
			
				
					    return  ( pos  > =  DEVICE_CLS_ASSIGN_LIST_LEN )  ?  NULL  :  stateClasses [ deviceFieldAssignment [ pos ] . stateClsId ] ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : resetSystem ( void )  {  
			
		
	
		
			
				
					    mUptimeSecs  =  0 ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -733,13 +751,11 @@ void app::resetSystem(void) { 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    mShowRebootRequest  =  false ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    memset ( mPayload ,  0 ,  ( MAX_NUM_INVERTERS  *  sizeof ( invPayload_t ) ) ) ;  
			
		
	
		
			
				
					    memset ( & mStat ,  0 ,  sizeof ( statistics_t ) ) ;  
			
		
	
		
			
				
					    mLastPacketId  =  0x00 ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : loadDefaultConfig ( void )  {  
			
		
	
		
			
				
					    memset ( & mSysConfig ,  0 ,  sizeof ( sysConfig_t ) ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -752,7 +768,6 @@ void app::loadDefaultConfig(void) { 
			
		
	
		
			
				
					    snprintf ( mSysConfig . stationSsid ,  SSID_LEN ,  " %s " ,  FB_WIFI_SSID ) ;  
			
		
	
		
			
				
					    snprintf ( mSysConfig . stationPwd ,  PWD_LEN ,  " %s " ,  FB_WIFI_PWD ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    // nrf24
  
			
		
	
		
			
				
					    mConfig . sendInterval  =  SEND_INTERVAL ;  
			
		
	
		
			
				
					    mConfig . maxRetransPerPyld  =  DEF_MAX_RETRANS_PER_PYLD ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -786,7 +801,6 @@ void app::loadDefaultConfig(void) { 
			
		
	
		
			
				
					    mConfig . disclaimer  =  false ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : loadEEpconfig ( void )  {  
			
		
	
		
			
				
					    DPRINTLN ( DBG_VERBOSE ,  F ( " app::loadEEpconfig " ) ) ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -829,7 +843,6 @@ void app::loadEEpconfig(void) { 
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : saveValues ( void )  {  
			
		
	
		
			
				
					    DPRINTLN ( DBG_VERBOSE ,  F ( " app::saveValues " ) ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -854,43 +867,26 @@ void app::saveValues(void) { 
			
		
	
		
			
				
					    mLatestSunTimestamp  =  0 ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					//-----------------------------------------------------------------------------
  
			
		
	
		
			
				
					void  app : : setupMqtt ( void )  {  
			
		
	
		
			
				
					    if  ( mSettingsValid )  {  
			
		
	
		
			
				
					        if  ( mConfig . mqtt . broker [ 0 ]  >  0 )  {  
			
		
	
		
			
				
					            mMqttActive  =  true ;  
			
		
	
		
			
				
					            if ( mMqttInterval  <  MIN_MQTT_INTERVAL )  
			
		
	
		
			
				
					                mMqttInterval  =  MIN_MQTT_INTERVAL ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					        else  
			
		
	
		
			
				
					            if  ( mMqttInterval  <  MIN_MQTT_INTERVAL )  mMqttInterval  =  MIN_MQTT_INTERVAL ;  
			
		
	
		
			
				
					        }  else  {  
			
		
	
		
			
				
					            mMqttInterval  =  0xffff ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mMqttTicker  =  0 ;  
			
		
	
		
			
				
					        mMqtt . setup ( & mConfig . mqtt ,  mSysConfig . deviceName ) ;  
			
		
	
		
			
				
					        mMqtt . setCallback ( std : : bind ( & app : : cbMqtt ,  this ,  std : : placeholders : : _1 ,  std : : placeholders : : _2 ,  std : : placeholders : : _3 ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( mMqttActive )  {  
			
		
	
		
			
				
					            mMqtt . sendMsg ( " version " ,  mVersion ) ;  
			
		
	
		
			
				
					            if  ( mMqtt . isConnected ( ) )  {  
			
		
	
		
			
				
					                mMqtt . sendMsg ( " device " ,  mSysConfig . deviceName ) ;  
			
		
	
		
			
				
					                mMqtt . sendMsg ( " uptime " ,  " 0 " ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            /*char topic[30];
  
			
		
	
		
			
				
					            for ( uint8_t  i  =  0 ;  i  <  MAX_NUM_INVERTERS ;  i  + + )  {  
			
		
	
		
			
				
					                iv  =  mSys - > getInverterByPos ( i ) ;  
			
		
	
		
			
				
					                if ( NULL  ! =  iv )  {  
			
		
	
		
			
				
					                    for ( uint8_t  i  =  0 ;  i  <  4 ;  i + + )  {  
			
		
	
		
			
				
					                        if ( 0  ! =  iv - > chName [ i ] [ 0 ] )  {  
			
		
	
		
			
				
					                            snprintf ( topic ,  30 ,  " %s/ch%d/%s " ,  iv - > name ,  i + 1 ,  " name " ) ;  
			
		
	
		
			
				
					                            mMqtt . sendMsg ( topic ,  iv - > chName [ i ] ) ;  
			
		
	
		
			
				
					                            yield ( ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            } */  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					}