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

Commit 1a2b945

Browse files
committed
Allow motion sensors and leak sensors to be backed by contact sensors
Some Z-wave configurations expose them as switches, other as contact sensors.
1 parent ce33a30 commit 1a2b945

File tree

4 files changed

+64
-26
lines changed

4 files changed

+64
-26
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ abstract class AbstractHomekitAccessoryImpl<T extends GenericItem> implements Ho
3333
private final ItemRegistry itemRegistry;
3434
private final HomekitAccessoryUpdater updater;
3535

36-
private Logger logger = LoggerFactory.getLogger(AbstractHomekitAccessoryImpl.class);
36+
protected Logger logger = LoggerFactory.getLogger(AbstractHomekitAccessoryImpl.class);
3737

3838
public AbstractHomekitAccessoryImpl(HomekitTaggedItem taggedItem, ItemRegistry itemRegistry,
3939
HomekitAccessoryUpdater updater, Class<T> expectedItemClass) {
@@ -48,7 +48,7 @@ public AbstractHomekitAccessoryImpl(HomekitTaggedItem taggedItem, ItemRegistry i
4848
}
4949
if (expectedItemClass != taggedItem.getItem().getClass()
5050
&& !expectedItemClass.isAssignableFrom(baseItem.getClass())) {
51-
logger.error("Type {} is a {} instead of the expected {}", taggedItem.getItem().getName(),
51+
logger.error("Item {} is of type {} instead of the expected {}", taggedItem.getItem().getName(),
5252
baseItem.getClass().getName(), expectedItemClass.getName());
5353
}
5454
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.openhab.io.homekit.internal.accessories;
2+
3+
import org.eclipse.smarthome.core.items.Item;
4+
import org.eclipse.smarthome.core.library.items.ContactItem;
5+
import org.eclipse.smarthome.core.library.items.SwitchItem;
6+
import org.eclipse.smarthome.core.library.types.OnOffType;
7+
import org.eclipse.smarthome.core.library.types.OpenClosedType;
8+
import org.eclipse.smarthome.core.types.State;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
/**
13+
* Wraps either a SwitchItem or a ContactItem, interpretting the open / closed states accordingly.
14+
*
15+
* @author Tim Harper
16+
*
17+
*/
18+
public class BooleanItemReader {
19+
private final Item item;
20+
private final OnOffType trueOnOffValue;
21+
private final OpenClosedType trueOpenClosedValue;
22+
23+
private static Logger logger = LoggerFactory.getLogger(BooleanItemReader.class);
24+
25+
/**
26+
*
27+
* @param item The item to read
28+
* @param trueOnOffValue If OnOffType, then consider true if this value
29+
* @param trueOpenClosedValue if OpenClosedType, then consider true if this value
30+
*/
31+
BooleanItemReader(Item item, OnOffType trueOnOffValue, OpenClosedType trueOpenClosedValue) {
32+
this.item = item;
33+
this.trueOnOffValue = trueOnOffValue;
34+
this.trueOpenClosedValue = trueOpenClosedValue;
35+
if (!(item instanceof SwitchItem) && !(item instanceof ContactItem)) {
36+
logger.error("Item {} is a {} instead of the expected SwitchItem or ContactItem", item.getName(),
37+
item.getClass().getName());
38+
}
39+
}
40+
41+
Boolean getValue() {
42+
State state = item.getState();
43+
if (state instanceof OnOffType) {
44+
return state == trueOnOffValue;
45+
} else if (state instanceof OpenClosedType) {
46+
return state == trueOpenClosedValue;
47+
} else {
48+
return null;
49+
}
50+
}
51+
}

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

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,8 @@
1313
import org.eclipse.jdt.annotation.NonNull;
1414
import org.eclipse.smarthome.core.items.GenericItem;
1515
import org.eclipse.smarthome.core.items.ItemRegistry;
16-
import org.eclipse.smarthome.core.library.items.ContactItem;
17-
import org.eclipse.smarthome.core.library.items.SwitchItem;
1816
import org.eclipse.smarthome.core.library.types.OnOffType;
1917
import org.eclipse.smarthome.core.library.types.OpenClosedType;
20-
import org.eclipse.smarthome.core.types.State;
2118
import org.openhab.io.homekit.internal.HomekitAccessoryUpdater;
2219
import org.openhab.io.homekit.internal.HomekitTaggedItem;
2320
import org.openhab.io.homekit.internal.battery.BatteryStatus;
@@ -36,28 +33,19 @@ public class HomekitLeakSensorImpl extends AbstractHomekitAccessoryImpl<GenericI
3633
@NonNull
3734
private BatteryStatus batteryStatus;
3835

36+
private BooleanItemReader leakDetectedReader;
37+
3938
public HomekitLeakSensorImpl(HomekitTaggedItem taggedItem, ItemRegistry itemRegistry,
4039
HomekitAccessoryUpdater updater, BatteryStatus batteryStatus) {
4140
super(taggedItem, itemRegistry, updater, GenericItem.class);
4241

43-
if (!(taggedItem.getItem() instanceof SwitchItem) && !(taggedItem.getItem() instanceof ContactItem)) {
44-
logger.error("Item {} is a {} instead of the expected SwitchItem or ContactItem",
45-
taggedItem.getItem().getName(), taggedItem.getClass().getName());
46-
}
47-
42+
this.leakDetectedReader = new BooleanItemReader(taggedItem.getItem(), OnOffType.ON, OpenClosedType.OPEN);
4843
this.batteryStatus = batteryStatus;
4944
}
5045

5146
@Override
5247
public CompletableFuture<Boolean> getLeakDetected() {
53-
State state = getItem().getState();
54-
if (state instanceof OnOffType) {
55-
return CompletableFuture.completedFuture(state == OnOffType.ON);
56-
} else if (state instanceof OpenClosedType) {
57-
return CompletableFuture.completedFuture(state == OpenClosedType.OPEN);
58-
} else {
59-
return CompletableFuture.completedFuture(null);
60-
}
48+
return CompletableFuture.completedFuture(this.leakDetectedReader.getValue());
6149
}
6250

6351
@Override

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010

1111
import java.util.concurrent.CompletableFuture;
1212

13+
import org.eclipse.smarthome.core.items.GenericItem;
1314
import org.eclipse.smarthome.core.items.ItemRegistry;
14-
import org.eclipse.smarthome.core.library.items.SwitchItem;
1515
import org.eclipse.smarthome.core.library.types.OnOffType;
16+
import org.eclipse.smarthome.core.library.types.OpenClosedType;
1617
import org.openhab.io.homekit.internal.HomekitAccessoryUpdater;
1718
import org.openhab.io.homekit.internal.HomekitTaggedItem;
1819
import org.openhab.io.homekit.internal.battery.BatteryStatus;
@@ -25,23 +26,21 @@
2526
*
2627
* @author Tim Harper - Initial implementation
2728
*/
28-
public class HomekitMotionSensorImpl extends AbstractHomekitAccessoryImpl<SwitchItem>
29+
public class HomekitMotionSensorImpl extends AbstractHomekitAccessoryImpl<GenericItem>
2930
implements MotionSensor, BatteryStatusAccessory {
3031
private BatteryStatus batteryStatus;
32+
private BooleanItemReader motionSensedReader;
3133

3234
public HomekitMotionSensorImpl(HomekitTaggedItem taggedItem, ItemRegistry itemRegistry,
3335
HomekitAccessoryUpdater updater, BatteryStatus batteryStatus) {
34-
super(taggedItem, itemRegistry, updater, SwitchItem.class);
36+
super(taggedItem, itemRegistry, updater, GenericItem.class);
37+
this.motionSensedReader = new BooleanItemReader(taggedItem.getItem(), OnOffType.ON, OpenClosedType.OPEN);
3538
this.batteryStatus = batteryStatus;
3639
}
3740

3841
@Override
3942
public CompletableFuture<Boolean> getMotionDetected() {
40-
OnOffType state = getItem().getStateAs(OnOffType.class);
41-
if (state == null) {
42-
return CompletableFuture.completedFuture(null);
43-
}
44-
return CompletableFuture.completedFuture(state == OnOffType.ON);
43+
return CompletableFuture.completedFuture(motionSensedReader.getValue());
4544
}
4645

4746
@Override

0 commit comments

Comments
 (0)