import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import javax.measure.Unit;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.items.GroupItem;
* @param defaultValue default value
* @return value
*/
- public QuantityType getConfigurationAsQuantity(String key, QuantityType defaultValue) {
+ public QuantityType<?> getConfigurationAsQuantity(String key, QuantityType defaultValue,
+ boolean relativeConversion) {
String stringValue = getConfiguration(key, new String());
if (stringValue.isEmpty()) {
return defaultValue;
}
var parsedValue = new QuantityType(stringValue);
- var convertedValue = parsedValue.toInvertibleUnit(defaultValue.getUnit());
- // not convertible? just assume it's in the expected unit
+ QuantityType<?> convertedValue;
+
+ if (relativeConversion) {
+ convertedValue = parsedValue.toUnitRelative(defaultValue.getUnit());
+ } else {
+ convertedValue = parsedValue.toInvertibleUnit(defaultValue.getUnit());
+ }
+ // not convertible? just assume it's in the item's unit
+ if (convertedValue == null) {
+ Unit unit;
+ if (getBaseItem() instanceof NumberItem && (unit = ((NumberItem) getBaseItem()).getUnit()) != null) {
+ var bdValue = new BigDecimal(stringValue);
+ parsedValue = new QuantityType(bdValue, unit);
+ if (relativeConversion) {
+ convertedValue = parsedValue.toUnitRelative(defaultValue.getUnit());
+ } else {
+ convertedValue = parsedValue.toInvertibleUnit(defaultValue.getUnit());
+ }
+ }
+ }
+ // still not convertible? just assume it's in the default's unit
if (convertedValue == null) {
return new QuantityType(parsedValue.toBigDecimal(), defaultValue.getUnit());
}
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
-import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiFunction;
import java.util.function.Consumer;
return convertAndRound(degrees, SIUnits.CELSIUS, useFahrenheit() ? ImperialUnits.FAHRENHEIT : SIUnits.CELSIUS);
}
+ public static double getTemperatureStep(HomekitTaggedItem taggedItem, double defaultValue) {
+ return taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.STEP,
+ new QuantityType(defaultValue, SIUnits.CELSIUS), true).doubleValue();
+ }
+
private static Supplier<CompletableFuture<Integer>> getAngleSupplier(HomekitTaggedItem taggedItem,
int defaultValue) {
return () -> CompletableFuture.completedFuture(getAngleFromItem(taggedItem, defaultValue));
private static ColorTemperatureCharacteristic createColorTemperatureCharacteristic(HomekitTaggedItem taggedItem,
HomekitAccessoryUpdater updater) {
- // Check if units are expressed in Kelvin, not mireds, and adjust
- // the min/max appropriately
- Unit unit = null;
- var numberItem = taggedItem.getBaseItem();
- if (numberItem instanceof NumberItem) {
- unit = ((NumberItem) numberItem).getUnit();
- }
- if (unit == null) {
- unit = Units.MIRED;
- }
- final Unit finalUnit = unit;
-
final boolean inverted = taggedItem.isInverted();
- if (!unit.equals(Units.KELVIN) && !unit.equals(Units.MIRED)) {
- logger.warn("Item {} must be in either K or mired. Given {}.", taggedItem.getName(), unit);
- return new ColorTemperatureCharacteristic(null, null, null, null);
- }
-
- var minValueQt = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE,
- Objects.requireNonNull(new QuantityType(ColorTemperatureCharacteristic.DEFAULT_MIN_VALUE, Units.MIRED)
- .toInvertibleUnit(unit)));
- var maxValueQt = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE,
- Objects.requireNonNull(new QuantityType(ColorTemperatureCharacteristic.DEFAULT_MAX_VALUE, Units.MIRED)
- .toInvertibleUnit(unit)));
-
- int minValue = minValueQt.toInvertibleUnit(Units.MIRED).intValue();
- int maxValue = maxValueQt.toInvertibleUnit(Units.MIRED).intValue();
+ int minValue = taggedItem
+ .getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE,
+ new QuantityType(ColorTemperatureCharacteristic.DEFAULT_MIN_VALUE, Units.MIRED), false)
+ .intValue();
+ int maxValue = taggedItem
+ .getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE,
+ new QuantityType(ColorTemperatureCharacteristic.DEFAULT_MAX_VALUE, Units.MIRED), false)
+ .intValue();
// It's common to swap these if you're providing in Kelvin instead of mired
if (minValue > maxValue) {
HomekitTaggedItem.MIN_VALUE, CoolingThresholdTemperatureCharacteristic.DEFAULT_MIN_VALUE));
double maxValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
HomekitTaggedItem.MAX_VALUE, CoolingThresholdTemperatureCharacteristic.DEFAULT_MAX_VALUE));
- return new CoolingThresholdTemperatureCharacteristic(minValue, maxValue,
- taggedItem.getConfigurationAsDouble(HomekitTaggedItem.STEP,
- CoolingThresholdTemperatureCharacteristic.DEFAULT_STEP),
+ double step = getTemperatureStep(taggedItem, CoolingThresholdTemperatureCharacteristic.DEFAULT_STEP);
+ return new CoolingThresholdTemperatureCharacteristic(minValue, maxValue, step,
getTemperatureSupplier(taggedItem, minValue), setTemperatureConsumer(taggedItem),
getSubscriber(taggedItem, COOLING_THRESHOLD_TEMPERATURE, updater),
getUnsubscriber(taggedItem, COOLING_THRESHOLD_TEMPERATURE, updater));
HomekitTaggedItem.MIN_VALUE, HeatingThresholdTemperatureCharacteristic.DEFAULT_MIN_VALUE));
double maxValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
HomekitTaggedItem.MAX_VALUE, HeatingThresholdTemperatureCharacteristic.DEFAULT_MAX_VALUE));
- return new HeatingThresholdTemperatureCharacteristic(minValue, maxValue,
- taggedItem.getConfigurationAsDouble(HomekitTaggedItem.STEP,
- HeatingThresholdTemperatureCharacteristic.DEFAULT_STEP),
+ double step = getTemperatureStep(taggedItem, HeatingThresholdTemperatureCharacteristic.DEFAULT_STEP);
+ return new HeatingThresholdTemperatureCharacteristic(minValue, maxValue, step,
getTemperatureSupplier(taggedItem, minValue), setTemperatureConsumer(taggedItem),
getSubscriber(taggedItem, HEATING_THRESHOLD_TEMPERATURE, updater),
getUnsubscriber(taggedItem, HEATING_THRESHOLD_TEMPERATURE, updater));