Skip to content
This repository was archived by the owner on Oct 18, 2025. It is now read-only.

Commit a743653

Browse files
committed
Re-enable window covering with the upstream hap fix
1 parent 3edb621 commit a743653

File tree

6 files changed

+106
-1
lines changed

6 files changed

+106
-1
lines changed

addons/io/org.openhab.io.homekit/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ A full list of supported accessory types can be found in the table below.
7777
| LeakSensor | | Switch, ContactSensor | Leak sensor. ON / OPEN state means flood detected. |
7878
| MotionSensor | | Switch, ContactSensor | Motion sensor. ON / OPEN state means motion detected. |
7979
| Valve | | Switch | Simple open/close valve. Assumes liquid is flowing when valve is open. |
80+
| WindowCovering | | Rollershutter | Simple window covering with support for setting target position / current position support. |
8081

8182

8283
See the sample below for example items:
@@ -93,6 +94,7 @@ String DownstairsThermostatHeatingCoolingMode "Downstairs Thermostat Heating/Coo
9394
Switch Hallway_MotionSensor "Hallway Motion Sensor" [ "MotionSensor" ]
9495
Switch MasterBath_Toilet_LeakSensor "Master Bath Toilet Flood" ["LeakSensor"]
9596
Switch WaterMain_Valve "Water Main Valve" ["Valve"]
97+
Rollershutter MasterWindow_Blinds "Master Window Blinds" [ "WindowCovering" ]
9698
```
9799

98100
## Battery Level
-834 Bytes
Binary file not shown.
-1.58 KB
Binary file not shown.

addons/io/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAccessoryType.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ public enum HomekitAccessoryType {
3030
LEAK_SENSOR("LeakSensor"),
3131
MOTION_SENSOR("MotionSensor"),
3232
OCCUPANCY_SENSOR("OccupancySensor"),
33-
CONTACT_SENSOR("ContactSensor");
33+
CONTACT_SENSOR("ContactSensor"),
34+
WINDOW_COVERING("WindowCovering"),
35+
@Deprecated()
36+
BLINDS("Blinds");
3437

3538
private static final Map<String, HomekitAccessoryType> tagMap = new HashMap<>();
3639

addons/io/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAccessoryFactory.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.Collections;
1212
import java.util.Map;
1313
import java.util.Optional;
14+
import java.util.stream.Collectors;
1415

1516
import org.eclipse.smarthome.core.items.GroupItem;
1617
import org.eclipse.smarthome.core.items.Item;
@@ -105,6 +106,9 @@ public static HomekitAccessory create(HomekitTaggedItem taggedItem, ItemRegistry
105106

106107
case HUMIDITY_SENSOR:
107108
return new HomekitHumiditySensorImpl(taggedItem, itemRegistry, updater);
109+
case BLINDS:
110+
case WINDOW_COVERING:
111+
return new HomekitWindowCoveringImpl(taggedItem, itemRegistry, updater);
108112
}
109113

110114
throw new Exception("Unknown homekit type: " + taggedItem.getAccessoryType());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package org.openhab.io.homekit.internal.accessories;
2+
3+
import java.util.concurrent.CompletableFuture;
4+
5+
import org.eclipse.smarthome.core.items.ItemRegistry;
6+
import org.eclipse.smarthome.core.library.items.RollershutterItem;
7+
import org.eclipse.smarthome.core.library.types.PercentType;
8+
import org.openhab.io.homekit.internal.HomekitAccessoryUpdater;
9+
import org.openhab.io.homekit.internal.HomekitTaggedItem;
10+
11+
import com.beowulfe.hap.HomekitCharacteristicChangeCallback;
12+
import com.beowulfe.hap.accessories.WindowCovering;
13+
import com.beowulfe.hap.accessories.properties.WindowCoveringPositionState;
14+
15+
public class HomekitWindowCoveringImpl extends AbstractHomekitAccessoryImpl<RollershutterItem> implements WindowCovering {
16+
17+
public HomekitWindowCoveringImpl(HomekitTaggedItem taggedItem, ItemRegistry itemRegistry, HomekitAccessoryUpdater updater) {
18+
super(taggedItem, itemRegistry, updater, RollershutterItem.class);
19+
}
20+
21+
@Override
22+
public CompletableFuture<Integer> getCurrentPosition() {
23+
PercentType value = getItem().getStateAs(PercentType.class);
24+
if (value == null) {
25+
return CompletableFuture.completedFuture(null);
26+
}
27+
return CompletableFuture.completedFuture(100 - value.intValue());
28+
}
29+
30+
@Override
31+
public CompletableFuture<Boolean> getObstructionDetected() {
32+
return CompletableFuture.completedFuture(false);
33+
}
34+
35+
@Override
36+
public CompletableFuture<WindowCoveringPositionState> getPositionState() {
37+
return CompletableFuture.completedFuture(WindowCoveringPositionState.STOPPED);
38+
}
39+
40+
@Override
41+
public CompletableFuture<Integer> getTargetPosition() {
42+
return getCurrentPosition();
43+
}
44+
45+
@Override
46+
public CompletableFuture<Void> setHoldPosition(boolean value) throws Exception {
47+
return CompletableFuture.completedFuture(null);
48+
}
49+
50+
@Override
51+
public CompletableFuture<Void> setTargetPosition(int value) throws Exception {
52+
((RollershutterItem) getItem()).send(new PercentType(100 - value));
53+
return CompletableFuture.completedFuture(null);
54+
}
55+
56+
@Override
57+
public void subscribeCurrentPosition(HomekitCharacteristicChangeCallback callback) {
58+
getUpdater().subscribe(getItem(), callback);
59+
}
60+
61+
@Override
62+
public void subscribeObstructionDetected(HomekitCharacteristicChangeCallback callback) {
63+
// Not implemented
64+
}
65+
66+
@Override
67+
public void subscribePositionState(HomekitCharacteristicChangeCallback callback) {
68+
// Not implemented
69+
}
70+
71+
@Override
72+
public void subscribeTargetPosition(HomekitCharacteristicChangeCallback callback) {
73+
getUpdater().subscribe(getItem(), "targetPosition", callback);
74+
}
75+
76+
@Override
77+
public void unsubscribeCurrentPosition() {
78+
getUpdater().unsubscribe(getItem());
79+
}
80+
81+
@Override
82+
public void unsubscribeObstructionDetected() {
83+
// Not implemented
84+
}
85+
86+
@Override
87+
public void unsubscribePositionState() {
88+
// Not implemented
89+
}
90+
91+
@Override
92+
public void unsubscribeTargetPosition() {
93+
getUpdater().unsubscribe(getItem(), "targetPosition");
94+
}
95+
96+
}

0 commit comments

Comments
 (0)