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

Commit 3edb621

Browse files
committed
Contact and occupancy sensors
1 parent 0135fdd commit 3edb621

File tree

6 files changed

+174
-3
lines changed

6 files changed

+174
-3
lines changed
Binary file not shown.
2.6 KB
Binary file not shown.

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ public enum HomekitAccessoryType {
2828
COLORFUL_LIGHTBULB("ColorfulLighting"),
2929
VALVE("Valve"),
3030
LEAK_SENSOR("LeakSensor"),
31-
MOTION_SENSOR("MotionSensor");
31+
MOTION_SENSOR("MotionSensor"),
32+
OCCUPANCY_SENSOR("OccupancySensor"),
33+
CONTACT_SENSOR("ContactSensor");
3234

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

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,31 @@ public static HomekitAccessory create(HomekitTaggedItem taggedItem, ItemRegistry
5555

5656
case MOTION_SENSOR:
5757
HomekitTaggedItem motionSensorAccessory = getPrimaryAccessory(taggedItem,
58-
HomekitAccessoryType.MOTION_SENSOR, itemRegistry).orElseThrow(
59-
() -> new Exception("Leak accessory group should have a leak sensor in it"));
58+
HomekitAccessoryType.MOTION_SENSOR, itemRegistry)
59+
.orElseThrow(() -> new Exception(
60+
"Motion sensor accessory group should have a motion sensor item in it"));
6061

6162
return new HomekitMotionSensorImpl(motionSensorAccessory, itemRegistry, updater,
6263
BatteryStatus.getFromCharacteristics(characteristicItems));
6364

65+
case OCCUPANCY_SENSOR:
66+
HomekitTaggedItem occupancySensorAccessory = getPrimaryAccessory(taggedItem,
67+
HomekitAccessoryType.OCCUPANCY_SENSOR, itemRegistry)
68+
.orElseThrow(() -> new Exception(
69+
"Occupancy sensor accessory group should have a occupancy sensor item in it"));
70+
71+
return new HomekitOccupancySensorImpl(occupancySensorAccessory, itemRegistry, updater,
72+
BatteryStatus.getFromCharacteristics(characteristicItems));
73+
74+
case CONTACT_SENSOR:
75+
HomekitTaggedItem contactSensorAccessory = getPrimaryAccessory(taggedItem,
76+
HomekitAccessoryType.CONTACT_SENSOR, itemRegistry)
77+
.orElseThrow(() -> new Exception(
78+
"Contact sensor accessory group should have a occupancy sensor item in it"));
79+
80+
return new HomekitContactSensorImpl(contactSensorAccessory, itemRegistry, updater,
81+
BatteryStatus.getFromCharacteristics(characteristicItems));
82+
6483
case LIGHTBULB:
6584
return new HomekitLightbulbImpl(taggedItem, itemRegistry, updater);
6685

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/**
2+
* Copyright (c) 2010-2018 by the respective copyright holders.
3+
*
4+
* All rights reserved. This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Public License v1.0
6+
* which accompanies this distribution, and is available at
7+
* http://www.eclipse.org/legal/epl-v10.html
8+
*/
9+
package org.openhab.io.homekit.internal.accessories;
10+
11+
import java.util.concurrent.CompletableFuture;
12+
13+
import org.eclipse.smarthome.core.items.GenericItem;
14+
import org.eclipse.smarthome.core.items.ItemRegistry;
15+
import org.eclipse.smarthome.core.library.types.OnOffType;
16+
import org.eclipse.smarthome.core.library.types.OpenClosedType;
17+
import org.openhab.io.homekit.internal.HomekitAccessoryUpdater;
18+
import org.openhab.io.homekit.internal.HomekitTaggedItem;
19+
import org.openhab.io.homekit.internal.battery.BatteryStatus;
20+
21+
import com.beowulfe.hap.HomekitCharacteristicChangeCallback;
22+
import com.beowulfe.hap.accessories.BatteryStatusAccessory;
23+
import com.beowulfe.hap.accessories.ContactSensor;
24+
import com.beowulfe.hap.accessories.properties.ContactState;
25+
26+
/**
27+
*
28+
* @author Tim Harper - Initial implementation
29+
*/
30+
public class HomekitContactSensorImpl extends AbstractHomekitAccessoryImpl<GenericItem>
31+
implements ContactSensor, BatteryStatusAccessory {
32+
private BatteryStatus batteryStatus;
33+
private BooleanItemReader contactSensedReader;
34+
35+
public HomekitContactSensorImpl(HomekitTaggedItem taggedItem, ItemRegistry itemRegistry,
36+
HomekitAccessoryUpdater updater, BatteryStatus batteryStatus) {
37+
super(taggedItem, itemRegistry, updater, GenericItem.class);
38+
this.contactSensedReader = new BooleanItemReader(taggedItem.getItem(), OnOffType.OFF, OpenClosedType.CLOSED);
39+
this.batteryStatus = batteryStatus;
40+
}
41+
42+
@Override
43+
public CompletableFuture<ContactState> getCurrentState() {
44+
ContactState result;
45+
Boolean contactDetected = contactSensedReader.getValue();
46+
if (contactDetected == null) {
47+
// BUG - HAP-java does not currently handle null well here, so we'll default to not detected.
48+
return CompletableFuture.completedFuture(ContactState.NOT_DETECTED);
49+
} else if (contactDetected == true) {
50+
return CompletableFuture.completedFuture(ContactState.DETECTED);
51+
} else {
52+
return CompletableFuture.completedFuture(ContactState.NOT_DETECTED);
53+
}
54+
}
55+
56+
@Override
57+
public void subscribeContactState(HomekitCharacteristicChangeCallback callback) {
58+
getUpdater().subscribe(getItem(), callback);
59+
}
60+
61+
@Override
62+
public void unsubscribeContactState() {
63+
getUpdater().unsubscribe(getItem());
64+
}
65+
66+
@Override
67+
public CompletableFuture<Boolean> getLowBatteryState() {
68+
return CompletableFuture.completedFuture(batteryStatus.isLow());
69+
}
70+
71+
@Override
72+
public void subscribeLowBatteryState(HomekitCharacteristicChangeCallback callback) {
73+
batteryStatus.subscribe(getUpdater(), callback);
74+
}
75+
76+
@Override
77+
public void unsubscribeLowBatteryState() {
78+
batteryStatus.unsubscribe(getUpdater());
79+
}
80+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* Copyright (c) 2010-2018 by the respective copyright holders.
3+
*
4+
* All rights reserved. This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Public License v1.0
6+
* which accompanies this distribution, and is available at
7+
* http://www.eclipse.org/legal/epl-v10.html
8+
*/
9+
package org.openhab.io.homekit.internal.accessories;
10+
11+
import java.util.concurrent.CompletableFuture;
12+
13+
import org.eclipse.smarthome.core.items.GenericItem;
14+
import org.eclipse.smarthome.core.items.ItemRegistry;
15+
import org.eclipse.smarthome.core.library.types.OnOffType;
16+
import org.eclipse.smarthome.core.library.types.OpenClosedType;
17+
import org.openhab.io.homekit.internal.HomekitAccessoryUpdater;
18+
import org.openhab.io.homekit.internal.HomekitTaggedItem;
19+
import org.openhab.io.homekit.internal.battery.BatteryStatus;
20+
21+
import com.beowulfe.hap.HomekitCharacteristicChangeCallback;
22+
import com.beowulfe.hap.accessories.BatteryStatusAccessory;
23+
import com.beowulfe.hap.accessories.OccupancySensor;
24+
25+
/**
26+
*
27+
* @author Tim Harper - Initial implementation
28+
*/
29+
public class HomekitOccupancySensorImpl extends AbstractHomekitAccessoryImpl<GenericItem>
30+
implements OccupancySensor, BatteryStatusAccessory {
31+
private BatteryStatus batteryStatus;
32+
private BooleanItemReader occupancySensedReader;
33+
34+
public HomekitOccupancySensorImpl(HomekitTaggedItem taggedItem, ItemRegistry itemRegistry,
35+
HomekitAccessoryUpdater updater, BatteryStatus batteryStatus) {
36+
super(taggedItem, itemRegistry, updater, GenericItem.class);
37+
this.occupancySensedReader = new BooleanItemReader(taggedItem.getItem(), OnOffType.ON, OpenClosedType.OPEN);
38+
this.batteryStatus = batteryStatus;
39+
}
40+
41+
@Override
42+
public CompletableFuture<Boolean> getOccupancyDetected() {
43+
return CompletableFuture.completedFuture(occupancySensedReader.getValue());
44+
}
45+
46+
@Override
47+
public void subscribeOccupancyDetected(HomekitCharacteristicChangeCallback callback) {
48+
getUpdater().subscribe(getItem(), callback);
49+
}
50+
51+
@Override
52+
public void unsubscribeOccupancyDetected() {
53+
getUpdater().unsubscribe(getItem());
54+
}
55+
56+
@Override
57+
public CompletableFuture<Boolean> getLowBatteryState() {
58+
return CompletableFuture.completedFuture(batteryStatus.isLow());
59+
}
60+
61+
@Override
62+
public void subscribeLowBatteryState(HomekitCharacteristicChangeCallback callback) {
63+
batteryStatus.subscribe(getUpdater(), callback);
64+
}
65+
66+
@Override
67+
public void unsubscribeLowBatteryState() {
68+
batteryStatus.unsubscribe(getUpdater());
69+
}
70+
}

0 commit comments

Comments
 (0)