diff --git a/include/Configuration.h b/include/Configuration.h index 9b464545..fe57d65e 100644 --- a/include/Configuration.h +++ b/include/Configuration.h @@ -108,6 +108,8 @@ struct CONFIG_T { bool PowerLimiter_IsInverterBehindPowerMeter; uint8_t PowerLimiter_InverterId; uint8_t PowerLimiter_InverterChannelId; + uint32_t PowerLimiter_TargetPowerConsumption; + uint32_t PowerLimiter_TargetPowerConsumptionHysteresis; uint32_t PowerLimiter_LowerPowerLimit; uint32_t PowerLimiter_UpperPowerLimit; uint32_t PowerLimiter_BatterySocStartThreshold; diff --git a/include/defaults.h b/include/defaults.h index 14c6d545..18c211e7 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -98,6 +98,8 @@ #define POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER true #define POWERLIMITER_INVERTER_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_UPPER_POWER_LIMIT 800 #define POWERLIMITER_BATTERY_SOC_START_THRESHOLD 80 diff --git a/src/Configuration.cpp b/src/Configuration.cpp index a1d978a4..ef12ecb8 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -125,6 +125,8 @@ bool ConfigurationClass::write() powerlimiter["is_inverter_behind_powermeter"] = config.PowerLimiter_IsInverterBehindPowerMeter; powerlimiter["inverter_id"] = config.PowerLimiter_InverterId; 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["upper_power_limit"] = config.PowerLimiter_UpperPowerLimit; 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_InverterId = powerlimiter["inverter_id"] | POWERLIMITER_INVERTER_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_UpperPowerLimit = powerlimiter["upper_power_limit"] | POWERLIMITER_UPPER_POWER_LIMIT; config.PowerLimiter_BatterySocStartThreshold = powerlimiter["battery_soc_start_threshold"] | POWERLIMITER_BATTERY_SOC_START_THRESHOLD; diff --git a/src/WebApi_powerlimiter.cpp b/src/WebApi_powerlimiter.cpp index 00824535..4c6544f4 100644 --- a/src/WebApi_powerlimiter.cpp +++ b/src/WebApi_powerlimiter.cpp @@ -42,6 +42,8 @@ void WebApiPowerLimiterClass::onStatus(AsyncWebServerRequest* request) root[F("is_inverter_behind_powermeter")] = config.PowerLimiter_IsInverterBehindPowerMeter; root[F("inverter_id")] = config.PowerLimiter_InverterId; 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("upper_power_limit")] = config.PowerLimiter_UpperPowerLimit; root[F("battery_soc_start_threshold")] = config.PowerLimiter_BatterySocStartThreshold; @@ -102,7 +104,10 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request) if (!(root.containsKey("enabled") && root.containsKey("lower_power_limit") && 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!"); response->setLength(); request->send(response); @@ -119,6 +124,8 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request) config.PowerLimiter_IsInverterBehindPowerMeter = root[F("is_inverter_behind_powermeter")].as(); config.PowerLimiter_InverterId = root[F("inverter_id")].as(); config.PowerLimiter_InverterChannelId = root[F("inverter_channel_id")].as(); + config.PowerLimiter_TargetPowerConsumption = root[F("target_power_consumption")].as(); + config.PowerLimiter_TargetPowerConsumptionHysteresis = root[F("target_power_consumption_hysteresis")].as(); config.PowerLimiter_LowerPowerLimit = root[F("lower_power_limit")].as(); config.PowerLimiter_UpperPowerLimit = root[F("upper_power_limit")].as(); config.PowerLimiter_BatterySocStartThreshold = root[F("battery_soc_start_threshold")].as(); @@ -135,6 +142,5 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request) request->send(response); MqttSettings.performReconnect(); // TODO(helge) is this really needed - MqttHandleHass.forceUpdate(); // TODO(helge) is this really needed PowerLimiter.init(); } diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 3ec4f19f..2152c292 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -447,7 +447,12 @@ "InverterId": "Wechselrichter ID", "InverterIdHint": "Wähle den Wechselrichter an dem die Batterie hängt.", "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": { "BatterySettings": "Batterie Einstellungen", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 695eeb2c..cdd219fb 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -454,6 +454,10 @@ "InverterIdHint": "Select proper inverter ID where battery is connected to.", "InverterChannelId": "Channel ID", "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", "UpperPowerLimit": "Upper power limit", "PowerMeters": "Power meters - MQTT", diff --git a/webapp/src/types/PowerLimiterConfig.ts b/webapp/src/types/PowerLimiterConfig.ts index 4573ca69..6cbdd612 100644 --- a/webapp/src/types/PowerLimiterConfig.ts +++ b/webapp/src/types/PowerLimiterConfig.ts @@ -7,6 +7,8 @@ export interface PowerLimiterConfig { is_inverter_behind_powermeter: boolean; inverter_id: number; inverter_channel_id: number; + target_power_consumption: number; + target_power_consumption_hysteresis: number; lower_power_limit: number; upper_power_limit: number; battery_soc_start_threshold: number; diff --git a/webapp/src/views/PowerLimiterAdminView.vue b/webapp/src/views/PowerLimiterAdminView.vue index d91964e6..e11cb26a 100644 --- a/webapp/src/views/PowerLimiterAdminView.vue +++ b/webapp/src/views/PowerLimiterAdminView.vue @@ -19,7 +19,7 @@
@@ -33,7 +33,7 @@
@@ -44,6 +44,34 @@
+ +
+ +
+
+ + W +
+
+
+ +
+ +
+
+ + W +
+
+
diff --git a/webapp_dist/index.html.gz b/webapp_dist/index.html.gz index f7547917..0830730b 100644 Binary files a/webapp_dist/index.html.gz and b/webapp_dist/index.html.gz differ diff --git a/webapp_dist/js/app.js.gz b/webapp_dist/js/app.js.gz index 6115656f..758fbb4c 100644 Binary files a/webapp_dist/js/app.js.gz and b/webapp_dist/js/app.js.gz differ diff --git a/webapp_dist/zones.json.gz b/webapp_dist/zones.json.gz index 45374b96..f1ea50bf 100644 Binary files a/webapp_dist/zones.json.gz and b/webapp_dist/zones.json.gz differ