Skip to content

Commit 09012ce

Browse files
authored
[serial] Support chaining transformations without an intersection symbol (openhab#17313)
Signed-off-by: Jimmy Tanagra <[email protected]>
1 parent 6f55f3d commit 09012ce

18 files changed

+104
-348
lines changed

Diff for: bundles/org.openhab.binding.serial/README.md

+12-7
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ The configuration for the `serialBridge` channels consists of the following para
8383

8484
| Parameter | Description | Supported Channels |
8585
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- |
86-
| `stateTransformation` | One or more transformation (concatenated with ``) used to convert device data to channel state, e.g. `REGEX:.*?STATE=(.*?);.*` | string, number, dimmer, switch, rollershutter |
87-
| `commandTransformation` | One or more transformation (concatenated with ``) used to convert command to device data, e.g. `JS:device.js` | string, number, dimmer, switch, rollershutter |
86+
| `stateTransformation` | One or more transformation (concatenated with ``) used to convert device data to channel state, e.g. `REGEX(.*?STATE=(.*?);.*)` | string, number, dimmer, switch, rollershutter |
87+
| `commandTransformation` | One or more transformation (concatenated with ``) used to convert command to device data, e.g. `JS(device.js)` | string, number, dimmer, switch, rollershutter |
8888
| `commandFormat` | Format string applied to the command before transform, e.g. `ID=671;COMMAND=%s` | string, number, dimmer, rollershutter |
8989
| `onValue` | Send this value when receiving an ON command | switch, dimmer |
9090
| `offValue` | Send this value when receiving an OFF command | switch, dimmer |
@@ -94,6 +94,11 @@ The configuration for the `serialBridge` channels consists of the following para
9494
| `downValue` | Send this value when receiving a DOWN command | rollershutter |
9595
| `stopValue` | Send this value when receiving a STOP command | rollershutter |
9696

97+
Transformations can be chained in the UI by listing each transformation on a separate line, or by separating them with the mathematical intersection character "∩".
98+
Transformations are defined using this syntax: `TYPE(FUNCTION)`, e.g.: `JSONPATH($.path)`.
99+
The syntax: `TYPE:FUNCTION` is still supported, e.g.: `JSONPATH:$.path`.
100+
Please note that the values will be discarded if one transformation fails (e.g. REGEX did not match).
101+
97102
## Full Example
98103

99104
The following example is for a device connected to a serial port which provides data for many different sensors and we are interested in the temperature from a particular sensor.
@@ -106,21 +111,21 @@ demo.things:
106111
Bridge serial:serialBridge:sensors [serialPort="/dev/ttyUSB01", baudRate=57600] {
107112
Thing serialDevice temperatureSensor [patternMatch="20;05;Cresta;ID=2801;.*"] {
108113
Channels:
109-
Type number : temperature [stateTransformation="REGEX:.*?TEMP=(.*?);.*"]
110-
Type number : humidity [stateTransformation="REGEX:.*?HUM=(.*?);.*"]
114+
Type number : temperature [stateTransformation="REGEX(.*?TEMP=(.*?);.*)"]
115+
Type number : humidity [stateTransformation="REGEX(.*?HUM=(.*?);.*)"]
111116
}
112117
Thing serialDevice rollershutter [patternMatch=".*"] {
113118
Channels:
114-
Type rollershutter : serialRollo [stateTransformation="REGEX:Position:([0-9.]*)", upValue="Rollo_UP\n", downValue="Rollo_DOWN\n", stopValue="Rollo_STOP\n"]
115-
Type switch : roloAt100 [stateTransformation="REGEX:s/Position:100/ON/"]
119+
Type rollershutter : serialRollo [stateTransformation="REGEX(Position:([0-9.]*))", upValue="Rollo_UP\n", downValue="Rollo_DOWN\n", stopValue="Rollo_STOP\n"]
120+
Type switch : roloAt100 [stateTransformation="REGEX(s/Position:100/ON/)"]
116121
}
117122
Thing serialDevice relay [patternMatch=".*"] {
118123
Channels:
119124
Type switch : serialRelay [onValue="Q1_ON\n", offValue="Q1_OFF\n"]
120125
}
121126
Thing serialDevice myDevice [patternMatch="ID=2341;.*"] {
122127
Channels:
123-
Type string : control [commandTransformation="JS:addCheckSum.js", commandFormat="ID=2341;COMMAND=%s;"]
128+
Type string : control [commandTransformation="JS(addCheckSum.js)", commandFormat="ID=2341;COMMAND=%s;"]
124129
}
125130
}
126131

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/SerialHandlerFactory.java

+2-16
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,13 @@
2121
import org.eclipse.jdt.annotation.Nullable;
2222
import org.openhab.binding.serial.internal.handler.SerialBridgeHandler;
2323
import org.openhab.binding.serial.internal.handler.SerialDeviceHandler;
24-
import org.openhab.binding.serial.internal.transform.CascadedValueTransformationImpl;
25-
import org.openhab.binding.serial.internal.transform.NoOpValueTransformation;
26-
import org.openhab.binding.serial.internal.transform.ValueTransformation;
27-
import org.openhab.binding.serial.internal.transform.ValueTransformationProvider;
2824
import org.openhab.core.io.transport.serial.SerialPortManager;
2925
import org.openhab.core.thing.Bridge;
3026
import org.openhab.core.thing.Thing;
3127
import org.openhab.core.thing.ThingTypeUID;
3228
import org.openhab.core.thing.binding.BaseThingHandlerFactory;
3329
import org.openhab.core.thing.binding.ThingHandler;
3430
import org.openhab.core.thing.binding.ThingHandlerFactory;
35-
import org.openhab.core.transform.TransformationHelper;
3631
import org.osgi.service.component.annotations.Activate;
3732
import org.osgi.service.component.annotations.Component;
3833
import org.osgi.service.component.annotations.Reference;
@@ -45,7 +40,7 @@
4540
*/
4641
@NonNullByDefault
4742
@Component(configurationPid = "binding.serial", service = ThingHandlerFactory.class)
48-
public class SerialHandlerFactory extends BaseThingHandlerFactory implements ValueTransformationProvider {
43+
public class SerialHandlerFactory extends BaseThingHandlerFactory {
4944

5045
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_BRIDGE, THING_TYPE_DEVICE);
5146

@@ -68,18 +63,9 @@ public boolean supportsThingType(final ThingTypeUID thingTypeUID) {
6863
if (THING_TYPE_BRIDGE.equals(thingTypeUID)) {
6964
return new SerialBridgeHandler((Bridge) thing, serialPortManager);
7065
} else if (THING_TYPE_DEVICE.equals(thingTypeUID)) {
71-
return new SerialDeviceHandler(thing, this);
66+
return new SerialDeviceHandler(thing);
7267
}
7368

7469
return null;
7570
}
76-
77-
@Override
78-
public ValueTransformation getValueTransformation(@Nullable final String pattern) {
79-
if (pattern == null) {
80-
return NoOpValueTransformation.getInstance();
81-
}
82-
return new CascadedValueTransformationImpl(pattern,
83-
name -> TransformationHelper.getTransformationService(bundleContext, name));
84-
}
8571
}

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/channel/ChannelConfig.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
*/
1313
package org.openhab.binding.serial.internal.channel;
1414

15+
import java.util.List;
16+
1517
import org.eclipse.jdt.annotation.NonNullByDefault;
1618
import org.eclipse.jdt.annotation.Nullable;
1719

@@ -25,12 +27,12 @@ public class ChannelConfig {
2527
/**
2628
* Transform for received data
2729
*/
28-
public @Nullable String stateTransformation;
30+
public @Nullable List<String> stateTransformation;
2931

3032
/**
3133
* Transform for command
3234
*/
33-
public @Nullable String commandTransformation;
35+
public @Nullable List<String> commandTransformation;
3436

3537
/**
3638
* Format string for command

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/channel/DeviceChannel.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
import java.util.Optional;
1717

1818
import org.eclipse.jdt.annotation.NonNullByDefault;
19-
import org.openhab.binding.serial.internal.transform.ValueTransformation;
20-
import org.openhab.binding.serial.internal.transform.ValueTransformationProvider;
19+
import org.openhab.core.thing.binding.generic.ChannelTransformation;
2120
import org.openhab.core.types.Command;
2221
import org.slf4j.Logger;
2322
import org.slf4j.LoggerFactory;
@@ -34,13 +33,14 @@ public abstract class DeviceChannel {
3433

3534
protected final ChannelConfig config;
3635

37-
private final ValueTransformation stateTransform;
38-
private final ValueTransformation commandTransform;
36+
private final ChannelTransformation stateTransform;
37+
private final ChannelTransformation commandTransform;
3938

40-
protected DeviceChannel(final ValueTransformationProvider valueTransformationProvider, final ChannelConfig config) {
39+
protected DeviceChannel(final ChannelConfig config) {
4140
this.config = config;
42-
stateTransform = valueTransformationProvider.getValueTransformation(config.stateTransformation);
43-
commandTransform = valueTransformationProvider.getValueTransformation(config.commandTransformation);
41+
42+
stateTransform = new ChannelTransformation(config.stateTransformation);
43+
commandTransform = new ChannelTransformation(config.commandTransformation);
4444
}
4545

4646
/**

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/channel/DeviceChannelFactory.java

+6-8
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import org.eclipse.jdt.annotation.NonNullByDefault;
2222
import org.eclipse.jdt.annotation.Nullable;
23-
import org.openhab.binding.serial.internal.transform.ValueTransformationProvider;
2423

2524
/**
2625
* A factory to create {@link DeviceChannel} objects
@@ -38,26 +37,25 @@ public class DeviceChannelFactory {
3837
* @param channelTypeID the channel type id
3938
* @return the DeviceChannel or null if the channel type is not supported.
4039
*/
41-
public static @Nullable DeviceChannel createDeviceChannel(
42-
final ValueTransformationProvider valueTransformationProvider, final ChannelConfig channelConfig,
40+
public static @Nullable DeviceChannel createDeviceChannel(final ChannelConfig channelConfig,
4341
final String channelTypeID) {
4442
DeviceChannel deviceChannel;
4543

4644
switch (channelTypeID) {
4745
case DEVICE_STRING_CHANNEL:
48-
deviceChannel = new StringChannel(valueTransformationProvider, channelConfig);
46+
deviceChannel = new StringChannel(channelConfig);
4947
break;
5048
case DEVICE_NUMBER_CHANNEL:
51-
deviceChannel = new NumberChannel(valueTransformationProvider, channelConfig);
49+
deviceChannel = new NumberChannel(channelConfig);
5250
break;
5351
case DEVICE_DIMMER_CHANNEL:
54-
deviceChannel = new DimmerChannel(valueTransformationProvider, channelConfig);
52+
deviceChannel = new DimmerChannel(channelConfig);
5553
break;
5654
case DEVICE_SWITCH_CHANNEL:
57-
deviceChannel = new SwitchChannel(valueTransformationProvider, channelConfig);
55+
deviceChannel = new SwitchChannel(channelConfig);
5856
break;
5957
case DEVICE_ROLLERSHUTTER_CHANNEL:
60-
deviceChannel = new RollershutterChannel(valueTransformationProvider, channelConfig);
58+
deviceChannel = new RollershutterChannel(channelConfig);
6159
break;
6260
default:
6361
deviceChannel = null;

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/channel/DimmerChannel.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.util.Optional;
1616

1717
import org.eclipse.jdt.annotation.NonNullByDefault;
18-
import org.openhab.binding.serial.internal.transform.ValueTransformationProvider;
1918
import org.openhab.core.library.types.IncreaseDecreaseType;
2019
import org.openhab.core.library.types.OnOffType;
2120
import org.openhab.core.types.Command;
@@ -28,8 +27,8 @@
2827
@NonNullByDefault
2928
public class DimmerChannel extends SwitchChannel {
3029

31-
public DimmerChannel(final ValueTransformationProvider valueTransformationProvider, final ChannelConfig config) {
32-
super(valueTransformationProvider, config);
30+
public DimmerChannel(final ChannelConfig config) {
31+
super(config);
3332
}
3433

3534
@Override

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/channel/NumberChannel.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
package org.openhab.binding.serial.internal.channel;
1414

1515
import org.eclipse.jdt.annotation.NonNullByDefault;
16-
import org.openhab.binding.serial.internal.transform.ValueTransformationProvider;
1716

1817
/**
1918
* The {@link NumberChannel} channel applies a format followed by a transform.
@@ -23,7 +22,7 @@
2322
@NonNullByDefault
2423
public class NumberChannel extends DeviceChannel {
2524

26-
public NumberChannel(final ValueTransformationProvider valueTransformationProvider, final ChannelConfig config) {
27-
super(valueTransformationProvider, config);
25+
public NumberChannel(final ChannelConfig config) {
26+
super(config);
2827
}
2928
}

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/channel/RollershutterChannel.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.util.Optional;
1616

1717
import org.eclipse.jdt.annotation.NonNullByDefault;
18-
import org.openhab.binding.serial.internal.transform.ValueTransformationProvider;
1918
import org.openhab.core.library.types.StopMoveType;
2019
import org.openhab.core.library.types.UpDownType;
2120
import org.openhab.core.types.Command;
@@ -28,9 +27,8 @@
2827
@NonNullByDefault
2928
public class RollershutterChannel extends DeviceChannel {
3029

31-
public RollershutterChannel(final ValueTransformationProvider valueTransformationProvider,
32-
final ChannelConfig config) {
33-
super(valueTransformationProvider, config);
30+
public RollershutterChannel(final ChannelConfig config) {
31+
super(config);
3432
}
3533

3634
@Override

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/channel/StringChannel.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
package org.openhab.binding.serial.internal.channel;
1414

1515
import org.eclipse.jdt.annotation.NonNullByDefault;
16-
import org.openhab.binding.serial.internal.transform.ValueTransformationProvider;
1716

1817
/**
1918
* The {@link StringChannel} channel applies a format followed by a transform.
@@ -23,7 +22,7 @@
2322
@NonNullByDefault
2423
public class StringChannel extends DeviceChannel {
2524

26-
public StringChannel(final ValueTransformationProvider valueTransformationProvider, final ChannelConfig config) {
27-
super(valueTransformationProvider, config);
25+
public StringChannel(final ChannelConfig config) {
26+
super(config);
2827
}
2928
}

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/channel/SwitchChannel.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.util.Optional;
1616

1717
import org.eclipse.jdt.annotation.NonNullByDefault;
18-
import org.openhab.binding.serial.internal.transform.ValueTransformationProvider;
1918
import org.openhab.core.library.types.OnOffType;
2019
import org.openhab.core.types.Command;
2120

@@ -27,8 +26,8 @@
2726
@NonNullByDefault
2827
public class SwitchChannel extends DeviceChannel {
2928

30-
public SwitchChannel(final ValueTransformationProvider valueTransformationProvider, final ChannelConfig config) {
31-
super(valueTransformationProvider, config);
29+
public SwitchChannel(final ChannelConfig config) {
30+
super(config);
3231
}
3332

3433
@Override

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/handler/SerialDeviceHandler.java

+3-7
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.openhab.binding.serial.internal.channel.ChannelConfig;
2323
import org.openhab.binding.serial.internal.channel.DeviceChannel;
2424
import org.openhab.binding.serial.internal.channel.DeviceChannelFactory;
25-
import org.openhab.binding.serial.internal.transform.ValueTransformationProvider;
2625
import org.openhab.core.library.types.StringType;
2726
import org.openhab.core.thing.Bridge;
2827
import org.openhab.core.thing.Channel;
@@ -45,17 +44,14 @@
4544
@NonNullByDefault
4645
public class SerialDeviceHandler extends BaseThingHandler {
4746

48-
private final ValueTransformationProvider valueTransformationProvider;
49-
5047
private @Nullable Pattern devicePattern;
5148

5249
private @Nullable String lastValue;
5350

5451
private final Map<ChannelUID, DeviceChannel> channels = new HashMap<>();
5552

56-
public SerialDeviceHandler(final Thing thing, final ValueTransformationProvider valueTransformationProvider) {
53+
public SerialDeviceHandler(final Thing thing) {
5754
super(thing);
58-
this.valueTransformationProvider = valueTransformationProvider;
5955
}
6056

6157
@Override
@@ -100,8 +96,8 @@ public void initialize() {
10096
if (type != null) {
10197
final ChannelConfig channelConfig = c.getConfiguration().as(ChannelConfig.class);
10298
try {
103-
final DeviceChannel deviceChannel = DeviceChannelFactory
104-
.createDeviceChannel(valueTransformationProvider, channelConfig, type.getId());
99+
final DeviceChannel deviceChannel = DeviceChannelFactory.createDeviceChannel(channelConfig,
100+
type.getId());
105101
if (deviceChannel != null) {
106102
channels.put(c.getUID(), deviceChannel);
107103
}

Diff for: bundles/org.openhab.binding.serial/src/main/java/org/openhab/binding/serial/internal/transform/CascadedValueTransformationImpl.java

-54
This file was deleted.

0 commit comments

Comments
 (0)