Skip to content

Commit c4b7e62

Browse files
committed
Thing channels access
1 parent 70ff841 commit c4b7e62

File tree

12 files changed

+130
-15
lines changed

12 files changed

+130
-15
lines changed

pom.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<version>4.2.1-SNAPSHOT</version>
1414

1515
<properties>
16+
<testcontainers.version>1.20.4</testcontainers.version>
1617
<bnd.importpackage>com.sun.org.apache.xml.internal.utils.*;resolution:=optional,\
1718
com.sun.org.apache.xpath.internal.*;resolution:=optional,\
1819
org.apache.log.*;resolution:=optional,\
@@ -77,19 +78,19 @@
7778
<dependency>
7879
<groupId>org.testcontainers</groupId>
7980
<artifactId>junit-jupiter</artifactId>
80-
<version>1.17.6</version>
81+
<version>${testcontainers.version}</version>
8182
<scope>test</scope>
8283
</dependency>
8384
<dependency>
8485
<groupId>org.testcontainers</groupId>
8586
<artifactId>toxiproxy</artifactId>
86-
<version>1.17.6</version>
87+
<version>${testcontainers.version}</version>
8788
<scope>test</scope>
8889
</dependency>
8990
<dependency>
9091
<groupId>org.testcontainers</groupId>
9192
<artifactId>mockserver</artifactId>
92-
<version>1.17.6</version>
93+
<version>${testcontainers.version}</version>
9394
<scope>test</scope>
9495
</dependency>
9596
<dependency>

src/main/history/dependencies.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2-
<features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="org.openhab.automation.jrule-4.2.0">
2+
<features xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" name="org.openhab.automation.jrule-4.2.1-SNAPSHOT">
33
<feature version="0.0.0">
44
<feature>openhab-runtime-base</feature>
55
<feature>wrap</feature>
66
<bundle>mvn:javax.el/javax.el-api/2.2.4</bundle>
77
<bundle>mvn:org.freemarker/freemarker/2.3.32</bundle>
8-
<bundle>mvn:org.openhab.addons.bundles/org.openhab.automation.jrule/4.2.0</bundle>
8+
<bundle>mvn:org.openhab.addons.bundles/org.openhab.automation.jrule/4.2.1-SNAPSHOT</bundle>
99
<bundle>wrap:mvn:javax.servlet/jsp-api/2.0</bundle>
1010
<bundle>wrap:mvn:javax.servlet/servlet-api/2.4</bundle>
1111
<bundle>wrap:mvn:org.lastnpe.eea/eea-all/2.2.1</bundle>

src/main/java/org/openhab/automation/jrule/internal/handler/JRuleEventHandler.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,14 @@ public void postUpdate(String itemName, JRuleValue value) {
139139
}
140140
}
141141

142+
public void postUndef(String itemName) {
143+
postUpdate(itemName, UnDefType.UNDEF);
144+
}
145+
146+
public void postNull(String itemName) {
147+
postUpdate(itemName, UnDefType.NULL);
148+
}
149+
142150
public void postUpdate(String itemName, double value, String unit) {
143151
QuantityType<?> type = new QuantityType<>(value + " " + unit);
144152
postUpdate(itemName, type);

src/main/java/org/openhab/automation/jrule/internal/handler/JRuleThingHandler.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@
1313
package org.openhab.automation.jrule.internal.handler;
1414

1515
import java.util.Collection;
16+
import java.util.List;
17+
import java.util.Set;
18+
import java.util.stream.Collectors;
1619

20+
import org.openhab.automation.jrule.items.JRuleItem;
21+
import org.openhab.automation.jrule.items.JRuleItemRegistry;
22+
import org.openhab.automation.jrule.things.JRuleChannel;
1723
import org.openhab.automation.jrule.things.JRuleThingStatus;
18-
import org.openhab.core.thing.Thing;
19-
import org.openhab.core.thing.ThingManager;
20-
import org.openhab.core.thing.ThingRegistry;
21-
import org.openhab.core.thing.ThingUID;
24+
import org.openhab.core.thing.*;
25+
import org.openhab.core.thing.link.ItemChannelLinkRegistry;
2226

2327
/**
2428
* The {@link JRuleThingHandler} provides access to thing actions
@@ -36,6 +40,8 @@ private JRuleThingHandler() {
3640

3741
private ThingManager thingManager;
3842

43+
private ItemChannelLinkRegistry itemChannelLinkRegistry;
44+
3945
public void setThingManager(ThingManager thingManager) {
4046
this.thingManager = thingManager;
4147
}
@@ -44,6 +50,10 @@ public void setThingRegistry(ThingRegistry thingRegistry) {
4450
this.thingRegistry = thingRegistry;
4551
}
4652

53+
public void setItemChannelLinkRegistry(ItemChannelLinkRegistry itemChannelLinkRegistry) {
54+
this.itemChannelLinkRegistry = itemChannelLinkRegistry;
55+
}
56+
4757
public static JRuleThingHandler get() {
4858
if (instance == null) {
4959
synchronized (JRuleThingHandler.class) {
@@ -83,4 +93,24 @@ public JRuleThingStatus getStatus(String thingUID) {
8393
return JRuleThingStatus.THING_UNKNOWN;
8494
}
8595
}
96+
97+
/**
98+
* Get all channels of a thing
99+
*
100+
* @param thingUID the thing UID
101+
* @return list of all channels
102+
*/
103+
public List<JRuleChannel> getChannels(String thingUID) {
104+
Thing thing = thingRegistry.get(new ThingUID(thingUID));
105+
if (thing != null) {
106+
return thing.getChannels().stream().map(channel -> new JRuleChannel(channel.getUID().toString())).toList();
107+
} else {
108+
return List.of();
109+
}
110+
}
111+
112+
public Set<JRuleItem> getLinkedItems(JRuleChannel channel) {
113+
return itemChannelLinkRegistry.getLinkedItemNames(new ChannelUID(channel.getChannelUID())).stream()
114+
.map(itemName -> JRuleItemRegistry.get(itemName)).collect(Collectors.toSet());
115+
}
86116
}

src/main/java/org/openhab/automation/jrule/items/JRuleItem.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,11 @@ default void postUpdate(JRuleRefreshValue state) {
9898
}
9999

100100
default void postNullUpdate() {
101-
JRuleEventHandler.get().postUpdate(getName(), null);
101+
JRuleEventHandler.get().postNull(getName());
102+
}
103+
104+
default void postUndefUpdate() {
105+
JRuleEventHandler.get().postUndef(getName());
102106
}
103107

104108
default Optional<ZonedDateTime> lastUpdated() {

src/main/java/org/openhab/automation/jrule/things/JRuleAbstractThing.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
*/
1313
package org.openhab.automation.jrule.things;
1414

15+
import java.util.List;
16+
import java.util.Set;
17+
1518
import org.openhab.automation.jrule.internal.handler.JRuleThingHandler;
19+
import org.openhab.automation.jrule.items.JRuleItem;
1620

1721
/**
1822
* The {@link JRuleAbstractThing} represents a thing that is either a bridge, a bridged (sub thing of a bridge) or a
@@ -49,4 +53,12 @@ public void restart() {
4953
disable();
5054
enable();
5155
}
56+
57+
public List<JRuleChannel> getChannels() {
58+
return JRuleThingHandler.get().getChannels(thingUID);
59+
}
60+
61+
public Set<JRuleItem> getLinkedItems(JRuleChannel channel) {
62+
return JRuleThingHandler.get().getLinkedItems(channel);
63+
}
5264
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.openhab.automation.jrule.things;
2+
3+
public class JRuleChannel {
4+
private String channelUID;
5+
6+
public JRuleChannel(String channelUID) {
7+
this.channelUID = channelUID;
8+
}
9+
10+
public String getChannelUID() {
11+
return channelUID;
12+
}
13+
}

src/test/java/org/openhab/automation/jrule/rules/integration_test/ITJRule.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,27 @@ public void mqttThingChangedToOffline() {
8989
verifyRuleWasExecuted(TestRules.NAME_MQTT_THING_CHANGED_TO_OFFLINE);
9090
}
9191

92+
@Test
93+
public void mqttThingChangedFromOnline() throws MqttException {
94+
95+
Awaitility.await().with().pollDelay(1, TimeUnit.SECONDS).timeout(20, TimeUnit.SECONDS)
96+
.pollInterval(200, TimeUnit.MILLISECONDS).await("thing online")
97+
.until(() -> getThingState("mqtt:topic:mqtt:fromonlinetest"), s -> s.equals("ONLINE"));
98+
publishMqttMessage("fromonlinetest/state", "1");
99+
Awaitility.await().with().pollDelay(100, TimeUnit.MILLISECONDS).timeout(5, TimeUnit.SECONDS)
100+
.pollInterval(100, TimeUnit.MILLISECONDS).await("item updated")
101+
.until(() -> getState(TestRules.ITEM_MQTT_TOPIC_FROM_ONLINE_TEST), s -> "1".equals(s));
102+
mqttProxy.setConnectionCut(true);
103+
Awaitility.await().with().pollDelay(1, TimeUnit.SECONDS).timeout(20, TimeUnit.SECONDS)
104+
.pollInterval(200, TimeUnit.MILLISECONDS).await("thing online")
105+
.until(() -> getThingState("mqtt:topic:mqtt:fromonlinetest"), s -> s.equals("OFFLINE"));
106+
Awaitility.await().with().pollDelay(1, TimeUnit.SECONDS).timeout(30, TimeUnit.SECONDS)
107+
.pollInterval(200, TimeUnit.MILLISECONDS).await("item undef")
108+
.until(() -> getState(TestRules.ITEM_MQTT_TOPIC_FROM_ONLINE_TEST), s -> "UNDEF".equals(s));
109+
110+
verifyRuleWasExecuted(TestRules.NAME_MQTT_THING_CHANGED_FROM_ONLINE);
111+
}
112+
92113
@Test
93114
public void memberOfGroupReceivedCommand() throws IOException {
94115
sendCommand(TestRules.ITEM_SWITCH_GROUP_MEMBER1, JRuleSwitchItem.ON);

src/test/java/org/openhab/automation/jrule/rules/integration_test/JRuleITBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ private Optional<Double> getDoubleState(String itemName) throws IOException, Par
312312
return Optional.ofNullable(getState(itemName)).map(Double::parseDouble);
313313
}
314314

315-
private String getState(String itemName) throws IOException, ParseException {
315+
protected static String getState(String itemName) throws IOException, ParseException {
316316
try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
317317
HttpGet request = new HttpGet(String.format("http://%s:%s/rest/items/" + itemName + "/state",
318318
getOpenhabHost(), getOpenhabPort()));

src/test/java/org/openhab/automation/jrule/rules/user/TestRules.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@
1919
import java.time.ZoneId;
2020
import java.time.ZonedDateTime;
2121
import java.time.temporal.ChronoUnit;
22-
import java.util.ArrayList;
23-
import java.util.Arrays;
24-
import java.util.Map;
25-
import java.util.Set;
22+
import java.util.*;
2623
import java.util.concurrent.atomic.AtomicInteger;
2724
import java.util.function.IntFunction;
2825
import java.util.stream.Collectors;
@@ -36,6 +33,9 @@
3633
import org.openhab.automation.jrule.rules.event.JRuleThingEvent;
3734
import org.openhab.automation.jrule.rules.event.JRuleTimerEvent;
3835
import org.openhab.automation.jrule.rules.value.*;
36+
import org.openhab.automation.jrule.things.JRuleChannel;
37+
import org.openhab.automation.jrule.things.JRuleSubThing;
38+
import org.openhab.automation.jrule.things.JRuleThingRegistry;
3939
import org.openhab.automation.jrule.things.JRuleThingStatus;
4040

4141
/**
@@ -57,6 +57,8 @@ public class TestRules extends JRule {
5757
public static final String NAME_EXEC_COMMAND_LINE = "Exec Command Line";
5858
public static final String NAME_MQTT_CHANNEL_TRIGGERED = "Mqtt Channel Triggered";
5959
public static final String NAME_MQTT_THING_CHANGED_TO_OFFLINE = "Mqtt Thing Changed To Offline";
60+
public static final String NAME_MQTT_THING_CHANGED_FROM_ONLINE = "Mqtt Thing Changed From Online";
61+
public static final String ITEM_MQTT_TOPIC_FROM_ONLINE_TEST = "ItemToUndef";
6062
public static final String NAME_MEMBER_OF_GROUP_RECEIVED_COMMAND = "Member Of Group Received Command";
6163
public static final String NAME_MEMBER_OF_GROUP_RECEIVED_UPDATE = "Member Of Group Received Update";
6264
public static final String NAME_MEMBER_OF_GROUP_CHANGED = "Member Of Group Changed";
@@ -184,6 +186,24 @@ public void mqttThingChangedToOffline(JRuleThingEvent event) {
184186
logInfo("thing '{}' goes '{}'", event.getThing(), event.getStatus());
185187
}
186188

189+
@JRuleName(NAME_MQTT_THING_CHANGED_FROM_ONLINE)
190+
@JRuleWhenThingTrigger(thing = "mqtt:topic:mqtt:fromonlinetest", from = JRuleThingStatus.ONLINE)
191+
public void mqttThingChangedFromOnline(JRuleThingEvent event) {
192+
logInfo("Thing '{}' goes '{}'", event.getThing(), event.getStatus());
193+
String thing = event.getThing();
194+
JRuleSubThing mqttTopicThing = JRuleThingRegistry.get(thing, JRuleSubThing.class);
195+
List<JRuleChannel> channels = mqttTopicThing.getChannels();
196+
logInfo("Channels size: {}", channels.size());
197+
channels.stream().forEach(channel -> {
198+
Set<JRuleItem> linkedItems = mqttTopicThing.getLinkedItems(channel);
199+
logInfo("Linked items size: {}", linkedItems.size());
200+
linkedItems.stream().forEach(item -> {
201+
logInfo("Linked item: {}, setting to UNDEF", item.getName());
202+
item.postUndefUpdate();
203+
});
204+
});
205+
}
206+
187207
@JRuleName(NAME_MEMBER_OF_GROUP_RECEIVED_COMMAND)
188208
@JRuleWhenItemReceivedCommand(item = ITEM_SWITCH_GROUP, memberOf = JRuleMemberOf.All)
189209
public synchronized void memberOfGroupReceivedCommand(JRuleItemEvent event) {

src/test/resources/docker/conf/items/default.items

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,5 @@ Number Number_To_Persist_Future (InfluxDbPersist)
8787

8888

8989
Dimmer Dimmer_With_Tags_And_Metadata ["Control", "Light"] { Speech="SetLightState" [ location="Livingroom" ] }
90+
91+
Number ItemToUndef {channel="mqtt:topic:mqtt:fromonlinetest:number"}

src/test/resources/docker/conf/things/mqtt.things

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ Bridge mqtt:broker:mqtt [ host="mqtt", port=8666, username="admin", password="ad
55
Type number : number [ stateTopic="number/state" ]
66
Type number : numberTrigger [ stateTopic="number/state", trigger="true" ]
77
}
8+
Thing topic fromonlinetest {
9+
Channels:
10+
Type number : number [ stateTopic="fromonlinetest/state" ]
11+
}
812
}

0 commit comments

Comments
 (0)