Skip to content

Commit f9c8d04

Browse files
authored
[homekit] Fix temperature unit conversion for min/max/step (openhab#17059)
* [homekit] fix temperature unit conversion for min/max/step use the item's unit if it has one. or allow explicit units Signed-off-by: Cody Cutrer <[email protected]>
1 parent a34e61b commit f9c8d04

File tree

1 file changed

+88
-24
lines changed

1 file changed

+88
-24
lines changed

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

+88-24
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import javax.measure.Quantity;
3131
import javax.measure.Unit;
32+
import javax.measure.quantity.Temperature;
3233

3334
import org.eclipse.jdt.annotation.NonNullByDefault;
3435
import org.eclipse.jdt.annotation.Nullable;
@@ -441,6 +442,10 @@ public static TemperatureDisplayUnitCharacteristic createSystemTemperatureDispla
441442
});
442443
}
443444

445+
public static Unit<Temperature> getSystemTemperatureUnit() {
446+
return useFahrenheit() ? ImperialUnits.FAHRENHEIT : SIUnits.CELSIUS;
447+
}
448+
444449
private static <T extends CharacteristicEnum> CompletableFuture<T> getEnumFromItem(HomekitTaggedItem item,
445450
Map<T, String> mapping, T defaultValue) {
446451
return CompletableFuture.completedFuture(getKeyFromMapping(item, mapping, defaultValue));
@@ -506,11 +511,11 @@ private static <T extends Quantity<T>> double convertAndRound(double value, Unit
506511
}
507512

508513
public static double convertToCelsius(double degrees) {
509-
return convertAndRound(degrees, useFahrenheit() ? ImperialUnits.FAHRENHEIT : SIUnits.CELSIUS, SIUnits.CELSIUS);
514+
return convertAndRound(degrees, getSystemTemperatureUnit(), SIUnits.CELSIUS);
510515
}
511516

512517
public static double convertFromCelsius(double degrees) {
513-
return convertAndRound(degrees, SIUnits.CELSIUS, useFahrenheit() ? ImperialUnits.FAHRENHEIT : SIUnits.CELSIUS);
518+
return convertAndRound(degrees, SIUnits.CELSIUS, getSystemTemperatureUnit());
514519
}
515520

516521
public static double getTemperatureStep(HomekitTaggedItem taggedItem, double defaultValue) {
@@ -604,8 +609,13 @@ private static Supplier<CompletableFuture<Double>> getTemperatureSupplier(Homeki
604609

605610
private static ExceptionalConsumer<Double> setTemperatureConsumer(HomekitTaggedItem taggedItem) {
606611
return (value) -> {
607-
if (taggedItem.getBaseItem() instanceof NumberItem) {
608-
taggedItem.send(new DecimalType(convertFromCelsius(value)));
612+
Item baseItem = taggedItem.getBaseItem();
613+
if (baseItem instanceof NumberItem baseAsNumberItem) {
614+
if (baseAsNumberItem.getUnit() != null) {
615+
taggedItem.send(new QuantityType(value, SIUnits.CELSIUS));
616+
} else {
617+
taggedItem.send(new DecimalType(convertFromCelsius(value)));
618+
}
609619
} else {
610620
LOGGER.warn("Item type {} is not supported for {}. Only Number type is supported.",
611621
taggedItem.getBaseItem().getType(), taggedItem.getName());
@@ -786,11 +796,22 @@ private static ConfiguredNameCharacteristic createConfiguredNameCharacteristic(H
786796

787797
private static CoolingThresholdTemperatureCharacteristic createCoolingThresholdCharacteristic(
788798
HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) {
789-
double minValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
790-
HomekitTaggedItem.MIN_VALUE, CoolingThresholdTemperatureCharacteristic.DEFAULT_MIN_VALUE));
791-
double maxValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
792-
HomekitTaggedItem.MAX_VALUE, CoolingThresholdTemperatureCharacteristic.DEFAULT_MAX_VALUE));
793-
double step = getTemperatureStep(taggedItem, CoolingThresholdTemperatureCharacteristic.DEFAULT_STEP);
799+
double minValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE,
800+
Objects.requireNonNull(
801+
new QuantityType(CoolingThresholdTemperatureCharacteristic.DEFAULT_MIN_VALUE, SIUnits.CELSIUS)
802+
.toUnit(getSystemTemperatureUnit())),
803+
false).toUnit(SIUnits.CELSIUS).doubleValue();
804+
double maxValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE,
805+
Objects.requireNonNull(
806+
new QuantityType(CoolingThresholdTemperatureCharacteristic.DEFAULT_MAX_VALUE, SIUnits.CELSIUS)
807+
.toUnit(getSystemTemperatureUnit())),
808+
false).toUnit(SIUnits.CELSIUS).doubleValue();
809+
double step = taggedItem
810+
.getConfigurationAsQuantity(HomekitTaggedItem.STEP,
811+
Objects.requireNonNull(new QuantityType(CoolingThresholdTemperatureCharacteristic.DEFAULT_STEP,
812+
SIUnits.CELSIUS).toUnit(getSystemTemperatureUnit())),
813+
true)
814+
.toUnit(SIUnits.CELSIUS).doubleValue();
794815
return new CoolingThresholdTemperatureCharacteristic(minValue, maxValue, step,
795816
getTemperatureSupplier(taggedItem, minValue), setTemperatureConsumer(taggedItem),
796817
getSubscriber(taggedItem, COOLING_THRESHOLD_TEMPERATURE, updater),
@@ -833,11 +854,27 @@ private static CurrentMediaStateCharacteristic createCurrentMediaStateCharacteri
833854

834855
private static CurrentTemperatureCharacteristic createCurrentTemperatureCharacteristic(HomekitTaggedItem taggedItem,
835856
HomekitAccessoryUpdater updater) {
836-
double minValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
837-
HomekitTaggedItem.MIN_VALUE, CurrentTemperatureCharacteristic.DEFAULT_MIN_VALUE));
838-
double maxValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
839-
HomekitTaggedItem.MAX_VALUE, CurrentTemperatureCharacteristic.DEFAULT_MAX_VALUE));
840-
double step = getTemperatureStep(taggedItem, CurrentTemperatureCharacteristic.DEFAULT_STEP);
857+
double minValue = taggedItem
858+
.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE,
859+
Objects.requireNonNull(
860+
new QuantityType(CurrentTemperatureCharacteristic.DEFAULT_MIN_VALUE, SIUnits.CELSIUS)
861+
.toUnit(getSystemTemperatureUnit())),
862+
false)
863+
.toUnit(SIUnits.CELSIUS).doubleValue();
864+
double maxValue = taggedItem
865+
.getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE,
866+
Objects.requireNonNull(
867+
new QuantityType(CurrentTemperatureCharacteristic.DEFAULT_MAX_VALUE, SIUnits.CELSIUS)
868+
.toUnit(getSystemTemperatureUnit())),
869+
false)
870+
.toUnit(SIUnits.CELSIUS).doubleValue();
871+
double step = taggedItem
872+
.getConfigurationAsQuantity(HomekitTaggedItem.STEP,
873+
Objects.requireNonNull(
874+
new QuantityType(CurrentTemperatureCharacteristic.DEFAULT_STEP, SIUnits.CELSIUS)
875+
.toUnit(getSystemTemperatureUnit())),
876+
true)
877+
.toUnit(SIUnits.CELSIUS).doubleValue();
841878
return new CurrentTemperatureCharacteristic(minValue, maxValue, step,
842879
getTemperatureSupplier(taggedItem, minValue), getSubscriber(taggedItem, TARGET_TEMPERATURE, updater),
843880
getUnsubscriber(taggedItem, TARGET_TEMPERATURE, updater));
@@ -916,11 +953,22 @@ private static HardwareRevisionCharacteristic createHardwareRevisionCharacterist
916953

917954
private static HeatingThresholdTemperatureCharacteristic createHeatingThresholdCharacteristic(
918955
HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) {
919-
double minValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
920-
HomekitTaggedItem.MIN_VALUE, HeatingThresholdTemperatureCharacteristic.DEFAULT_MIN_VALUE));
921-
double maxValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
922-
HomekitTaggedItem.MAX_VALUE, HeatingThresholdTemperatureCharacteristic.DEFAULT_MAX_VALUE));
923-
double step = getTemperatureStep(taggedItem, HeatingThresholdTemperatureCharacteristic.DEFAULT_STEP);
956+
double minValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE,
957+
Objects.requireNonNull(
958+
new QuantityType(HeatingThresholdTemperatureCharacteristic.DEFAULT_MIN_VALUE, SIUnits.CELSIUS)
959+
.toUnit(getSystemTemperatureUnit())),
960+
false).toUnit(SIUnits.CELSIUS).doubleValue();
961+
double maxValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE,
962+
Objects.requireNonNull(
963+
new QuantityType(HeatingThresholdTemperatureCharacteristic.DEFAULT_MAX_VALUE, SIUnits.CELSIUS)
964+
.toUnit(getSystemTemperatureUnit())),
965+
false).toUnit(SIUnits.CELSIUS).doubleValue();
966+
double step = taggedItem
967+
.getConfigurationAsQuantity(HomekitTaggedItem.STEP,
968+
Objects.requireNonNull(new QuantityType(HeatingThresholdTemperatureCharacteristic.DEFAULT_STEP,
969+
SIUnits.CELSIUS).toUnit(getSystemTemperatureUnit())),
970+
true)
971+
.toUnit(SIUnits.CELSIUS).doubleValue();
924972
return new HeatingThresholdTemperatureCharacteristic(minValue, maxValue, step,
925973
getTemperatureSupplier(taggedItem, minValue), setTemperatureConsumer(taggedItem),
926974
getSubscriber(taggedItem, HEATING_THRESHOLD_TEMPERATURE, updater),
@@ -1286,11 +1334,27 @@ private static TargetRelativeHumidityCharacteristic createTargetRelativeHumidity
12861334

12871335
private static TargetTemperatureCharacteristic createTargetTemperatureCharacteristic(HomekitTaggedItem taggedItem,
12881336
HomekitAccessoryUpdater updater) {
1289-
double minValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
1290-
HomekitTaggedItem.MIN_VALUE, TargetTemperatureCharacteristic.DEFAULT_MIN_VALUE));
1291-
double maxValue = HomekitCharacteristicFactory.convertToCelsius(taggedItem.getConfigurationAsDouble(
1292-
HomekitTaggedItem.MAX_VALUE, TargetTemperatureCharacteristic.DEFAULT_MAX_VALUE));
1293-
double step = getTemperatureStep(taggedItem, TargetTemperatureCharacteristic.DEFAULT_STEP);
1337+
double minValue = taggedItem
1338+
.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE,
1339+
Objects.requireNonNull(
1340+
new QuantityType(TargetTemperatureCharacteristic.DEFAULT_MIN_VALUE, SIUnits.CELSIUS)
1341+
.toUnit(getSystemTemperatureUnit())),
1342+
false)
1343+
.toUnit(SIUnits.CELSIUS).doubleValue();
1344+
double maxValue = taggedItem
1345+
.getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE,
1346+
Objects.requireNonNull(
1347+
new QuantityType(TargetTemperatureCharacteristic.DEFAULT_MAX_VALUE, SIUnits.CELSIUS)
1348+
.toUnit(getSystemTemperatureUnit())),
1349+
false)
1350+
.toUnit(SIUnits.CELSIUS).doubleValue();
1351+
double step = taggedItem
1352+
.getConfigurationAsQuantity(HomekitTaggedItem.STEP,
1353+
Objects.requireNonNull(
1354+
new QuantityType(TargetTemperatureCharacteristic.DEFAULT_STEP, SIUnits.CELSIUS)
1355+
.toUnit(getSystemTemperatureUnit())),
1356+
true)
1357+
.toUnit(SIUnits.CELSIUS).doubleValue();
12941358
return new TargetTemperatureCharacteristic(minValue, maxValue, step,
12951359
getTemperatureSupplier(taggedItem, minValue), setTemperatureConsumer(taggedItem),
12961360
getSubscriber(taggedItem, TARGET_TEMPERATURE, updater),

0 commit comments

Comments
 (0)