From 9872ca7789f488eea41cb16083eaf68f1f03eabf Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Wed, 20 Dec 2023 11:21:08 +0100 Subject: [PATCH] [energidataservice] Provide work-around for currency issues (#16085) * Provide work-around for currency issues * Verify unit before trying to instantiate QuantityType Signed-off-by: Jacob Laursen --- .../README.md | 7 ++++ .../handler/EnergiDataServiceHandler.java | 33 +++++++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/bundles/org.openhab.binding.energidataservice/README.md b/bundles/org.openhab.binding.energidataservice/README.md index a203dbabd..f08aafc65 100644 --- a/bundles/org.openhab.binding.energidataservice/README.md +++ b/bundles/org.openhab.binding.energidataservice/README.md @@ -68,6 +68,13 @@ 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. +#### Currencies + +There are some existing limitations related to currency support. +While the binding attempts to update channels in the correct currency, such attempts may face rejection. +In such cases, the binding will resort to omitting the currency unit. +While this ensures correct prices, it's important to note that the currency information may be incorrect in these instances. + #### Value-Added Tax VAT is not included in any of the prices. 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 5f6ed20d7..11b69e953 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 @@ -33,6 +33,8 @@ import java.util.Set; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import javax.measure.Unit; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jetty.client.HttpClient; @@ -56,9 +58,10 @@ import org.openhab.binding.energidataservice.internal.exception.DataServiceExcep import org.openhab.binding.energidataservice.internal.retry.RetryPolicyFactory; import org.openhab.binding.energidataservice.internal.retry.RetryStrategy; import org.openhab.core.i18n.TimeZoneProvider; -import org.openhab.core.library.dimension.EnergyPrice; +import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.types.StringType; +import org.openhab.core.library.unit.CurrencyUnits; import org.openhab.core.thing.Channel; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; @@ -68,6 +71,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.State; import org.openhab.core.types.TimeSeries; import org.openhab.core.types.UnDefType; import org.slf4j.Logger; @@ -321,19 +325,36 @@ public class EnergiDataServiceHandler extends BaseThingHandler { return; } BigDecimal spotPrice = cacheManager.getSpotPrice(); - updateState(CHANNEL_SPOT_PRICE, - spotPrice != null ? getEnergyPrice(spotPrice, config.getCurrency()) : UnDefType.UNDEF); + updatePriceState(CHANNEL_SPOT_PRICE, spotPrice, config.getCurrency()); } private void updateCurrentTariff(String channelId, @Nullable BigDecimal tariff) { if (!isLinked(channelId)) { return; } - updateState(channelId, tariff != null ? getEnergyPrice(tariff, CURRENCY_DKK) : UnDefType.UNDEF); + updatePriceState(channelId, tariff, CURRENCY_DKK); } - private QuantityType getEnergyPrice(BigDecimal price, Currency currency) { - return new QuantityType<>(price + " " + currency.getSymbol() + "/kWh"); + private void updatePriceState(String channelID, @Nullable BigDecimal price, Currency currency) { + updateState(channelID, price != null ? getEnergyPrice(price, currency) : UnDefType.UNDEF); + } + + private State getEnergyPrice(BigDecimal price, Currency currency) { + Unit unit = CurrencyUnits.getInstance().getUnit(currency.getCurrencyCode()); + if (unit == null) { + logger.trace("Currency {} is unknown, falling back to DecimalType", currency.getCurrencyCode()); + return new DecimalType(price); + } + try { + String currencyUnit = unit.getSymbol(); + if (currencyUnit == null) { + currencyUnit = unit.getName(); + } + return new QuantityType<>(price + " " + currencyUnit + "/kWh"); + } catch (IllegalArgumentException e) { + logger.debug("Unable to create QuantityType, falling back to DecimalType", e); + return new DecimalType(price); + } } private void updateHourlyPrices() {