Skip to content

Commit aadcbaf

Browse files
[Edge] App.Prediction.Default: add new app "Default Prediction"
- Problem: Existing predictor persistence models, which are used for fallback, are not added to the PredictorManager - Solution: - The PersistenceModel is now packed into the app "Default Prediction", which is installed automatically - It is also added with the lowest priority to the PredictorManager during installation Reviewed-by: Michael Grill <[email protected]> Reviewed-by: Stefan Feilmeier <[email protected]> Co-authored-by: Leonhard Anderle <[email protected]> Co-committed-by: Leonhard Anderle <[email protected]>
1 parent c452b30 commit aadcbaf

File tree

21 files changed

+249
-107
lines changed

21 files changed

+249
-107
lines changed

io.openems.common/src/io/openems/common/oem/DummyOpenemsEdgeOem.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ public SystemUpdateParams getSystemUpdateParams() {
186186
.put("App.Ess.PowerPlantController", "") //
187187
.put("App.Ess.PrepareBatteryExtension", "") //
188188
.put("App.Ess.Limiter14a", "") //
189+
.put("App.Prediction.Default", "") //
189190
.put("App.Prediction.UnmanagedConsumption", "") //
190191
.build();
191192

io.openems.edge.core/bnd.bnd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Bundle-Version: 1.0.0.${tstamp}
1919
io.openems.edge.io.api,\
2020
io.openems.edge.meter.api,\
2121
io.openems.edge.predictor.api,\
22+
io.openems.edge.predictor.persistencemodel,\
2223
io.openems.edge.scheduler.api,\
2324
io.openems.edge.timedata.api,\
2425
io.openems.edge.timeofusetariff.api,\

io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome10.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.batteryInverter;
66
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.essLimiter14aToHardware;
77
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.gridOptimizedCharge;
8-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.persistencePredictorTask;
8+
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionDefault;
99
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionUnmanagedConsumption;
10-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictor;
1110
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.prepareBatteryExtension;
1211
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization;
1312
import static io.openems.edge.app.integratedsystem.IntegratedSystemProps.acMeterType;
@@ -364,7 +363,6 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
364363
.addProperty("batteryInverter.id", "batteryInverter0") //
365364
.addProperty("battery.id", "battery0") //
366365
.build()),
367-
predictor(bundle, t), //
368366
new EdgeConfig.Component("ctrlEssSurplusFeedToGrid0",
369367
TranslationUtil.getTranslation(bundle,
370368
this.getAppId() + ".ctrlEssSurplusFeedToGrid0.alias"),
@@ -428,6 +426,7 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
428426
gridOptimizedCharge(t), //
429427
selfConsumptionOptimization(t, essId, "meter0"), //
430428
prepareBatteryExtension(), //
429+
predictionDefault(), //
431430
predictionUnmanagedConsumption()//
432431
);
433432

@@ -451,7 +450,6 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
451450
return AppConfiguration.create() //
452451
.addTask(Tasks.component(components)) //
453452
.addTask(Tasks.schedulerByCentralOrder(schedulerComponents)) //
454-
.addTask(persistencePredictorTask()) //
455453
.addDependencies(dependencies) //
456454
.build();
457455
};

io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome10Gen2.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.gridOptimizedCharge;
1111
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.isStateLedCompatible;
1212
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusForExternalMeters;
13-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.persistencePredictorTask;
13+
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionDefault;
1414
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionUnmanagedConsumption;
15-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictor;
1615
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.prepareBatteryExtension;
1716
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization;
1817
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.stateLed;
@@ -189,7 +188,7 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
189188
modbusForExternalMeters(bundle, t, modbusIdExternalMeters, deviceHardware), //
190189
// ess
191190
FeneconHomeComponents.ess(bundle, essId, "battery0", "batteryInverter0"),
192-
FeneconHomeComponents.ctrlEssSurplusFeedToGrid(bundle, essId), predictor(bundle, t), //
191+
FeneconHomeComponents.ctrlEssSurplusFeedToGrid(bundle, essId), //
193192
// battery
194193
FeneconHomeComponents.battery(bundle, "battery0", modbusIdInternal),
195194
batteryInverter(bundle, "batteryInverter0", hasEmergencyReserve, feedInType, modbusIdExternal,
@@ -221,6 +220,7 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
221220
gridOptimizedCharge(t), //
222221
selfConsumptionOptimization(t, essId, "meter0"), //
223222
prepareBatteryExtension(), //
223+
predictionDefault(), //
224224
predictionUnmanagedConsumption()//
225225
);
226226

@@ -251,7 +251,6 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
251251
return AppConfiguration.create() //
252252
.addTask(Tasks.component(components)) //
253253
.addTask(Tasks.schedulerByCentralOrder(schedulerComponents)) //
254-
.addTask(persistencePredictorTask()) //
255254
.addDependencies(dependencies) //
256255
.build();
257256
};

io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome15.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.gridOptimizedCharge;
1111
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.isStateLedCompatible;
1212
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusForExternalMeters;
13-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.persistencePredictorTask;
13+
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionDefault;
1414
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionUnmanagedConsumption;
15-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictor;
1615
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.prepareBatteryExtension;
1716
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization;
1817
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.stateLed;
@@ -190,7 +189,7 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
190189
modbusForExternalMeters(bundle, t, modbusIdExternalMeters, deviceHardware), //
191190
// ess
192191
FeneconHomeComponents.ess(bundle, essId, "battery0", "batteryInverter0"),
193-
FeneconHomeComponents.ctrlEssSurplusFeedToGrid(bundle, essId), predictor(bundle, t), //
192+
FeneconHomeComponents.ctrlEssSurplusFeedToGrid(bundle, essId), //
194193
// battery
195194
FeneconHomeComponents.battery(bundle, "battery0", modbusIdInternal),
196195
batteryInverter(bundle, "batteryInverter0", hasEmergencyReserve, feedInType, modbusIdExternal,
@@ -222,6 +221,7 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
222221
gridOptimizedCharge(t), //
223222
selfConsumptionOptimization(t, essId, "meter0"), //
224223
prepareBatteryExtension(), //
224+
predictionDefault(), //
225225
predictionUnmanagedConsumption()//
226226
);
227227

@@ -251,7 +251,6 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
251251
return AppConfiguration.create() //
252252
.addTask(Tasks.component(components)) //
253253
.addTask(Tasks.schedulerByCentralOrder(schedulerComponents)) //
254-
.addTask(persistencePredictorTask()) //
255254
.addDependencies(dependencies) //
256255
.build();
257256
};

io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome20.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@
2121
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusExternal;
2222
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusForExternalMeters;
2323
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusInternal;
24-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.persistencePredictorTask;
2524
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.power;
25+
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionDefault;
2626
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionUnmanagedConsumption;
27-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictor;
2827
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.prepareBatteryExtension;
2928
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization;
3029
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.stateLed;
@@ -334,7 +333,6 @@ protected ThrowingTriFunction<ConfigurationTarget, Map<PropertyParent, JsonEleme
334333
modbusInternal(bundle, t, modbusIdInternal), //
335334
modbusExternal(bundle, t, modbusIdExternal), //
336335
modbusForExternalMeters(bundle, t, modbusIdExternalMeters, deviceHardware), //
337-
predictor(bundle, t), //
338336
ctrlEssSurplusFeedToGrid(bundle, essId), //
339337
power() //
340338
);
@@ -369,6 +367,7 @@ protected ThrowingTriFunction<ConfigurationTarget, Map<PropertyParent, JsonEleme
369367
gridOptimizedCharge(t), //
370368
selfConsumptionOptimization(t, essId, gridMeterId), //
371369
prepareBatteryExtension(), //
370+
predictionDefault(), //
372371
predictionUnmanagedConsumption()//
373372
);
374373

@@ -402,7 +401,6 @@ protected ThrowingTriFunction<ConfigurationTarget, Map<PropertyParent, JsonEleme
402401
return AppConfiguration.create() //
403402
.addTask(Tasks.component(components)) //
404403
.addTask(Tasks.schedulerByCentralOrder(schedulerComponents)) //
405-
.addTask(persistencePredictorTask()) //
406404
.addDependencies(dependencies) //
407405
.build();
408406
};

io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome30.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@
2121
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusExternal;
2222
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusForExternalMeters;
2323
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusInternal;
24-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.persistencePredictorTask;
2524
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.power;
25+
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionDefault;
2626
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionUnmanagedConsumption;
27-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictor;
2827
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.prepareBatteryExtension;
2928
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization;
3029
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.stateLed;
@@ -336,7 +335,6 @@ protected ThrowingTriFunction<ConfigurationTarget, Map<PropertyParent, JsonEleme
336335
modbusInternal(bundle, t, modbusIdInternal), //
337336
modbusExternal(bundle, t, modbusIdExternal), //
338337
modbusForExternalMeters(bundle, t, modbusIdExternalMeters, deviceHardware), //
339-
predictor(bundle, t), //
340338
ctrlEssSurplusFeedToGrid(bundle, essId), //
341339
power() //
342340
);
@@ -371,6 +369,7 @@ protected ThrowingTriFunction<ConfigurationTarget, Map<PropertyParent, JsonEleme
371369
gridOptimizedCharge(t), //
372370
selfConsumptionOptimization(t, essId, gridMeterId), //
373371
prepareBatteryExtension(), //
372+
predictionDefault(), //
374373
predictionUnmanagedConsumption()//
375374
);
376375

@@ -404,7 +403,6 @@ protected ThrowingTriFunction<ConfigurationTarget, Map<PropertyParent, JsonEleme
404403
return AppConfiguration.create() //
405404
.addTask(Tasks.component(components)) //
406405
.addTask(Tasks.schedulerByCentralOrder(schedulerComponents)) //
407-
.addTask(persistencePredictorTask()) //
408406
.addDependencies(dependencies) //
409407
.build();
410408
};

io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome6.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.gridOptimizedCharge;
1111
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.isStateLedCompatible;
1212
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusForExternalMeters;
13-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.persistencePredictorTask;
13+
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionDefault;
1414
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionUnmanagedConsumption;
15-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictor;
1615
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.prepareBatteryExtension;
1716
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization;
1817
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.stateLed;
@@ -186,7 +185,7 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
186185
modbusForExternalMeters(bundle, t, modbusIdExternalMeters, deviceHardware), //
187186
// ess
188187
FeneconHomeComponents.ess(bundle, essId, "battery0", "batteryInverter0"),
189-
FeneconHomeComponents.ctrlEssSurplusFeedToGrid(bundle, essId), predictor(bundle, t), //
188+
FeneconHomeComponents.ctrlEssSurplusFeedToGrid(bundle, essId), //
190189
// battery
191190
FeneconHomeComponents.battery(bundle, "battery0", modbusIdInternal),
192191
batteryInverter(bundle, "batteryInverter0", hasEmergencyReserve, feedInType, modbusIdExternal,
@@ -219,6 +218,7 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
219218
gridOptimizedCharge(t), //
220219
selfConsumptionOptimization(t, essId, "meter0"), //
221220
prepareBatteryExtension(), //
221+
predictionDefault(), //
222222
predictionUnmanagedConsumption()//
223223
);
224224

@@ -248,7 +248,6 @@ AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() {
248248
return AppConfiguration.create() //
249249
.addTask(Tasks.component(components)) //
250250
.addTask(Tasks.schedulerByCentralOrder(schedulerComponents)) //
251-
.addTask(persistencePredictorTask()) //
252251
.addDependencies(dependencies) //
253252
.build();
254253
};

io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHomeComponents.java

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -355,41 +355,6 @@ public static EdgeConfig.Component modbusForExternalMeters(//
355355
}).build());
356356
}
357357

358-
/**
359-
* Creates a default predictor component for a FENECON Home.
360-
*
361-
* @param bundle the translation bundle
362-
* @param t the current {@link ConfigurationTarget}
363-
* @return the {@link Component}
364-
*/
365-
public static EdgeConfig.Component predictor(//
366-
final ResourceBundle bundle, //
367-
final ConfigurationTarget t //
368-
) {
369-
return new EdgeConfig.Component("predictor0",
370-
TranslationUtil.getTranslation(bundle, "App.IntegratedSystem.predictor0.alias"),
371-
"Predictor.PersistenceModel", //
372-
JsonUtils.buildJsonObject() //
373-
.addProperty("enabled", true) //
374-
.onlyIf(t == ConfigurationTarget.ADD, b -> b//
375-
.add("channelAddresses", JsonUtils.buildJsonArray() //
376-
.add("_sum/ProductionActivePower") //
377-
.add("_sum/ConsumptionActivePower") //
378-
.build())) //
379-
.build());
380-
}
381-
382-
/**
383-
* Creates a default predictor task for a PersistenceModel Predictor.
384-
*
385-
* @return the {@link Task}
386-
*/
387-
public static Task<PredictorManagerByCentralOrderConfiguration> persistencePredictorTask() {
388-
return Tasks.predictorManagerByCentralOrder(//
389-
new PredictorManagerByCentralOrderConfiguration.PredictorManagerComponent("predictor0",
390-
"Predictor.PersistenceModel"));
391-
}
392-
393358
/**
394359
* Creates a default ctrlEssSurplusFeedToGrid component for a FENECON Home.
395360
*
@@ -827,6 +792,23 @@ private static final boolean isHardwareRelayInstalled(OpenemsAppInstance hardwar
827792
};
828793
}
829794

795+
/**
796+
* Creates a default predictionDefault dependency for a FENECON Home.
797+
*
798+
* @return the {@link DependencyDeclaration}
799+
*/
800+
public static DependencyDeclaration predictionDefault() {
801+
return new DependencyDeclaration("PREDICTION_DEFAULT", //
802+
DependencyDeclaration.CreatePolicy.IF_NOT_EXISTING, //
803+
DependencyDeclaration.UpdatePolicy.ALWAYS, //
804+
DependencyDeclaration.DeletePolicy.IF_MINE, //
805+
DependencyDeclaration.DependencyUpdatePolicy.ALLOW_ONLY_UNCONFIGURED_PROPERTIES, //
806+
DependencyDeclaration.DependencyDeletePolicy.NOT_ALLOWED, //
807+
DependencyDeclaration.AppDependencyConfig.create()//
808+
.setAppId("App.Prediction.Default")//
809+
.build());
810+
}
811+
830812
/**
831813
* Creates a default predictionUnmanagedConsumption dependency for a FENECON
832814
* Home.

io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/commercial/FeneconCommercial100.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@
1919
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusExternal;
2020
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusForExternalMeters;
2121
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.modbusInternal;
22-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.persistencePredictorTask;
2322
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.power;
23+
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionDefault;
2424
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictionUnmanagedConsumption;
25-
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.predictor;
2625
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.prepareBatteryExtension;
2726
import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization;
2827
import static io.openems.edge.app.integratedsystem.IntegratedSystemProps.ctRatioFirst;
@@ -258,7 +257,6 @@ protected ThrowingTriFunction<ConfigurationTarget, Map<PropertyParent, JsonEleme
258257
modbusInternal(bundle, t, modbusIdInternal), //
259258
modbusExternal(bundle, t, modbusIdExternal), //
260259
modbusForExternalMeters(bundle, t, modbusIdExternalMeters, deviceHardware), //
261-
predictor(bundle, t), //
262260
ctrlEssSurplusFeedToGrid(bundle, essId), //
263261
power() //
264262
);
@@ -283,6 +281,7 @@ protected ThrowingTriFunction<ConfigurationTarget, Map<PropertyParent, JsonEleme
283281
gridOptimizedCharge(t), //
284282
selfConsumptionOptimization(t, essId, gridMeterId), //
285283
prepareBatteryExtension(), //
284+
predictionDefault(), //
286285
predictionUnmanagedConsumption()//
287286
);
288287

@@ -308,7 +307,6 @@ protected ThrowingTriFunction<ConfigurationTarget, Map<PropertyParent, JsonEleme
308307
return AppConfiguration.create() //
309308
.addTask(Tasks.component(components)) //
310309
.addTask(Tasks.schedulerByCentralOrder(schedulerComponents)) //
311-
.addTask(persistencePredictorTask()) //
312310
.addDependencies(dependencies) //
313311
.build();
314312
};

0 commit comments

Comments
 (0)