[insteon] Add ezx10rf x10 transceiver support (#18294)

Signed-off-by: Jeremy Setton <jeremy.setton@gmail.com>
pull/14578/merge
Jeremy 2025-02-20 04:50:11 -05:00 committed by GitHub
parent 664c981c81
commit c3fa94302d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 536 additions and 30 deletions

View File

@ -351,8 +351,24 @@ In order to determine which channels a device supports, check the device in the
| event-button-bottom | Event Button Bottom |
| event-button-top | Event Button Top |
| im-event-button | Event Button |
| x10-event1 | X10 Event 1 |
| x10-event2 | X10 Event 2 |
| x10-event3 | X10 Event 3 |
| x10-event4 | X10 Event 4 |
| x10-event5 | X10 Event 5 |
| x10-event6 | X10 Event 6 |
| x10-event7 | X10 Event 7 |
| x10-event8 | X10 Event 8 |
| x10-event9 | X10 Event 9 |
| x10-event10 | X10 Event 10 |
| x10-event11 | X10 Event 11 |
| x10-event12 | X10 Event 12 |
| x10-event13 | X10 Event 13 |
| x10-event14 | X10 Event 14 |
| x10-event15 | X10 Event 15 |
| x10-event16 | X10 Event 16 |
The supported triggered events for Insteon Device things:
The button events for supported Insteon devices:
| Event | Description |
| -------------------- | ------------------------------------- |
@ -364,7 +380,7 @@ The supported triggered events for Insteon Device things:
| `HELD_DOWN` | Button Held Down (Manual Change Down) |
| `RELEASED` | Button Released (Manual Change Stop) |
And for Insteon Hub and PLM things:
And for Insteon Hubs and PLMs:
| Event | Description |
| ---------- | --------------- |
@ -372,6 +388,15 @@ And for Insteon Hub and PLM things:
| `HELD` | Button Held |
| `RELEASED` | Button Released |
The events for the Insteon X10 RF Transceiver (EZX10RF):
| Event | Description |
| -------- | ----------- |
| `ON` | On |
| `OFF` | Off |
| `BRIGHT` | Bright |
| `DIM` | Dim |
### Legacy Channels
<details>

View File

@ -39,6 +39,9 @@ public class DeviceTypeRegistry extends InsteonResourceLoader {
private static final DeviceTypeRegistry DEVICE_TYPE_REGISTRY = new DeviceTypeRegistry();
private static final String RESOURCE_NAME = "/device-types.xml";
private static final List<String> EXCLUDED_BASE_FEATURES = List.of("NetworkBridge_Hub", "NetworkBridge_PLM",
"X10_Dimmer", "X10_Sensor", "X10_Switch");
private Map<String, DeviceType> deviceTypes = new LinkedHashMap<>();
private Map<String, FeatureEntry> baseFeatures = new LinkedHashMap<>();
@ -135,8 +138,8 @@ public class DeviceTypeRegistry extends InsteonResourceLoader {
}
}
}
// add base features if device type not network brige or x10 categories
if (!name.startsWith("NetworkBridge") && !name.startsWith("X10")) {
// add base features if device type not in excluded list
if (!EXCLUDED_BASE_FEATURES.contains(name)) {
baseFeatures.forEach(features::putIfAbsent);
}
deviceTypes.put(name, new DeviceType(name, flags, features, links));

View File

@ -44,9 +44,11 @@ public class LinkDBReader implements PortListener {
private @Nullable ScheduledFuture<?> job;
private ByteArrayOutputStream stream = new ByteArrayOutputStream();
private boolean done = true;
private boolean standardMode = true;
private long lastMsgReceived;
private int location;
private int lastMSB;
private int recordCount;
public LinkDBReader(InsteonModem modem, ScheduledExecutorService scheduler) {
this.modem = modem;
@ -66,8 +68,14 @@ public class LinkDBReader implements PortListener {
job = scheduler.scheduleWithFixedDelay(() -> {
if (System.currentTimeMillis() - lastMsgReceived > DatabaseManager.MESSAGE_TIMEOUT) {
logger.debug("link database reader timed out for {}, aborting", device.getAddress());
done();
if (standardMode && recordCount == 0 && device.isAwake()) {
logger.debug("all link database request timed out for {}, trying peek method instead",
device.getAddress());
getPeekRecords();
} else {
logger.debug("link database reader timed out for {}, aborting", device.getAddress());
done();
}
}
}, 0, 1000, TimeUnit.MILLISECONDS);
}
@ -75,6 +83,8 @@ public class LinkDBReader implements PortListener {
private void getAllRecords() {
lastMsgReceived = System.currentTimeMillis();
done = false;
standardMode = true;
recordCount = 0;
modem.getPort().registerListener(this);
@ -111,6 +121,8 @@ public class LinkDBReader implements PortListener {
}
private void getPeekRecords() {
standardMode = false;
lastMsgReceived = System.currentTimeMillis();
location = device.getLinkDB().getFirstRecordLocation();
lastMSB = -1;
getNextPeekRecord();
@ -216,7 +228,7 @@ public class LinkDBReader implements PortListener {
return;
}
logger.trace("got link db record #{} for {}", device.getLinkDB().size(), device.getAddress());
logger.trace("got link db record #{} for {}", ++recordCount, device.getAddress());
if (record.isLast()) {
logger.trace("got last link db record for {}", device.getAddress());

View File

@ -478,6 +478,32 @@ public class FeatureEnums {
}
}
public static enum X10Event {
ON,
OFF,
BRIGHT,
DIM;
public static X10Event valueOf(int cmd) throws IllegalArgumentException {
switch (cmd) {
case 0x02:
case 0x11:
return X10Event.ON;
case 0x03:
case 0x13:
return X10Event.OFF;
case 0x05:
case 0x15:
return X10Event.BRIGHT;
case 0x04:
case 0x16:
return X10Event.DIM;
default:
throw new IllegalArgumentException("unexpected x10 event");
}
}
}
public interface DeviceTypeRenamer {
String getNewDeviceType(String deviceType);
}

View File

@ -49,6 +49,7 @@ import org.openhab.binding.insteon.internal.device.feature.FeatureEnums.Thermost
import org.openhab.binding.insteon.internal.device.feature.FeatureEnums.ThermostatTemperatureScale;
import org.openhab.binding.insteon.internal.device.feature.FeatureEnums.ThermostatTimeFormat;
import org.openhab.binding.insteon.internal.device.feature.FeatureEnums.VenstarSystemMode;
import org.openhab.binding.insteon.internal.device.feature.FeatureEnums.X10Event;
import org.openhab.binding.insteon.internal.transport.message.FieldException;
import org.openhab.binding.insteon.internal.transport.message.Msg;
import org.openhab.binding.insteon.internal.utils.BinaryUtils;
@ -1850,11 +1851,10 @@ public abstract class MessageHandler extends BaseFeatureHandler {
}
/**
* Process X10 messages that are generated when another controller
* changes the state of an X10 device.
* X10 on message handler
*/
public static class X10OnHandler extends MessageHandler {
X10OnHandler(DeviceFeature feature) {
public static class X10OnMsgHandler extends MessageHandler {
X10OnMsgHandler(DeviceFeature feature) {
super(feature);
}
@ -1865,8 +1865,11 @@ public abstract class MessageHandler extends BaseFeatureHandler {
}
}
public static class X10OffHandler extends MessageHandler {
X10OffHandler(DeviceFeature feature) {
/**
* X10 off message handler
*/
public static class X10OffMsgHandler extends MessageHandler {
X10OffMsgHandler(DeviceFeature feature) {
super(feature);
}
@ -1877,8 +1880,11 @@ public abstract class MessageHandler extends BaseFeatureHandler {
}
}
public static class X10BrightHandler extends MessageHandler {
X10BrightHandler(DeviceFeature feature) {
/**
* X10 brighten message handler
*/
public static class X10BrightMsgHandler extends MessageHandler {
X10BrightMsgHandler(DeviceFeature feature) {
super(feature);
}
@ -1888,8 +1894,11 @@ public abstract class MessageHandler extends BaseFeatureHandler {
}
}
public static class X10DimHandler extends MessageHandler {
X10DimHandler(DeviceFeature feature) {
/**
* X10 dim message handler
*/
public static class X10DimMsgHandler extends MessageHandler {
X10DimMsgHandler(DeviceFeature feature) {
super(feature);
}
@ -1899,8 +1908,11 @@ public abstract class MessageHandler extends BaseFeatureHandler {
}
}
public static class X10OpenHandler extends MessageHandler {
X10OpenHandler(DeviceFeature feature) {
/**
* X10 open message handler
*/
public static class X10OpenMsgHandler extends MessageHandler {
X10OpenMsgHandler(DeviceFeature feature) {
super(feature);
}
@ -1911,8 +1923,11 @@ public abstract class MessageHandler extends BaseFeatureHandler {
}
}
public static class X10ClosedHandler extends MessageHandler {
X10ClosedHandler(DeviceFeature feature) {
/**
* X10 closed message handler
*/
public static class X10ClosedMsgHandler extends MessageHandler {
X10ClosedMsgHandler(DeviceFeature feature) {
super(feature);
}
@ -1923,6 +1938,28 @@ public abstract class MessageHandler extends BaseFeatureHandler {
}
}
/**
* X10 event message handler
*/
public static class X10EventMsgHandler extends MessageHandler {
X10EventMsgHandler(DeviceFeature feature) {
super(feature);
}
@Override
public void handleMessage(byte cmd1, Msg msg) {
try {
X10Event event = X10Event.valueOf(cmd1);
logger.debug("{}: device {} {} received event {}", nm(), getDevice().getAddress(), feature.getName(),
event);
feature.triggerEvent(event.toString());
feature.pollRelatedDevices(0L);
} catch (IllegalArgumentException e) {
logger.warn("{}: got unexpected x10 event: {}", nm(), HexUtils.getHexString(cmd1));
}
}
}
/**
* Factory method for dermining if a message handler command supports group
*

View File

@ -372,18 +372,185 @@ channel-type.insteon.valve7.label = Valve 7
channel-type.insteon.valve8.label = Valve 8
channel-type.insteon.event-button.label = Event Button
channel-type.insteon.event-button.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button.event.option.HELD_UP = Held Up
channel-type.insteon.event-button.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button.event.option.RELEASED = Released
channel-type.insteon.event-button-a.label = Event Button A
channel-type.insteon.event-button-a.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-a.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-a.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-a.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-a.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-a.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-a.event.option.RELEASED = Released
channel-type.insteon.event-button-b.label = Event Button B
channel-type.insteon.event-button-b.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-b.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-b.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-b.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-b.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-b.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-b.event.option.RELEASED = Released
channel-type.insteon.event-button-c.label = Event Button C
channel-type.insteon.event-button-c.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-c.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-c.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-c.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-c.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-c.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-c.event.option.RELEASED = Released
channel-type.insteon.event-button-d.label = Event Button D
channel-type.insteon.event-button-d.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-d.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-d.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-d.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-d.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-d.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-d.event.option.RELEASED = Released
channel-type.insteon.event-button-e.label = Event Button E
channel-type.insteon.event-button-e.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-e.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-e.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-e.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-e.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-e.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-e.event.option.RELEASED = Released
channel-type.insteon.event-button-f.label = Event Button F
channel-type.insteon.event-button-f.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-f.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-f.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-f.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-f.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-f.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-f.event.option.RELEASED = Released
channel-type.insteon.event-button-g.label = Event Button G
channel-type.insteon.event-button-g.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-g.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-g.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-g.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-g.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-g.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-g.event.option.RELEASED = Released
channel-type.insteon.event-button-h.label = Event Button H
channel-type.insteon.event-button-h.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-h.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-h.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-h.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-h.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-h.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-h.event.option.RELEASED = Released
channel-type.insteon.event-button-main.label = Event Button Main
channel-type.insteon.event-button-main.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-main.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-main.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-main.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-main.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-main.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-main.event.option.RELEASED = Released
channel-type.insteon.event-button-bottom.label = Event Button Bottom
channel-type.insteon.event-button-bottom.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-bottom.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-bottom.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-bottom.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-bottom.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-bottom.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-bottom.event.option.RELEASED = Released
channel-type.insteon.event-button-top.label = Event Button Top
channel-type.insteon.event-button-top.event.option.PRESSED_ON = Pressed On
channel-type.insteon.event-button-top.event.option.PRESSED_OFF = Pressed Off
channel-type.insteon.event-button-top.event.option.DOUBLE_PRESSED_ON = Double Pressed On
channel-type.insteon.event-button-top.event.option.DOUBLE_PRESSED_OFF = Double Pressed Off
channel-type.insteon.event-button-top.event.option.HELD_UP = Held Up
channel-type.insteon.event-button-top.event.option.HELD_DOWN = Held Down
channel-type.insteon.event-button-top.event.option.RELEASED = Released
channel-type.insteon.im-event-button.label = Event Button
channel-type.insteon.im-event-button.event.option.PRESSED = Pressed
channel-type.insteon.im-event-button.event.option.HELD = Held
channel-type.insteon.im-event-button.event.option.RELEASED = Released
channel-type.insteon.x10-event1.label = X10 Event 1
channel-type.insteon.x10-event1.event.option.ON = On
channel-type.insteon.x10-event1.event.option.OFF = Off
channel-type.insteon.x10-event1.event.option.BRIGHT = Bright
channel-type.insteon.x10-event1.event.option.DIM = Dim
channel-type.insteon.x10-event2.label = X10 Event 2
channel-type.insteon.x10-event2.event.option.ON = On
channel-type.insteon.x10-event2.event.option.OFF = Off
channel-type.insteon.x10-event2.event.option.BRIGHT = Bright
channel-type.insteon.x10-event2.event.option.DIM = Dim
channel-type.insteon.x10-event3.label = X10 Event 3
channel-type.insteon.x10-event3.event.option.ON = On
channel-type.insteon.x10-event3.event.option.OFF = Off
channel-type.insteon.x10-event3.event.option.BRIGHT = Bright
channel-type.insteon.x10-event3.event.option.DIM = Dim
channel-type.insteon.x10-event4.label = X10 Event 4
channel-type.insteon.x10-event4.event.option.ON = On
channel-type.insteon.x10-event4.event.option.OFF = Off
channel-type.insteon.x10-event4.event.option.BRIGHT = Bright
channel-type.insteon.x10-event4.event.option.DIM = Dim
channel-type.insteon.x10-event5.label = X10 Event 5
channel-type.insteon.x10-event5.event.option.ON = On
channel-type.insteon.x10-event5.event.option.OFF = Off
channel-type.insteon.x10-event5.event.option.BRIGHT = Bright
channel-type.insteon.x10-event5.event.option.DIM = Dim
channel-type.insteon.x10-event6.label = X10 Event 6
channel-type.insteon.x10-event6.event.option.ON = On
channel-type.insteon.x10-event6.event.option.OFF = Off
channel-type.insteon.x10-event6.event.option.BRIGHT = Bright
channel-type.insteon.x10-event6.event.option.DIM = Dim
channel-type.insteon.x10-event7.label = X10 Event 7
channel-type.insteon.x10-event7.event.option.ON = On
channel-type.insteon.x10-event7.event.option.OFF = Off
channel-type.insteon.x10-event7.event.option.BRIGHT = Bright
channel-type.insteon.x10-event7.event.option.DIM = Dim
channel-type.insteon.x10-event8.label = X10 Event 8
channel-type.insteon.x10-event8.event.option.ON = On
channel-type.insteon.x10-event8.event.option.OFF = Off
channel-type.insteon.x10-event8.event.option.BRIGHT = Bright
channel-type.insteon.x10-event8.event.option.DIM = Dim
channel-type.insteon.x10-event9.label = X10 Event 9
channel-type.insteon.x10-event9.event.option.ON = On
channel-type.insteon.x10-event9.event.option.OFF = Off
channel-type.insteon.x10-event9.event.option.BRIGHT = Bright
channel-type.insteon.x10-event9.event.option.DIM = Dim
channel-type.insteon.x10-event10.label = X10 Event 10
channel-type.insteon.x10-event10.event.option.ON = On
channel-type.insteon.x10-event10.event.option.OFF = Off
channel-type.insteon.x10-event10.event.option.BRIGHT = Bright
channel-type.insteon.x10-event10.event.option.DIM = Dim
channel-type.insteon.x10-event11.label = X10 Event 11
channel-type.insteon.x10-event11.event.option.ON = On
channel-type.insteon.x10-event11.event.option.OFF = Off
channel-type.insteon.x10-event11.event.option.BRIGHT = Bright
channel-type.insteon.x10-event11.event.option.DIM = Dim
channel-type.insteon.x10-event12.label = X10 Event 12
channel-type.insteon.x10-event12.event.option.ON = On
channel-type.insteon.x10-event12.event.option.OFF = Off
channel-type.insteon.x10-event12.event.option.BRIGHT = Bright
channel-type.insteon.x10-event12.event.option.DIM = Dim
channel-type.insteon.x10-event13.label = X10 Event 13
channel-type.insteon.x10-event13.event.option.ON = On
channel-type.insteon.x10-event13.event.option.OFF = Off
channel-type.insteon.x10-event13.event.option.BRIGHT = Bright
channel-type.insteon.x10-event13.event.option.DIM = Dim
channel-type.insteon.x10-event14.label = X10 Event 14
channel-type.insteon.x10-event14.event.option.ON = On
channel-type.insteon.x10-event14.event.option.OFF = Off
channel-type.insteon.x10-event14.event.option.BRIGHT = Bright
channel-type.insteon.x10-event14.event.option.DIM = Dim
channel-type.insteon.x10-event15.label = X10 Event 15
channel-type.insteon.x10-event15.event.option.ON = On
channel-type.insteon.x10-event15.event.option.OFF = Off
channel-type.insteon.x10-event15.event.option.BRIGHT = Bright
channel-type.insteon.x10-event15.event.option.DIM = Dim
channel-type.insteon.x10-event16.label = X10 Event 16
channel-type.insteon.x10-event16.event.option.ON = On
channel-type.insteon.x10-event16.event.option.OFF = Off
channel-type.insteon.x10-event16.event.option.BRIGHT = Bright
channel-type.insteon.x10-event16.event.option.DIM = Dim
channel-type.insteon.legacyAcDelay.label = AC Delay
channel-type.insteon.legacyBacklightDuration.label = Back Light Duration

View File

@ -1028,4 +1028,211 @@
</event>
</channel-type>
<channel-type id="x10-event1" advanced="true">
<kind>trigger</kind>
<label>X10 Event 1</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event2" advanced="true">
<kind>trigger</kind>
<label>X10 Event 2</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event3" advanced="true">
<kind>trigger</kind>
<label>X10 Event 3</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event4" advanced="true">
<kind>trigger</kind>
<label>X10 Event 4</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event5" advanced="true">
<kind>trigger</kind>
<label>X10 Event 5</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event6" advanced="true">
<kind>trigger</kind>
<label>X10 Event 6</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event7" advanced="true">
<kind>trigger</kind>
<label>X10 Event 7</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event8" advanced="true">
<kind>trigger</kind>
<label>X10 Event 8</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event9" advanced="true">
<kind>trigger</kind>
<label>X10 Event 9</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event10" advanced="true">
<kind>trigger</kind>
<label>X10 Event 10</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event11" advanced="true">
<kind>trigger</kind>
<label>X10 Event 11</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event12" advanced="true">
<kind>trigger</kind>
<label>X10 Event 12</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event13" advanced="true">
<kind>trigger</kind>
<label>X10 Event 13</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event14" advanced="true">
<kind>trigger</kind>
<label>X10 Event 14</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event15" advanced="true">
<kind>trigger</kind>
<label>X10 Event 15</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
<channel-type id="x10-event16" advanced="true">
<kind>trigger</kind>
<label>X10 Event 16</label>
<event>
<options>
<option value="ON"/>
<option value="OFF"/>
<option value="BRIGHT"/>
<option value="DIM"/>
</options>
</event>
</channel-type>
</thing:thing-descriptions>

View File

@ -1066,10 +1066,10 @@
<feature-type name="X10Dimmer">
<message-dispatcher>X10Dispatcher</message-dispatcher>
<message-handler command="0x02">X10OnHandler</message-handler>
<message-handler command="0x03">X10OffHandler</message-handler>
<message-handler command="0x05">X10BrightHandler</message-handler>
<message-handler command="0x04">X10DimHandler</message-handler>
<message-handler command="0x02">X10OnMsgHandler</message-handler>
<message-handler command="0x03">X10OffMsgHandler</message-handler>
<message-handler command="0x05">X10BrightMsgHandler</message-handler>
<message-handler command="0x04">X10DimMsgHandler</message-handler>
<message-handler default="true">NoOpMsgHandler</message-handler>
<command-handler command="OnOffType">X10OnOffCommandHandler</command-handler>
<command-handler command="PercentType">X10PercentCommandHandler</command-handler>
@ -1078,8 +1078,8 @@
</feature-type>
<feature-type name="X10Switch">
<message-dispatcher>X10Dispatcher</message-dispatcher>
<message-handler command="0x02">X10OnHandler</message-handler>
<message-handler command="0x03">X10OffHandler</message-handler>
<message-handler command="0x02">X10OnMsgHandler</message-handler>
<message-handler command="0x03">X10OffMsgHandler</message-handler>
<message-handler default="true">NoOpMsgHandler</message-handler>
<command-handler command="OnOffType">X10OnOffCommandHandler</command-handler>
<command-handler command="PercentType">NoOpCommandHandler</command-handler>
@ -1088,10 +1088,19 @@
</feature-type>
<feature-type name="X10Contact">
<message-dispatcher>X10Dispatcher</message-dispatcher>
<message-handler command="0x02">X10OpenHandler</message-handler>
<message-handler command="0x03">X10ClosedHandler</message-handler>
<message-handler command="0x02">X10OpenMsgHandler</message-handler>
<message-handler command="0x03">X10ClosedMsgHandler</message-handler>
<message-handler default="true">NoOpMsgHandler</message-handler>
<command-handler default="true">NoOpCommandHandler</command-handler>
<poll-handler>NoPollHandler</poll-handler>
</feature-type>
<feature-type name="X10BridgeEvent" event="true">
<message-dispatcher>DefaultDispatcher</message-dispatcher>
<message-handler command="0x11" group="1">X10EventMsgHandler</message-handler>
<message-handler command="0x13" group="1">X10EventMsgHandler</message-handler>
<message-handler command="0x15" group="1">X10EventMsgHandler</message-handler>
<message-handler command="0x16" group="1">X10EventMsgHandler</message-handler>
<message-handler default="true">NoOpMsgHandler</message-handler>
<command-handler default="true">NoOpCommandHandler</command-handler>
</feature-type>
</xml>

View File

@ -968,6 +968,7 @@
<description>X10 RF Transceiver</description>
<model>EZX10RF</model>
<vendor>Compacta</vendor>
<device-type>NetworkBridge_X10</device-type>
</product>
<product devCat="0x03" subCat="0x0E" productKey="0x00002C">
<description>X10 Translator</description>

View File

@ -1,6 +1,6 @@
<xml>
<!-- Base features for all device types except Network Bridge and X10 -->
<!-- Base features for all device types except specific Network Bridge and X10 -->
<base-features>
<feature name="insteonEngine">InsteonEngine</feature>
@ -678,6 +678,25 @@
</feature-group>
</device-type>
<device-type name="NetworkBridge_X10">
<feature name="x10Event1" group="1">X10BridgeEvent</feature>
<feature name="x10Event2" group="2">X10BridgeEvent</feature>
<feature name="x10Event3" group="3">X10BridgeEvent</feature>
<feature name="x10Event4" group="4">X10BridgeEvent</feature>
<feature name="x10Event5" group="5">X10BridgeEvent</feature>
<feature name="x10Event6" group="6">X10BridgeEvent</feature>
<feature name="x10Event7" group="7">X10BridgeEvent</feature>
<feature name="x10Event8" group="8">X10BridgeEvent</feature>
<feature name="x10Event9" group="9">X10BridgeEvent</feature>
<feature name="x10Event10" group="10">X10BridgeEvent</feature>
<feature name="x10Event11" group="11">X10BridgeEvent</feature>
<feature name="x10Event12" group="12">X10BridgeEvent</feature>
<feature name="x10Event13" group="13">X10BridgeEvent</feature>
<feature name="x10Event14" group="14">X10BridgeEvent</feature>
<feature name="x10Event15" group="15">X10BridgeEvent</feature>
<feature name="x10Event16" group="16">X10BridgeEvent</feature>
</device-type>
<!-- Irrigation Control -->
<device-type name="IrrigationControl_Sprinkler">