// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include "Configuration.h" #include #include #include #include typedef enum { STATE_PL_SHUTDOWN = 0, STATE_ACTIVE } plStates; typedef enum { EMPTY_WHEN_FULL= 0, EMPTY_AT_NIGHT } batDrainStrategy; class PowerLimiterClass { public: void init(); void loop(); plStates getPowerLimiterState(); int32_t getLastRequestedPowewrLimit(); void setDisable(bool disable); bool getDisable(); private: uint32_t _lastCommandSent = 0; uint32_t _lastLoop = 0; int32_t _lastRequestedPowerLimit = 0; uint32_t _lastLimitSetTime = 0; plStates _plState = STATE_ACTIVE; bool _disabled = false; float _powerMeter1Power; float _powerMeter2Power; float _powerMeter3Power; bool canUseDirectSolarPower(); int32_t calcPowerLimit(std::shared_ptr inverter, bool consumeSolarPowerOnly); void setNewPowerLimit(std::shared_ptr inverter, int32_t newPowerLimit); int32_t getDirectSolarPower(); float getLoadCorrectedVoltage(std::shared_ptr inverter); bool isStartThresholdReached(std::shared_ptr inverter); bool isStopThresholdReached(std::shared_ptr inverter); }; extern PowerLimiterClass PowerLimiter;