[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 <jacob-github@vindvejr.dk>
This commit is contained in:
parent
fe2d521209
commit
9872ca7789
|
@ -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.
|
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.
|
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
|
#### Value-Added Tax
|
||||||
|
|
||||||
VAT is not included in any of the prices.
|
VAT is not included in any of the prices.
|
||||||
|
|
|
@ -33,6 +33,8 @@ import java.util.Set;
|
||||||
import java.util.concurrent.ScheduledFuture;
|
import java.util.concurrent.ScheduledFuture;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.measure.Unit;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.eclipse.jdt.annotation.Nullable;
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
import org.eclipse.jetty.client.HttpClient;
|
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.RetryPolicyFactory;
|
||||||
import org.openhab.binding.energidataservice.internal.retry.RetryStrategy;
|
import org.openhab.binding.energidataservice.internal.retry.RetryStrategy;
|
||||||
import org.openhab.core.i18n.TimeZoneProvider;
|
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.QuantityType;
|
||||||
import org.openhab.core.library.types.StringType;
|
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.Channel;
|
||||||
import org.openhab.core.thing.ChannelUID;
|
import org.openhab.core.thing.ChannelUID;
|
||||||
import org.openhab.core.thing.Thing;
|
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.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.State;
|
||||||
import org.openhab.core.types.TimeSeries;
|
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;
|
||||||
|
@ -321,19 +325,36 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BigDecimal spotPrice = cacheManager.getSpotPrice();
|
BigDecimal spotPrice = cacheManager.getSpotPrice();
|
||||||
updateState(CHANNEL_SPOT_PRICE,
|
updatePriceState(CHANNEL_SPOT_PRICE, spotPrice, config.getCurrency());
|
||||||
spotPrice != null ? getEnergyPrice(spotPrice, config.getCurrency()) : UnDefType.UNDEF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateCurrentTariff(String channelId, @Nullable BigDecimal tariff) {
|
private void updateCurrentTariff(String channelId, @Nullable BigDecimal tariff) {
|
||||||
if (!isLinked(channelId)) {
|
if (!isLinked(channelId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
updateState(channelId, tariff != null ? getEnergyPrice(tariff, CURRENCY_DKK) : UnDefType.UNDEF);
|
updatePriceState(channelId, tariff, CURRENCY_DKK);
|
||||||
}
|
}
|
||||||
|
|
||||||
private QuantityType<EnergyPrice> getEnergyPrice(BigDecimal price, Currency currency) {
|
private void updatePriceState(String channelID, @Nullable BigDecimal price, Currency currency) {
|
||||||
return new QuantityType<>(price + " " + currency.getSymbol() + "/kWh");
|
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() {
|
private void updateHourlyPrices() {
|
||||||
|
|
Loading…
Reference in New Issue