// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include "Configuration.h" #include #include #include #include #define PL_UI_STATE_INACTIVE 0 #define PL_UI_STATE_CHARGING 1 #define PL_UI_STATE_USE_SOLAR_ONLY 2 #define PL_UI_STATE_USE_SOLAR_AND_BATTERY 3 #define PL_MODE_ENABLE_NORMAL_OP 0 #define PL_MODE_FULL_DISABLE 1 #define PL_MODE_SOLAR_PT_ONLY 2 typedef enum { SHUTDOWN = 0, ACTIVE } plStates; typedef enum { EMPTY_WHEN_FULL= 0, EMPTY_AT_NIGHT } batDrainStrategy; class PowerLimiterClass { public: void init(); void loop(); uint8_t getPowerLimiterState(); int32_t getLastRequestedPowewrLimit(); void setMode(uint8_t mode); bool getMode(); void calcNextInverterRestart(); private: uint32_t _lastLoop = 0; int32_t _lastRequestedPowerLimit = 0; uint32_t _lastLimitSetTime = 0; plStates _plState; uint8_t _mode = PL_MODE_ENABLE_NORMAL_OP; bool _batteryDischargeEnabled = false; uint32_t _nextInverterRestart = 0; // Values: 0->not calculated / 1->no restart configured / >1->time of next inverter restart in millis() uint32_t _nextCalculateCheck = 5000; // time in millis for next NTP check to calulate restart bool _fullSolarPassThroughEnabled = false; float _powerMeter1Power; float _powerMeter2Power; float _powerMeter3Power; bool canUseDirectSolarPower(); int32_t calcPowerLimit(std::shared_ptr inverter, bool solarPowerEnabled, bool batteryDischargeEnabled); void commitPowerLimit(std::shared_ptr inverter, int32_t limit, bool enablePowerProduction); void setNewPowerLimit(std::shared_ptr inverter, int32_t newPowerLimit); int32_t getSolarChargePower(); float getLoadCorrectedVoltage(std::shared_ptr inverter); bool isStartThresholdReached(std::shared_ptr inverter); bool isStopThresholdReached(std::shared_ptr inverter); bool useFullSolarPassthrough(std::shared_ptr inverter); }; extern PowerLimiterClass PowerLimiter;