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; float _powerMeter3Power;
bool canUseDirectSolarPower(); bool canUseDirectSolarPower();
uint32_t getDirectSolarPower(); float getDirectSolarPower();
float getLoadCorrectedVoltage(std::shared_ptr<InverterAbstract> inverter); float getLoadCorrectedVoltage(std::shared_ptr<InverterAbstract> inverter);
bool isStartThresholdReached(std::shared_ptr<InverterAbstract> inverter); bool isStartThresholdReached(std::shared_ptr<InverterAbstract> inverter);
bool isStopThresholdReached(std::shared_ptr<InverterAbstract> inverter); bool isStopThresholdReached(std::shared_ptr<InverterAbstract> inverter);

View File

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