[homekit] Adjust default ranges for some characteristics (#17157)

* [homekit] adjust default ranges for some characteristics

Signed-off-by: Cody Cutrer <cody@cutrer.us>
This commit is contained in:
Cody Cutrer 2024-09-09 15:53:27 -06:00 committed by GitHub
parent fa5fd1c32e
commit 0252099518
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 18 deletions

View File

@ -188,6 +188,26 @@ import io.github.hapjava.characteristics.impl.windowcovering.TargetVerticalTiltA
*/ */
@NonNullByDefault @NonNullByDefault
public class HomekitCharacteristicFactory { 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); private static final Logger LOGGER = LoggerFactory.getLogger(HomekitCharacteristicFactory.class);
// List of optional characteristics and corresponding method to create them. // List of optional characteristics and corresponding method to create them.
@ -796,14 +816,10 @@ public class HomekitCharacteristicFactory {
HomekitAccessoryUpdater updater) { HomekitAccessoryUpdater updater) {
final boolean inverted = taggedItem.isInverted(); final boolean inverted = taggedItem.isInverted();
int minValue = taggedItem int minValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE,
.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE, new QuantityType(COLOR_TEMPERATURE_MIN_MIREDS, Units.MIRED), false).intValue();
new QuantityType(ColorTemperatureCharacteristic.DEFAULT_MIN_VALUE, Units.MIRED), false) int maxValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE,
.intValue(); new QuantityType(COLOR_TEMPERATURE_MAX_MIREDS, 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 // It's common to swap these if you're providing in Kelvin instead of mired
if (minValue > maxValue) { if (minValue > maxValue) {
@ -947,13 +963,9 @@ public class HomekitCharacteristicFactory {
private static CurrentTemperatureCharacteristic createCurrentTemperatureCharacteristic(HomekitTaggedItem taggedItem, private static CurrentTemperatureCharacteristic createCurrentTemperatureCharacteristic(HomekitTaggedItem taggedItem,
HomekitAccessoryUpdater updater) { HomekitAccessoryUpdater updater) {
double minValue = taggedItem double minValue = taggedItem.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE, Objects.requireNonNull(
.getConfigurationAsQuantity(HomekitTaggedItem.MIN_VALUE, new QuantityType(CURRENT_TEMPERATURE_MIN_CELSIUS, SIUnits.CELSIUS).toUnit(getSystemTemperatureUnit())),
Objects.requireNonNull( false).toUnit(SIUnits.CELSIUS).doubleValue();
new QuantityType(CurrentTemperatureCharacteristic.DEFAULT_MIN_VALUE, SIUnits.CELSIUS)
.toUnit(getSystemTemperatureUnit())),
false)
.toUnit(SIUnits.CELSIUS).doubleValue();
double maxValue = taggedItem double maxValue = taggedItem
.getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE, .getConfigurationAsQuantity(HomekitTaggedItem.MAX_VALUE,
Objects.requireNonNull( Objects.requireNonNull(

View File

@ -29,7 +29,6 @@ import org.openhab.io.homekit.internal.HomekitTaggedItem;
import io.github.hapjava.accessories.LightSensorAccessory; import io.github.hapjava.accessories.LightSensorAccessory;
import io.github.hapjava.characteristics.Characteristic; import io.github.hapjava.characteristics.Characteristic;
import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
import io.github.hapjava.characteristics.impl.lightsensor.CurrentAmbientLightLevelCharacteristic;
import io.github.hapjava.services.impl.LightSensorService; import io.github.hapjava.services.impl.LightSensorService;
/** /**
@ -61,13 +60,13 @@ public class HomekitLightSensorImpl extends AbstractHomekitAccessoryImpl impleme
@Override @Override
public double getMinCurrentAmbientLightLevel() { public double getMinCurrentAmbientLightLevel() {
return getAccessoryConfiguration(HomekitCharacteristicType.LIGHT_LEVEL, HomekitTaggedItem.MIN_VALUE, 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 @Override
public double getMaxCurrentAmbientLightLevel() { public double getMaxCurrentAmbientLightLevel() {
return getAccessoryConfiguration(HomekitCharacteristicType.LIGHT_LEVEL, HomekitTaggedItem.MAX_VALUE, 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 @Override