Added method to detect whether an inverter is reachable

This commit is contained in:
Thomas Basler 2022-10-01 02:16:47 +02:00
parent a261eb838c
commit 862b65e844
6 changed files with 36 additions and 1 deletions

View File

@ -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();
}

View File

@ -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);
};

View File

@ -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();

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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;
};