From 422b72eef52c761fcb078ecb0c091898062df652 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Thu, 20 Jun 2024 23:48:20 +0200 Subject: [PATCH] Provide JavaScript example for persisting total price (#16889) Signed-off-by: Jacob Laursen --- .../README.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/bundles/org.openhab.binding.energidataservice/README.md b/bundles/org.openhab.binding.energidataservice/README.md index b1a58a9eb71..005b897b555 100644 --- a/bundles/org.openhab.binding.energidataservice/README.md +++ b/bundles/org.openhab.binding.energidataservice/README.md @@ -58,6 +58,8 @@ It will not impact channels, see [Electricity Tax](#electricity-tax) for further | co2-emission-prognosis | Number:EmissionIntensity | Estimated prognosis for CO₂ emission following the day-ahead market in g/kWh | | co2-emission-realtime | Number:EmissionIntensity | Near up-to-date history for CO₂ emission from electricity consumed in Denmark in g/kWh | +#### Total Price + _Please note:_ There is no channel providing the total price. Instead, create a group item with `SUM` as aggregate function and add the individual price items as children. This has the following advantages: @@ -69,6 +71,41 @@ This has the following advantages: If you want electricity tax included in your total price, please add either `electricity-tax` or `reduced-electricity-tax` to the group - depending on which one applies. See [Electricity Tax](#electricity-tax) for further information. +##### Time Series + +Group items with aggregate functions are not automatically recalculated into the future when the time series for child items are updated. +Therefore, the `SUM` function mentioned above will only work for the current price. +Calculation of future total prices can be achieved with a rule (in this example file-based using Rule Builder): + +:::: tabs + +::: tab JavaScript + +```javascript +rules.when() + .channel('energidataservice:service:energidataservice:electricity#event').triggered('DAY_AHEAD_AVAILABLE') + .then(event => { + var timeSeries = new items.TimeSeries('REPLACE'); + var start = time.LocalDate.now().atStartOfDay().atZone(time.ZoneId.systemDefault()); + var spotPrices = items.SpotPrice.persistence.getAllStatesBetween(start, start.plusDays(2)); + for (var spotPrice of spotPrices) { + var totalPrice = spotPrice.quantityState + .add(items.GridTariff.persistence.persistedState(spotPrice.timestamp).quantityState) + .add(items.SystemTariff.persistence.persistedState(spotPrice.timestamp).quantityState) + .add(items.TransmissionGridTariff.persistence.persistedState(spotPrice.timestamp).quantityState) + .add(items.ElectricityTax.persistence.persistedState(spotPrice.timestamp).quantityState); + + timeSeries.add(spotPrice.timestamp, totalPrice); + } + items.TotalPrice.persistence.persist(timeSeries); + }) + .build("Calculate total price"); +``` + +::: + +:::: + #### Currencies There are some existing limitations related to currency support.