[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.
|
||||
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.
|
||||
|
|
|
@ -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<EnergyPrice> 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() {
|
||||
|
|
Loading…
Reference in New Issue