stop inverter, if exporting power to grid

This commit is contained in:
helgeerbe 2023-02-28 13:09:10 +01:00
parent 4a49f48969
commit 26a8809121
2 changed files with 16 additions and 9 deletions

View File

@ -25,7 +25,7 @@ private:
float _powerMeter3Power;
bool canUseDirectSolarPower();
uint32_t getDirectSolarPower();
float getDirectSolarPower();
float getLoadCorrectedVoltage(std::shared_ptr<InverterAbstract> inverter);
bool isStartThresholdReached(std::shared_ptr<InverterAbstract> inverter);
bool isStopThresholdReached(std::shared_ptr<InverterAbstract> inverter);

View File

@ -90,13 +90,12 @@ void PowerLimiterClass::loop()
return;
}
uint32_t victronChargePower = this->getDirectSolarPower();
float victronChargePower = this->getDirectSolarPower();
MessageOutput.printf("[PowerLimiterClass::loop] victronChargePower: %d\r\n",
static_cast<int>(victronChargePower));
MessageOutput.printf("[PowerLimiterClass::loop] victronChargePower: %.2f\r\n", victronChargePower);
if (millis() - _lastPowerMeterUpdate < (30 * 1000)) {
MessageOutput.printf("[PowerLimiterClass::loop] dcVoltage: %f config.PowerLimiter_VoltageStartThreshold: %f config.PowerLimiter_VoltageStopThreshold: %f inverter->isProducing(): %d\r\n",
MessageOutput.printf("[PowerLimiterClass::loop] dcVoltage: %.2f config.PowerLimiter_VoltageStartThreshold: %.2f config.PowerLimiter_VoltageStopThreshold: %.2f inverter->isProducing(): %d\r\n",
dcVoltage, config.PowerLimiter_VoltageStartThreshold, config.PowerLimiter_VoltageStopThreshold, inverter->isProducing());
}
@ -116,7 +115,7 @@ void PowerLimiterClass::loop()
if ((!_consumeSolarPowerOnly && isStopThresholdReached(inverter))
|| (_consumeSolarPowerOnly && victronChargePower < 10)) {
// DC voltage too low, stop the inverter
MessageOutput.printf("[PowerLimiterClass::loop] DC voltage: %f Corrected DC voltage: %f...\r\n",
MessageOutput.printf("[PowerLimiterClass::loop] DC voltage: %.2f Corrected DC voltage: %.2f...\r\n",
dcVoltage, correctedDcVoltage);
MessageOutput.println("[PowerLimiterClass::loop] Stopping inverter...");
inverter->sendPowerControlRequest(Hoymiles.getRadio(), false);
@ -174,7 +173,15 @@ void PowerLimiterClass::loop()
upperPowerLimit = victronChargePower;
}
newPowerLimit = constrain(newPowerLimit, (uint16_t)config.PowerLimiter_LowerPowerLimit, upperPowerLimit);
if (newPowerLimit > upperPowerLimit)
newPowerLimit = upperPowerLimit;
else if (newPowerLimit < (uint16_t)config.PowerLimiter_LowerPowerLimit) {
newPowerLimit = (uint16_t)config.PowerLimiter_LowerPowerLimit;
// stop the inverter
MessageOutput.println("[PowerLimiterClass::loop] Power limit too low. Stopping inverter...");
inverter->sendPowerControlRequest(Hoymiles.getRadio(), false);
}
MessageOutput.printf("[PowerLimiterClass::loop] powerMeter: %d W lastRequestedPowerLimit: %d\r\n",
static_cast<int>(_powerMeter1Power + _powerMeter2Power + _powerMeter3Power), _lastRequestedPowerLimit);
@ -211,13 +218,13 @@ bool PowerLimiterClass::canUseDirectSolarPower()
return true;
}
uint32_t PowerLimiterClass::getDirectSolarPower()
float PowerLimiterClass::getDirectSolarPower()
{
if (!this->canUseDirectSolarPower()) {
return 0;
}
return (uint32_t) round(VeDirect.veFrame.PPV);
return VeDirect.veFrame.PPV;
}
float PowerLimiterClass::getLoadCorrectedVoltage(std::shared_ptr<InverterAbstract> inverter)