diff --git a/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp b/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp index e820375..79c66b9 100644 --- a/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp +++ b/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp @@ -23,6 +23,12 @@ bool RealTimeRunDataCommand::handleResponse(InverterAbstract* inverter, fragment inverter->Statistics()->appendFragment(offs, fragment[i].fragment, fragment[i].len); offs += (fragment[i].len); } + inverter->Statistics()->resetRxFailureCount(); inverter->Statistics()->setLastUpdate(millis()); return true; +} + +void RealTimeRunDataCommand::gotTimeout(InverterAbstract* inverter) +{ + inverter->Statistics()->incrementRxFailureCount(); } \ No newline at end of file diff --git a/lib/Hoymiles/src/commands/RealTimeRunDataCommand.h b/lib/Hoymiles/src/commands/RealTimeRunDataCommand.h index 0044ab0..ff150cb 100644 --- a/lib/Hoymiles/src/commands/RealTimeRunDataCommand.h +++ b/lib/Hoymiles/src/commands/RealTimeRunDataCommand.h @@ -7,4 +7,5 @@ public: explicit RealTimeRunDataCommand(uint64_t target_address = 0, uint64_t router_address = 0, time_t time = 0); virtual bool handleResponse(InverterAbstract* inverter, fragment_t fragment[], uint8_t max_fragment_id); + virtual void gotTimeout(InverterAbstract* inverter); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index 386a4b0..d6c1f01 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -49,6 +49,11 @@ bool InverterAbstract::isProducing() return Statistics()->getChannelFieldValue(CH0, FLD_PAC) > 0; } +bool InverterAbstract::isReachable() +{ + return Statistics()->getRxFailureCount() <= MAX_ONLINE_FAILURE_COUNT; +} + AlarmLogParser* InverterAbstract::EventLog() { return _alarmLogParser.get(); diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index 3738f97..bd53f9e 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -23,6 +23,7 @@ enum { #define MAX_RF_FRAGMENT_COUNT 13 #define MAX_RETRANSMIT_COUNT 5 // Used to send the retransmit package #define MAX_RESEND_COUNT 4 // Used if all packages are missing +#define MAX_ONLINE_FAILURE_COUNT 2 class CommandAbstract; @@ -38,6 +39,7 @@ public: virtual const uint8_t getAssignmentCount() = 0; bool isProducing(); + bool isReachable(); void clearRxFragmentBuffer(); void addRxFragment(uint8_t fragment[], uint8_t len); diff --git a/lib/Hoymiles/src/parser/StatisticsParser.cpp b/lib/Hoymiles/src/parser/StatisticsParser.cpp index a5dc334..ad02a66 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.cpp +++ b/lib/Hoymiles/src/parser/StatisticsParser.cpp @@ -112,6 +112,21 @@ void StatisticsParser::setChannelMaxPower(uint8_t channel, uint16_t power) } } +void StatisticsParser::resetRxFailureCount() +{ + _rxFailureCount = 0; +} + +void StatisticsParser::incrementRxFailureCount() +{ + _rxFailureCount++; +} + +uint32_t StatisticsParser::getRxFailureCount() +{ + return _rxFailureCount; +} + static float calcYieldTotalCh0(StatisticsParser* iv, uint8_t arg0) { float yield = 0; @@ -168,4 +183,4 @@ static float calcIrradiation(StatisticsParser* iv, uint8_t arg0) return iv->getChannelFieldValue(arg0, FLD_PDC) / iv->getChannelMaxPower(arg0 - 1) * 100.0f; } return 0.0; -} \ No newline at end of file +} diff --git a/lib/Hoymiles/src/parser/StatisticsParser.h b/lib/Hoymiles/src/parser/StatisticsParser.h index 5b64624..f1e7e4f 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.h +++ b/lib/Hoymiles/src/parser/StatisticsParser.h @@ -113,6 +113,10 @@ public: uint16_t getChannelMaxPower(uint8_t channel); void setChannelMaxPower(uint8_t channel, uint16_t power); + void resetRxFailureCount(); + void incrementRxFailureCount(); + uint32_t getRxFailureCount(); + private: uint8_t _payloadStatistic[STATISTIC_PACKET_SIZE] = {}; uint8_t _statisticLength = 0; @@ -120,4 +124,6 @@ private: const byteAssign_t* _byteAssignment; uint8_t _byteAssignmentCount; + + uint32_t _rxFailureCount = 0; }; \ No newline at end of file