Skip to content

Commit 0b13f65

Browse files
authored
[homekit] fix unit conversions on step values for temperatures (openhab#18233)
getConfigurationAsQuantity was using toUnitRelative appropriately, but the final conversion to Celsius was not, resulting in a 1 °F step being interpreted as a -17.5 °C step! Signed-off-by: Cody Cutrer <[email protected]>
1 parent 1650591 commit 0b13f65

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitTaggedItem.java

+18-9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Map;
1919
import java.util.concurrent.ConcurrentHashMap;
2020

21+
import javax.measure.Quantity;
2122
import javax.measure.Unit;
2223

2324
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -450,36 +451,44 @@ public double getConfigurationAsDouble(String key, double defaultValue) {
450451
* @param defaultValue default value
451452
* @return value
452453
*/
453-
public QuantityType<?> getConfigurationAsQuantity(String key, QuantityType defaultValue,
454+
public <T extends Quantity<T>> QuantityType<T> getConfigurationAsQuantity(String key, QuantityType<T> defaultValue,
454455
boolean relativeConversion) {
455456
String stringValue = getConfiguration(key, new String());
456457
if (stringValue.isEmpty()) {
457458
return defaultValue;
458459
}
459-
var parsedValue = new QuantityType(stringValue);
460-
QuantityType<?> convertedValue;
460+
var parsedValue = new QuantityType<>(stringValue);
461+
QuantityType<T> convertedValue;
461462

462463
if (relativeConversion) {
463-
convertedValue = parsedValue.toUnitRelative(defaultValue.getUnit());
464+
if (parsedValue.getUnit().isCompatible(defaultValue.getUnit())) {
465+
convertedValue = ((QuantityType<T>) parsedValue).toUnitRelative(defaultValue.getUnit());
466+
} else {
467+
convertedValue = null;
468+
}
464469
} else {
465-
convertedValue = parsedValue.toInvertibleUnit(defaultValue.getUnit());
470+
convertedValue = (QuantityType<T>) parsedValue.toInvertibleUnit(defaultValue.getUnit());
466471
}
467472
// not convertible? just assume it's in the item's unit
468473
if (convertedValue == null) {
469474
Unit unit;
470475
if (getBaseItem() instanceof NumberItem numberItem && (unit = numberItem.getUnit()) != null) {
471476
var bdValue = new BigDecimal(stringValue);
472-
parsedValue = new QuantityType(bdValue, unit);
477+
parsedValue = new QuantityType<>(bdValue, unit);
473478
if (relativeConversion) {
474-
convertedValue = parsedValue.toUnitRelative(defaultValue.getUnit());
479+
if (parsedValue.getUnit().isCompatible(defaultValue.getUnit())) {
480+
convertedValue = ((QuantityType<T>) parsedValue).toUnitRelative(defaultValue.getUnit());
481+
} else {
482+
convertedValue = null;
483+
}
475484
} else {
476-
convertedValue = parsedValue.toInvertibleUnit(defaultValue.getUnit());
485+
convertedValue = (QuantityType<T>) parsedValue.toInvertibleUnit(defaultValue.getUnit());
477486
}
478487
}
479488
}
480489
// still not convertible? just assume it's in the default's unit
481490
if (convertedValue == null) {
482-
return new QuantityType(parsedValue.toBigDecimal(), defaultValue.getUnit());
491+
return new QuantityType<>(parsedValue.toBigDecimal(), defaultValue.getUnit());
483492
}
484493
return convertedValue;
485494
}

bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCharacteristicFactory.java

+4-9
Original file line numberDiff line numberDiff line change
@@ -610,11 +610,6 @@ public static double convertFromCelsius(double degrees) {
610610
return convertAndRound(degrees, SIUnits.CELSIUS, getSystemTemperatureUnit());
611611
}
612612

613-
public static double getTemperatureStep(HomekitTaggedItem taggedItem, double defaultValue) {
614-
return taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.STEP,
615-
new QuantityType(defaultValue, SIUnits.CELSIUS), true).doubleValue();
616-
}
617-
618613
private static Supplier<CompletableFuture<Integer>> getAngleSupplier(HomekitTaggedItem taggedItem,
619614
int defaultValue) {
620615
return () -> CompletableFuture.completedFuture(getAngleFromItem(taggedItem, defaultValue));
@@ -899,7 +894,7 @@ private static CoolingThresholdTemperatureCharacteristic createCoolingThresholdC
899894
Objects.requireNonNull(new QuantityType(CoolingThresholdTemperatureCharacteristic.DEFAULT_STEP,
900895
SIUnits.CELSIUS).toUnit(getSystemTemperatureUnit())),
901896
true)
902-
.toUnit(SIUnits.CELSIUS).doubleValue();
897+
.toUnitRelative(SIUnits.CELSIUS).doubleValue();
903898
return new CoolingThresholdTemperatureCharacteristic(minValue, maxValue, step,
904899
getTemperatureSupplier(taggedItem, minValue), setTemperatureConsumer(taggedItem),
905900
getSubscriber(taggedItem, COOLING_THRESHOLD_TEMPERATURE, updater),
@@ -979,7 +974,7 @@ private static CurrentTemperatureCharacteristic createCurrentTemperatureCharacte
979974
new QuantityType(CurrentTemperatureCharacteristic.DEFAULT_STEP, SIUnits.CELSIUS)
980975
.toUnit(getSystemTemperatureUnit())),
981976
true)
982-
.toUnit(SIUnits.CELSIUS).doubleValue();
977+
.toUnitRelative(SIUnits.CELSIUS).doubleValue();
983978
return new CurrentTemperatureCharacteristic(minValue, maxValue, step,
984979
getTemperatureSupplier(taggedItem, minValue), getSubscriber(taggedItem, TARGET_TEMPERATURE, updater),
985980
getUnsubscriber(taggedItem, TARGET_TEMPERATURE, updater));
@@ -1073,7 +1068,7 @@ private static HeatingThresholdTemperatureCharacteristic createHeatingThresholdC
10731068
Objects.requireNonNull(new QuantityType(HeatingThresholdTemperatureCharacteristic.DEFAULT_STEP,
10741069
SIUnits.CELSIUS).toUnit(getSystemTemperatureUnit())),
10751070
true)
1076-
.toUnit(SIUnits.CELSIUS).doubleValue();
1071+
.toUnitRelative(SIUnits.CELSIUS).doubleValue();
10771072
return new HeatingThresholdTemperatureCharacteristic(minValue, maxValue, step,
10781073
getTemperatureSupplier(taggedItem, minValue), setTemperatureConsumer(taggedItem),
10791074
getSubscriber(taggedItem, HEATING_THRESHOLD_TEMPERATURE, updater),
@@ -1573,7 +1568,7 @@ private static TargetTemperatureCharacteristic createTargetTemperatureCharacteri
15731568
new QuantityType(TargetTemperatureCharacteristic.DEFAULT_STEP, SIUnits.CELSIUS)
15741569
.toUnit(getSystemTemperatureUnit())),
15751570
true)
1576-
.toUnit(SIUnits.CELSIUS).doubleValue();
1571+
.toUnitRelative(SIUnits.CELSIUS).doubleValue();
15771572
return new TargetTemperatureCharacteristic(minValue, maxValue, step,
15781573
getTemperatureSupplier(taggedItem, minValue), setTemperatureConsumer(taggedItem),
15791574
getSubscriber(taggedItem, TARGET_TEMPERATURE, updater),

0 commit comments

Comments
 (0)