diff --git a/bundles/org.openhab.io.homekit/README.md b/bundles/org.openhab.io.homekit/README.md index 28189de1fc545..d71332ef15ff9 100644 --- a/bundles/org.openhab.io.homekit/README.md +++ b/bundles/org.openhab.io.homekit/README.md @@ -270,12 +270,12 @@ In contrast, HomeKit window covering/door/window have inverted mapping - CLOSED if position is 0% Therefore, HomeKit integration inverts by default the values between openHAB and HomeKit, e.g. if openHAB current position is 30% then it will send 70% to HomeKit app. -In case you need to disable this logic you can do it with configuration parameter inverted="false", e.g. +In case you need to disable this logic you can do it with configuration parameter inverted=false, e.g. ```xtend -Rollershutter window_covering "Window Rollershutter" {homekit = "WindowCovering" [inverted="false"]} -Rollershutter window "Window" {homekit = "Window" [inverted="false"]} -Rollershutter door "Door" {homekit = "Door" [inverted="false"]} +Rollershutter window_covering "Window Rollershutter" {homekit = "WindowCovering" [inverted=false]} +Rollershutter window "Window" {homekit = "Window" [inverted=false]} +Rollershutter door "Door" {homekit = "Door" [inverted=false]} ``` @@ -425,7 +425,7 @@ Following table summarizes the optional characteristics supported by sensors. | BatteryLowStatus | Switch, Contact | Accessory battery status. "ON"/"OPEN" indicates that the battery level of the accessory is low. Value should return to "OFF"/"CLOSED" when the battery charges to a level thats above the low threshold. | Switch and Contact items support inversion of the state mapping, e.g. by default the openHAB switch state "ON" is mapped to HomeKit contact sensor state "Open", and "OFF" to "Closed". -The configuration "inverted='true'" inverts this mapping, so that "ON" will be mapped to "Closed" and "OFF" to "Open". +The configuration "inverted=true" inverts this mapping, so that "ON" will be mapped to "Closed" and "OFF" to "Open". Examples of sensor definitions. Sensors without optional characteristics: @@ -435,7 +435,7 @@ Switch leaksensor_single "Leak Sensor" {homekit="LeakSenso Number light_sensor "Light Sensor" {homekit="LightSensor"} Number temperature_sensor "Temperature Sensor [%.1f °C]" {homekit="TemperatureSensor"} Contact contact_sensor "Contact Sensor" {homekit="ContactSensor"} -Contact contact_sensor "Contact Sensor" {homekit="ContactSensor" [inverted="true"]} +Contact contact_sensor "Contact Sensor" {homekit="ContactSensor" [inverted=true]} Switch occupancy_sensor "Occupancy Sensor" {homekit="OccupancyDetectedState"} Switch motion_sensor "Motion Sensor" {homekit="MotionSensor"} @@ -448,13 +448,13 @@ Sensors with optional characteristics: Group gLeakSensor "Leak Sensor" {homekit="LeakSensor"} Switch leaksensor "Leak Sensor State" (gLeakSensor) {homekit="LeakDetectedState"} Switch leaksensor_bat "Leak Sensor Battery" (gLeakSensor) {homekit="BatteryLowStatus" } -Switch leaksensor_active "Leak Sensor Active" (gLeakSensor) {homekit="ActiveStatus" [inverted="true"]} +Switch leaksensor_active "Leak Sensor Active" (gLeakSensor) {homekit="ActiveStatus" [inverted=true]} Switch leaksensor_fault "Leak Sensor Fault" (gLeakSensor) {homekit="FaultStatus"} Switch leaksensor_tampered "Leak Sensor Tampered" (gLeakSensor) {homekit="TamperedStatus"} Group gMotionSensor "Motion Sensor" {homekit="MotionSensor"} Switch motionsensor "Motion Sensor State" (gMotionSensor) {homekit="MotionDetectedState"} -Switch motionsensor_bat "Motion Sensor Battery" (gMotionSensor) {homekit="BatteryLowStatus" [inverted="true"]} +Switch motionsensor_bat "Motion Sensor Battery" (gMotionSensor) {homekit="BatteryLowStatus" [inverted=true]} Switch motionsensor_active "Motion Sensor Active" (gMotionSensor) {homekit="ActiveStatus"} Switch motionsensor_fault "Motion Sensor Fault" (gMotionSensor) {homekit="FaultStatus"} Switch motionsensor_tampered "Motion Sensor Tampered" (gMotionSensor) {homekit="TamperedStatus"} @@ -676,11 +676,11 @@ Support for this is planned for the future release of openHAB HomeKit binding. | Fan | | | | Fan | | | ActiveStatus | | Switch | Accessory current working status. A value of "ON"/"OPEN" indicates that the accessory is active and is functioning without any errors. | | | | CurrentFanState | Number | Current fan state. values: 0=INACTIVE, 1=IDLE, 2=BLOWING AIR | -| | | TargetFanState | Number, Switch | Target fan state. values: 0/OFF=MANUAL, 1/ON=AUTO. Flag [inverted="true"] swaps the default mapping | -| | | RotationDirection | Number, Switch | Rotation direction. values: 0/OFF=CLOCKWISE, 1/ON=COUNTER CLOCKWISE. Flag [inverted="true"] swaps the default mapping | +| | | TargetFanState | Number, Switch | Target fan state. values: 0/OFF=MANUAL, 1/ON=AUTO. Flag [inverted=true] swaps the default mapping | +| | | RotationDirection | Number, Switch | Rotation direction. values: 0/OFF=CLOCKWISE, 1/ON=COUNTER CLOCKWISE. Flag [inverted=true] swaps the default mapping | | | | RotationSpeed | Number, Dimmer | Fan rotation speed in % (1-100) | -| | | SwingMode | Number, Switch | Swing mode. values: 0/OFF=SWING DISABLED, 1/ON=SWING ENABLED. Flag [inverted="true"] swaps the default mapping | -| | | LockControl | Number, Switch | Status of physical control lock. values: 0/OFF=CONTROL LOCK DISABLED, 1/ON=CONTROL LOCK ENABLED.Flag [inverted="true"] swaps the default mapping | +| | | SwingMode | Number, Switch | Swing mode. values: 0/OFF=SWING DISABLED, 1/ON=SWING ENABLED. Flag [inverted=true] swaps the default mapping | +| | | LockControl | Number, Switch | Status of physical control lock. values: 0/OFF=CONTROL LOCK DISABLED, 1/ON=CONTROL LOCK ENABLED.Flag [inverted=true] swaps the default mapping | | Thermostat | | | | A thermostat requires all mandatory characteristics defined below | | | CurrentTemperature | | Number | Current temperature. supported configuration: minValue, maxValue, step | | | TargetTemperature | | Number | Target temperature. supported configuration: minValue, maxValue, step | @@ -700,7 +700,7 @@ Support for this is planned for the future release of openHAB HomeKit binding. | | | LockControl | Number, Switch | Status of physical control lock. values: 0/OFF=CONTROL LOCK DISABLED, 1/ON=CONTROL LOCK ENABLED | | | | CoolingThresholdTemperature | Number | Maximum temperature that must be reached before cooling is turned on. min/max/step can configured at item level, e.g. minValue=10.5, maxValue=50, step=2] | | | | HeatingThresholdTemperature | Number | Minimum temperature that must be reached before heating is turned on. min/max/step can configured at item level, e.g. minValue=10.5, maxValue=50, step=2] | -| Lock | | | | A Lock Mechanism. with flag [inverted="true"] the default mapping to switch ON/OFF can be inverted. | +| Lock | | | | A Lock Mechanism. with flag [inverted=true] the default mapping to switch ON/OFF can be inverted. | | | LockCurrentState | | Switch, Number | Current state of lock mechanism (1/ON=SECURED, 0/OFF=UNSECURED, 2=JAMMED, 3=UNKNOWN) | | | LockTargetState | | Switch | Target state of lock mechanism (ON=SECURED, OFF=UNSECURED) | | | | Name | String | Name of the lock | diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitTaggedItem.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitTaggedItem.java index f212839be533f..056f760d479ca 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitTaggedItem.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitTaggedItem.java @@ -211,14 +211,38 @@ public T getConfiguration(String key, T defaultValue) { return defaultValue; } + /** + * Returns configuration value as boolean if its exists otherwise returns defaultValue + * + * @param key configuration key + * @param defaultValue default value + * @return configuration value as boolean + */ + public boolean getConfigurationAsBoolean(String key, boolean defaultValue) { + if (configuration == null) { + return defaultValue; + } + final @Nullable Object value = configuration.get(key); + if (value == null) { + return defaultValue; + } + if (value instanceof Boolean) { + return (Boolean) value; + } + if (value instanceof String) { + final String valueString = (String) value; + return valueString.equalsIgnoreCase("yes") || valueString.equalsIgnoreCase("true"); + } + return defaultValue; + } + /** * returns true if inverted flag is set, i.e. item has the configuration "inverted=true" * * @return true if inverted flag is set to true */ public boolean isInverted() { - final String invertedConfig = getConfiguration(HomekitTaggedItem.INVERTED, "false"); - return invertedConfig.equalsIgnoreCase("yes") || invertedConfig.equalsIgnoreCase("true"); + return getConfigurationAsBoolean(HomekitTaggedItem.INVERTED, false); } /** diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitAccessoryImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitAccessoryImpl.java index 784d29f9b1442..6204524401a2b 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitAccessoryImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitAccessoryImpl.java @@ -196,6 +196,18 @@ protected T getAccessoryConfiguration(String key, T defaultValue) { return accessory.getConfiguration(key, defaultValue); } + /** + * return configuration attached to the root accessory, e.g. groupItem. + * + * @param key configuration key + * @param defaultValue default value + * @return configuration value + */ + @NonNullByDefault + protected boolean getAccessoryConfigurationAsBoolean(String key, boolean defaultValue) { + return accessory.getConfigurationAsBoolean(key, defaultValue); + } + /** * return configuration of the characteristic item, e.g. currentTemperature. * Note: result will be casted to the type of the default value. diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitPositionAccessoryImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitPositionAccessoryImpl.java index 0cbb761b13cb5..161b7bf4b245f 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitPositionAccessoryImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitPositionAccessoryImpl.java @@ -57,8 +57,7 @@ public AbstractHomekitPositionAccessoryImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) { super(taggedItem, mandatoryCharacteristics, updater, settings); - final String invertedConfig = getAccessoryConfiguration(HomekitTaggedItem.INVERTED, "true"); - final boolean inverted = invertedConfig.equalsIgnoreCase("yes") || invertedConfig.equalsIgnoreCase("true"); + final boolean inverted = getAccessoryConfigurationAsBoolean(HomekitTaggedItem.INVERTED, true); closedPosition = inverted ? 0 : 100; openPosition = inverted ? 100 : 0; positionStateMapping = new EnumMap<>(PositionStateEnum.class); diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAccessoryFactory.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAccessoryFactory.java index 139940c43b15c..ca62341929de5 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAccessoryFactory.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAccessoryFactory.java @@ -147,8 +147,8 @@ private static List getRequiredCharacteristics(Homeki characteristics.addAll(Arrays.asList(MANDATORY_CHARACTERISTICS.get(taggedItem.getAccessoryType()))); } if (taggedItem.getAccessoryType() == BATTERY) { - final String isChargeable = taggedItem.getConfiguration(HomekitBatteryImpl.BATTERY_TYPE, "false"); - if ("true".equalsIgnoreCase(isChargeable) || "yes".equalsIgnoreCase(isChargeable)) { + final boolean isChargeable = taggedItem.getConfigurationAsBoolean(HomekitBatteryImpl.BATTERY_TYPE, false); + if (isChargeable) { characteristics.add(BATTERY_CHARGING_STATE); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitBatteryImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitBatteryImpl.java index 9d4c323e89780..a67fb8266fb1b 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitBatteryImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitBatteryImpl.java @@ -47,8 +47,7 @@ public HomekitBatteryImpl(HomekitTaggedItem taggedItem, List HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); lowBatteryReader = createBooleanReader(BATTERY_LOW_STATUS); - final String batteryTypeConfig = getAccessoryConfiguration(BATTERY_TYPE, "false"); - isChargeable = "true".equalsIgnoreCase(batteryTypeConfig) || "yes".equalsIgnoreCase(batteryTypeConfig); + isChargeable = getAccessoryConfigurationAsBoolean(BATTERY_TYPE, false); if (isChargeable) { chargingBatteryReader = createBooleanReader(BATTERY_CHARGING_STATE); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitValveImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitValveImpl.java index 14e4defa393de..ab4ee591e236d 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitValveImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitValveImpl.java @@ -78,8 +78,7 @@ public HomekitValveImpl(HomekitTaggedItem taggedItem, List ma activeReader = createBooleanReader(ACTIVE_STATUS); ValveService service = new ValveService(this); getServices().add(service); - final String timerConfig = getAccessoryConfiguration(CONFIG_TIMER, ""); - homekitTimer = timerConfig.equalsIgnoreCase("yes") || timerConfig.equalsIgnoreCase("true"); + homekitTimer = getAccessoryConfigurationAsBoolean(CONFIG_TIMER, false); if (homekitTimer) { addRemainingDurationCharacteristic(taggedItem, updater, service); }