Feature: support 'use battery at night' without VE.Direct

previously, we needed VE.Direct enabled to know the
solar charge controller output, which solely decided when
it was "nighttime". since this is now determined by the
wall clock, we can offer this feature to users without a
Victron charge controller connected using VE.Direct.
This commit is contained in:
Andreas Böhm 2024-08-19 20:49:37 +02:00 committed by GitHub
parent df53f34b51
commit e7d454ff0b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 14 additions and 10 deletions

View File

@ -251,8 +251,7 @@ void PowerLimiterClass::loop()
if (isStartThresholdReached()) { return true; } if (isStartThresholdReached()) { return true; }
if (config.PowerLimiter.SolarPassThroughEnabled && if (config.PowerLimiter.BatteryAlwaysUseAtNight &&
config.PowerLimiter.BatteryAlwaysUseAtNight &&
!isDayPeriod && !isDayPeriod &&
!_batteryDischargeEnabled) { !_batteryDischargeEnabled) {
_nighttimeDischarging = true; _nighttimeDischarging = true;

View File

@ -153,13 +153,13 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request)
if (config.Vedirect.Enabled) { if (config.Vedirect.Enabled) {
config.PowerLimiter.SolarPassThroughEnabled = root["solar_passthrough_enabled"].as<bool>(); config.PowerLimiter.SolarPassThroughEnabled = root["solar_passthrough_enabled"].as<bool>();
config.PowerLimiter.SolarPassThroughLosses = root["solar_passthrough_losses"].as<uint8_t>(); config.PowerLimiter.SolarPassThroughLosses = root["solar_passthrough_losses"].as<uint8_t>();
config.PowerLimiter.BatteryAlwaysUseAtNight= root["battery_always_use_at_night"].as<bool>();
config.PowerLimiter.FullSolarPassThroughStartVoltage = static_cast<int>(root["full_solar_passthrough_start_voltage"].as<float>() * 100) / 100.0; config.PowerLimiter.FullSolarPassThroughStartVoltage = static_cast<int>(root["full_solar_passthrough_start_voltage"].as<float>() * 100) / 100.0;
config.PowerLimiter.FullSolarPassThroughStopVoltage = static_cast<int>(root["full_solar_passthrough_stop_voltage"].as<float>() * 100) / 100.0; config.PowerLimiter.FullSolarPassThroughStopVoltage = static_cast<int>(root["full_solar_passthrough_stop_voltage"].as<float>() * 100) / 100.0;
} }
config.PowerLimiter.IsInverterBehindPowerMeter = root["is_inverter_behind_powermeter"].as<bool>(); config.PowerLimiter.IsInverterBehindPowerMeter = root["is_inverter_behind_powermeter"].as<bool>();
config.PowerLimiter.IsInverterSolarPowered = root["is_inverter_solar_powered"].as<bool>(); config.PowerLimiter.IsInverterSolarPowered = root["is_inverter_solar_powered"].as<bool>();
config.PowerLimiter.BatteryAlwaysUseAtNight = root["battery_always_use_at_night"].as<bool>();
config.PowerLimiter.UseOverscalingToCompensateShading = root["use_overscaling_to_compensate_shading"].as<bool>(); config.PowerLimiter.UseOverscalingToCompensateShading = root["use_overscaling_to_compensate_shading"].as<bool>();
config.PowerLimiter.InverterId = root["inverter_serial"].as<uint64_t>(); config.PowerLimiter.InverterId = root["inverter_serial"].as<uint64_t>();
config.PowerLimiter.InverterChannelId = root["inverter_channel_id"].as<uint8_t>(); config.PowerLimiter.InverterChannelId = root["inverter_channel_id"].as<uint8_t>();

View File

@ -105,6 +105,14 @@
wide wide
/> />
<InputElement
v-show="canUseBatteryDischargeAtNight()"
:label="$t('powerlimiteradmin.BatteryDischargeAtNight')"
v-model="powerLimiterConfigList.battery_always_use_at_night"
type="checkbox"
wide
/>
<InputElement <InputElement
v-show="canUseOverscaling()" v-show="canUseOverscaling()"
:label="$t('powerlimiteradmin.UseOverscalingToCompensateShading')" :label="$t('powerlimiteradmin.UseOverscalingToCompensateShading')"
@ -221,13 +229,6 @@
/> />
<div v-if="powerLimiterConfigList.solar_passthrough_enabled"> <div v-if="powerLimiterConfigList.solar_passthrough_enabled">
<InputElement
:label="$t('powerlimiteradmin.BatteryDischargeAtNight')"
v-model="powerLimiterConfigList.battery_always_use_at_night"
type="checkbox"
wide
/>
<InputElement <InputElement
:label="$t('powerlimiteradmin.SolarPassthroughLosses')" :label="$t('powerlimiteradmin.SolarPassthroughLosses')"
v-model="powerLimiterConfigList.solar_passthrough_losses" v-model="powerLimiterConfigList.solar_passthrough_losses"
@ -493,6 +494,10 @@ export default defineComponent({
const cfg = this.powerLimiterConfigList; const cfg = this.powerLimiterConfigList;
return cfg.is_inverter_solar_powered; return cfg.is_inverter_solar_powered;
}, },
canUseBatteryDischargeAtNight() {
const cfg = this.powerLimiterConfigList;
return !cfg.is_inverter_solar_powered;
},
canUseSolarPassthrough() { canUseSolarPassthrough() {
const cfg = this.powerLimiterConfigList; const cfg = this.powerLimiterConfigList;
const meta = this.powerLimiterMetaData; const meta = this.powerLimiterMetaData;