Fix for meters with clock skew

This commit is contained in:
Gunnar Skjold 2024-07-03 09:22:09 +02:00
parent a1bbcc20e3
commit 1d91416348
3 changed files with 18 additions and 19 deletions

View File

@ -79,9 +79,9 @@ public:
uint8_t getMonthAccuracy();
void setMonthAccuracy(uint8_t);
bool isHappy();
bool isDayHappy();
bool isMonthHappy();
bool isHappy(time_t now);
bool isDayHappy(time_t now);
bool isMonthHappy(time_t now);
double getEstimatedImportCounter();

View File

@ -27,7 +27,7 @@ void AmsDataStorage::setTimezone(Timezone* tz) {
}
bool AmsDataStorage::update(AmsData* data, time_t now) {
if(isHappy()) {
if(isHappy(now)) {
#if defined(AMS_REMOTE_DEBUG)
if (debugger->isActive(RemoteDebug::DEBUG))
#endif
@ -137,7 +137,7 @@ bool AmsDataStorage::update(AmsData* data, time_t now) {
bool ret = false;
// Update day plot
if(!isDayHappy()) {
if(!isDayHappy(now)) {
#if defined(AMS_REMOTE_DEBUG)
if (debugger->isActive(RemoteDebug::DEBUG))
#endif
@ -200,7 +200,7 @@ bool AmsDataStorage::update(AmsData* data, time_t now) {
}
// Update month plot
if(ltz.Hour == 0 && !isMonthHappy()) {
if(ltz.Hour == 0 && !isMonthHappy(now)) {
#if defined(AMS_REMOTE_DEBUG)
if (debugger->isActive(RemoteDebug::DEBUG))
#endif
@ -582,16 +582,15 @@ void AmsDataStorage::setMonthAccuracy(uint8_t accuracy) {
month.accuracy = accuracy;
}
bool AmsDataStorage::isHappy() {
return isDayHappy() && isMonthHappy();
bool AmsDataStorage::isHappy(time_t now) {
return isDayHappy(now) && isMonthHappy(now);
}
bool AmsDataStorage::isDayHappy() {
bool AmsDataStorage::isDayHappy(time_t now) {
if(tz == NULL) {
return false;
}
time_t now = time(nullptr);
if(now < FirmwareVersion::BuildEpoch) return false;
if(now < day.lastMeterReadTime) {
@ -613,26 +612,26 @@ bool AmsDataStorage::isDayHappy() {
return true;
}
bool AmsDataStorage::isMonthHappy() {
bool AmsDataStorage::isMonthHappy(time_t now) {
if(tz == NULL) {
return false;
}
time_t now = time(nullptr);
if(now < FirmwareVersion::BuildEpoch) return false;
tmElements_t tm, last;
if(now < month.lastMeterReadTime) {
return false;
}
breakTime(tz->toLocal(now), tm);
breakTime(tz->toLocal(month.lastMeterReadTime), last);
if(tm.Day != last.Day) {
// 25 hours, because of DST
if(now-month.lastMeterReadTime > 90000) {
return false;
}
if(now-month.lastMeterReadTime > 90100) {
tmElements_t tm, last;
breakTime(tz->toLocal(now), tm);
breakTime(tz->toLocal(month.lastMeterReadTime), last);
if(tm.Day != last.Day) {
return false;
}

View File

@ -858,7 +858,7 @@ void loop() {
debugW_P(PSTR("Used %dms to read HAN port (false)"), millis()-start);
}
}
if(millis() - meterState.getLastUpdateMillis() > 1800000 && !ds.isHappy()) {
if(millis() - meterState.getLastUpdateMillis() > 1800000 && !ds.isHappy(time(nullptr))) {
handleClear(now);
}
} catch(const std::exception& e) {
@ -1367,7 +1367,7 @@ void handleDataSuccess(AmsData* data) {
rtp.update(meterState);
bool saveData = false;
if(!ds.isHappy() && now > FirmwareVersion::BuildEpoch) { // Must use "isHappy()" in case day state gets reset and lastTimestamp is "now"
if(!ds.isHappy(now) && now > FirmwareVersion::BuildEpoch) { // Must use "isHappy()" in case day state gets reset and lastTimestamp is "now"
tmElements_t tm, mtm;
breakTime(now, tm);
breakTime(meterTime, mtm);