mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-10 15:11:59 +01:00
[velbus] Add new functionality PRESSED and LONG PRESSED (#10664)
* [velbus] Add new functionality PRESSED and LONG PRESSED and fix bug New functionality: Add the the possibility to simulate the PRESSED and LONG PRESSED message of an input. Module supported with button simulation : VMB1RYS (button : CH6) VMB6IN (buttons : CH1 ... CH6) VMB2PBN, VMB6PBN, VMB7IN, VMB8IR, VMB8PB, VMB8PBU, VMBEL1, VMBEL2, VMBEL4, VMBGP1, VMBGP1-2, VMBGP2, VMBGP2-2, VMBGP4, VMBGP4-2, VMBGP4PIR, VMBGP4PIR-2 (buttons : CH1 ... CH8) VMBELO, VMBGPOD, VMBGPOD-2 (buttons : CH1 ... CH32) Fix bug: The channels names were not correctly assigned to the thing properties. The last channel had the default name, not the one retrieved from the module. Also-by: cedricboon <cedric.boon@hotmail.com> Signed-off-by: Daniel Rosengarten <github@praetorians.be>
This commit is contained in:
parent
7f05dbaf2c
commit
4ad6eda961
@ -152,18 +152,30 @@ OnOff command types are supported.
|
|||||||
For thing type `vmb4ry` 4 channels are available `CH1` ... `CH4`.
|
For thing type `vmb4ry` 4 channels are available `CH1` ... `CH4`.
|
||||||
OnOff command types are supported.
|
OnOff command types are supported.
|
||||||
|
|
||||||
For thing types `vmb1ryno`, `vmb1rynos`, `vmb1rys`, `vmb4ryld` and `vmb4ryno` 5 channels are available `CH1` ... `CH5`.
|
For thing types `vmb1ryno`, `vmb1rynos`, `vmb4ryld` and `vmb4ryno` 5 channels are available `CH1` ... `CH5`.
|
||||||
OnOff command types are supported.
|
OnOff command types are supported.
|
||||||
|
|
||||||
|
For thing types `vmb1rys` 6 channels are available `CH1` ... `CH6`.
|
||||||
|
OnOff command types are supported on channels `CH1` ... `CH5`.
|
||||||
|
Pressed and Long_Pressed command types are supported on channel `CH6`.
|
||||||
|
1 trigger channel on `CH6t`.
|
||||||
|
|
||||||
The module `vmb1ts` has a number of channels to set the module's thermostat (`thermostat:currentTemperatureSetpoint`, `thermostat:heatingModeComfortTemperatureSetpoint`, `thermostat:heatingModeDayTemperatureSetpoint`, `thermostat:heatingModeNightTemperatureSetpoint`, `thermostat:heatingModeAntiFrostTemperatureSetpoint`, `thermostat:coolingModeComfortTemperatureSetpoint`, `thermostat:coolingModeDayTemperatureSetpoint`, `thermostat:coolingModeNightTemperatureSetpoint`, `thermostat:coolingModeSafeTemperatureSetpoint`, `operatingMode` and `thermostat:mode`) and thermostat trigger channels: `thermostat:heater`, `thermostat:boost`, `thermostat:pump`, `thermostat:cooler`, `thermostat:alarm1`, `thermostat:alarm2`, `thermostat:alarm3`, `thermostat:alarm4`.
|
The module `vmb1ts` has a number of channels to set the module's thermostat (`thermostat:currentTemperatureSetpoint`, `thermostat:heatingModeComfortTemperatureSetpoint`, `thermostat:heatingModeDayTemperatureSetpoint`, `thermostat:heatingModeNightTemperatureSetpoint`, `thermostat:heatingModeAntiFrostTemperatureSetpoint`, `thermostat:coolingModeComfortTemperatureSetpoint`, `thermostat:coolingModeDayTemperatureSetpoint`, `thermostat:coolingModeNightTemperatureSetpoint`, `thermostat:coolingModeSafeTemperatureSetpoint`, `operatingMode` and `thermostat:mode`) and thermostat trigger channels: `thermostat:heater`, `thermostat:boost`, `thermostat:pump`, `thermostat:cooler`, `thermostat:alarm1`, `thermostat:alarm2`, `thermostat:alarm3`, `thermostat:alarm4`.
|
||||||
|
|
||||||
For thing types `vmb2bl` and `vmb2ble` the supported channels are `CH1` and `CH2`. UpDown, StopMove and Percent command types are supported.
|
For thing types `vmb2bl` and `vmb2ble` the supported channels are `CH1` and `CH2`. UpDown, StopMove and Percent command types are supported.
|
||||||
|
|
||||||
Thing type `vmb6in` has 6 trigger channels `input#CH1` ... `input#CH6`.
|
For thing type `vmb6in` 6 channels are available `CH1` ... `CH6`.
|
||||||
|
Pressed and Long_Pressed command types are supported on channels `button#CH1` ... `button#CH6`.
|
||||||
|
6 trigger channels on channels `input#CH1` ... `input#CH6`.
|
||||||
|
|
||||||
Thing type `vmb7in` has 8 trigger channels `input#CH1` ... `input#CH8`.
|
For thing type `vmb7in` 8 channels are available `CH1` ... `CH8`.
|
||||||
|
Pressed and Long_Pressed command types are supported on channels `button#CH1` ... `button#CH8`.
|
||||||
|
8 trigger channels on channels `input#CH1` ... `input#CH8`.
|
||||||
|
|
||||||
|
For thing types `vmb2pbn`, `vmb6pbn`, `vmb7in`, `vmb8ir`, `vmb8pb`, `vmb8pbu`, `vmbrfr8s` and `vmbvp1` 8 channels are available `CH1` ... `CH8`.
|
||||||
|
Pressed and Long_Pressed command types are supported on channels `button#CH1` ... `button#CH8`.
|
||||||
|
8 trigger channels on channels `input:CH1` ... `input:CH8`.
|
||||||
|
|
||||||
Thing types `vmb2pbn`, `vmb6pbn`, `vmb7in`, `vmb8ir`, `vmb8pb`, `vmb8pbu`, `vmbrfr8s` and `vmbvp1` have 8 trigger channels (`input:CH1` ... `input:CH8`).
|
|
||||||
Thing types `vmb2pbn`, `vmb6pbn`, `vmb7in`, `vmb8pb`, `vmb8pbu`, `vmbrfr8s` and `vmbvp1` also have and 2 channels to steer the button LED feedback (`feedback:CH1` and `feedback:CH2`).
|
Thing types `vmb2pbn`, `vmb6pbn`, `vmb7in`, `vmb8pb`, `vmb8pbu`, `vmbrfr8s` and `vmbvp1` also have and 2 channels to steer the button LED feedback (`feedback:CH1` and `feedback:CH2`).
|
||||||
Additionally, the modules `vmb2pbn`, `vmb6pbn`, `vmb7in`, `vmb8pbu`, `vmbrfr8s` and `vmbvp1` have a number of channels to set the module's alarms: `clockAlarm:clockAlarm1Enabled`, `clockAlarm:clockAlarm1Type`, `clockAlarm:clockAlarm1WakeupHour`, `clockAlarm:clockAlarm1WakeupMinute`, `clockAlarm:clockAlarm1BedtimeHour`, `clockAlarm:clockAlarm1BedtimeMinute`, `clockAlarm:clockAlarm2Enabled`, `clockAlarm:clockAlarm2Type`, `clockAlarm:clockAlarm2WakeupHour`, `clockAlarm:clockAlarm2WakeupMinute`, `clockAlarm:clockAlarm2BedtimeHour` and `clockAlarm:clockAlarm2BedtimeMinute`.
|
Additionally, the modules `vmb2pbn`, `vmb6pbn`, `vmb7in`, `vmb8pbu`, `vmbrfr8s` and `vmbvp1` have a number of channels to set the module's alarms: `clockAlarm:clockAlarm1Enabled`, `clockAlarm:clockAlarm1Type`, `clockAlarm:clockAlarm1WakeupHour`, `clockAlarm:clockAlarm1WakeupMinute`, `clockAlarm:clockAlarm1BedtimeHour`, `clockAlarm:clockAlarm1BedtimeMinute`, `clockAlarm:clockAlarm2Enabled`, `clockAlarm:clockAlarm2Type`, `clockAlarm:clockAlarm2WakeupHour`, `clockAlarm:clockAlarm2WakeupMinute`, `clockAlarm:clockAlarm2BedtimeHour` and `clockAlarm:clockAlarm2BedtimeMinute`.
|
||||||
|
|
||||||
@ -181,6 +193,7 @@ For thing type `vmb4ry` 4 channels are available `CH1` ... `CH4`.
|
|||||||
OnOff command types are supported.
|
OnOff command types are supported.
|
||||||
|
|
||||||
Thing types `vmbel1`, `vmbel2`, `vmbel4`, `vmbgp1`, `vmbgp2`, `vmbgp4`, `vmbgp4pir` and `vmbpiro` have 8 trigger channels `input:CH1` ... `input:CH8` and one temperature channel `input:CH9`.
|
Thing types `vmbel1`, `vmbel2`, `vmbel4`, `vmbgp1`, `vmbgp2`, `vmbgp4`, `vmbgp4pir` and `vmbpiro` have 8 trigger channels `input:CH1` ... `input:CH8` and one temperature channel `input:CH9`.
|
||||||
|
Pressed and Long_Pressed command types are supported on channels `button#CH1` ... `button#CH8`.
|
||||||
The thing types `vmbel1` and `vmbgp1` have one channel to steer the button LED feedback `feedback:CH1`.
|
The thing types `vmbel1` and `vmbgp1` have one channel to steer the button LED feedback `feedback:CH1`.
|
||||||
The thing types `vmbel2` and `vmbgp2` have two channels to steer the button LED feedback `feedback:CH1` and `feedback:CH2`.
|
The thing types `vmbel2` and `vmbgp2` have two channels to steer the button LED feedback `feedback:CH1` and `feedback:CH2`.
|
||||||
The thing types `vmbel4`, `vmbgp4` and `vmbgp4pir` have four channels to steer the button LED feedback `feedback:CH1` ... `feedback:CH4`.
|
The thing types `vmbel4`, `vmbgp4` and `vmbgp4pir` have four channels to steer the button LED feedback `feedback:CH1` ... `feedback:CH4`.
|
||||||
@ -189,6 +202,7 @@ Thing types `vmbel1`, `vmbel2`, `vmbel4`, `vmbgp1`, `vmbgp2`, `vmbgp4` and `vmbg
|
|||||||
Thing types `vmbel1`, `vmbel2`, `vmbel4`, `vmbgp1`, `vmbgp2`, `vmbgp4` and `vmbgp4pir` also have a number of channels to set the module's thermostat (`thermostat:currentTemperatureSetpoint`, `thermostat:heatingModeComfortTemperatureSetpoint`, `thermostat:heatingModeDayTemperatureSetpoint`, `thermostat:heatingModeNightTemperatureSetpoint`, `thermostat:heatingModeAntiFrostTemperatureSetpoint`, `thermostat:coolingModeComfortTemperatureSetpoint`, `thermostat:coolingModeDayTemperatureSetpoint`, `thermostat:coolingModeNightTemperatureSetpoint`, `thermostat:coolingModeSafeTemperatureSetpoint`, `operatingMode` and `thermostat:mode`) and thermostat trigger channels: `thermostat:heater`, `thermostat:boost`, `thermostat:pump`, `thermostat:cooler`, `thermostat:alarm1`, `thermostat:alarm2`, `thermostat:alarm3`, `thermostat:alarm4`.
|
Thing types `vmbel1`, `vmbel2`, `vmbel4`, `vmbgp1`, `vmbgp2`, `vmbgp4` and `vmbgp4pir` also have a number of channels to set the module's thermostat (`thermostat:currentTemperatureSetpoint`, `thermostat:heatingModeComfortTemperatureSetpoint`, `thermostat:heatingModeDayTemperatureSetpoint`, `thermostat:heatingModeNightTemperatureSetpoint`, `thermostat:heatingModeAntiFrostTemperatureSetpoint`, `thermostat:coolingModeComfortTemperatureSetpoint`, `thermostat:coolingModeDayTemperatureSetpoint`, `thermostat:coolingModeNightTemperatureSetpoint`, `thermostat:coolingModeSafeTemperatureSetpoint`, `operatingMode` and `thermostat:mode`) and thermostat trigger channels: `thermostat:heater`, `thermostat:boost`, `thermostat:pump`, `thermostat:cooler`, `thermostat:alarm1`, `thermostat:alarm2`, `thermostat:alarm3`, `thermostat:alarm4`.
|
||||||
|
|
||||||
Thing types `vmbelo`, `vmbgpo` and `vmbgpod` have 32 trigger channels `input:CH1` ... `input:CH32` and one temperature channel `input:CH33`.
|
Thing types `vmbelo`, `vmbgpo` and `vmbgpod` have 32 trigger channels `input:CH1` ... `input:CH32` and one temperature channel `input:CH33`.
|
||||||
|
Pressed and Long_Pressed command types are supported on channels `button#CH1` ... `button#CH32`.
|
||||||
They have have 32 channels to steer the button LED feedback `feedback:CH1` ... `feedback:CH32`.
|
They have have 32 channels to steer the button LED feedback `feedback:CH1` ... `feedback:CH32`.
|
||||||
They have a number of channels to set the module's alarms: `clockAlarm:clockAlarm1Enabled`, `clockAlarm:clockAlarm1Type`, `clockAlarm:clockAlarm1WakeupHour`, `clockAlarm:clockAlarm1WakeupMinute`, `clockAlarm:clockAlarm1BedtimeHour`, `clockAlarm:clockAlarm1BedtimeMinute`, `clockAlarm:clockAlarm2Enabled`, `clockAlarm:clockAlarm2Type`, `clockAlarm:clockAlarm2WakeupHour`, `clockAlarm:clockAlarm2WakeupMinute`, `clockAlarm:clockAlarm2BedtimeHour` and `clockAlarm:clockAlarm2BedtimeMinute`.
|
They have a number of channels to set the module's alarms: `clockAlarm:clockAlarm1Enabled`, `clockAlarm:clockAlarm1Type`, `clockAlarm:clockAlarm1WakeupHour`, `clockAlarm:clockAlarm1WakeupMinute`, `clockAlarm:clockAlarm1BedtimeHour`, `clockAlarm:clockAlarm1BedtimeMinute`, `clockAlarm:clockAlarm2Enabled`, `clockAlarm:clockAlarm2Type`, `clockAlarm:clockAlarm2WakeupHour`, `clockAlarm:clockAlarm2WakeupMinute`, `clockAlarm:clockAlarm2BedtimeHour` and `clockAlarm:clockAlarm2BedtimeMinute`.
|
||||||
They have a number of channels to set the module's thermostat thermostat (`thermostat:currentTemperatureSetpoint`, `thermostat:heatingModeComfortTemperatureSetpoint`, `thermostat:heatingModeDayTemperatureSetpoint`, `thermostat:heatingModeNightTemperatureSetpoint`, `thermostat:heatingModeAntiFrostTemperatureSetpoint`, `thermostat:coolingModeComfortTemperatureSetpoint`, `thermostat:coolingModeDayTemperatureSetpoint`, `thermostat:coolingModeNightTemperatureSetpoint`, `thermostat:coolingModeSafeTemperatureSetpoint`, `operatingMode` and `thermostat:mode`) and thermostat trigger channels: `thermostat:heater`, `thermostat:boost`, `thermostat:pump`, `thermostat:cooler`, `thermostat:alarm1`, `thermostat:alarm2`, `thermostat:alarm3`, `thermostat:alarm4`.
|
They have a number of channels to set the module's thermostat thermostat (`thermostat:currentTemperatureSetpoint`, `thermostat:heatingModeComfortTemperatureSetpoint`, `thermostat:heatingModeDayTemperatureSetpoint`, `thermostat:heatingModeNightTemperatureSetpoint`, `thermostat:heatingModeAntiFrostTemperatureSetpoint`, `thermostat:coolingModeComfortTemperatureSetpoint`, `thermostat:coolingModeDayTemperatureSetpoint`, `thermostat:coolingModeNightTemperatureSetpoint`, `thermostat:coolingModeSafeTemperatureSetpoint`, `operatingMode` and `thermostat:mode`) and thermostat trigger channels: `thermostat:heater`, `thermostat:boost`, `thermostat:pump`, `thermostat:cooler`, `thermostat:alarm1`, `thermostat:alarm2`, `thermostat:alarm3`, `thermostat:alarm4`.
|
||||||
@ -203,6 +217,9 @@ Additionally, these modules have a number of channels to set the module's alarms
|
|||||||
|
|
||||||
The trigger channels can be used as a trigger to rules. The event message can be `PRESSED`, `RELEASED`or `LONG_PRESSED`.
|
The trigger channels can be used as a trigger to rules. The event message can be `PRESSED`, `RELEASED`or `LONG_PRESSED`.
|
||||||
|
|
||||||
|
To remove the state of the Item in the Sitemap for a `button` channel.
|
||||||
|
Go to the Items list, select the Item, add a State Description Metadata, and set the Pattern value to a blank space.
|
||||||
|
|
||||||
## Full Example
|
## Full Example
|
||||||
|
|
||||||
.things:
|
.things:
|
||||||
@ -230,6 +247,7 @@ Bridge velbus:bridge:1 [ port="COM1"] {
|
|||||||
|
|
||||||
```
|
```
|
||||||
Switch LivingRoom {channel="velbus:vmb4ryld:1:06:CH1"} # Switch for onOff type action
|
Switch LivingRoom {channel="velbus:vmb4ryld:1:06:CH1"} # Switch for onOff type action
|
||||||
|
Switch KitchenButton {velbus:vmb2pbn:1:05:button#CH1} # Switch for Pressed and Long_Pressed type actions
|
||||||
Dimmer TVRoom {channel="velbus:vmb4dc:1:07:CH2"} # Changing brightness dimmer type action
|
Dimmer TVRoom {channel="velbus:vmb4dc:1:07:CH2"} # Changing brightness dimmer type action
|
||||||
Rollershutter Kitchen {channel="velbus:vmb2ble:1:01"} # Controlling rollershutter or blind type action
|
Rollershutter Kitchen {channel="velbus:vmb2ble:1:01"} # Controlling rollershutter or blind type action
|
||||||
|
|
||||||
@ -245,6 +263,12 @@ Switch item=LivingRoom
|
|||||||
Slider item=TVRoom
|
Slider item=TVRoom
|
||||||
Switch item=TVRoom # allows switching dimmer item off or on
|
Switch item=TVRoom # allows switching dimmer item off or on
|
||||||
Rollershutter item=Kitchen
|
Rollershutter item=Kitchen
|
||||||
|
|
||||||
|
Switch item=KitchenButton # Press and Long_Pressed message are available
|
||||||
|
# or
|
||||||
|
Switch item=KitchenButton mappings=[PRESSED="Push"] # only the Pressed message is send on the bus
|
||||||
|
# or
|
||||||
|
Switch item=KitchenButton mappings=[LONG_PRESSED="Push"] # only the Long_Pressed message is send on the bus
|
||||||
```
|
```
|
||||||
|
|
||||||
Example trigger rule:
|
Example trigger rule:
|
||||||
|
@ -21,6 +21,7 @@ import org.openhab.binding.velbus.internal.handler.VelbusBridgeHandler;
|
|||||||
import org.openhab.binding.velbus.internal.handler.VelbusDimmerHandler;
|
import org.openhab.binding.velbus.internal.handler.VelbusDimmerHandler;
|
||||||
import org.openhab.binding.velbus.internal.handler.VelbusNetworkBridgeHandler;
|
import org.openhab.binding.velbus.internal.handler.VelbusNetworkBridgeHandler;
|
||||||
import org.openhab.binding.velbus.internal.handler.VelbusRelayHandler;
|
import org.openhab.binding.velbus.internal.handler.VelbusRelayHandler;
|
||||||
|
import org.openhab.binding.velbus.internal.handler.VelbusRelayWithInputHandler;
|
||||||
import org.openhab.binding.velbus.internal.handler.VelbusSensorHandler;
|
import org.openhab.binding.velbus.internal.handler.VelbusSensorHandler;
|
||||||
import org.openhab.binding.velbus.internal.handler.VelbusSensorWithAlarmClockHandler;
|
import org.openhab.binding.velbus.internal.handler.VelbusSensorWithAlarmClockHandler;
|
||||||
import org.openhab.binding.velbus.internal.handler.VelbusSerialBridgeHandler;
|
import org.openhab.binding.velbus.internal.handler.VelbusSerialBridgeHandler;
|
||||||
@ -77,6 +78,8 @@ public class VelbusHandlerFactory extends BaseThingHandlerFactory {
|
|||||||
thingHandler = velbusBridgeHandler;
|
thingHandler = velbusBridgeHandler;
|
||||||
} else if (VelbusRelayHandler.SUPPORTED_THING_TYPES.contains(thingTypeUID)) {
|
} else if (VelbusRelayHandler.SUPPORTED_THING_TYPES.contains(thingTypeUID)) {
|
||||||
thingHandler = new VelbusRelayHandler(thing);
|
thingHandler = new VelbusRelayHandler(thing);
|
||||||
|
} else if (VelbusRelayWithInputHandler.SUPPORTED_THING_TYPES.contains(thingTypeUID)) {
|
||||||
|
thingHandler = new VelbusRelayWithInputHandler(thing);
|
||||||
} else if (VelbusDimmerHandler.SUPPORTED_THING_TYPES.contains(thingTypeUID)) {
|
} else if (VelbusDimmerHandler.SUPPORTED_THING_TYPES.contains(thingTypeUID)) {
|
||||||
thingHandler = new VelbusDimmerHandler(thing);
|
thingHandler = new VelbusDimmerHandler(thing);
|
||||||
} else if (VelbusBlindsHandler.SUPPORTED_THING_TYPES.contains(thingTypeUID)) {
|
} else if (VelbusBlindsHandler.SUPPORTED_THING_TYPES.contains(thingTypeUID)) {
|
||||||
|
@ -94,7 +94,7 @@ public class VelbusModule {
|
|||||||
protected String getChannelName(int channelIndex) {
|
protected String getChannelName(int channelIndex) {
|
||||||
String channelName = "";
|
String channelName = "";
|
||||||
|
|
||||||
Integer key = channelIndex - 1;
|
Integer key = channelIndex;
|
||||||
if (channelNames.containsKey(key)) {
|
if (channelNames.containsKey(key)) {
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
String channelNamePart = channelNames.get(key)[i];
|
String channelNamePart = channelNames.get(key)[i];
|
||||||
@ -147,7 +147,7 @@ public class VelbusModule {
|
|||||||
for (Integer key : keys) {
|
for (Integer key : keys) {
|
||||||
String channelName = getChannelName(key);
|
String channelName = getChannelName(key);
|
||||||
if (channelName.length() > 0) {
|
if (channelName.length() > 0) {
|
||||||
properties.put(CHANNEL + key, channelName);
|
properties.put(CHANNEL + (key + 1), channelName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,6 @@ import org.openhab.binding.velbus.internal.packets.VelbusScanPacket;
|
|||||||
import org.openhab.core.config.discovery.AbstractDiscoveryService;
|
import org.openhab.core.config.discovery.AbstractDiscoveryService;
|
||||||
import org.openhab.core.config.discovery.DiscoveryResult;
|
import org.openhab.core.config.discovery.DiscoveryResult;
|
||||||
import org.openhab.core.config.discovery.DiscoveryResultBuilder;
|
import org.openhab.core.config.discovery.DiscoveryResultBuilder;
|
||||||
import org.openhab.core.config.discovery.DiscoveryService;
|
|
||||||
import org.openhab.core.thing.ThingUID;
|
import org.openhab.core.thing.ThingUID;
|
||||||
import org.openhab.core.thing.binding.ThingHandler;
|
import org.openhab.core.thing.binding.ThingHandler;
|
||||||
import org.openhab.core.thing.binding.ThingHandlerService;
|
import org.openhab.core.thing.binding.ThingHandlerService;
|
||||||
@ -48,7 +47,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class VelbusThingDiscoveryService extends AbstractDiscoveryService
|
public class VelbusThingDiscoveryService extends AbstractDiscoveryService
|
||||||
implements DiscoveryService, ThingHandlerService, VelbusPacketListener {
|
implements ThingHandlerService, VelbusPacketListener {
|
||||||
private static final int SEARCH_TIME = 60;
|
private static final int SEARCH_TIME = 60;
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(VelbusThingDiscoveryService.class);
|
private final Logger logger = LoggerFactory.getLogger(VelbusThingDiscoveryService.class);
|
||||||
|
@ -40,9 +40,8 @@ import org.openhab.core.types.RefreshType;
|
|||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class VelbusRelayHandler extends VelbusThingHandler {
|
public class VelbusRelayHandler extends VelbusThingHandler {
|
||||||
public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES = new HashSet<>(
|
public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES = new HashSet<>(Arrays.asList(THING_TYPE_VMB1RY,
|
||||||
Arrays.asList(THING_TYPE_VMB1RY, THING_TYPE_VMB1RYNO, THING_TYPE_VMB1RYNOS, THING_TYPE_VMB1RYS,
|
THING_TYPE_VMB1RYNO, THING_TYPE_VMB1RYNOS, THING_TYPE_VMB4RY, THING_TYPE_VMB4RYLD, THING_TYPE_VMB4RYNO));
|
||||||
THING_TYPE_VMB4RY, THING_TYPE_VMB4RYLD, THING_TYPE_VMB4RYNO));
|
|
||||||
|
|
||||||
public VelbusRelayHandler(Thing thing) {
|
public VelbusRelayHandler(Thing thing) {
|
||||||
super(thing, 0);
|
super(thing, 0);
|
||||||
|
@ -0,0 +1,128 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||||
|
*
|
||||||
|
* See the NOTICE file(s) distributed with this work for additional
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available under the
|
||||||
|
* terms of the Eclipse Public License 2.0 which is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-2.0
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: EPL-2.0
|
||||||
|
*/
|
||||||
|
package org.openhab.binding.velbus.internal.handler;
|
||||||
|
|
||||||
|
import static org.openhab.binding.velbus.internal.VelbusBindingConstants.*;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
import org.openhab.binding.velbus.internal.VelbusChannelIdentifier;
|
||||||
|
import org.openhab.binding.velbus.internal.packets.VelbusButtonPacket;
|
||||||
|
import org.openhab.binding.velbus.internal.packets.VelbusPacket;
|
||||||
|
import org.openhab.core.library.types.StringType;
|
||||||
|
import org.openhab.core.thing.ChannelUID;
|
||||||
|
import org.openhab.core.thing.CommonTriggerEvents;
|
||||||
|
import org.openhab.core.thing.Thing;
|
||||||
|
import org.openhab.core.thing.ThingStatus;
|
||||||
|
import org.openhab.core.thing.ThingStatusDetail;
|
||||||
|
import org.openhab.core.thing.ThingTypeUID;
|
||||||
|
import org.openhab.core.types.Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@link VelbusRelayWithInputHandler} is responsible for handling commands, which are
|
||||||
|
* sent to one of the channels.
|
||||||
|
*
|
||||||
|
* @author Daniel Rosengarten - Initial contribution
|
||||||
|
*/
|
||||||
|
@NonNullByDefault
|
||||||
|
public class VelbusRelayWithInputHandler extends VelbusRelayHandler {
|
||||||
|
public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES = new HashSet<>(Arrays.asList(THING_TYPE_VMB1RYS));
|
||||||
|
|
||||||
|
private static final StringType PRESSED = new StringType("PRESSED");
|
||||||
|
private static final StringType LONG_PRESSED = new StringType("LONG_PRESSED");
|
||||||
|
|
||||||
|
public VelbusRelayWithInputHandler(Thing thing) {
|
||||||
|
super(thing);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleCommand(ChannelUID channelUID, Command command) {
|
||||||
|
super.handleCommand(channelUID, command);
|
||||||
|
|
||||||
|
VelbusBridgeHandler velbusBridgeHandler = getVelbusBridgeHandler();
|
||||||
|
if (velbusBridgeHandler == null) {
|
||||||
|
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isButtonChannel(channelUID) && command instanceof StringType) {
|
||||||
|
StringType stringTypeCommand = (StringType) command;
|
||||||
|
|
||||||
|
if (stringTypeCommand.equals(PRESSED) || stringTypeCommand.equals(LONG_PRESSED)) {
|
||||||
|
VelbusButtonPacket packet = new VelbusButtonPacket(getModuleAddress().getChannelIdentifier(channelUID));
|
||||||
|
|
||||||
|
packet.Pressed();
|
||||||
|
velbusBridgeHandler.sendPacket(packet.getBytes());
|
||||||
|
triggerChannel("CH6t", CommonTriggerEvents.PRESSED);
|
||||||
|
|
||||||
|
if (stringTypeCommand.equals(LONG_PRESSED)) {
|
||||||
|
packet.LongPressed();
|
||||||
|
velbusBridgeHandler.sendPacket(packet.getBytes());
|
||||||
|
triggerChannel("CH6t", CommonTriggerEvents.LONG_PRESSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
packet.Released();
|
||||||
|
velbusBridgeHandler.sendPacket(packet.getBytes());
|
||||||
|
triggerChannel("CH6t", CommonTriggerEvents.RELEASED);
|
||||||
|
} else {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"The command '" + command + "' is not supported on channel '" + channelUID + "'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isButtonChannel(ChannelUID channelUID) {
|
||||||
|
return "CH6".equals(channelUID.toString().substring(channelUID.toString().length() - 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isTriggerChannel(byte address, byte channel) {
|
||||||
|
VelbusChannelIdentifier velbusChannelIdentifier = new VelbusChannelIdentifier(address, channel);
|
||||||
|
|
||||||
|
if (getModuleAddress().getChannelNumber(velbusChannelIdentifier) == 6) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPacketReceived(byte[] packet) {
|
||||||
|
super.onPacketReceived(packet);
|
||||||
|
|
||||||
|
if (packet[0] == VelbusPacket.STX && packet.length >= 5) {
|
||||||
|
byte command = packet[4];
|
||||||
|
|
||||||
|
if (command == COMMAND_PUSH_BUTTON_STATUS && packet.length >= 6) {
|
||||||
|
byte address = packet[2];
|
||||||
|
|
||||||
|
byte channelJustPressed = packet[5];
|
||||||
|
if (isTriggerChannel(address, channelJustPressed)) {
|
||||||
|
triggerChannel("CH6t", CommonTriggerEvents.PRESSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte channelJustReleased = packet[6];
|
||||||
|
if (isTriggerChannel(address, channelJustReleased)) {
|
||||||
|
triggerChannel("CH6t", CommonTriggerEvents.RELEASED);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte channelLongPressed = packet[7];
|
||||||
|
if (isTriggerChannel(address, channelLongPressed)) {
|
||||||
|
triggerChannel("CH6t", CommonTriggerEvents.LONG_PRESSED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -20,6 +20,7 @@ import java.util.Set;
|
|||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.openhab.binding.velbus.internal.VelbusChannelIdentifier;
|
import org.openhab.binding.velbus.internal.VelbusChannelIdentifier;
|
||||||
|
import org.openhab.binding.velbus.internal.packets.VelbusButtonPacket;
|
||||||
import org.openhab.binding.velbus.internal.packets.VelbusFeedbackLEDPacket;
|
import org.openhab.binding.velbus.internal.packets.VelbusFeedbackLEDPacket;
|
||||||
import org.openhab.binding.velbus.internal.packets.VelbusPacket;
|
import org.openhab.binding.velbus.internal.packets.VelbusPacket;
|
||||||
import org.openhab.core.library.types.StringType;
|
import org.openhab.core.library.types.StringType;
|
||||||
@ -36,6 +37,7 @@ import org.openhab.core.types.Command;
|
|||||||
* sent to one of the channels.
|
* sent to one of the channels.
|
||||||
*
|
*
|
||||||
* @author Cedric Boon - Initial contribution
|
* @author Cedric Boon - Initial contribution
|
||||||
|
* @author Daniel Rosengarten - Add button simulation
|
||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class VelbusSensorHandler extends VelbusThingHandler {
|
public class VelbusSensorHandler extends VelbusThingHandler {
|
||||||
@ -48,6 +50,9 @@ public class VelbusSensorHandler extends VelbusThingHandler {
|
|||||||
private static final StringType VERY_FAST_BLINK_LED = new StringType("VERY_FAST_BLINK_LED");
|
private static final StringType VERY_FAST_BLINK_LED = new StringType("VERY_FAST_BLINK_LED");
|
||||||
private static final StringType CLEAR_LED = new StringType("CLEAR_LED");
|
private static final StringType CLEAR_LED = new StringType("CLEAR_LED");
|
||||||
|
|
||||||
|
private static final StringType PRESSED = new StringType("PRESSED");
|
||||||
|
private static final StringType LONG_PRESSED = new StringType("LONG_PRESSED");
|
||||||
|
|
||||||
public VelbusSensorHandler(Thing thing) {
|
public VelbusSensorHandler(Thing thing) {
|
||||||
this(thing, 0);
|
this(thing, 0);
|
||||||
}
|
}
|
||||||
@ -89,12 +94,44 @@ public class VelbusSensorHandler extends VelbusThingHandler {
|
|||||||
byte[] packetBytes = packet.getBytes();
|
byte[] packetBytes = packet.getBytes();
|
||||||
velbusBridgeHandler.sendPacket(packetBytes);
|
velbusBridgeHandler.sendPacket(packetBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isButtonChannel(channelUID) && command instanceof StringType) {
|
||||||
|
StringType stringTypeCommand = (StringType) command;
|
||||||
|
|
||||||
|
if (stringTypeCommand.equals(PRESSED) || stringTypeCommand.equals(LONG_PRESSED)) {
|
||||||
|
VelbusButtonPacket packet = new VelbusButtonPacket(getModuleAddress().getChannelIdentifier(channelUID));
|
||||||
|
|
||||||
|
packet.Pressed();
|
||||||
|
velbusBridgeHandler.sendPacket(packet.getBytes());
|
||||||
|
triggerChannel("input#CH" + getModuleAddress().getChannelNumber(channelUID),
|
||||||
|
CommonTriggerEvents.PRESSED);
|
||||||
|
|
||||||
|
if (stringTypeCommand.equals(LONG_PRESSED)) {
|
||||||
|
packet.LongPressed();
|
||||||
|
velbusBridgeHandler.sendPacket(packet.getBytes());
|
||||||
|
triggerChannel("input#CH" + getModuleAddress().getChannelNumber(channelUID),
|
||||||
|
CommonTriggerEvents.LONG_PRESSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
packet.Released();
|
||||||
|
velbusBridgeHandler.sendPacket(packet.getBytes());
|
||||||
|
triggerChannel("input#CH" + getModuleAddress().getChannelNumber(channelUID),
|
||||||
|
CommonTriggerEvents.RELEASED);
|
||||||
|
} else {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"The command '" + command + "' is not supported on channel '" + channelUID + "'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isFeedbackChannel(ChannelUID channelUID) {
|
private boolean isFeedbackChannel(ChannelUID channelUID) {
|
||||||
return "feedback".equals(channelUID.getGroupId());
|
return "feedback".equals(channelUID.getGroupId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isButtonChannel(ChannelUID channelUID) {
|
||||||
|
return "button".equals(channelUID.getGroupId());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPacketReceived(byte[] packet) {
|
public void onPacketReceived(byte[] packet) {
|
||||||
logger.trace("onPacketReceived() was called");
|
logger.trace("onPacketReceived() was called");
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||||
|
*
|
||||||
|
* See the NOTICE file(s) distributed with this work for additional
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available under the
|
||||||
|
* terms of the Eclipse Public License 2.0 which is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-2.0
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: EPL-2.0
|
||||||
|
*/
|
||||||
|
package org.openhab.binding.velbus.internal.packets;
|
||||||
|
|
||||||
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
import org.openhab.binding.velbus.internal.VelbusBindingConstants;
|
||||||
|
import org.openhab.binding.velbus.internal.VelbusChannelIdentifier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@link VelbusButtonPacket} represents a Velbus packet that can be used to
|
||||||
|
* simulate a pushed button.
|
||||||
|
*
|
||||||
|
* @author Daniel Rosengarten - Initial contribution
|
||||||
|
*/
|
||||||
|
@NonNullByDefault
|
||||||
|
public class VelbusButtonPacket extends VelbusPacket {
|
||||||
|
private byte channel;
|
||||||
|
private byte[] data;
|
||||||
|
|
||||||
|
public VelbusButtonPacket(VelbusChannelIdentifier velbusChannelIdentifier) {
|
||||||
|
super(velbusChannelIdentifier.getAddress(), PRIO_HI, false);
|
||||||
|
|
||||||
|
this.channel = velbusChannelIdentifier.getChannelByte();
|
||||||
|
this.data = new byte[] { VelbusBindingConstants.COMMAND_PUSH_BUTTON_STATUS, (byte) 0x00, (byte) 0x00,
|
||||||
|
(byte) 0x00 };
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Pressed() {
|
||||||
|
data = new byte[] { VelbusBindingConstants.COMMAND_PUSH_BUTTON_STATUS, channel, (byte) 0x00, (byte) 0x00 };
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LongPressed() {
|
||||||
|
data = new byte[] { VelbusBindingConstants.COMMAND_PUSH_BUTTON_STATUS, (byte) 0x00, (byte) 0x00, channel };
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Released() {
|
||||||
|
data = new byte[] { VelbusBindingConstants.COMMAND_PUSH_BUTTON_STATUS, (byte) 0x00, channel, (byte) 0x00 };
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected byte[] getDataBytes() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -136,16 +136,18 @@
|
|||||||
</supported-bridge-type-refs>
|
</supported-bridge-type-refs>
|
||||||
|
|
||||||
<label>VMB1RYS</label>
|
<label>VMB1RYS</label>
|
||||||
<description>1-channel relay module</description>
|
<description>1-channel relay module with input</description>
|
||||||
<channels>
|
<channels>
|
||||||
<channel id="CH1" typeId="switch"/>
|
<channel id="CH1" typeId="switch"/>
|
||||||
<channel id="CH2" typeId="switch"/>
|
<channel id="CH2" typeId="switch"/>
|
||||||
<channel id="CH3" typeId="switch"/>
|
<channel id="CH3" typeId="switch"/>
|
||||||
<channel id="CH4" typeId="switch"/>
|
<channel id="CH4" typeId="switch"/>
|
||||||
<channel id="CH5" typeId="switch"/>
|
<channel id="CH5" typeId="switch"/>
|
||||||
|
<channel id="CH6" typeId="button-channel"/>
|
||||||
|
<channel id="CH6t" typeId="trigger-channel"/>
|
||||||
</channels>
|
</channels>
|
||||||
|
|
||||||
<config-description-ref uri="thing-type:velbus:5channelDevice"/>
|
<config-description-ref uri="thing-type:velbus:6channelDevice"/>
|
||||||
</thing-type>
|
</thing-type>
|
||||||
|
|
||||||
<thing-type id="vmb1ts">
|
<thing-type id="vmb1ts">
|
||||||
@ -206,6 +208,7 @@
|
|||||||
<description>Push-button interface for Niko 1- or 2-fold push-buttons</description>
|
<description>Push-button interface for Niko 1- or 2-fold push-buttons</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="8channelInputModule"/>
|
<channel-group id="input" typeId="8channelInputModule"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="2channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="2channelFeedbackModule"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
</channel-groups>
|
</channel-groups>
|
||||||
@ -313,6 +316,7 @@
|
|||||||
<description>6-channel input module</description>
|
<description>6-channel input module</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="6channelInputModule"/>
|
<channel-group id="input" typeId="6channelInputModule"/>
|
||||||
|
<channel-group id="button" typeId="6channelButtonModule"/>
|
||||||
</channel-groups>
|
</channel-groups>
|
||||||
|
|
||||||
<config-description-ref uri="thing-type:velbus:6channelDevice"/>
|
<config-description-ref uri="thing-type:velbus:6channelDevice"/>
|
||||||
@ -328,6 +332,7 @@
|
|||||||
<description>Push-button interface module for Niko 4- or 6-fold push-button</description>
|
<description>Push-button interface module for Niko 4- or 6-fold push-button</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="8channelInputModule"/>
|
<channel-group id="input" typeId="8channelInputModule"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="6channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="6channelFeedbackModule"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
</channel-groups>
|
</channel-groups>
|
||||||
@ -345,6 +350,7 @@
|
|||||||
<description>7-channel input module (potentialfree + pulse)</description>
|
<description>7-channel input module (potentialfree + pulse)</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="8channelInputModule"/>
|
<channel-group id="input" typeId="8channelInputModule"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="counter" typeId="4channelCounterModule"/>
|
<channel-group id="counter" typeId="4channelCounterModule"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
</channel-groups>
|
</channel-groups>
|
||||||
@ -362,6 +368,7 @@
|
|||||||
<description>Infrared remote control receiver module</description>
|
<description>Infrared remote control receiver module</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="8channelInputModule"/>
|
<channel-group id="input" typeId="8channelInputModule"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
</channel-groups>
|
</channel-groups>
|
||||||
|
|
||||||
<config-description-ref uri="thing-type:velbus:8channelDevice"/>
|
<config-description-ref uri="thing-type:velbus:8channelDevice"/>
|
||||||
@ -377,6 +384,7 @@
|
|||||||
<description>8-Channel Push Button module</description>
|
<description>8-Channel Push Button module</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="8channelInputModule"/>
|
<channel-group id="input" typeId="8channelInputModule"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="8channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="8channelFeedbackModule"/>
|
||||||
</channel-groups>
|
</channel-groups>
|
||||||
|
|
||||||
@ -393,6 +401,7 @@
|
|||||||
<description>Push-button interface with 8 channels for universal mounting</description>
|
<description>Push-button interface with 8 channels for universal mounting</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="8channelInputModule"/>
|
<channel-group id="input" typeId="8channelInputModule"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="8channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="8channelFeedbackModule"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
</channel-groups>
|
</channel-groups>
|
||||||
@ -455,6 +464,7 @@
|
|||||||
<description>Edge-lit one touch button module</description>
|
<description>Edge-lit one touch button module</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="1channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="1channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -473,6 +483,7 @@
|
|||||||
<description>Edge-lit two touch buttons module</description>
|
<description>Edge-lit two touch buttons module</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="2channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="2channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -491,6 +502,7 @@
|
|||||||
<description>Edge-lit four touch buttons module</description>
|
<description>Edge-lit four touch buttons module</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -509,6 +521,7 @@
|
|||||||
<description>Edge-lit touch panel with Oled display</description>
|
<description>Edge-lit touch panel with Oled display</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="33channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="33channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="32channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="32channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="32channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -528,6 +541,7 @@
|
|||||||
<description>Glass control module with 1 touch key</description>
|
<description>Glass control module with 1 touch key</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="1channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="1channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -546,6 +560,7 @@
|
|||||||
<description>Glass control module with 1 touch key (Edition 2)</description>
|
<description>Glass control module with 1 touch key (Edition 2)</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="1channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="1channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -564,6 +579,7 @@
|
|||||||
<description>Glass control module with 2 touch keys</description>
|
<description>Glass control module with 2 touch keys</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="2channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="2channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -582,6 +598,7 @@
|
|||||||
<description>Glass control module with 2 touch keys (Edition 2)</description>
|
<description>Glass control module with 2 touch keys (Edition 2)</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="2channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="2channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -600,6 +617,7 @@
|
|||||||
<description>Glass control module with 4 touch keys</description>
|
<description>Glass control module with 4 touch keys</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -618,6 +636,7 @@
|
|||||||
<description>Glass control module with 4 touch keys (Edition 2)</description>
|
<description>Glass control module with 4 touch keys (Edition 2)</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -636,6 +655,7 @@
|
|||||||
<description>Glass control module with 4 touch keys and built-in motion and twilight sensor</description>
|
<description>Glass control module with 4 touch keys and built-in motion and twilight sensor</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -654,6 +674,7 @@
|
|||||||
<description>Glass control module with 4 touch keys and built-in motion and twilight sensor (Edition 2)</description>
|
<description>Glass control module with 4 touch keys and built-in motion and twilight sensor (Edition 2)</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="9channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="8channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="4channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -672,6 +693,7 @@
|
|||||||
<description>Glass control module with oled display</description>
|
<description>Glass control module with oled display</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="33channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="33channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="32channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="32channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="32channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -691,6 +713,7 @@
|
|||||||
<description>Glass control module with oled display and temperature controller</description>
|
<description>Glass control module with oled display and temperature controller</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="33channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="33channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="32channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="32channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="32channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -710,6 +733,7 @@
|
|||||||
<description>Glass control module with oled display and temperature controller (Edition 2)</description>
|
<description>Glass control module with oled display and temperature controller (Edition 2)</description>
|
||||||
<channel-groups>
|
<channel-groups>
|
||||||
<channel-group id="input" typeId="33channelInputModuleWithTemperatureSensor"/>
|
<channel-group id="input" typeId="33channelInputModuleWithTemperatureSensor"/>
|
||||||
|
<channel-group id="button" typeId="32channelButtonModule"/>
|
||||||
<channel-group id="feedback" typeId="32channelFeedbackModule"/>
|
<channel-group id="feedback" typeId="32channelFeedbackModule"/>
|
||||||
<channel-group id="thermostat" typeId="thermostat"/>
|
<channel-group id="thermostat" typeId="thermostat"/>
|
||||||
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
<channel-group id="clockAlarm" typeId="clockAlarm"/>
|
||||||
@ -877,6 +901,17 @@
|
|||||||
<description>Switch control for action in Velbus</description>
|
<description>Switch control for action in Velbus</description>
|
||||||
<category>Switch</category>
|
<category>Switch</category>
|
||||||
</channel-type>
|
</channel-type>
|
||||||
|
<channel-type id="button-channel">
|
||||||
|
<item-type>String</item-type>
|
||||||
|
<label>Button Channel</label>
|
||||||
|
<category>Switch</category>
|
||||||
|
<command>
|
||||||
|
<options>
|
||||||
|
<option value="PRESSED">pressed</option>
|
||||||
|
<option value="LONG_PRESSED">long pressed</option>
|
||||||
|
</options>
|
||||||
|
</command>
|
||||||
|
</channel-type>
|
||||||
<channel-type id="brightness">
|
<channel-type id="brightness">
|
||||||
<item-type>Dimmer</item-type>
|
<item-type>Dimmer</item-type>
|
||||||
<label>Brightness</label>
|
<label>Brightness</label>
|
||||||
@ -1257,6 +1292,76 @@
|
|||||||
<channel id="CH32" typeId="ledFeedback"/>
|
<channel id="CH32" typeId="ledFeedback"/>
|
||||||
</channels>
|
</channels>
|
||||||
</channel-group-type>
|
</channel-group-type>
|
||||||
|
<channel-group-type id="6channelButtonModule">
|
||||||
|
<label>Button</label>
|
||||||
|
<description>
|
||||||
|
This is a generic module with 6 button channels.
|
||||||
|
</description>
|
||||||
|
<channels>
|
||||||
|
<channel id="CH1" typeId="button-channel"/>
|
||||||
|
<channel id="CH2" typeId="button-channel"/>
|
||||||
|
<channel id="CH3" typeId="button-channel"/>
|
||||||
|
<channel id="CH4" typeId="button-channel"/>
|
||||||
|
<channel id="CH5" typeId="button-channel"/>
|
||||||
|
<channel id="CH6" typeId="button-channel"/>
|
||||||
|
</channels>
|
||||||
|
</channel-group-type>
|
||||||
|
<channel-group-type id="8channelButtonModule">
|
||||||
|
<label>Button</label>
|
||||||
|
<description>
|
||||||
|
This is a generic module with 8 button channels.
|
||||||
|
</description>
|
||||||
|
<channels>
|
||||||
|
<channel id="CH1" typeId="button-channel"/>
|
||||||
|
<channel id="CH2" typeId="button-channel"/>
|
||||||
|
<channel id="CH3" typeId="button-channel"/>
|
||||||
|
<channel id="CH4" typeId="button-channel"/>
|
||||||
|
<channel id="CH5" typeId="button-channel"/>
|
||||||
|
<channel id="CH6" typeId="button-channel"/>
|
||||||
|
<channel id="CH7" typeId="button-channel"/>
|
||||||
|
<channel id="CH8" typeId="button-channel"/>
|
||||||
|
</channels>
|
||||||
|
</channel-group-type>
|
||||||
|
<channel-group-type id="32channelButtonModule">
|
||||||
|
<label>Button</label>
|
||||||
|
<description>
|
||||||
|
This is a generic module with 32 button channels.
|
||||||
|
</description>
|
||||||
|
<channels>
|
||||||
|
<channel id="CH1" typeId="button-channel"/>
|
||||||
|
<channel id="CH2" typeId="button-channel"/>
|
||||||
|
<channel id="CH3" typeId="button-channel"/>
|
||||||
|
<channel id="CH4" typeId="button-channel"/>
|
||||||
|
<channel id="CH5" typeId="button-channel"/>
|
||||||
|
<channel id="CH6" typeId="button-channel"/>
|
||||||
|
<channel id="CH7" typeId="button-channel"/>
|
||||||
|
<channel id="CH8" typeId="button-channel"/>
|
||||||
|
<channel id="CH9" typeId="button-channel"/>
|
||||||
|
<channel id="CH10" typeId="button-channel"/>
|
||||||
|
<channel id="CH11" typeId="button-channel"/>
|
||||||
|
<channel id="CH12" typeId="button-channel"/>
|
||||||
|
<channel id="CH13" typeId="button-channel"/>
|
||||||
|
<channel id="CH14" typeId="button-channel"/>
|
||||||
|
<channel id="CH15" typeId="button-channel"/>
|
||||||
|
<channel id="CH16" typeId="button-channel"/>
|
||||||
|
<channel id="CH17" typeId="button-channel"/>
|
||||||
|
<channel id="CH18" typeId="button-channel"/>
|
||||||
|
<channel id="CH19" typeId="button-channel"/>
|
||||||
|
<channel id="CH20" typeId="button-channel"/>
|
||||||
|
<channel id="CH21" typeId="button-channel"/>
|
||||||
|
<channel id="CH22" typeId="button-channel"/>
|
||||||
|
<channel id="CH23" typeId="button-channel"/>
|
||||||
|
<channel id="CH24" typeId="button-channel"/>
|
||||||
|
<channel id="CH25" typeId="button-channel"/>
|
||||||
|
<channel id="CH26" typeId="button-channel"/>
|
||||||
|
<channel id="CH27" typeId="button-channel"/>
|
||||||
|
<channel id="CH28" typeId="button-channel"/>
|
||||||
|
<channel id="CH29" typeId="button-channel"/>
|
||||||
|
<channel id="CH30" typeId="button-channel"/>
|
||||||
|
<channel id="CH31" typeId="button-channel"/>
|
||||||
|
<channel id="CH32" typeId="button-channel"/>
|
||||||
|
</channels>
|
||||||
|
</channel-group-type>
|
||||||
<channel-group-type id="oledDisplay">
|
<channel-group-type id="oledDisplay">
|
||||||
<label>O-LED Display</label>
|
<label>O-LED Display</label>
|
||||||
<channels>
|
<channels>
|
||||||
|
Loading…
Reference in New Issue
Block a user