Removing un-necessary timestamp, commenting code and cleanups

This commit is contained in:
MalteSchm 2023-04-13 07:45:26 +02:00
parent 03ce71519d
commit 9ff1885d5a
2 changed files with 16 additions and 24 deletions

View File

@ -28,7 +28,6 @@ public:
bool getDisable(); bool getDisable();
private: private:
uint32_t _lastCommandSent = 0;
uint32_t _lastLoop = 0; uint32_t _lastLoop = 0;
int32_t _lastRequestedPowerLimit = 0; int32_t _lastRequestedPowerLimit = 0;
uint32_t _lastLimitSetTime = 0; uint32_t _lastLimitSetTime = 0;

View File

@ -26,24 +26,19 @@ void PowerLimiterClass::loop()
// Run inital checks to make sure we have met the basic conditions // Run inital checks to make sure we have met the basic conditions
if (!config.PowerMeter_Enabled if (!config.PowerMeter_Enabled
|| !Hoymiles.getRadio()->isIdle() || !Hoymiles.getRadio()->isIdle()
|| (millis() - _lastCommandSent) < (config.PowerLimiter_Interval * 1000)
|| (millis() - _lastLoop) < (config.PowerLimiter_Interval * 1000)) { || (millis() - _lastLoop) < (config.PowerLimiter_Interval * 1000)) {
return; return;
} }
_lastLoop = millis(); _lastLoop = millis();
// Debug state transistions, TODO: Remove
MessageOutput.printf("****************** PL STATE: %i\r\n", _plState);
std::shared_ptr<InverterAbstract> inverter = Hoymiles.getInverterByPos(config.PowerLimiter_InverterId); std::shared_ptr<InverterAbstract> inverter = Hoymiles.getInverterByPos(config.PowerLimiter_InverterId);
if (inverter == nullptr || !inverter->isReachable()) { if (inverter == nullptr || !inverter->isReachable()) {
return; return;
} }
// Make sure inverter is turned off if PL is disabled by user // Make sure inverter is turned off if PL is disabled by user/MQTT
// Make sure inverter is turned off when lower battery threshold is reached // Make sure inverter is turned off when low battery threshold is reached
// In this case we are in some state and want to reach STATE_PL_SHUTDOWN
if (((!config.PowerLimiter_Enabled || _disabled) && _plState != SHUTDOWN) if (((!config.PowerLimiter_Enabled || _disabled) && _plState != SHUTDOWN)
|| isStopThresholdReached(inverter)) { || isStopThresholdReached(inverter)) {
if (inverter->isProducing()) { if (inverter->isProducing()) {
@ -55,35 +50,34 @@ void PowerLimiterClass::loop()
return; return;
} }
// If power limiter is disabled // Return if power limiter is disabled
if (!config.PowerLimiter_Enabled) { if (!config.PowerLimiter_Enabled || _disabled) {
return; return;
} }
// At this point the PL is enabled but we could still be in the shutdown state
float dcVoltage = inverter->Statistics()->getChannelFieldValue(TYPE_DC, (ChannelNum_t) config.PowerLimiter_InverterChannelId, FLD_UDC); _plState = ACTIVE;
//float acPower = inverter->Statistics()->getChannelFieldValue(TYPE_AC, (ChannelNum_t) config.PowerLimiter_InverterChannelId, FLD_PAC);
//float correctedDcVoltage = dcVoltage + (acPower * config.PowerLimiter_VoltageLoadCorrectionFactor);
// If the last inverter update is too old, don't do anything. // If the last inverter update is too old, don't do anything.
// If the last inverter update was before the last limit updated, don't do anything. // If the last inverter update was before the last limit updated, don't do anything.
// Also give the Power meter 3 seconds time to recognize power changes because of the last set limit // Also give the Power meter 3 seconds time to recognize power changes after the last set limit
// and also because the Hoymiles MPPT might not react immediately. // as the Hoymiles MPPT might not react immediately.
if ((millis() - inverter->Statistics()->getLastUpdate()) > 10000 if ((millis() - inverter->Statistics()->getLastUpdate()) > 10000
|| inverter->Statistics()->getLastUpdate() <= _lastLimitSetTime || inverter->Statistics()->getLastUpdate() <= _lastLimitSetTime
|| PowerMeter.getLastPowerMeterUpdate() <= (_lastLimitSetTime + 3000)) { || PowerMeter.getLastPowerMeterUpdate() <= (_lastLimitSetTime + 3000)) {
return; return;
} }
// Printout some stats
if (millis() - PowerMeter.getLastPowerMeterUpdate() < (30 * 1000)) { if (millis() - PowerMeter.getLastPowerMeterUpdate() < (30 * 1000)) {
float dcVoltage = inverter->Statistics()->getChannelFieldValue(TYPE_DC, (ChannelNum_t) config.PowerLimiter_InverterChannelId, FLD_UDC);
MessageOutput.printf("[PowerLimiterClass::loop] dcVoltage: %.2f Voltage Start Threshold: %.2f Voltage Stop Threshold: %.2f inverter->isProducing(): %d\r\n", MessageOutput.printf("[PowerLimiterClass::loop] dcVoltage: %.2f Voltage Start Threshold: %.2f Voltage Stop Threshold: %.2f inverter->isProducing(): %d\r\n",
dcVoltage, config.PowerLimiter_VoltageStartThreshold, config.PowerLimiter_VoltageStopThreshold, inverter->isProducing()); dcVoltage, config.PowerLimiter_VoltageStartThreshold, config.PowerLimiter_VoltageStopThreshold, inverter->isProducing());
} }
// If we're in shutdown move to active operation
if (_plState == SHUTDOWN) {
_plState = ACTIVE;
}
// Battery charging cycle conditions
// The battery can only be discharged after a full charge in the
// EMPTY_WHEN_FULL case
if (isStopThresholdReached(inverter)) { if (isStopThresholdReached(inverter)) {
// Disable battery discharge when empty // Disable battery discharge when empty
_batteryDischargeEnabled = false; _batteryDischargeEnabled = false;
@ -98,10 +92,11 @@ void PowerLimiterClass::loop()
_batteryDischargeEnabled = true; _batteryDischargeEnabled = true;
} }
// Calculate and set Power Limit
int32_t newPowerLimit = calcPowerLimit(inverter, !_batteryDischargeEnabled); int32_t newPowerLimit = calcPowerLimit(inverter, !_batteryDischargeEnabled);
setNewPowerLimit(inverter, newPowerLimit);
// Debug, TODO: Remove // Debug, TODO: Remove
MessageOutput.printf("****************************** Powerlimit: %i\r\n", newPowerLimit); MessageOutput.printf("****************************** Powerlimit: %i\r\n", newPowerLimit);
setNewPowerLimit(inverter, newPowerLimit);
} }
plStates PowerLimiterClass::getPowerLimiterState() { plStates PowerLimiterClass::getPowerLimiterState() {
@ -205,7 +200,6 @@ void PowerLimiterClass::setNewPowerLimit(std::shared_ptr<InverterAbstract> inver
if (!inverter->isProducing() && newPowerLimit > config.PowerLimiter_LowerPowerLimit) { if (!inverter->isProducing() && newPowerLimit > config.PowerLimiter_LowerPowerLimit) {
MessageOutput.println("[PowerLimiterClass::loop] Starting up inverter..."); MessageOutput.println("[PowerLimiterClass::loop] Starting up inverter...");
inverter->sendPowerControlRequest(Hoymiles.getRadio(), true); inverter->sendPowerControlRequest(Hoymiles.getRadio(), true);
_lastCommandSent = millis();
} }
// Stop the inverter if limit is below threshold. // Stop the inverter if limit is below threshold.
@ -214,7 +208,6 @@ void PowerLimiterClass::setNewPowerLimit(std::shared_ptr<InverterAbstract> inver
if (inverter->isProducing()) { if (inverter->isProducing()) {
MessageOutput.println("[PowerLimiterClass::loop] Stopping inverter..."); MessageOutput.println("[PowerLimiterClass::loop] Stopping inverter...");
inverter->sendPowerControlRequest(Hoymiles.getRadio(), false); inverter->sendPowerControlRequest(Hoymiles.getRadio(), false);
_lastCommandSent = millis();
} }
newPowerLimit = config.PowerLimiter_LowerPowerLimit; newPowerLimit = config.PowerLimiter_LowerPowerLimit;
} }
@ -223,7 +216,7 @@ void PowerLimiterClass::setNewPowerLimit(std::shared_ptr<InverterAbstract> inver
// and differs from the last requested value // and differs from the last requested value
if( _lastRequestedPowerLimit != newPowerLimit && if( _lastRequestedPowerLimit != newPowerLimit &&
/* newPowerLimit > config.PowerLimiter_LowerPowerLimit && --> This will always be true given the check above, kept for code readability */ /* newPowerLimit > config.PowerLimiter_LowerPowerLimit && --> This will always be true given the check above, kept for code readability */
newPowerLimit < config.PowerLimiter_UpperPowerLimit ) { newPowerLimit <= config.PowerLimiter_UpperPowerLimit ) {
MessageOutput.printf("[PowerLimiterClass::loop] Limit Non-Persistent: %d W\r\n", newPowerLimit); MessageOutput.printf("[PowerLimiterClass::loop] Limit Non-Persistent: %d W\r\n", newPowerLimit);
inverter->sendActivePowerControlRequest(Hoymiles.getRadio(), newPowerLimit, PowerLimitControlType::AbsolutNonPersistent); inverter->sendActivePowerControlRequest(Hoymiles.getRadio(), newPowerLimit, PowerLimitControlType::AbsolutNonPersistent);
_lastRequestedPowerLimit = newPowerLimit; _lastRequestedPowerLimit = newPowerLimit;