From b88030f76e0b7efa1b1e94e60031ddecf504fe32 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Fri, 25 Aug 2023 11:04:14 +0200 Subject: [PATCH] Feature: Re-Request DevInfo if it contains invalid data It can sometimes occour that the DevInfo request returns invalid data. Currently this is identified if the firmware build year is < 2016. In this case the package will be re-requested now. --- lib/Hoymiles/src/Hoymiles.cpp | 18 +++++++++++++++--- lib/Hoymiles/src/parser/DevInfoParser.cpp | 10 ++++++++++ lib/Hoymiles/src/parser/DevInfoParser.h | 2 ++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index 29b239af..535f492e 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -91,9 +91,21 @@ void HoymilesClass::loop() } // Fetch dev info (but first fetch stats) - if (iv->Statistics()->getLastUpdate() > 0 && (iv->DevInfo()->getLastUpdateAll() == 0 || iv->DevInfo()->getLastUpdateSimple() == 0)) { - _messageOutput->println("Request device info"); - iv->sendDevInfoRequest(); + if (iv->Statistics()->getLastUpdate() > 0) { + bool invalidDevInfo = !iv->DevInfo()->containsValidData() + && iv->DevInfo()->getLastUpdateAll() > 0 + && iv->DevInfo()->getLastUpdateSimple() > 0; + + if (invalidDevInfo) { + _messageOutput->println("DevInfo: No Valid Data"); + } + + if ((iv->DevInfo()->getLastUpdateAll() == 0) + || (iv->DevInfo()->getLastUpdateSimple() == 0) + || invalidDevInfo) { + _messageOutput->println("Request device info"); + iv->sendDevInfoRequest(); + } } if (++inverterPos >= getNumInverters()) { diff --git a/lib/Hoymiles/src/parser/DevInfoParser.cpp b/lib/Hoymiles/src/parser/DevInfoParser.cpp index 44fe59e1..eab3a303 100644 --- a/lib/Hoymiles/src/parser/DevInfoParser.cpp +++ b/lib/Hoymiles/src/parser/DevInfoParser.cpp @@ -196,6 +196,16 @@ String DevInfoParser::getHwModelName() return devInfo[idx].modelName; } +bool DevInfoParser::containsValidData() +{ + time_t t = getFwBuildDateTime(); + + struct tm info; + localtime_r(&t, &info); + + return info.tm_year > (2016 - 1900); +} + uint8_t DevInfoParser::getDevIdx() { uint8_t ret = 0xff; diff --git a/lib/Hoymiles/src/parser/DevInfoParser.h b/lib/Hoymiles/src/parser/DevInfoParser.h index 18c3d7c8..b18bc8a1 100644 --- a/lib/Hoymiles/src/parser/DevInfoParser.h +++ b/lib/Hoymiles/src/parser/DevInfoParser.h @@ -33,6 +33,8 @@ public: uint16_t getMaxPower(); String getHwModelName(); + bool containsValidData(); + private: time_t timegm(struct tm* tm); uint8_t getDevIdx();