mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-25 14:55:55 +01:00
[homekit] Support UP/DOWN for WindowCoverings (#17138)
* [homekit] Support UP/DOWN for WindowCoverings Signed-off-by: Cody Cutrer <cody@cutrer.us>
This commit is contained in:
parent
fd4dd89bb1
commit
9362fcccdc
@ -466,6 +466,14 @@ Some blinds devices do support "STOP" command but would stop if they receive UP/
|
|||||||
Rollershutter window_covering "Window Rollershutter" {homekit = "WindowCovering" [stop=true, stopSameDirection=true]}
|
Rollershutter window_covering "Window Rollershutter" {homekit = "WindowCovering" [stop=true, stopSameDirection=true]}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Some blinds devices do not support going to a specific position, even though they are modeled as Rollershutter items.
|
||||||
|
The Home App only sends exact percentages by default.
|
||||||
|
To avoid creating a rule, you can have the HomeKit addon translate 0%/100% to UP/DOWN commands.
|
||||||
|
|
||||||
|
```java
|
||||||
|
Rollershutter window_covering "Window Rollershutter" {homekit = "WindowCovering" [sendUpDownForExtents=true]}
|
||||||
|
```
|
||||||
|
|
||||||
Window covering can have a number of optional characteristics like horizontal & vertical tilt, obstruction status and hold position trigger.
|
Window covering can have a number of optional characteristics like horizontal & vertical tilt, obstruction status and hold position trigger.
|
||||||
If your blind supports tilt, and you want to control tilt via HomeKit you need to define blind as a group.
|
If your blind supports tilt, and you want to control tilt via HomeKit you need to define blind as a group.
|
||||||
e.g.
|
e.g.
|
||||||
|
@ -62,6 +62,7 @@ public class HomekitTaggedItem {
|
|||||||
public static final String UNIT = "unit";
|
public static final String UNIT = "unit";
|
||||||
public static final String EMULATE_STOP_STATE = "stop";
|
public static final String EMULATE_STOP_STATE = "stop";
|
||||||
public static final String EMULATE_STOP_SAME_DIRECTION = "stopSameDirection";
|
public static final String EMULATE_STOP_SAME_DIRECTION = "stopSameDirection";
|
||||||
|
public static final String SEND_UP_DOWN_FOR_EXTENTS = "sendUpDownForExtents";
|
||||||
|
|
||||||
private static final Map<Integer, String> CREATED_ACCESSORY_IDS = new ConcurrentHashMap<>();
|
private static final Map<Integer, String> CREATED_ACCESSORY_IDS = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
@ -56,6 +56,7 @@ abstract class AbstractHomekitPositionAccessoryImpl extends AbstractHomekitAcces
|
|||||||
private final Map<PositionStateEnum, String> positionStateMapping;
|
private final Map<PositionStateEnum, String> positionStateMapping;
|
||||||
protected boolean emulateState;
|
protected boolean emulateState;
|
||||||
protected boolean emulateStopSameDirection;
|
protected boolean emulateStopSameDirection;
|
||||||
|
protected boolean sendUpDownForExtents;
|
||||||
protected PositionStateEnum emulatedState = PositionStateEnum.STOPPED;
|
protected PositionStateEnum emulatedState = PositionStateEnum.STOPPED;
|
||||||
|
|
||||||
public AbstractHomekitPositionAccessoryImpl(HomekitTaggedItem taggedItem,
|
public AbstractHomekitPositionAccessoryImpl(HomekitTaggedItem taggedItem,
|
||||||
@ -66,6 +67,7 @@ abstract class AbstractHomekitPositionAccessoryImpl extends AbstractHomekitAcces
|
|||||||
emulateState = getAccessoryConfigurationAsBoolean(HomekitTaggedItem.EMULATE_STOP_STATE, false);
|
emulateState = getAccessoryConfigurationAsBoolean(HomekitTaggedItem.EMULATE_STOP_STATE, false);
|
||||||
emulateStopSameDirection = getAccessoryConfigurationAsBoolean(HomekitTaggedItem.EMULATE_STOP_SAME_DIRECTION,
|
emulateStopSameDirection = getAccessoryConfigurationAsBoolean(HomekitTaggedItem.EMULATE_STOP_SAME_DIRECTION,
|
||||||
false);
|
false);
|
||||||
|
sendUpDownForExtents = getAccessoryConfigurationAsBoolean(HomekitTaggedItem.SEND_UP_DOWN_FOR_EXTENTS, false);
|
||||||
closedPosition = inverted ? 0 : 100;
|
closedPosition = inverted ? 0 : 100;
|
||||||
openPosition = inverted ? 100 : 0;
|
openPosition = inverted ? 100 : 0;
|
||||||
positionStateMapping = createMapping(POSITION_STATE, PositionStateEnum.class);
|
positionStateMapping = createMapping(POSITION_STATE, PositionStateEnum.class);
|
||||||
@ -101,7 +103,13 @@ abstract class AbstractHomekitPositionAccessoryImpl extends AbstractHomekitAcces
|
|||||||
}
|
}
|
||||||
emulatedState = PositionStateEnum.STOPPED;
|
emulatedState = PositionStateEnum.STOPPED;
|
||||||
} else {
|
} else {
|
||||||
itemAsRollerShutterItem.send(new PercentType(targetPosition));
|
if (sendUpDownForExtents && targetPosition == 0) {
|
||||||
|
itemAsRollerShutterItem.send(UpDownType.UP);
|
||||||
|
} else if (sendUpDownForExtents && targetPosition == 100) {
|
||||||
|
itemAsRollerShutterItem.send(UpDownType.DOWN);
|
||||||
|
} else {
|
||||||
|
itemAsRollerShutterItem.send(new PercentType(targetPosition));
|
||||||
|
}
|
||||||
if (emulateState) {
|
if (emulateState) {
|
||||||
@Nullable
|
@Nullable
|
||||||
PercentType currentPosition = item.getStateAs(PercentType.class);
|
PercentType currentPosition = item.getStateAs(PercentType.class);
|
||||||
|
Loading…
Reference in New Issue
Block a user