Skip to content

Commit 2a99097

Browse files
committed
0.8.145
* fix NTP related issues #1748 #1752 * fix MqTT discovery total #1715 * upgrade webserver version for ESP32 devices
1 parent 97d9786 commit 2a99097

File tree

10 files changed

+112
-98
lines changed

10 files changed

+112
-98
lines changed

src/CHANGES.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Development Changes
22

3+
## 0.8.145 - 2024-09-22
4+
* fix NTP related issues #1748 #1752
5+
* fix MqTT discovery total #1715
6+
* upgrade webserver version for ESP32 devices
7+
38
## 0.8.144 - 2024-09-14
49
* fix NTP lookup if internet connection is not there
510
* added fallback for NTP to gateway IP

src/app.cpp

+47-64
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,15 @@
1313

1414

1515
//-----------------------------------------------------------------------------
16-
app::app() : ah::Scheduler {} {
16+
app::app()
17+
: ah::Scheduler {}
18+
, mSunrise {0}
19+
, mSunset {0}
20+
, idTickMqttSecond {MAX_NUM_TICKER}
21+
, idTickMqttMinute {MAX_NUM_TICKER}
22+
, idTickMidnight {MAX_NUM_TICKER}
23+
, idTickReboot {MAX_NUM_TICKER}
24+
{
1725
memset(mVersion, 0, sizeof(char) * 12);
1826
memset(mVersionModules, 0, sizeof(char) * 12);
1927
}
@@ -51,7 +59,7 @@ void app::setup() {
5159
#else
5260
mNetwork = static_cast<AhoyNetwork*>(new AhoyWifi());
5361
#endif
54-
mNetwork->setup(mConfig, &mTimestamp, [this](bool gotIp) { this->onNetwork(gotIp); }, [this](bool gotTime) { this->onNtpUpdate(gotTime); });
62+
mNetwork->setup(mConfig, [this](bool gotIp) { this->onNetwork(gotIp); }, [this](uint32_t gotTime) { this->onNtpUpdate(gotTime); });
5563
mNetwork->begin();
5664

5765
esp_task_wdt_reset();
@@ -151,15 +159,19 @@ void app::loop(void) {
151159
void app::onNetwork(bool gotIp) {
152160
mNetworkConnected = gotIp;
153161
if(gotIp) {
154-
ah::Scheduler::resetTicker();
155-
regularTickers(); //reinstall regular tickers
162+
mNetwork->updateNtpTime();
156163
if(!mConfig->inst.startWithoutTime) // already set in regularTickers
157164
every(std::bind(&app::tickSend, this), mConfig->inst.sendInterval, "tSend");
158-
mTickerInstallOnce = true;
159-
mSunrise = 0; // needs to be set to 0, to reinstall sunrise and ivComm tickers!
160165

161-
uint32_t nextTrig = (mTimestamp < 0x1337) ? 0 : (mConfig->ntp.interval * 60);
162-
once(std::bind(&app::tickNtpUpdate, this), nextTrig, "ntp");
166+
#if defined(ENABLE_MQTT)
167+
if (mMqttEnabled) {
168+
if(MAX_NUM_TICKER == idTickMqttSecond)
169+
idTickMqttSecond = everySec(std::bind(&PubMqttType::tickerSecond, &mMqtt), "mqttS");
170+
171+
if(MAX_NUM_TICKER == idTickMqttMinute)
172+
idTickMqttMinute = everyMin(std::bind(&PubMqttType::tickerMinute, &mMqtt), "mqttM");
173+
}
174+
#endif /*ENABLE_MQTT*/
163175
}
164176
}
165177

@@ -170,9 +182,15 @@ void app::regularTickers(void) {
170182
everySec([this]() { mProtection->tickSecond(); }, "prot");
171183
everySec([this]() {mNetwork->tickNetworkLoop(); }, "net");
172184

173-
if(mConfig->inst.startWithoutTime && !mNetworkConnected)
185+
if(mConfig->inst.startWithoutTime)
174186
every(std::bind(&app::tickSend, this), mConfig->inst.sendInterval, "tSend");
175187

188+
189+
every([this]() { mNetwork->updateNtpTime(); }, mConfig->ntp.interval * 60, "ntp");
190+
191+
if (mConfig->inst.rstValsNotAvail)
192+
everyMin(std::bind(&app::tickMinute, this), "tMin");
193+
176194
// Plugins
177195
#if defined(PLUGIN_DISPLAY)
178196
if (DISP_TYPE_T0_NONE != mConfig->plugin.display.type)
@@ -191,62 +209,32 @@ void app::regularTickers(void) {
191209
}
192210

193211
//-----------------------------------------------------------------------------
194-
void app::onNtpUpdate(bool gotTime) {
195-
mNtpReceived = true;
196-
if ((0 == mSunrise) && (0.0 != mConfig->sun.lat) && (0.0 != mConfig->sun.lon)) {
197-
mCalculatedTimezoneOffset = (int8_t)((mConfig->sun.lon >= 0 ? mConfig->sun.lon + 7.5 : mConfig->sun.lon - 7.5) / 15) * 3600;
198-
tickCalcSunrise();
199-
}
200-
201-
if (mTickerInstallOnce) {
202-
mTickerInstallOnce = false;
203-
#if defined(ENABLE_MQTT)
204-
if (mMqttEnabled) {
205-
mMqtt.tickerSecond();
206-
everySec(std::bind(&PubMqttType::tickerSecond, &mMqtt), "mqttS");
207-
everyMin(std::bind(&PubMqttType::tickerMinute, &mMqtt), "mqttM");
212+
void app::onNtpUpdate(uint32_t utcTimestamp) {
213+
if(0 == utcTimestamp) {
214+
// try again in 5s
215+
once([this]() { mNetwork->updateNtpTime(); }, 5, "ntp");
216+
} else {
217+
mTimestamp = utcTimestamp;
218+
DPRINTLN(DBG_INFO, "[NTP]: " + ah::getDateTimeStr(mTimestamp) + " UTC");
219+
220+
uint32_t localTime = gTimezone.toLocal(mTimestamp);
221+
uint32_t midTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86400); // next midnight local time
222+
resetById(idTickMidnight);
223+
idTickMidnight = onceAt(std::bind(&app::tickMidnight, this), midTrig, "midNi");
224+
225+
if (mConfig->sys.schedReboot) {
226+
resetById(idTickReboot);
227+
uint32_t rebootTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86410); // reboot 10 secs after midnght
228+
idTickReboot = onceAt(std::bind(&app::tickReboot, this), rebootTrig, "midRe");
208229
}
209-
#endif /*ENABLE_MQTT*/
210-
211-
if (mConfig->inst.rstValsNotAvail)
212-
everyMin(std::bind(&app::tickMinute, this), "tMin");
213230

214-
if(mNtpReceived) {
215-
uint32_t localTime = gTimezone.toLocal(mTimestamp);
216-
uint32_t midTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86400); // next midnight local time
217-
onceAt(std::bind(&app::tickMidnight, this), midTrig, "midNi");
218-
219-
if (mConfig->sys.schedReboot) {
220-
uint32_t rebootTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86410); // reboot 10 secs after midnght
221-
onceAt(std::bind(&app::tickReboot, this), rebootTrig, "midRe");
222-
}
231+
if ((0 == mSunrise) && (0.0 != mConfig->sun.lat) && (0.0 != mConfig->sun.lon)) {
232+
mCalculatedTimezoneOffset = (int8_t)((mConfig->sun.lon >= 0 ? mConfig->sun.lon + 7.5 : mConfig->sun.lon - 7.5) / 15) * 3600;
233+
tickCalcSunrise();
223234
}
224235
}
225236
}
226237

227-
//-----------------------------------------------------------------------------
228-
void app::updateNtp(void) {
229-
if(mNtpReceived)
230-
onNtpUpdate(true);
231-
}
232-
233-
//-----------------------------------------------------------------------------
234-
void app::tickNtpUpdate(void) {
235-
uint32_t nxtTrig = 5; // default: check again in 5 sec
236-
237-
if (!mNtpReceived)
238-
mNetwork->updateNtpTime();
239-
else {
240-
nxtTrig = mConfig->ntp.interval * 60; // check again in configured interval
241-
mNtpReceived = false;
242-
}
243-
yield();
244-
245-
updateNtp();
246-
247-
once(std::bind(&app::tickNtpUpdate, this), nxtTrig, "ntp");
248-
}
249-
250238
//-----------------------------------------------------------------------------
251239
void app::tickCalcSunrise(void) {
252240
if (mSunrise == 0) // on boot/reboot calc sun values for current time
@@ -528,9 +516,6 @@ void app::resetSystem(void) {
528516

529517
mAllIvNotAvail = true;
530518

531-
mSunrise = 0;
532-
mSunset = 0;
533-
534519
mMqttEnabled = false;
535520

536521
mSendLastIvId = 0;
@@ -539,8 +524,6 @@ void app::resetSystem(void) {
539524
mSaveReboot = false;
540525

541526
mNetworkConnected = false;
542-
mNtpReceived = false;
543-
mTickerInstallOnce = false;
544527
}
545528

546529
//-----------------------------------------------------------------------------

src/app.h

+4-5
Original file line numberDiff line numberDiff line change
@@ -407,10 +407,7 @@ class app : public IApp, public ah::Scheduler {
407407
setRebootFlag();
408408
}
409409

410-
void tickNtpUpdate(void);
411-
void onNtpUpdate(bool gotTime);
412-
bool mNtpReceived = false;
413-
void updateNtp(void);
410+
void onNtpUpdate(uint32_t utcTimestamp);
414411

415412
void triggerTickSend(uint8_t id) override {
416413
once([this, id]() {
@@ -465,9 +462,11 @@ class app : public IApp, public ah::Scheduler {
465462
#if defined(ENABLE_MQTT)
466463
PubMqttType mMqtt;
467464
#endif
468-
bool mTickerInstallOnce = false;
469465
bool mMqttEnabled = false;
470466

467+
uint8_t idTickMqttSecond, idTickMqttMinute;
468+
uint8_t idTickMidnight, idTickReboot;
469+
471470
// sun
472471
int32_t mCalculatedTimezoneOffset = 0;
473472
uint32_t mSunrise = 0, mSunset = 0;

src/defines.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
//-------------------------------------
1414
#define VERSION_MAJOR 0
1515
#define VERSION_MINOR 8
16-
#define VERSION_PATCH 144
16+
#define VERSION_PATCH 145
1717
//-------------------------------------
1818
typedef struct {
1919
uint8_t ch;

src/network/AhoyNetwork.h

+27-9
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@
1717
class AhoyNetwork {
1818
public:
1919
typedef std::function<void(bool)> OnNetworkCB;
20-
typedef std::function<void(bool)> OnTimeCB;
20+
typedef std::function<void(uint32_t utcTimestamp)> OnTimeCB;
2121

2222
public:
23-
void setup(settings_t *config, uint32_t *utcTimestamp, OnNetworkCB onNetworkCB, OnTimeCB onTimeCB) {
23+
void setup(settings_t *config, OnNetworkCB onNetworkCB, OnTimeCB onTimeCB) {
2424
mConfig = config;
25-
mUtcTimestamp = utcTimestamp;
2625
mOnNetworkCB = onNetworkCB;
2726
mOnTimeCB = onTimeCB;
2827

@@ -53,6 +52,19 @@ class AhoyNetwork {
5352
#endif
5453
}
5554

55+
virtual void tickNetworkLoop() {
56+
if(mDnsCallbackReady) {
57+
mDnsCallbackReady = false;
58+
startNtpUpdate();
59+
}
60+
61+
if(mNtpTimeoutSec) {
62+
mNtpTimeoutSec--;
63+
if(!mNtpTimeoutSec)
64+
mOnTimeCB(0); // timeout
65+
}
66+
}
67+
5668
bool isConnected() const {
5769
return ((mStatus == NetworkState::CONNECTED) || (mStatus == NetworkState::GOT_IP));
5870
}
@@ -66,6 +78,7 @@ class AhoyNetwork {
6678
obj->mNtpIp = ipaddr->addr;
6779
#endif
6880
}
81+
obj->mDnsCallbackReady = true;
6982
}
7083

7184
void updateNtpTime() {
@@ -74,6 +87,8 @@ class AhoyNetwork {
7487
return;
7588
}
7689

90+
mNtpTimeoutSec = 30;
91+
7792
ip_addr_t ipaddr;
7893
mNtpIp = WiFi.gatewayIP();
7994
// dns_gethostbyname runs asynchronous and sets the member mNtpIp which is then checked on
@@ -94,8 +109,10 @@ class AhoyNetwork {
94109
void startNtpUpdate() {
95110
DPRINTLN(DBG_INFO, F("get time from: ") + mNtpIp.toString());
96111
if (!mUdp.connected()) {
97-
if (!mUdp.connect(mNtpIp, mConfig->ntp.port))
112+
if (!mUdp.connect(mNtpIp, mConfig->ntp.port)) {
113+
mOnTimeCB(0);
98114
return;
115+
}
99116
}
100117

101118
mUdp.onPacket([this](AsyncUDPPacket packet) {
@@ -109,7 +126,6 @@ class AhoyNetwork {
109126

110127
public:
111128
virtual void begin() = 0;
112-
virtual void tickNetworkLoop() = 0;
113129
virtual String getIp(void) = 0;
114130
virtual String getMac(void) = 0;
115131

@@ -242,10 +258,9 @@ class AhoyNetwork {
242258
// this is NTP time (seconds since Jan 1 1900):
243259
unsigned long secsSince1900 = highWord << 16 | lowWord;
244260

245-
*mUtcTimestamp = secsSince1900 - 2208988800UL; // UTC time
246-
DPRINTLN(DBG_INFO, "[NTP]: " + ah::getDateTimeStr(*mUtcTimestamp) + " UTC");
247-
mOnTimeCB(true);
248261
mUdp.close();
262+
mNtpTimeoutSec = 0; // clear timeout
263+
mOnTimeCB(secsSince1900 - 2208988800UL);
249264
}
250265

251266
protected:
@@ -257,12 +272,15 @@ class AhoyNetwork {
257272
CONNECTING // ESP8266
258273
};
259274

275+
public:
276+
bool mDnsCallbackReady = false;
277+
260278
protected:
261279
settings_t *mConfig = nullptr;
262-
uint32_t *mUtcTimestamp = nullptr;
263280
bool mConnected = false;
264281
bool mScanActive = false;
265282
bool mWifiConnecting = false;
283+
uint8_t mNtpTimeoutSec = 0;
266284

267285
OnNetworkCB mOnNetworkCB;
268286
OnTimeCB mOnTimeCB;

src/network/AhoyWifiEsp32.h

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class AhoyWifi : public AhoyNetwork {
3737
}
3838

3939
void tickNetworkLoop() override {
40+
AhoyNetwork::tickNetworkLoop();
4041
if(mAp.isEnabled())
4142
mAp.tickLoop();
4243
}

src/network/AhoyWifiEsp8266.h

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class AhoyWifi : public AhoyNetwork {
2323
}
2424

2525
void tickNetworkLoop() override {
26+
AhoyNetwork::tickNetworkLoop();
2627
if(mAp.isEnabled())
2728
mAp.tickLoop();
2829

src/platformio.ini

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ platform = [email protected]
154154
board = lolin_d32
155155
lib_deps =
156156
${env.lib_deps}
157-
https://github.com/mathieucarbou/ESPAsyncWebServer @ ^3.1.5
157+
https://github.com/mathieucarbou/ESPAsyncWebServer @ ^3.3.1
158158
build_flags = ${env.build_flags}
159159
-DSPI_HAL
160160
monitor_filters =

0 commit comments

Comments
 (0)