diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCharacteristicFactory.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCharacteristicFactory.java index 5797e6238dce2..09e126a06a856 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCharacteristicFactory.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCharacteristicFactory.java @@ -186,6 +186,26 @@ */ @NonNullByDefault public class HomekitCharacteristicFactory { + // These values represent ranges that do not match the defaults that are part of + // the HAP specification/the defaults in HAP-Java, but nonetheless are commonly + // encountered in consumer-grade devices. So we define our own default min/max so + // that users don't have to override the default unnecessarily. + + // HAP default is 50-400 mired/2500-20,000 K. These numbers represent + // the warmest and coolest bulbs I could reasonably find at general + // purpose retailers. + public static final int COLOR_TEMPERATURE_MIN_MIREDS = 107; // 9300 K + public static final int COLOR_TEMPERATURE_MAX_MIREDS = 556; // 1800 K + // HAP default is 0 °C, but it's very common for outdoor temperatures and/or + // refrigation devices to go below freezing. + // Lowest recorded temperature on Earth is -89.2 °C. This is just a nice round number. + public static final int CURRENT_TEMPERATURE_MIN_CELSIUS = -100; + // HAP default is 0.0001 lx, but this is commonly rounded to 0 by many devices + public static final int CURRENT_AMBIENT_LIGHT_LEVEL_MIN_LUX = 0; + // HAP default is 100k + // https://en.wikipedia.org/wiki/Daylight#Intensity_in_different_conditions + public static final int CURRENT_AMBIENT_LIGHT_LEVEL_MAX_LUX = 120000; + private static final Logger LOGGER = LoggerFactory.getLogger(HomekitCharacteristicFactory.class); // List of optional characteristics and corresponding method to create them. @@ -759,14 +779,10 @@ private static ColorTemperatureCharacteristic createColorTemperatureCharacterist HomekitAccessoryUpdater updater) { final boolean inverted = taggedItem.isInverted(); - 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(); + int minValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE, + new QuantityType(COLOR_TEMPERATURE_MIN_MIREDS, Units.MIRED), false).intValue(); + int maxValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE, + new QuantityType(COLOR_TEMPERATURE_MAX_MIREDS, Units.MIRED), false).intValue(); // It's common to swap these if you're providing in Kelvin instead of mired if (minValue > maxValue) { @@ -898,13 +914,9 @@ private static CurrentMediaStateCharacteristic createCurrentMediaStateCharacteri private static CurrentTemperatureCharacteristic createCurrentTemperatureCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { - double minValue = taggedItem - .getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE, - Objects.requireNonNull( - new QuantityType(CurrentTemperatureCharacteristic.DEFAULT_MIN_VALUE, SIUnits.CELSIUS) - .toUnit(getSystemTemperatureUnit())), - false) - .toUnit(SIUnits.CELSIUS).doubleValue(); + double minValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE, Objects.requireNonNull( + new QuantityType(CURRENT_TEMPERATURE_MIN_CELSIUS, SIUnits.CELSIUS).toUnit(getSystemTemperatureUnit())), + false).toUnit(SIUnits.CELSIUS).doubleValue(); double maxValue = taggedItem .getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE, Objects.requireNonNull( diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightSensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightSensorImpl.java index cea33839e3151..7247d38c7cfe8 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightSensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightSensorImpl.java @@ -29,7 +29,6 @@ import io.github.hapjava.accessories.LightSensorAccessory; import io.github.hapjava.characteristics.Characteristic; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.impl.lightsensor.CurrentAmbientLightLevelCharacteristic; import io.github.hapjava.services.impl.LightSensorService; /** @@ -61,13 +60,13 @@ public CompletableFuture getCurrentAmbientLightLevel() { @Override public double getMinCurrentAmbientLightLevel() { return getAccessoryConfiguration(HomekitCharacteristicType.LIGHT_LEVEL, HomekitTaggedItem.MIN_VALUE, - BigDecimal.valueOf(CurrentAmbientLightLevelCharacteristic.DEFAULT_MIN_VALUE)).doubleValue(); + BigDecimal.valueOf(HomekitCharacteristicFactory.CURRENT_AMBIENT_LIGHT_LEVEL_MIN_LUX)).doubleValue(); } @Override public double getMaxCurrentAmbientLightLevel() { return getAccessoryConfiguration(HomekitCharacteristicType.LIGHT_LEVEL, HomekitTaggedItem.MAX_VALUE, - BigDecimal.valueOf(CurrentAmbientLightLevelCharacteristic.DEFAULT_MAX_VALUE)).doubleValue(); + BigDecimal.valueOf(HomekitCharacteristicFactory.CURRENT_AMBIENT_LIGHT_LEVEL_MAX_LUX)).doubleValue(); } @Override