implement UI for target power consumption
This commit is contained in:
parent
cd7ece7caf
commit
28b24d01ad
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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">
|
||||||
@ -45,6 +45,34 @@
|
|||||||
</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>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user