]> git.basschouten.com Git - openhab-addons.git/commitdiff
[energidataservice] Provide work-around for currency issues (#16085)
authorJacob Laursen <jacob-github@vindvejr.dk>
Wed, 20 Dec 2023 10:21:08 +0000 (11:21 +0100)
committerGitHub <noreply@github.com>
Wed, 20 Dec 2023 10:21:08 +0000 (11:21 +0100)
* Provide work-around for currency issues
* Verify unit before trying to instantiate QuantityType

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
bundles/org.openhab.binding.energidataservice/README.md
bundles/org.openhab.binding.energidataservice/src/main/java/org/openhab/binding/energidataservice/internal/handler/EnergiDataServiceHandler.java

index a203dbabd1f1975baa701c4bcf83077d29db04db..f08aafc6565c085e3baf59a10956c2bbb3fe11e1 100644 (file)
@@ -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.
index 5f6ed20d78dbec7be5f3e681ecf8250e3aab8296..11b69e95320902370e7b169ac562aaedf1c43acc 100644 (file)
@@ -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 void updatePriceState(String channelID, @Nullable BigDecimal price, Currency currency) {
+        updateState(channelID, price != null ? getEnergyPrice(price, currency) : UnDefType.UNDEF);
     }
 
-    private QuantityType<EnergyPrice> getEnergyPrice(BigDecimal price, Currency currency) {
-        return new QuantityType<>(price + " " + currency.getSymbol() + "/kWh");
+    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() {