[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:
Daniel Rosengarten 2021-05-29 20:23:29 +02:00 committed by GitHub
parent 7f05dbaf2c
commit 4ad6eda961
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 362 additions and 13 deletions

View File

@ -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:

View File

@ -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)) {

View File

@ -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);
} }
} }

View File

@ -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);

View File

@ -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);

View File

@ -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);
}
}
}
}
}

View File

@ -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");

View File

@ -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;
}
}

View File

@ -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>