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.
|
This must be installed separately.
|
||||||
Once installed, simply select "Value-Added Tax" as Profile when linking an item.
|
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
|
#### Net Tariff
|
||||||
|
|
||||||
Discounts are automatically taken into account for channel `net-tariff` so that it represents the actual price.
|
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;
|
package org.openhab.binding.energidataservice.internal.handler;
|
||||||
|
|
||||||
import static org.openhab.binding.energidataservice.internal.EnergiDataServiceBindingConstants.*;
|
import static org.openhab.binding.energidataservice.internal.EnergiDataServiceBindingConstants.*;
|
||||||
|
import static org.openhab.core.types.TimeSeries.Policy.REPLACE;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
@ -24,6 +25,7 @@ import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Currency;
|
import java.util.Currency;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
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.thing.binding.ThingHandlerService;
|
||||||
import org.openhab.core.types.Command;
|
import org.openhab.core.types.Command;
|
||||||
import org.openhab.core.types.RefreshType;
|
import org.openhab.core.types.RefreshType;
|
||||||
|
import org.openhab.core.types.TimeSeries;
|
||||||
import org.openhab.core.types.UnDefType;
|
import org.openhab.core.types.UnDefType;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -180,6 +183,7 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
|
||||||
|
|
||||||
updateStatus(ThingStatus.ONLINE);
|
updateStatus(ThingStatus.ONLINE);
|
||||||
updatePrices();
|
updatePrices();
|
||||||
|
updateTimeSeries();
|
||||||
|
|
||||||
if (isLinked(CHANNEL_SPOT_PRICE) || isLinked(CHANNEL_HOURLY_PRICES)) {
|
if (isLinked(CHANNEL_SPOT_PRICE) || isLinked(CHANNEL_HOURLY_PRICES)) {
|
||||||
if (cacheManager.getNumberOfFutureSpotPrices() < 13) {
|
if (cacheManager.getNumberOfFutureSpotPrices() < 13) {
|
||||||
|
@ -348,6 +352,50 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
|
||||||
updateState(CHANNEL_HOURLY_PRICES, new StringType(gson.toJson(targetPrices)));
|
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.
|
* Get the configured {@link Currency} for spot prices.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue