From 50e16874721eea2586f5cd61256e32945d9e0f65 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 11 Nov 2023 13:39:05 +0100 Subject: [PATCH] Persist future prices (#15864) Resolves #15863 Signed-off-by: Jacob Laursen --- .../README.md | 7 +++ .../handler/EnergiDataServiceHandler.java | 48 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/bundles/org.openhab.binding.energidataservice/README.md b/bundles/org.openhab.binding.energidataservice/README.md index 7f43adf2cf..8b717e19d9 100644 --- a/bundles/org.openhab.binding.energidataservice/README.md +++ b/bundles/org.openhab.binding.energidataservice/README.md @@ -75,6 +75,13 @@ To include VAT for items linked to the `Number` channels, the [VAT profile](http This must be installed separately. Once installed, simply select "Value-Added Tax" as Profile when linking an item. +#### Persisting Time Series + +The binding offers support for persisting both historical and upcoming prices. +The recommended persistence strategy is `forecast`, as it ensures a clean history without redundancy. +Prices from the past 24 hours and all forthcoming prices will be stored. +Any changes that impact published prices (e.g. selecting or deselecting VAT Profile) will result in the replacement of persisted prices within this period. + #### Net Tariff Discounts are automatically taken into account for channel `net-tariff` so that it represents the actual price. diff --git a/bundles/org.openhab.binding.energidataservice/src/main/java/org/openhab/binding/energidataservice/internal/handler/EnergiDataServiceHandler.java b/bundles/org.openhab.binding.energidataservice/src/main/java/org/openhab/binding/energidataservice/internal/handler/EnergiDataServiceHandler.java index 3241685f3d..2a71212972 100644 --- a/bundles/org.openhab.binding.energidataservice/src/main/java/org/openhab/binding/energidataservice/internal/handler/EnergiDataServiceHandler.java +++ b/bundles/org.openhab.binding.energidataservice/src/main/java/org/openhab/binding/energidataservice/internal/handler/EnergiDataServiceHandler.java @@ -13,6 +13,7 @@ package org.openhab.binding.energidataservice.internal.handler; import static org.openhab.binding.energidataservice.internal.EnergiDataServiceBindingConstants.*; +import static org.openhab.core.types.TimeSeries.Policy.REPLACE; import java.math.BigDecimal; import java.time.Duration; @@ -24,6 +25,7 @@ import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Collection; import java.util.Currency; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -65,6 +67,7 @@ import org.openhab.core.thing.binding.BaseThingHandler; import org.openhab.core.thing.binding.ThingHandlerService; import org.openhab.core.types.Command; import org.openhab.core.types.RefreshType; +import org.openhab.core.types.TimeSeries; import org.openhab.core.types.UnDefType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -180,6 +183,7 @@ public class EnergiDataServiceHandler extends BaseThingHandler { updateStatus(ThingStatus.ONLINE); updatePrices(); + updateTimeSeries(); if (isLinked(CHANNEL_SPOT_PRICE) || isLinked(CHANNEL_HOURLY_PRICES)) { if (cacheManager.getNumberOfFutureSpotPrices() < 13) { @@ -348,6 +352,50 @@ public class EnergiDataServiceHandler extends BaseThingHandler { updateState(CHANNEL_HOURLY_PRICES, new StringType(gson.toJson(targetPrices))); } + private void updateTimeSeries() { + TimeSeries spotPriceTimeSeries = new TimeSeries(REPLACE); + Map datahubTimeSeriesMap = new HashMap<>(); + for (DatahubTariff datahubTariff : DatahubTariff.values()) { + datahubTimeSeriesMap.put(datahubTariff, new TimeSeries(REPLACE)); + } + + Map spotPriceMap = cacheManager.getSpotPrices(); + List> spotPrices = spotPriceMap.entrySet().stream() + .sorted(Map.Entry.comparingByKey()).toList(); + for (Entry spotPrice : spotPrices) { + Instant hourStart = spotPrice.getKey(); + if (isLinked(CHANNEL_SPOT_PRICE)) { + spotPriceTimeSeries.add(hourStart, new DecimalType(spotPrice.getValue())); + } + for (Map.Entry entry : datahubTimeSeriesMap.entrySet()) { + DatahubTariff datahubTariff = entry.getKey(); + String channelId = datahubTariff.getChannelId(); + if (!isLinked(channelId)) { + continue; + } + BigDecimal tariff = cacheManager.getTariff(datahubTariff, hourStart); + if (tariff != null) { + TimeSeries timeSeries = entry.getValue(); + timeSeries.add(hourStart, new DecimalType(tariff)); + } + } + } + if (spotPriceTimeSeries.size() > 0) { + sendTimeSeries(CHANNEL_SPOT_PRICE, spotPriceTimeSeries); + } + for (Map.Entry entry : datahubTimeSeriesMap.entrySet()) { + DatahubTariff datahubTariff = entry.getKey(); + String channelId = datahubTariff.getChannelId(); + if (!isLinked(channelId)) { + continue; + } + TimeSeries timeSeries = entry.getValue(); + if (timeSeries.size() > 0) { + sendTimeSeries(channelId, timeSeries); + } + } + } + /** * Get the configured {@link Currency} for spot prices. * -- 2.47.3