implement UI for target power consumption

This commit is contained in:
helgeerbe 2023-02-24 16:13:32 +01:00
parent cd7ece7caf
commit 28b24d01ad
11 changed files with 58 additions and 5 deletions

View File

@ -108,6 +108,8 @@ struct CONFIG_T {
bool PowerLimiter_IsInverterBehindPowerMeter; bool PowerLimiter_IsInverterBehindPowerMeter;
uint8_t PowerLimiter_InverterId; uint8_t PowerLimiter_InverterId;
uint8_t PowerLimiter_InverterChannelId; uint8_t PowerLimiter_InverterChannelId;
uint32_t PowerLimiter_TargetPowerConsumption;
uint32_t PowerLimiter_TargetPowerConsumptionHysteresis;
uint32_t PowerLimiter_LowerPowerLimit; uint32_t PowerLimiter_LowerPowerLimit;
uint32_t PowerLimiter_UpperPowerLimit; uint32_t PowerLimiter_UpperPowerLimit;
uint32_t PowerLimiter_BatterySocStartThreshold; uint32_t PowerLimiter_BatterySocStartThreshold;

View File

@ -98,6 +98,8 @@
#define POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER true #define POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER true
#define POWERLIMITER_INVERTER_ID 0 #define POWERLIMITER_INVERTER_ID 0
#define POWERLIMITER_INVERTER_CHANNEL_ID 0 #define POWERLIMITER_INVERTER_CHANNEL_ID 0
#define POWERLIMITER_TARGET_POWER_CONSUMPTION 0
#define POWERLIMITER_TARGET_POWER_CONSUMPTION_HYSTERESIS 0
#define POWERLIMITER_LOWER_POWER_LIMIT 10 #define POWERLIMITER_LOWER_POWER_LIMIT 10
#define POWERLIMITER_UPPER_POWER_LIMIT 800 #define POWERLIMITER_UPPER_POWER_LIMIT 800
#define POWERLIMITER_BATTERY_SOC_START_THRESHOLD 80 #define POWERLIMITER_BATTERY_SOC_START_THRESHOLD 80

View File

@ -125,6 +125,8 @@ bool ConfigurationClass::write()
powerlimiter["is_inverter_behind_powermeter"] = config.PowerLimiter_IsInverterBehindPowerMeter; powerlimiter["is_inverter_behind_powermeter"] = config.PowerLimiter_IsInverterBehindPowerMeter;
powerlimiter["inverter_id"] = config.PowerLimiter_InverterId; powerlimiter["inverter_id"] = config.PowerLimiter_InverterId;
powerlimiter["inverter_channel_id"] = config.PowerLimiter_InverterChannelId; powerlimiter["inverter_channel_id"] = config.PowerLimiter_InverterChannelId;
powerlimiter["target_power_consumption"] = config.PowerLimiter_TargetPowerConsumption;
powerlimiter["target_power_consumption_hysteresis"] = config.PowerLimiter_TargetPowerConsumptionHysteresis;
powerlimiter["lower_power_limit"] = config.PowerLimiter_LowerPowerLimit; powerlimiter["lower_power_limit"] = config.PowerLimiter_LowerPowerLimit;
powerlimiter["upper_power_limit"] = config.PowerLimiter_UpperPowerLimit; powerlimiter["upper_power_limit"] = config.PowerLimiter_UpperPowerLimit;
powerlimiter["battery_soc_start_threshold"] = config.PowerLimiter_BatterySocStartThreshold; powerlimiter["battery_soc_start_threshold"] = config.PowerLimiter_BatterySocStartThreshold;
@ -288,6 +290,8 @@ bool ConfigurationClass::read()
config.PowerLimiter_IsInverterBehindPowerMeter = powerlimiter["is_inverter_behind_powermeter"] | POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER; config.PowerLimiter_IsInverterBehindPowerMeter = powerlimiter["is_inverter_behind_powermeter"] | POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER;
config.PowerLimiter_InverterId = powerlimiter["inverter_id"] | POWERLIMITER_INVERTER_ID; config.PowerLimiter_InverterId = powerlimiter["inverter_id"] | POWERLIMITER_INVERTER_ID;
config.PowerLimiter_InverterChannelId = powerlimiter["inverter_channel_id"] | POWERLIMITER_INVERTER_CHANNEL_ID; config.PowerLimiter_InverterChannelId = powerlimiter["inverter_channel_id"] | POWERLIMITER_INVERTER_CHANNEL_ID;
config.PowerLimiter_InverterChannelId = powerlimiter["target_power_consumption"] | POWERLIMITER_TARGET_POWER_CONSUMPTION;
config.PowerLimiter_InverterChannelId = powerlimiter["target_power_consumption_hysteresis"] | POWERLIMITER_TARGET_POWER_CONSUMPTION_HYSTERESIS;
config.PowerLimiter_LowerPowerLimit = powerlimiter["lower_power_limit"] | POWERLIMITER_LOWER_POWER_LIMIT; config.PowerLimiter_LowerPowerLimit = powerlimiter["lower_power_limit"] | POWERLIMITER_LOWER_POWER_LIMIT;
config.PowerLimiter_UpperPowerLimit = powerlimiter["upper_power_limit"] | POWERLIMITER_UPPER_POWER_LIMIT; config.PowerLimiter_UpperPowerLimit = powerlimiter["upper_power_limit"] | POWERLIMITER_UPPER_POWER_LIMIT;
config.PowerLimiter_BatterySocStartThreshold = powerlimiter["battery_soc_start_threshold"] | POWERLIMITER_BATTERY_SOC_START_THRESHOLD; config.PowerLimiter_BatterySocStartThreshold = powerlimiter["battery_soc_start_threshold"] | POWERLIMITER_BATTERY_SOC_START_THRESHOLD;

View File

@ -42,6 +42,8 @@ void WebApiPowerLimiterClass::onStatus(AsyncWebServerRequest* request)
root[F("is_inverter_behind_powermeter")] = config.PowerLimiter_IsInverterBehindPowerMeter; root[F("is_inverter_behind_powermeter")] = config.PowerLimiter_IsInverterBehindPowerMeter;
root[F("inverter_id")] = config.PowerLimiter_InverterId; root[F("inverter_id")] = config.PowerLimiter_InverterId;
root[F("inverter_channel_id")] = config.PowerLimiter_InverterChannelId; root[F("inverter_channel_id")] = config.PowerLimiter_InverterChannelId;
root[F("target_power_consumption")] = config.PowerLimiter_TargetPowerConsumption;
root[F("target_power_consumption_hysteresis")] = config.PowerLimiter_TargetPowerConsumptionHysteresis;
root[F("lower_power_limit")] = config.PowerLimiter_LowerPowerLimit; root[F("lower_power_limit")] = config.PowerLimiter_LowerPowerLimit;
root[F("upper_power_limit")] = config.PowerLimiter_UpperPowerLimit; root[F("upper_power_limit")] = config.PowerLimiter_UpperPowerLimit;
root[F("battery_soc_start_threshold")] = config.PowerLimiter_BatterySocStartThreshold; root[F("battery_soc_start_threshold")] = config.PowerLimiter_BatterySocStartThreshold;
@ -102,7 +104,10 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request)
if (!(root.containsKey("enabled") if (!(root.containsKey("enabled")
&& root.containsKey("lower_power_limit") && root.containsKey("lower_power_limit")
&& root.containsKey("inverter_id") && root.containsKey("inverter_id")
&& root.containsKey("inverter_channel_id"))) { && root.containsKey("inverter_channel_id")
&& root.containsKey("target_power_consumption")
&& root.containsKey("target_power_consumption_hysteresis")
)) {
retMsg[F("message")] = F("Values are missing!"); retMsg[F("message")] = F("Values are missing!");
response->setLength(); response->setLength();
request->send(response); request->send(response);
@ -119,6 +124,8 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request)
config.PowerLimiter_IsInverterBehindPowerMeter = root[F("is_inverter_behind_powermeter")].as<bool>(); config.PowerLimiter_IsInverterBehindPowerMeter = root[F("is_inverter_behind_powermeter")].as<bool>();
config.PowerLimiter_InverterId = root[F("inverter_id")].as<uint8_t>(); config.PowerLimiter_InverterId = root[F("inverter_id")].as<uint8_t>();
config.PowerLimiter_InverterChannelId = root[F("inverter_channel_id")].as<uint8_t>(); config.PowerLimiter_InverterChannelId = root[F("inverter_channel_id")].as<uint8_t>();
config.PowerLimiter_TargetPowerConsumption = root[F("target_power_consumption")].as<uint32_t>();
config.PowerLimiter_TargetPowerConsumptionHysteresis = root[F("target_power_consumption_hysteresis")].as<uint32_t>();
config.PowerLimiter_LowerPowerLimit = root[F("lower_power_limit")].as<uint32_t>(); config.PowerLimiter_LowerPowerLimit = root[F("lower_power_limit")].as<uint32_t>();
config.PowerLimiter_UpperPowerLimit = root[F("upper_power_limit")].as<uint32_t>(); config.PowerLimiter_UpperPowerLimit = root[F("upper_power_limit")].as<uint32_t>();
config.PowerLimiter_BatterySocStartThreshold = root[F("battery_soc_start_threshold")].as<float>(); config.PowerLimiter_BatterySocStartThreshold = root[F("battery_soc_start_threshold")].as<float>();
@ -135,6 +142,5 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request)
request->send(response); request->send(response);
MqttSettings.performReconnect(); // TODO(helge) is this really needed MqttSettings.performReconnect(); // TODO(helge) is this really needed
MqttHandleHass.forceUpdate(); // TODO(helge) is this really needed
PowerLimiter.init(); PowerLimiter.init();
} }

View File

@ -447,7 +447,12 @@
"InverterId": "Wechselrichter ID", "InverterId": "Wechselrichter ID",
"InverterIdHint": "Wähle den Wechselrichter an dem die Batterie hängt.", "InverterIdHint": "Wähle den Wechselrichter an dem die Batterie hängt.",
"InverterChannelId": "Kanal ID", "InverterChannelId": "Kanal ID",
"InverterChannelIdHint": "Wähle den Kanal an dem die Batterie hängt." "InverterChannelIdHint": "Wähle den Kanal an dem die Batterie hängt.",
"TargetPowerConsumption": "Erlaubter Stromverbrauch",
"TargetPowerConsumptionHint": "Angestrebter erlaubter Stromverbrauch.",
"TargetPowerConsumptionHysteresis": "Hysterese für den Zielstromverbrauch",
"TargetPowerConsumptionHysteresisHint": "Wert um den der Zielstromverbrauch schwanken darf, ohne dass nachgeregelt wird."
}, },
"batteryadmin": { "batteryadmin": {
"BatterySettings": "Batterie Einstellungen", "BatterySettings": "Batterie Einstellungen",

View File

@ -454,6 +454,10 @@
"InverterIdHint": "Select proper inverter ID where battery is connected to.", "InverterIdHint": "Select proper inverter ID where battery is connected to.",
"InverterChannelId": "Channel ID", "InverterChannelId": "Channel ID",
"InverterChannelIdHint": "Select proper channel where battery is connected to.", "InverterChannelIdHint": "Select proper channel where battery is connected to.",
"TargetPowerConsumption": "Target power consumption",
"TargetPowerConsumptionHint": "Set the grid power consumption the limiter tries to achieve.",
"TargetPowerConsumptionHysteresis": "Hysteresis for power consumption",
"TargetPowerConsumptionHysteresisHint": "Value around which the target power consumption fluctuates without readjustment.",
"LowerPowerLimit": "Lower power limit / continuous feed", "LowerPowerLimit": "Lower power limit / continuous feed",
"UpperPowerLimit": "Upper power limit", "UpperPowerLimit": "Upper power limit",
"PowerMeters": "Power meters - MQTT", "PowerMeters": "Power meters - MQTT",

View File

@ -7,6 +7,8 @@ export interface PowerLimiterConfig {
is_inverter_behind_powermeter: boolean; is_inverter_behind_powermeter: boolean;
inverter_id: number; inverter_id: number;
inverter_channel_id: number; inverter_channel_id: number;
target_power_consumption: number;
target_power_consumption_hysteresis: number;
lower_power_limit: number; lower_power_limit: number;
upper_power_limit: number; upper_power_limit: number;
battery_soc_start_threshold: number; battery_soc_start_threshold: number;

View File

@ -19,7 +19,7 @@
<div class="row mb-3" v-show="powerLimiterConfigList.enabled"> <div class="row mb-3" v-show="powerLimiterConfigList.enabled">
<label for="inputTimezone" class="col-sm-2 col-form-label"> <label for="inputTimezone" class="col-sm-2 col-form-label">
{{ $t('powerlimiteradmin.InverterId') }} {{ $t('powerlimiteradmin.InverterId') }}:
<BIconInfoCircle v-tooltip :title="$t('powerlimiteradmin.InverterIdHint')" /> <BIconInfoCircle v-tooltip :title="$t('powerlimiteradmin.InverterIdHint')" />
</label> </label>
<div class="col-sm-10"> <div class="col-sm-10">
@ -33,7 +33,7 @@
<div class="row mb-3" v-show="powerLimiterConfigList.enabled"> <div class="row mb-3" v-show="powerLimiterConfigList.enabled">
<label for="inputTimezone" class="col-sm-2 col-form-label"> <label for="inputTimezone" class="col-sm-2 col-form-label">
{{ $t('powerlimiteradmin.InverterChannelId') }} {{ $t('powerlimiteradmin.InverterChannelId') }}:
<BIconInfoCircle v-tooltip :title="$t('powerlimiteradmin.InverterChannelIdHint')" /> <BIconInfoCircle v-tooltip :title="$t('powerlimiteradmin.InverterChannelIdHint')" />
</label> </label>
<div class="col-sm-10"> <div class="col-sm-10">
@ -44,6 +44,34 @@
</select> </select>
</div> </div>
</div> </div>
<div class="row mb-3" v-show="powerLimiterConfigList.enabled">
<label for="targetPowerConsumption" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.TargetPowerConsumption') }}:
<BIconInfoCircle v-tooltip :title="$t('powerlimiteradmin.TargetPowerConsumptionHint')" />
</label>
<div class="col-sm-10">
<div class="input-group">
<input type="number" class="form-control" id="targetPowerConsumption"
placeholder="70" min="10" v-model="powerLimiterConfigList.target_power_consumption"
aria-describedby="targetPowerConsumptionDescription" />
<span class="input-group-text" id="targetPowerConsumptionDescription">W</span>
</div>
</div>
</div>
<div class="row mb-3" v-show="powerLimiterConfigList.enabled">
<label for="targetPowerConsumptionHyteresis" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.TargetPowerConsumptionHysteresis') }}:
<BIconInfoCircle v-tooltip :title="$t('powerlimiteradmin.TargetPowerConsumptionHysteresisHint')" />
</label>
<div class="col-sm-10">
<div class="input-group">
<input type="number" class="form-control" id="targetPowerConsumptionHysteresis"
placeholder="25" min="10" v-model="powerLimiterConfigList.target_power_consumption_hysteresis"
aria-describedby="targetPowerConsumptionHysteresisDescription" />
<span class="input-group-text" id="targetPowerConsumptionHysteresisDescription">W</span>
</div>
</div>
</div>
<div class="row mb-3" v-show="powerLimiterConfigList.enabled"> <div class="row mb-3" v-show="powerLimiterConfigList.enabled">
<label for="inputLowerPowerLimit" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.LowerPowerLimit') }}:</label> <label for="inputLowerPowerLimit" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.LowerPowerLimit') }}:</label>

Binary file not shown.

Binary file not shown.

Binary file not shown.