Skip to content

Commit c3fa943

Browse files
authored
[insteon] Add ezx10rf x10 transceiver support (openhab#18294)
Signed-off-by: Jeremy Setton <[email protected]>
1 parent 664c981 commit c3fa943

File tree

10 files changed

+537
-31
lines changed

10 files changed

+537
-31
lines changed

bundles/org.openhab.binding.insteon/README.md

+28-3
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,24 @@ In order to determine which channels a device supports, check the device in the
351351
| event-button-bottom | Event Button Bottom |
352352
| event-button-top | Event Button Top |
353353
| im-event-button | Event Button |
354-
355-
The supported triggered events for Insteon Device things:
354+
| x10-event1 | X10 Event 1 |
355+
| x10-event2 | X10 Event 2 |
356+
| x10-event3 | X10 Event 3 |
357+
| x10-event4 | X10 Event 4 |
358+
| x10-event5 | X10 Event 5 |
359+
| x10-event6 | X10 Event 6 |
360+
| x10-event7 | X10 Event 7 |
361+
| x10-event8 | X10 Event 8 |
362+
| x10-event9 | X10 Event 9 |
363+
| x10-event10 | X10 Event 10 |
364+
| x10-event11 | X10 Event 11 |
365+
| x10-event12 | X10 Event 12 |
366+
| x10-event13 | X10 Event 13 |
367+
| x10-event14 | X10 Event 14 |
368+
| x10-event15 | X10 Event 15 |
369+
| x10-event16 | X10 Event 16 |
370+
371+
The button events for supported Insteon devices:
356372

357373
| Event | Description |
358374
| -------------------- | ------------------------------------- |
@@ -364,14 +380,23 @@ The supported triggered events for Insteon Device things:
364380
| `HELD_DOWN` | Button Held Down (Manual Change Down) |
365381
| `RELEASED` | Button Released (Manual Change Stop) |
366382

367-
And for Insteon Hub and PLM things:
383+
And for Insteon Hubs and PLMs:
368384

369385
| Event | Description |
370386
| ---------- | --------------- |
371387
| `PRESSED` | Button Pressed |
372388
| `HELD` | Button Held |
373389
| `RELEASED` | Button Released |
374390

391+
The events for the Insteon X10 RF Transceiver (EZX10RF):
392+
393+
| Event | Description |
394+
| -------- | ----------- |
395+
| `ON` | On |
396+
| `OFF` | Off |
397+
| `BRIGHT` | Bright |
398+
| `DIM` | Dim |
399+
375400
### Legacy Channels
376401

377402
<details>

bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/device/DeviceTypeRegistry.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public class DeviceTypeRegistry extends InsteonResourceLoader {
3939
private static final DeviceTypeRegistry DEVICE_TYPE_REGISTRY = new DeviceTypeRegistry();
4040
private static final String RESOURCE_NAME = "/device-types.xml";
4141

42+
private static final List<String> EXCLUDED_BASE_FEATURES = List.of("NetworkBridge_Hub", "NetworkBridge_PLM",
43+
"X10_Dimmer", "X10_Sensor", "X10_Switch");
44+
4245
private Map<String, DeviceType> deviceTypes = new LinkedHashMap<>();
4346
private Map<String, FeatureEntry> baseFeatures = new LinkedHashMap<>();
4447

@@ -135,8 +138,8 @@ private void parseDeviceType(Element element) throws SAXException {
135138
}
136139
}
137140
}
138-
// add base features if device type not network brige or x10 categories
139-
if (!name.startsWith("NetworkBridge") && !name.startsWith("X10")) {
141+
// add base features if device type not in excluded list
142+
if (!EXCLUDED_BASE_FEATURES.contains(name)) {
140143
baseFeatures.forEach(features::putIfAbsent);
141144
}
142145
deviceTypes.put(name, new DeviceType(name, flags, features, links));

bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/device/database/LinkDBReader.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ public class LinkDBReader implements PortListener {
4444
private @Nullable ScheduledFuture<?> job;
4545
private ByteArrayOutputStream stream = new ByteArrayOutputStream();
4646
private boolean done = true;
47+
private boolean standardMode = true;
4748
private long lastMsgReceived;
4849
private int location;
4950
private int lastMSB;
51+
private int recordCount;
5052

5153
public LinkDBReader(InsteonModem modem, ScheduledExecutorService scheduler) {
5254
this.modem = modem;
@@ -66,15 +68,23 @@ public void read(InsteonDevice device) {
6668

6769
job = scheduler.scheduleWithFixedDelay(() -> {
6870
if (System.currentTimeMillis() - lastMsgReceived > DatabaseManager.MESSAGE_TIMEOUT) {
69-
logger.debug("link database reader timed out for {}, aborting", device.getAddress());
70-
done();
71+
if (standardMode && recordCount == 0 && device.isAwake()) {
72+
logger.debug("all link database request timed out for {}, trying peek method instead",
73+
device.getAddress());
74+
getPeekRecords();
75+
} else {
76+
logger.debug("link database reader timed out for {}, aborting", device.getAddress());
77+
done();
78+
}
7179
}
7280
}, 0, 1000, TimeUnit.MILLISECONDS);
7381
}
7482

7583
private void getAllRecords() {
7684
lastMsgReceived = System.currentTimeMillis();
7785
done = false;
86+
standardMode = true;
87+
recordCount = 0;
7888

7989
modem.getPort().registerListener(this);
8090

@@ -111,6 +121,8 @@ private void done() {
111121
}
112122

113123
private void getPeekRecords() {
124+
standardMode = false;
125+
lastMsgReceived = System.currentTimeMillis();
114126
location = device.getLinkDB().getFirstRecordLocation();
115127
lastMSB = -1;
116128
getNextPeekRecord();
@@ -216,7 +228,7 @@ private void addRecord(LinkDBRecord record) {
216228
return;
217229
}
218230

219-
logger.trace("got link db record #{} for {}", device.getLinkDB().size(), device.getAddress());
231+
logger.trace("got link db record #{} for {}", ++recordCount, device.getAddress());
220232

221233
if (record.isLast()) {
222234
logger.trace("got last link db record for {}", device.getAddress());

bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/device/feature/FeatureEnums.java

+26
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,32 @@ public static ThermostatTimeFormat from(String label) throws IllegalArgumentExce
478478
}
479479
}
480480

481+
public static enum X10Event {
482+
ON,
483+
OFF,
484+
BRIGHT,
485+
DIM;
486+
487+
public static X10Event valueOf(int cmd) throws IllegalArgumentException {
488+
switch (cmd) {
489+
case 0x02:
490+
case 0x11:
491+
return X10Event.ON;
492+
case 0x03:
493+
case 0x13:
494+
return X10Event.OFF;
495+
case 0x05:
496+
case 0x15:
497+
return X10Event.BRIGHT;
498+
case 0x04:
499+
case 0x16:
500+
return X10Event.DIM;
501+
default:
502+
throw new IllegalArgumentException("unexpected x10 event");
503+
}
504+
}
505+
}
506+
481507
public interface DeviceTypeRenamer {
482508
String getNewDeviceType(String deviceType);
483509
}

bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/device/feature/MessageHandler.java

+51-14
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.openhab.binding.insteon.internal.device.feature.FeatureEnums.ThermostatTemperatureScale;
5050
import org.openhab.binding.insteon.internal.device.feature.FeatureEnums.ThermostatTimeFormat;
5151
import org.openhab.binding.insteon.internal.device.feature.FeatureEnums.VenstarSystemMode;
52+
import org.openhab.binding.insteon.internal.device.feature.FeatureEnums.X10Event;
5253
import org.openhab.binding.insteon.internal.transport.message.FieldException;
5354
import org.openhab.binding.insteon.internal.transport.message.Msg;
5455
import org.openhab.binding.insteon.internal.utils.BinaryUtils;
@@ -1850,11 +1851,10 @@ public void handleMessage(byte cmd1, Msg msg) {
18501851
}
18511852

18521853
/**
1853-
* Process X10 messages that are generated when another controller
1854-
* changes the state of an X10 device.
1854+
* X10 on message handler
18551855
*/
1856-
public static class X10OnHandler extends MessageHandler {
1857-
X10OnHandler(DeviceFeature feature) {
1856+
public static class X10OnMsgHandler extends MessageHandler {
1857+
X10OnMsgHandler(DeviceFeature feature) {
18581858
super(feature);
18591859
}
18601860

@@ -1865,8 +1865,11 @@ public void handleMessage(byte cmd1, Msg msg) {
18651865
}
18661866
}
18671867

1868-
public static class X10OffHandler extends MessageHandler {
1869-
X10OffHandler(DeviceFeature feature) {
1868+
/**
1869+
* X10 off message handler
1870+
*/
1871+
public static class X10OffMsgHandler extends MessageHandler {
1872+
X10OffMsgHandler(DeviceFeature feature) {
18701873
super(feature);
18711874
}
18721875

@@ -1877,8 +1880,11 @@ public void handleMessage(byte cmd1, Msg msg) {
18771880
}
18781881
}
18791882

1880-
public static class X10BrightHandler extends MessageHandler {
1881-
X10BrightHandler(DeviceFeature feature) {
1883+
/**
1884+
* X10 brighten message handler
1885+
*/
1886+
public static class X10BrightMsgHandler extends MessageHandler {
1887+
X10BrightMsgHandler(DeviceFeature feature) {
18821888
super(feature);
18831889
}
18841890

@@ -1888,8 +1894,11 @@ public void handleMessage(byte cmd1, Msg msg) {
18881894
}
18891895
}
18901896

1891-
public static class X10DimHandler extends MessageHandler {
1892-
X10DimHandler(DeviceFeature feature) {
1897+
/**
1898+
* X10 dim message handler
1899+
*/
1900+
public static class X10DimMsgHandler extends MessageHandler {
1901+
X10DimMsgHandler(DeviceFeature feature) {
18931902
super(feature);
18941903
}
18951904

@@ -1899,8 +1908,11 @@ public void handleMessage(byte cmd1, Msg msg) {
18991908
}
19001909
}
19011910

1902-
public static class X10OpenHandler extends MessageHandler {
1903-
X10OpenHandler(DeviceFeature feature) {
1911+
/**
1912+
* X10 open message handler
1913+
*/
1914+
public static class X10OpenMsgHandler extends MessageHandler {
1915+
X10OpenMsgHandler(DeviceFeature feature) {
19041916
super(feature);
19051917
}
19061918

@@ -1911,8 +1923,11 @@ public void handleMessage(byte cmd1, Msg msg) {
19111923
}
19121924
}
19131925

1914-
public static class X10ClosedHandler extends MessageHandler {
1915-
X10ClosedHandler(DeviceFeature feature) {
1926+
/**
1927+
* X10 closed message handler
1928+
*/
1929+
public static class X10ClosedMsgHandler extends MessageHandler {
1930+
X10ClosedMsgHandler(DeviceFeature feature) {
19161931
super(feature);
19171932
}
19181933

@@ -1923,6 +1938,28 @@ public void handleMessage(byte cmd1, Msg msg) {
19231938
}
19241939
}
19251940

1941+
/**
1942+
* X10 event message handler
1943+
*/
1944+
public static class X10EventMsgHandler extends MessageHandler {
1945+
X10EventMsgHandler(DeviceFeature feature) {
1946+
super(feature);
1947+
}
1948+
1949+
@Override
1950+
public void handleMessage(byte cmd1, Msg msg) {
1951+
try {
1952+
X10Event event = X10Event.valueOf(cmd1);
1953+
logger.debug("{}: device {} {} received event {}", nm(), getDevice().getAddress(), feature.getName(),
1954+
event);
1955+
feature.triggerEvent(event.toString());
1956+
feature.pollRelatedDevices(0L);
1957+
} catch (IllegalArgumentException e) {
1958+
logger.warn("{}: got unexpected x10 event: {}", nm(), HexUtils.getHexString(cmd1));
1959+
}
1960+
}
1961+
}
1962+
19261963
/**
19271964
* Factory method for dermining if a message handler command supports group
19281965
*

0 commit comments

Comments
 (0)