mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-10 15:11:59 +01:00
Adjust retry policy for extended spot price unavailability (#16653)
Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
This commit is contained in:
parent
815ada9afc
commit
f4fada5036
@ -122,14 +122,10 @@ public class ApiController {
|
||||
try {
|
||||
String responseContent = sendRequest(request, properties);
|
||||
ElspotpriceRecords records = gson.fromJson(responseContent, ElspotpriceRecords.class);
|
||||
if (records == null) {
|
||||
if (records == null || Objects.isNull(records.records())) {
|
||||
throw new DataServiceException("Error parsing response");
|
||||
}
|
||||
|
||||
if (records.total() == 0 || Objects.isNull(records.records()) || records.records().length == 0) {
|
||||
throw new DataServiceException("No records");
|
||||
}
|
||||
|
||||
return Arrays.stream(records.records()).filter(Objects::nonNull).toArray(ElspotpriceRecord[]::new);
|
||||
} catch (JsonSyntaxException e) {
|
||||
throw new DataServiceException("Error parsing response", e);
|
||||
|
@ -250,12 +250,15 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
|
||||
updateTimeSeries();
|
||||
|
||||
if (isLinked(CHANNEL_SPOT_PRICE)) {
|
||||
if (cacheManager.getNumberOfFutureSpotPrices() < 13) {
|
||||
logger.warn("Spot prices are not yet available, retry scheduled (see details in Thing properties)");
|
||||
retryPolicy = RetryPolicyFactory.whenExpectedSpotPriceDataMissing(DAILY_REFRESH_TIME_CET,
|
||||
NORD_POOL_TIMEZONE);
|
||||
} else {
|
||||
long numberOfFutureSpotPrices = cacheManager.getNumberOfFutureSpotPrices();
|
||||
LocalTime now = LocalTime.now(NORD_POOL_TIMEZONE);
|
||||
|
||||
if (numberOfFutureSpotPrices >= 13 || (numberOfFutureSpotPrices == 12
|
||||
&& now.isAfter(DAILY_REFRESH_TIME_CET.minusHours(1)) && now.isBefore(DAILY_REFRESH_TIME_CET))) {
|
||||
retryPolicy = RetryPolicyFactory.atFixedTime(DAILY_REFRESH_TIME_CET, NORD_POOL_TIMEZONE);
|
||||
} else {
|
||||
logger.warn("Spot prices are not available, retry scheduled (see details in Thing properties)");
|
||||
retryPolicy = RetryPolicyFactory.whenExpectedSpotPriceDataMissing();
|
||||
}
|
||||
} else {
|
||||
retryPolicy = RetryPolicyFactory.atFixedTime(LocalTime.MIDNIGHT, timeZoneProvider.getTimeZone());
|
||||
@ -293,10 +296,13 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
|
||||
Duration.ofHours(-CacheManager.NUMBER_OF_HISTORIC_HOURS));
|
||||
}
|
||||
Map<String, String> properties = editProperties();
|
||||
ElspotpriceRecord[] spotPriceRecords = apiController.getSpotPrices(config.priceArea, config.getCurrency(),
|
||||
start, properties);
|
||||
cacheManager.putSpotPrices(spotPriceRecords, config.getCurrency());
|
||||
updateProperties(properties);
|
||||
try {
|
||||
ElspotpriceRecord[] spotPriceRecords = apiController.getSpotPrices(config.priceArea, config.getCurrency(),
|
||||
start, properties);
|
||||
cacheManager.putSpotPrices(spotPriceRecords, config.getCurrency());
|
||||
} finally {
|
||||
updateProperties(properties);
|
||||
}
|
||||
}
|
||||
|
||||
private void downloadTariffs(DatahubTariff datahubTariff) throws InterruptedException, DataServiceException {
|
||||
@ -325,11 +331,11 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
|
||||
private Collection<DatahubPricelistRecord> downloadPriceLists(GlobalLocationNumber globalLocationNumber,
|
||||
DatahubTariffFilter filter) throws InterruptedException, DataServiceException {
|
||||
Map<String, String> properties = editProperties();
|
||||
Collection<DatahubPricelistRecord> records = apiController.getDatahubPriceLists(globalLocationNumber,
|
||||
ChargeType.Tariff, filter, properties);
|
||||
updateProperties(properties);
|
||||
|
||||
return records;
|
||||
try {
|
||||
return apiController.getDatahubPriceLists(globalLocationNumber, ChargeType.Tariff, filter, properties);
|
||||
} finally {
|
||||
updateProperties(properties);
|
||||
}
|
||||
}
|
||||
|
||||
private DatahubTariffFilter getGridTariffFilter() {
|
||||
|
@ -76,15 +76,10 @@ public class RetryPolicyFactory {
|
||||
/**
|
||||
* Determine {@link RetryStrategy} when expected spot price data is missing.
|
||||
*
|
||||
* @param localTime the time of daily data request
|
||||
* @param zoneId time-zone
|
||||
* @return retry strategy
|
||||
*/
|
||||
public static RetryStrategy whenExpectedSpotPriceDataMissing(LocalTime localTime, ZoneId zoneId) {
|
||||
LocalTime now = LocalTime.now(zoneId);
|
||||
if (now.isAfter(localTime)) {
|
||||
return new ExponentialBackoff().withMinimum(Duration.ofMinutes(10)).withJitter(0.2);
|
||||
}
|
||||
return atFixedTime(localTime, zoneId);
|
||||
public static RetryStrategy whenExpectedSpotPriceDataMissing() {
|
||||
return new ExponentialBackoff().withMinimum(Duration.ofMinutes(10)).withMaximum(Duration.ofHours(1))
|
||||
.withJitter(0.2);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user