Skip to content

Commit

Permalink
Fix: rename solar-passthrough losses to conduction losses
Browse files Browse the repository at this point in the history
that loss factor is not only used in the context of solar-passthrough.
for that reason, the setting was renamed. the web UI is updated
accordingly.

this commit includes minor updates to other DPL language tokens to
better match the support for multiple inverters. one obsolete token was
removed.
  • Loading branch information
schlimmchen committed Nov 30, 2024
1 parent fc965c1 commit 4e4d46c
Show file tree
Hide file tree
Showing 9 changed files with 59 additions and 80 deletions.
4 changes: 2 additions & 2 deletions include/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

#define CONFIG_FILENAME "/config.json"
#define CONFIG_VERSION 0x00011d00 // 0.1.29 // make sure to clean all after change
#define CONFIG_VERSION_ONBATTERY 1
#define CONFIG_VERSION_ONBATTERY 2

#define WIFI_MAX_SSID_STRLEN 32
#define WIFI_MAX_PASSWORD_STRLEN 64
Expand Down Expand Up @@ -148,7 +148,7 @@ struct POWERLIMITER_CONFIG_T {
bool Enabled;
bool VerboseLogging;
bool SolarPassThroughEnabled;
uint8_t SolarPassThroughLosses;
uint8_t ConductionLosses;
bool BatteryAlwaysUseAtNight;
int16_t TargetPowerConsumption;
uint16_t TargetPowerConsumptionHysteresis;
Expand Down
2 changes: 1 addition & 1 deletion include/defaults.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@

#define POWERLIMITER_ENABLED false
#define POWERLIMITER_SOLAR_PASSTHROUGH_ENABLED true
#define POWERLIMITER_SOLAR_PASSTHROUGH_LOSSES 3
#define POWERLIMITER_CONDUCTION_LOSSES 3
#define POWERLIMITER_BATTERY_ALWAYS_USE_AT_NIGHT false
#define POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER true
#define POWERLIMITER_IS_INVERTER_SOLAR_POWERED false
Expand Down
10 changes: 7 additions & 3 deletions src/Configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ void ConfigurationClass::serializePowerLimiterConfig(PowerLimiterConfig const& s
target["enabled"] = source.Enabled;
target["verbose_logging"] = source.VerboseLogging;
target["solar_passthrough_enabled"] = source.SolarPassThroughEnabled;
target["solar_passthrough_losses"] = source.SolarPassThroughLosses;
target["conduction_losses"] = source.ConductionLosses;
target["battery_always_use_at_night"] = source.BatteryAlwaysUseAtNight;
target["target_power_consumption"] = source.TargetPowerConsumption;
target["target_power_consumption_hysteresis"] = source.TargetPowerConsumptionHysteresis;
Expand Down Expand Up @@ -441,7 +441,7 @@ void ConfigurationClass::deserializePowerLimiterConfig(JsonObject const& source,
target.Enabled = source["enabled"] | POWERLIMITER_ENABLED;
target.VerboseLogging = source["verbose_logging"] | VERBOSE_LOGGING;
target.SolarPassThroughEnabled = source["solar_passthrough_enabled"] | POWERLIMITER_SOLAR_PASSTHROUGH_ENABLED;
target.SolarPassThroughLosses = source["solar_passthrough_losses"] | POWERLIMITER_SOLAR_PASSTHROUGH_LOSSES;
target.ConductionLosses = source["conduction_losses"] | POWERLIMITER_CONDUCTION_LOSSES;
target.BatteryAlwaysUseAtNight = source["battery_always_use_at_night"] | POWERLIMITER_BATTERY_ALWAYS_USE_AT_NIGHT;
target.TargetPowerConsumption = source["target_power_consumption"] | POWERLIMITER_TARGET_POWER_CONSUMPTION;
target.TargetPowerConsumptionHysteresis = source["target_power_consumption_hysteresis"] | POWERLIMITER_TARGET_POWER_CONSUMPTION_HYSTERESIS;
Expand Down Expand Up @@ -868,7 +868,7 @@ void ConfigurationClass::migrateOnBattery()
}

if (!powerlimiter["solar_passtrough_losses"].isNull()) {
config.PowerLimiter.SolarPassThroughLosses = powerlimiter["solar_passtrough_losses"].as<uint8_t>();
config.PowerLimiter.ConductionLosses = powerlimiter["solar_passtrough_losses"].as<uint8_t>();
}

if (!powerlimiter["inverter_id"].isNull()) {
Expand All @@ -895,6 +895,10 @@ void ConfigurationClass::migrateOnBattery()
}
}

if (config.Cfg.VersionOnBattery < 2) {
config.PowerLimiter.ConductionLosses = doc["powerlimiter"]["solar_passthrough_losses"].as<uint8_t>();
}

f.close();

config.Cfg.VersionOnBattery = CONFIG_VERSION_ONBATTERY;
Expand Down
6 changes: 3 additions & 3 deletions src/PowerLimiter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -294,9 +294,9 @@ void PowerLimiterClass::loop()
(config.PowerLimiter.SolarPassThroughEnabled?"en":"dis"),
(config.PowerLimiter.BatteryAlwaysUseAtNight?"yes":"no"));

MessageOutput.printf("[DPL] total max AC power is %u W, cabling losses are %u %%\r\n",
MessageOutput.printf("[DPL] total max AC power is %u W, conduction losses are %u %%\r\n",
config.PowerLimiter.TotalUpperPowerLimit,
config.PowerLimiter.SolarPassThroughLosses);
config.PowerLimiter.ConductionLosses);
};

// this value is negative if we are exporting power to the grid
Expand Down Expand Up @@ -397,7 +397,7 @@ uint16_t PowerLimiterClass::dcPowerBusToInverterAc(uint16_t dcPower)
{
// account for losses between power bus and inverter (cables, junctions...)
auto const& config = Configuration.get();
float lossesFactor = 1.00 - static_cast<float>(config.PowerLimiter.SolarPassThroughLosses)/100;
float lossesFactor = 1.00 - static_cast<float>(config.PowerLimiter.ConductionLosses)/100;

// we cannot know the efficiency at the new limit. even if we could we
// cannot know which inverter is assigned which limit. hence we use a
Expand Down
20 changes: 9 additions & 11 deletions webapp/src/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -667,13 +667,12 @@
"Enable": "Aktiviert",
"GovernInverter": "Steuere Wechselrichter \"{name}\"",
"VerboseLogging": "@:base.VerboseLogging",
"SolarPassthrough": "Solar-Passthrough",
"EnableSolarPassthrough": "Aktiviere Solar-Passthrough",
"SolarPassthroughLosses": "(Full) Solar-Passthrough Verluste",
"SolarPassthroughLossesInfo": "<b>Hinweis:</b> Bei der Übertragung von Energie vom Solarladeregler zum Inverter sind Leitungsverluste zu erwarten. Um eine schleichende Entladung der Batterie im (Full) Solar-Passthrough Modus zu unterbinden, können diese Verluste berücksichtigt werden. Das am Inverter einzustellende Power Limit wird nach Berücksichtigung von dessen Effizienz zusätzlich um diesen Faktor verringert.",
"ConductionLosses": "Leitungsverluste",
"ConductionLossesInfo": "Bei der Übertragung von Energie vom Solarladeregler oder der Batterie zum Inverter sind Leitungsverluste zu erwarten. Diese Verluste werden berücksichtigt, um besser geeignete Wechselrichterlimits zu errechnen.",
"BatteryDischargeAtNight": "Batterie nachts sogar teilweise geladen nutzen",
"SolarpassthroughInfo": "Diese Funktion ermöglicht den unmittelbaren Verbauch der verfügbaren Solarleistung. Dazu wird die aktuell vom Laderegler gemeldete Solarleistung am Wechselrichter als Limit eingestellt, selbst wenn sich die Batterie in einem Ladezyklus befindet. Somit wird eine unnötige Speicherung vermieden, die verlustbehaftet wäre.",
"InverterSettings": "Wechselrichtereinstellungen",
"SolarPassthroughInfo": "Solar-Passthrough ermöglicht den unmittelbaren Verbauch der verfügbaren Solarleistung. Dazu wird die aktuell vom Laderegler gemeldete Solarleistung als Sollwert für die Wechselrichtergesamtleistung angenommen, selbst wenn sich die Batterie in einem Ladezyklus befindet. Somit wird eine unnötige verlustbehaftete Speicherung der Energie umgangen.",
"DcPowerBusSettings": "Einstellungen DC-Stromschiene",
"SelectInverter": "Inverter auswählen...",
"InverterForDcVoltage": "Wechselrichter für Spannungsmessungen",
"InverterChannelId": "Eingang für Spannungsmessungen",
Expand All @@ -682,14 +681,13 @@
"TargetPowerConsumptionHysteresis": "Hysterese",
"TargetPowerConsumptionHysteresisHint": "Neu berechnetes Limit nur dann an den jeweiligen Inverter senden, wenn es vom zurückgemeldeten Limit um mindestens diesen Betrag abweicht.",
"LowerPowerLimit": "Minimales Leistungslimit",
"LowerPowerLimitHint": "Dieser Wert muss so gewählt werden, dass ein stabiler Betrieb mit diesem Limit möglich ist. Falls der Wechselrichter nur mit einem kleineren Limit betrieben werden könnte, wird er stattdessen in Standby versetzt.",
"LowerPowerLimitHint": "Dieser Wert muss so gewählt werden, dass ein stabiler Betrieb mit diesem Limit möglich ist. Falls der Wechselrichter nur mit einem kleineren Limit betrieben werden könnte, wird er stattdessen in Standby versetzt, falls er batteriebetrieben ist.",
"BaseLoadLimit": "Grundlast",
"BaseLoadLimitHint": "Relevant beim Betrieb ohne oder beim Ausfall des Stromzählers. Solange es die sonstigen Bedinungen zulassen (insb. Batterieladung), wird diese Leistung auf die Wechselrichter verteilt.",
"TotalUpperPowerLimit": "Maximale Gesamtausgangsleistung",
"TotalUpperPowerLimitHint": "Die Wechselrichter werden so eingestellt, dass sie in Summe höchstens diese Leistung erbringen.",
"ManagedInverters": "Verwaltete Wechselrichter",
"AddInverter": "Wechselrichter Hinzufügen",
"NoManagedInverters": "Der Dynamic Power Limiter verwaltet zur Zeit keine Wechselrichter. Um Fortzufahren, wähle einen Wechselrichter aus der Auswahlliste oben und füge ihn hinzu.",
"InverterLabel": "Name (Typ)",
"PowerSource": "Energiequelle",
"PowerSourceBattery": "Batterie",
Expand All @@ -709,7 +707,7 @@
"StartThreshold": "Batterienutzung Start-Schwellwert",
"StopThreshold": "Batterienutzung Stop-Schwellwert",
"FullSolarPassthroughStartThreshold": "Full-Solar-Passthrough Start-Schwellwert",
"FullSolarPassthroughStartThresholdHint": "Oberhalb dieses Schwellwertes wird die Inverterleistung der Victron-MPPT-Leistung gleichgesetzt (abzüglich Effizienzkorrekturfaktor). Kann verwendet werden um überschüssige Solarleistung an das Netz zu liefern wenn die Batterie voll ist.",
"FullSolarPassthroughStartThresholdHint": "Oberhalb dieses Schwellwertes wird die Leistung der Inverter der Ladereglerausgangsleistung gleichgesetzt (abzüglich Effizienzkorrekturen). Kann verwendet werden um überschüssige Solarleistung an das Netz zu liefern wenn die Batterie voll ist.",
"VoltageSolarPassthroughStopThreshold": "Full-Solar-Passthrough Stop-Schwellwert",
"VoltageLoadCorrectionFactor": "Lastkorrekturfaktor",
"BatterySocInfo": "<b>Hinweis:</b> Die Batterie State of Charge (SoC) Schwellwerte werden bevorzugt herangezogen. Sie werden allerdings nur benutzt, wenn die Batterie-Kommunikationsschnittstelle innerhalb der letzten Minute gültige Werte verarbeitet hat. Andernfalls werden ersatzweise die Spannungs-Schwellwerte verwendet.",
Expand All @@ -719,10 +717,10 @@
"UseOverscalingToCompensateShading": "Verschattung durch Überskalierung ausgleichen",
"UseOverscalingToCompensateShadingHint": "Erlaubt das Überskalieren des Wechselrichter-Limits, um Verschattung eines oder mehrerer Eingänge auszugleichen.",
"VoltageThresholds": "Batterie Spannungs-Schwellwerte ",
"VoltageLoadCorrectionInfo": "<b>Hinweis:</b> Wenn Leistung von der Batterie abgegeben wird, bricht ihre Spannung etwas ein. Der Spannungseinbruch skaliert mit dem Entladestrom. Damit nicht vorzeitig der Wechselrichter ausgeschaltet wird sobald der Stop-Schwellenwert unterschritten wurde, wird der hier angegebene Korrekturfaktor mit einberechnet um die Spannung zu errechnen die der Akku in Ruhe hätte. Korrigierte Spannung = DC Spannung + (Aktuelle Leistung (W) * Korrekturfaktor).",
"InverterRestartHour": "Uhrzeit für geplanten Neustart",
"VoltageLoadCorrectionInfo": "<b>Hinweis:</b> Wenn Leistung von der Batterie abgegeben wird, bricht ihre Spannung etwas ein. Der Spannungseinbruch skaliert mit dem Entladestrom. Damit Wechselrichter nicht vorzeitig ausgeschaltet werden sobald der Stop-Schwellenwert unterschritten wurde, wird der hier angegebene Korrekturfaktor mit einberechnet, um die Spannung zu errechnen, die der Akku in Ruhe hätte. Korrigierte Spannung = DC Spannung + (Aktuelle Leistung (W) * Korrekturfaktor).",
"InverterRestartHour": "Uhrzeit für automatischen Wechselrichterneustart",
"InverterRestartDisabled": "Keinen automatischen Neustart planen",
"InverterRestartHint": "Der Tagesertrag des Wechselrichters wird normalerweise nachts zurückgesetzt, wenn sich der Wechselrichter mangels Licht abschaltet. Um den Tageserstrag zurückzusetzen obwohl der Wechselrichter dauerhaft von der Batterie gespeist wird, kann der Inverter täglich zur gewünschten Uhrzeit automatisch neu gestartet werden."
"InverterRestartHint": "Der Tagesertrag des Wechselrichters wird beim Einsatz an Solarmodulen nachts zurückgesetzt, wenn sich der Wechselrichter mangels Licht abschaltet. Um den Tageserstrag zurückzusetzen obwohl der Wechselrichter dauerhaft von einer Batterie gespeist wird, kann der Inverter täglich zur gewünschten Uhrzeit automatisch neu gestartet werden."
},
"batteryadmin": {
"BatterySettings": "Batterie Einstellungen",
Expand Down
22 changes: 10 additions & 12 deletions webapp/src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -669,29 +669,27 @@
"Enable": "Enable",
"GovernInverter": "Govern Inverter \"{name}\"",
"VerboseLogging": "@:base.VerboseLogging",
"SolarPassthrough": "Solar-Passthrough",
"EnableSolarPassthrough": "Enable Solar-Passthrough",
"SolarPassthroughLosses": "(Full) Solar-Passthrough Losses",
"SolarPassthroughLossesInfo": "<b>Hint:</b> Line losses are to be expected when transferring energy from the solar charge controller to the inverter. These losses can be taken into account to prevent the battery from gradually discharging in (full) solar-passthrough mode. The power limit to be set on the inverter is additionally reduced by this factor after taking its efficiency into account.",
"ConductionLosses": "Conduction Losses",
"ConductionLossesInfo": "Conduction losses are to be expected when transferring energy from the solar charge controller or from the battery to the inverter. These losses are taken into account to calculate better suited inverter limits.",
"BatteryDischargeAtNight": "Use battery at night even if only partially charged",
"SolarpassthroughInfo": "This feature allows to use the available current solar power directly. The solar power, as reported by the MPPT charge controller, is set as the inverter's limit, even if the battery is currently charging. This avoids storing energy unnecessarily, which would be lossy.",
"InverterSettings": "Inverter Settings",
"SolarPassthroughInfo": "Solar-Passthrough enables the immediate consumption of the available solar power. For this purpose, the solar power currently reported by the charge controller is assumed as the inverters' output power target, even if the battery is in a charge cycle. This avoids unnecessary lossy energy storage.",
"DcPowerBusSettings": "DC Power Bus Settings",
"SelectInverter": "Select an inverter...",
"InverterForDcVoltage": "Inverter used for voltage measurements",
"InverterChannelId": "Input used for voltage measurements",
"TargetPowerConsumption": "Target Grid Consumption",
"TargetPowerConsumptionHint": "Grid power consumption the dynamic power limiter tries to achieve. Value may be negative.",
"TargetPowerConsumptionHint": "Grid power consumption the Dynamic Power Limiter tries to achieve. Value may be negative.",
"TargetPowerConsumptionHysteresis": "Hysteresis",
"TargetPowerConsumptionHysteresisHint": "Only send a newly calculated power limit to the respective inverter if the absolute difference to the last reported power limit exceeds this amount.",
"LowerPowerLimit": "Minimum Power Limit",
"LowerPowerLimitHint": "This value must be selected so that stable operation is possible at this limit. If the inverter could only be operated with a lower limit, it is put into standby instead.",
"LowerPowerLimitHint": "This value must be selected so that stable operation is possible at this limit. If the inverter could only be operated with a lower limit, it is put into standby instead if it is battery-powered.",
"BaseLoadLimit": "Base Load",
"BaseLoadLimitHint": "Relevant for operation without power meter or when the power meter fails. As long as the other conditions allow (battery charge in particular), the inverters are configured to output this amount of power in total.",
"TotalUpperPowerLimit": "Maximum Total Output",
"TotalUpperPowerLimitHint": "The inverters are configured to output this maximum amount of power in total.",
"ManagedInverters": "Managed Inverters",
"AddInverter": "Add Inverter",
"NoManagedInverters": "The Dynamic Power Limiter is currently not managing any inverters. To continue, select an inverter in the dropdown list above and add it.",
"InverterLabel": "Name (Type)",
"PowerSource": "Power Source",
"PowerSourceBattery": "Battery",
Expand All @@ -711,7 +709,7 @@
"StartThreshold": "Start Threshold for Battery Discharging",
"StopThreshold": "Stop Threshold for Battery Discharging",
"FullSolarPassthroughStartThreshold": "Full Solar-Passthrough Start Threshold",
"FullSolarPassthroughStartThresholdHint": "Inverter power is set equal to Victron MPPT power (minus efficiency factors) while above this threshold. Use this if you want to supply excess power to the grid when the battery is full.",
"FullSolarPassthroughStartThresholdHint": "The inverters' output power is set equal to the charge controller's output power (after accounting efficiency factors) while above this threshold. Use this if you want to supply excess power to the grid when the battery is full.",
"VoltageSolarPassthroughStopThreshold": "Full Solar-Passthrough Stop Threshold",
"VoltageLoadCorrectionFactor": "Load correction factor",
"BatterySocInfo": "<b>Hint:</b> The use of battery State of Charge (SoC) thresholds is prioritized. However, SoC thresholds are only used if the battery communication interface has processed valid SoC values in the last minute. Otherwise, the voltage thresholds will be used as fallback.",
Expand All @@ -721,10 +719,10 @@
"UseOverscalingToCompensateShading": "Compensate for shading",
"UseOverscalingToCompensateShadingHint": "Allow to overscale the inverter limit to compensate for shading of one or multiple inputs.",
"VoltageThresholds": "Battery Voltage Thresholds",
"VoltageLoadCorrectionInfo": "<b>Hint:</b> When the battery is discharged, its voltage drops. The voltage drop scales with the discharge current. In order to not stop the inverter too early (stop threshold), this load correction factor can be specified to calculate the battery voltage if it was idle. Corrected voltage = DC Voltage + (Current power * correction factor).",
"InverterRestartHour": "Automatic Restart Time",
"VoltageLoadCorrectionInfo": "<b>Hint:</b> When the battery is discharged, its voltage drops. The voltage drop scales with the discharge current. In order to not stop inverters too early (stop threshold), this load correction factor can be specified to calculate the battery voltage if it was idle. Corrected voltage = DC Voltage + (Current power * correction factor).",
"InverterRestartHour": "Automatic Inverter Restart Time",
"InverterRestartDisabled": "Do not execute automatic restart",
"InverterRestartHint": "The daily yield of the inverter is usually reset at night when the inverter turns off due to lack of light. To reset the daily yield even though the inverter is continuously powered by the battery, the inverter can be automatically restarted daily at the desired time."
"InverterRestartHint": "When used with solar modules, the inverter's daily yield is usually reset at night when the inverter turns off due to lack of light. To reset the daily yield even though the inverter is continuously powered by a battery, the inverter can be automatically restarted daily at the desired time."
},
"batteryadmin": {
"BatterySettings": "Battery Settings",
Expand Down
Loading

0 comments on commit 4e4d46c

Please sign in to comment.