@ -17,10 +17,6 @@ app::app()
: ah : : Scheduler { }
: ah : : Scheduler { }
, mSunrise { 0 }
, mSunrise { 0 }
, mSunset { 0 }
, mSunset { 0 }
, idTickMqttSecond { MAX_NUM_TICKER }
, idTickMqttMinute { MAX_NUM_TICKER }
, idTickMidnight { MAX_NUM_TICKER }
, idTickReboot { MAX_NUM_TICKER }
{
{
memset ( mVersion , 0 , sizeof ( char ) * 12 ) ;
memset ( mVersion , 0 , sizeof ( char ) * 12 ) ;
memset ( mVersionModules , 0 , sizeof ( char ) * 12 ) ;
memset ( mVersionModules , 0 , sizeof ( char ) * 12 ) ;
@ -86,7 +82,7 @@ void app::setup() {
mMqttEnabled = ( mConfig - > mqtt . broker [ 0 ] > 0 ) ;
mMqttEnabled = ( mConfig - > mqtt . broker [ 0 ] > 0 ) ;
if ( mMqttEnabled ) {
if ( mMqttEnabled ) {
mMqtt . setup ( this , & mConfig - > mqtt , mConfig - > sys . deviceName , mVersion , & mSys , & mTimestamp , & mUptime ) ;
mMqtt . setup ( this , & mConfig - > mqtt , mConfig - > sys . deviceName , mVersion , & mSys , & mTimestamp , & mUptime ) ;
mMqtt . setSubscriptionCb ( std : : bind ( & app : : mqttSubRxCb , this , std : : placeholders : : _1 ) ) ;
mMqtt . setSubscriptionCb ( [ this ] ( JsonObject obj ) { mqttSubRxCb ( obj ) ; } ) ;
mCommunication . addAlarmListener ( [ this ] ( Inverter < > * iv ) { mMqtt . alarmEvent ( iv ) ; } ) ;
mCommunication . addAlarmListener ( [ this ] ( Inverter < > * iv ) { mMqtt . alarmEvent ( iv ) ; } ) ;
}
}
# endif
# endif
@ -156,20 +152,25 @@ void app::loop(void) {
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void app : : onNetwork ( bool gotIp ) {
void app : : onNetwork ( bool connected ) {
mNetworkConnected = gotIp ;
mNetworkConnected = connected ;
if ( gotIp ) {
# if defined(ENABLE_MQTT)
if ( mMqttEnabled ) {
resetTickerByName ( " mqttS " ) ;
resetTickerByName ( " mqttM " ) ;
}
# endif
if ( connected ) {
mNetwork - > updateNtpTime ( ) ;
mNetwork - > updateNtpTime ( ) ;
if ( ! mConfig - > inst . startWithoutTime ) // already set in regularTickers
every ( std : : bind ( & app : : tickSend , this ) , mConfig - > inst . sendInterval , " tSend " ) ;
resetTickerByName ( " tSend " ) ;
every ( [ this ] ( ) { tickSend ( ) ; } , mConfig - > inst . sendInterval , " tSend " ) ;
# if defined(ENABLE_MQTT)
# if defined(ENABLE_MQTT)
if ( mMqttEnabled ) {
if ( mMqttEnabled ) {
if ( MAX_NUM_TICKER = = idTickMqttSecond )
everySec ( [ this ] ( ) { mMqtt . tickerSecond ( ) ; } , " mqttS " ) ;
idTickMqttSecond = everySec ( std : : bind ( & PubMqttType : : tickerSecond , & mMqtt ) , " mqttS " ) ;
everyMin ( [ this ] ( ) { mMqtt . tickerMinute ( ) ; } , " mqttM " ) ;
if ( MAX_NUM_TICKER = = idTickMqttMinute )
idTickMqttMinute = everyMin ( std : : bind ( & PubMqttType : : tickerMinute , & mMqtt ) , " mqttM " ) ;
}
}
# endif /*ENABLE_MQTT*/
# endif /*ENABLE_MQTT*/
}
}
@ -178,33 +179,33 @@ void app::onNetwork(bool gotIp) {
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void app : : regularTickers ( void ) {
void app : : regularTickers ( void ) {
DPRINTLN ( DBG_DEBUG , F ( " regularTickers " ) ) ;
DPRINTLN ( DBG_DEBUG , F ( " regularTickers " ) ) ;
everySec ( std : : bind ( & WebType : : tickSecond , & mWeb ) , " webSc " ) ;
everySec ( [ this ] ( ) { mWeb . tickSecond ( ) ; } , " webSc " ) ;
everySec ( [ this ] ( ) { mProtection - > tickSecond ( ) ; } , " prot " ) ;
everySec ( [ this ] ( ) { mProtection - > tickSecond ( ) ; } , " prot " ) ;
everySec ( [ this ] ( ) { mNetwork - > tickNetworkLoop ( ) ; } , " net " ) ;
everySec ( [ this ] ( ) { mNetwork - > tickNetworkLoop ( ) ; } , " net " ) ;
if ( mConfig - > inst . startWithoutTime )
if ( mConfig - > inst . startWithoutTime )
every ( std : : bind ( & app : : tickSend , this ) , mConfig - > inst . sendInterval , " tSend " ) ;
every ( [ this ] ( ) { tickSend ( ) ; } , mConfig - > inst . sendInterval , " tSend " ) ;
every ( [ this ] ( ) { mNetwork - > updateNtpTime ( ) ; } , mConfig - > ntp . interval * 60 , " ntp " ) ;
every ( [ this ] ( ) { mNetwork - > updateNtpTime ( ) ; } , mConfig - > ntp . interval * 60 , " ntp " ) ;
if ( mConfig - > inst . rstValsNotAvail )
if ( mConfig - > inst . rstValsNotAvail )
everyMin ( std : : bind ( & app : : tickMinute , this ) , " tMin " ) ;
everyMin ( [ this ] ( ) { tickMinute ( ) ; } , " tMin " ) ;
// Plugins
// Plugins
# if defined(PLUGIN_DISPLAY)
# if defined(PLUGIN_DISPLAY)
if ( DISP_TYPE_T0_NONE ! = mConfig - > plugin . display . type )
if ( DISP_TYPE_T0_NONE ! = mConfig - > plugin . display . type )
everySec ( std : : bind ( & DisplayType : : tickerSecond , & mDisplay ) , " disp " ) ;
everySec ( [ this ] ( ) { mDisplay . tickerSecond ( ) ; } , " disp " ) ;
# endif
# endif
every ( std : : bind ( & PubSerialType : : tick , & mPubSerial ) , 5 , " uart " ) ;
every ( [ this ] ( ) { mPubSerial . tick ( ) ; } , 5 , " uart " ) ;
//everySec([this]() { mImprov.tickSerial(); }, "impro");
//everySec([this]() { mImprov.tickSerial(); }, "impro");
# if defined(ENABLE_HISTORY)
# if defined(ENABLE_HISTORY)
everySec ( std : : bind ( & HistoryType : : tickerSecond , & mHistory ) , " hist " ) ;
everySec ( [ this ] ( ) { mHistory . tickerSecond ( ) ; } , " hist " ) ;
# endif /*ENABLE_HISTORY*/
# endif /*ENABLE_HISTORY*/
# if defined(ENABLE_SIMULATOR)
# if defined(ENABLE_SIMULATOR)
every ( std : : bind ( & SimulatorType : : tick , & mSimulator ) , 5 , " sim " ) ;
every ( [ this ] ( ) { mSimulator - > tick ( ) ; } , 5 , " sim " ) ;
# endif /*ENABLE_SIMULATOR*/
# endif /*ENABLE_SIMULATOR*/
}
}
@ -219,13 +220,13 @@ void app::onNtpUpdate(uint32_t utcTimestamp) {
uint32_t localTime = gTimezone . toLocal ( mTimestamp ) ;
uint32_t localTime = gTimezone . toLocal ( mTimestamp ) ;
uint32_t midTrig = gTimezone . toUTC ( localTime - ( localTime % 86400 ) + 86400 ) ; // next midnight local time
uint32_t midTrig = gTimezone . toUTC ( localTime - ( localTime % 86400 ) + 86400 ) ; // next midnight local time
resetById ( idTickMidnight ) ;
resetTickerByName ( " midNi " ) ;
idTickMidnight = onceAt ( std : : bind ( & app : : tickMidnight , this ) , midTrig , " midNi " ) ;
onceAt ( [ this ] ( ) { tickMidnight ( ) ; } , midTrig , " midNi " ) ;
if ( mConfig - > sys . schedReboot ) {
if ( mConfig - > sys . schedReboot ) {
resetById ( idTickReboot ) ;
uint32_t rebootTrig = gTimezone . toUTC ( localTime - ( localTime % 86400 ) + 86410 ) ; // reboot 10 secs after midnght
uint32_t rebootTrig = gTimezone . toUTC ( localTime - ( localTime % 86400 ) + 86410 ) ; // reboot 10 secs after midnght
idTickReboot = onceAt ( std : : bind ( & app : : tickReboot , this ) , rebootTrig , " midRe " ) ;
resetTickerByName ( " midRe " ) ;
onceAt ( [ this ] ( ) { tickReboot ( ) ; } , rebootTrig , " midRe " ) ;
}
}
if ( ( 0 = = mSunrise ) & & ( 0.0 ! = mConfig - > sun . lat ) & & ( 0.0 ! = mConfig - > sun . lon ) ) {
if ( ( 0 = = mSunrise ) & & ( 0.0 ! = mConfig - > sun . lat ) & & ( 0.0 ! = mConfig - > sun . lon ) ) {
@ -246,11 +247,11 @@ void app::tickCalcSunrise(void) {
tickIVCommunication ( ) ;
tickIVCommunication ( ) ;
uint32_t nxtTrig = mSunset + mConfig - > sun . offsetSecEvening + 60 ; // set next trigger to communication stop, +60 for safety that it is certain past communication stop
uint32_t nxtTrig = mSunset + mConfig - > sun . offsetSecEvening + 60 ; // set next trigger to communication stop, +60 for safety that it is certain past communication stop
onceAt ( std : : bind ( & app : : tickCalcSunrise , this ) , nxtTrig , " Sunri " ) ;
onceAt ( [ this ] ( ) { tickCalcSunrise ( ) ; } , nxtTrig , " Sunri " ) ;
if ( mMqttEnabled ) {
if ( mMqttEnabled ) {
tickSun ( ) ;
tickSun ( ) ;
nxtTrig = mSunrise + mConfig - > sun . offsetSecMorning + 1 ; // one second safety to trigger correctly
nxtTrig = mSunrise + mConfig - > sun . offsetSecMorning + 1 ; // one second safety to trigger correctly
onceAt ( std : : bind ( & app : : tickSunrise , this ) , nxtTrig , " mqSr " ) ; // trigger on sunrise to update 'dis_night_comm'
onceAt ( [ this ] ( ) { tickSunrise ( ) ; } , nxtTrig , " mqSr " ) ; // trigger on sunrise to update 'dis_night_comm'
}
}
}
}
@ -288,10 +289,10 @@ void app::tickIVCommunication(void) {
}
}
if ( restartTick ) // at least one inverter
if ( restartTick ) // at least one inverter
onceAt ( std : : bind ( & app : : tickIVCommunication , this ) , nxtTrig , " ivCom " ) ;
onceAt ( [ this ] ( ) { tickIVCommunication ( ) ; } , nxtTrig , " ivCom " ) ;
if ( zeroValues ) // at least one inverter
if ( zeroValues ) // at least one inverter
once ( std : : bind ( & app : : tickZeroValues , this ) , mConfig - > inst . sendInterval , " tZero " ) ;
once ( [ this ] ( ) { tickZeroValues ( ) ; } , mConfig - > inst . sendInterval , " tZero " ) ;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
@ -299,7 +300,7 @@ void app::tickSun(void) {
// only used and enabled by MQTT (see setup())
// only used and enabled by MQTT (see setup())
# if defined(ENABLE_MQTT)
# if defined(ENABLE_MQTT)
if ( ! mMqtt . tickerSun ( mSunrise , mSunset , mConfig - > sun . offsetSecMorning , mConfig - > sun . offsetSecEvening ) )
if ( ! mMqtt . tickerSun ( mSunrise , mSunset , mConfig - > sun . offsetSecMorning , mConfig - > sun . offsetSecEvening ) )
once ( std : : bind ( & app : : tickSun , this ) , 1 , " mqSun " ) ; // MQTT not connected, retry
once ( [ this ] ( ) { tickSun ( ) ; } , 1 , " mqSun " ) ; // MQTT not connected, retry
# endif
# endif
}
}
@ -308,7 +309,7 @@ void app::tickSunrise(void) {
// only used and enabled by MQTT (see setup())
// only used and enabled by MQTT (see setup())
# if defined(ENABLE_MQTT)
# if defined(ENABLE_MQTT)
if ( ! mMqtt . tickerSun ( mSunrise , mSunset , mConfig - > sun . offsetSecMorning , mConfig - > sun . offsetSecEvening , true ) )
if ( ! mMqtt . tickerSun ( mSunrise , mSunset , mConfig - > sun . offsetSecMorning , mConfig - > sun . offsetSecEvening , true ) )
once ( std : : bind ( & app : : tickSun , this ) , 1 , " mqSun " ) ; // MQTT not connected, retry
once ( [ this ] ( ) { tickSun ( ) ; } , 1 , " mqSun " ) ; // MQTT not connected, retry
# endif
# endif
}
}
@ -336,7 +337,8 @@ void app::tickMinute(void) {
void app : : tickMidnight ( void ) {
void app : : tickMidnight ( void ) {
uint32_t localTime = gTimezone . toLocal ( mTimestamp ) ;
uint32_t localTime = gTimezone . toLocal ( mTimestamp ) ;
uint32_t nxtTrig = gTimezone . toUTC ( localTime - ( localTime % 86400 ) + 86400 ) ; // next midnight local time
uint32_t nxtTrig = gTimezone . toUTC ( localTime - ( localTime % 86400 ) + 86400 ) ; // next midnight local time
onceAt ( std : : bind ( & app : : tickMidnight , this ) , nxtTrig , " mid2 " ) ;
resetTickerByName ( " midNi " ) ;
onceAt ( [ this ] ( ) { tickMidnight ( ) ; } , nxtTrig , " midNi " ) ;
Inverter < > * iv ;
Inverter < > * iv ;
for ( uint8_t id = 0 ; id < mSys . getNumInverters ( ) ; id + + ) {
for ( uint8_t id = 0 ; id < mSys . getNumInverters ( ) ; id + + ) {
@ -379,7 +381,7 @@ void app::tickSend(void) {
}
}
if ( mAllIvNotAvail ! = notAvail )
if ( mAllIvNotAvail ! = notAvail )
once ( std : : bind ( & app : : notAvailChanged , this ) , 1 , " avail " ) ;
once ( [ this ] ( ) { notAvailChanged ( ) ; } , 1 , " avail " ) ;
mAllIvNotAvail = notAvail ;
mAllIvNotAvail = notAvail ;
updateLed ( ) ;
updateLed ( ) ;