Persist future prices (#15864)
Resolves #15863 Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
This commit is contained in:
parent
49b952b9a3
commit
50e1687472
|
@ -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.
|
||||
|
|
|
@ -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<DatahubTariff, TimeSeries> datahubTimeSeriesMap = new HashMap<>();
|
||||
for (DatahubTariff datahubTariff : DatahubTariff.values()) {
|
||||
datahubTimeSeriesMap.put(datahubTariff, new TimeSeries(REPLACE));
|
||||
}
|
||||
|
||||
Map<Instant, BigDecimal> spotPriceMap = cacheManager.getSpotPrices();
|
||||
List<Entry<Instant, BigDecimal>> spotPrices = spotPriceMap.entrySet().stream()
|
||||
.sorted(Map.Entry.comparingByKey()).toList();
|
||||
for (Entry<Instant, BigDecimal> spotPrice : spotPrices) {
|
||||
Instant hourStart = spotPrice.getKey();
|
||||
if (isLinked(CHANNEL_SPOT_PRICE)) {
|
||||
spotPriceTimeSeries.add(hourStart, new DecimalType(spotPrice.getValue()));
|
||||
}
|
||||
for (Map.Entry<DatahubTariff, TimeSeries> 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<DatahubTariff, TimeSeries> 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.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue