Skip to content

Commit 066a778

Browse files
committed
Updated new S7-adapter to work with recent SDK-changes
1 parent 23f5155 commit 066a778

File tree

13 files changed

+281
-91
lines changed

13 files changed

+281
-91
lines changed

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ jctools = "4.0.5"
3030
jersey = "2.45"
3131
jose4j = "0.9.6"
3232
jsonSchemaValidator = "1.5.2"
33+
jsonSchemaInferrer = "0.2.1"
3334
junit-jupiter = "5.11.2"
3435
junit = "4.13.2"
3536
logback = "1.5.11"
@@ -89,6 +90,7 @@ javax-annotation-api = { module = "javax.annotation:javax.annotation-api", versi
8990
jaxb-impl = { module = "com.sun.xml.bind:jaxb-impl", version.ref = "jaxb" }
9091
jctools = { module = "org.jctools:jctools-core", version.ref = "jctools" }
9192
jose4j = { module = "org.bitbucket.b_c:jose4j", version.ref = "jose4j" }
93+
jsonSchemaInferrer = { module = "com.github.saasquatch:json-schema-inferrer", version.ref = "jsonSchemaInferrer" }
9294
jsonSchemaValidator = { module = "com.networknt:json-schema-validator", version.ref = "jsonSchemaValidator" }
9395
julToSlf4j = { module = "org.slf4j:jul-to-slf4j", version.ref = "slf4j" }
9496
junit = { module = "junit:junit", version.ref = "junit" }

hivemq-edge/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ repositories {
104104
}
105105
filter {
106106
includeGroup("com.github.simon622.mqtt-sn")
107+
includeGroup("com.github.saasquatch")
107108
}
108109
}
109110
}
@@ -197,6 +198,7 @@ dependencies {
197198
implementation(libs.victools.jsonschema.generator)
198199
implementation(libs.victools.jsonschema.jackson)
199200
implementation(libs.jsonSchemaInferrer)
201+
200202
}
201203

202204
/* ******************** test ******************** */

modules/hivemq-edge-module-s7/build.gradle.kts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ java {
2121

2222
repositories {
2323
mavenCentral()
24+
maven { url = uri("https://jitpack.io") }
2425
exclusiveContent {
2526
forRepository {
2627
maven {
@@ -37,17 +38,21 @@ repositories {
3738
dependencies {
3839
compileOnly(libs.hivemq.edge.adapterSdk)
3940
compileOnly(libs.apache.commonsIO)
40-
compileOnly(libs.jackson.databind)
4141
compileOnly(libs.slf4j.api)
42+
compileOnly(libs.jackson.databind)
4243
implementation(libs.iot.communication)
4344

45+
}
46+
47+
dependencies {
48+
testImplementation("com.hivemq:hivemq-edge")
4449
testImplementation(libs.jackson.databind)
45-
testImplementation(libs.junit.jupiter)
46-
testImplementation(libs.assertj)
50+
testImplementation(libs.hivemq.edge.adapterSdk)
4751
testImplementation(libs.mockito.junitJupiter)
48-
testImplementation(libs.iot.communication)
49-
testImplementation("com.hivemq:hivemq-edge")
52+
testImplementation(libs.junit.jupiter)
5053

54+
testImplementation(libs.assertj)
55+
testImplementation(libs.awaitility)
5156
}
5257

5358
tasks.test {

modules/hivemq-edge-module-s7/src/main/java/com/hivemq/edge/adapters/s7/S7ProtocolAdapter.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
1919
import com.hivemq.adapter.sdk.api.ProtocolAdapterInformation;
2020
import com.hivemq.adapter.sdk.api.data.DataPoint;
21+
import com.hivemq.adapter.sdk.api.factories.ProtocolAdapterFactoryInput;
2122
import com.hivemq.adapter.sdk.api.model.ProtocolAdapterInput;
2223
import com.hivemq.adapter.sdk.api.model.ProtocolAdapterStartInput;
2324
import com.hivemq.adapter.sdk.api.model.ProtocolAdapterStartOutput;
@@ -27,8 +28,11 @@
2728
import com.hivemq.adapter.sdk.api.polling.PollingOutput;
2829
import com.hivemq.adapter.sdk.api.polling.PollingProtocolAdapter;
2930
import com.hivemq.adapter.sdk.api.state.ProtocolAdapterState;
31+
import com.hivemq.adapter.sdk.api.tag.Tag;
3032
import com.hivemq.edge.adapters.s7.config.S7AdapterConfig;
3133
import com.hivemq.edge.adapters.s7.config.S7DataType;
34+
import com.hivemq.edge.adapters.s7.config.S7Tag;
35+
import com.hivemq.edge.adapters.s7.config.S7TagDefinition;
3236
import com.hivemq.edge.adapters.s7.config.S7ToMqttConfig;
3337
import org.jetbrains.annotations.NotNull;
3438
import org.slf4j.Logger;
@@ -38,6 +42,8 @@
3842
import java.util.Map;
3943
import java.util.Objects;
4044
import java.util.concurrent.ConcurrentHashMap;
45+
import java.util.function.Function;
46+
import java.util.stream.Collectors;
4147

4248
/**
4349
* @author HiveMQ Adapter Generator
@@ -50,6 +56,7 @@ public class S7ProtocolAdapter implements PollingProtocolAdapter<S7ToMqttConfig>
5056
private final S7AdapterConfig adapterConfig;
5157
private final ProtocolAdapterState protocolAdapterState;
5258
private final S7Client s7Client;
59+
private final Map<String, S7Tag> tags;
5360

5461
private final Map<String, DataPoint> dataPoints;
5562

@@ -58,6 +65,7 @@ public S7ProtocolAdapter(
5865
final @NotNull ProtocolAdapterInput<S7AdapterConfig> input) {
5966
this.adapterInformation = adapterInformation;
6067
this.adapterConfig = input.getConfig();
68+
this.tags = input.getTags().stream().map(t -> (S7Tag)t).collect(Collectors.toMap(S7Tag::getName, Function.identity()));
6169
this.protocolAdapterState = input.getProtocolAdapterState();
6270
final EPlcType eplcType = S7Client.getEplcType(adapterConfig.getControllerType());
6371
s7Client = new S7Client(
@@ -127,14 +135,15 @@ public void poll(
127135
@NotNull final PollingOutput pollingOutput) {
128136
final S7ToMqttConfig s7ToMqtt = pollingInput.getPollingContext();
129137

138+
S7Tag tagToRead = tags.get(pollingInput.getPollingContext().getTagName());
139+
S7TagDefinition tagDefinition = tagToRead.getDefinition();
130140
//Every S7 address starts with a % but the iot-communications lib doesn't like it, so we are stripping it.
131-
final String tagAddress = s7ToMqtt.getTagAddress().replace("%","");
141+
final String tagAddress = tagDefinition.getAddress().replace("%","");
132142
final DataPoint dataPoint;
133-
134-
if(s7ToMqtt.getDataType() == S7DataType.BYTE) {
143+
if(tagDefinition.getDataType() == S7DataType.BYTE) {
135144
dataPoint = s7Client.readByte(tagAddress);
136145
} else {
137-
dataPoint = s7Client.read(s7ToMqtt.getDataType(), List.of(tagAddress)).get(0);
146+
dataPoint = s7Client.read(tagDefinition.getDataType(), List.of(tagAddress)).get(0);
138147
}
139148

140149
if(adapterConfig.getPublishChangedDataOnly()) {

modules/hivemq-edge-module-s7/src/main/java/com/hivemq/edge/adapters/s7/S7ProtocolAdapterFactory.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@
3333
*/
3434
public class S7ProtocolAdapterFactory implements ProtocolAdapterFactory<S7AdapterConfig> {
3535

36-
private static final @NotNull Logger log = LoggerFactory.getLogger(S7ProtocolAdapterFactory.class);
37-
3836
final boolean writingEnabled;
3937

4038
public S7ProtocolAdapterFactory(final boolean writingEnabled) {
@@ -53,17 +51,4 @@ public S7ProtocolAdapterFactory(final boolean writingEnabled) {
5351
return new S7ProtocolAdapter(adapterInformation, input);
5452
}
5553

56-
57-
@Override
58-
public @NotNull Class<S7AdapterConfig> getConfigClass() {
59-
return S7AdapterConfig.class;
60-
}
61-
62-
63-
@Override
64-
public @NotNull ProtocolAdapterConfig convertConfigObject(
65-
final @NotNull ObjectMapper objectMapper, final @NotNull Map<String, Object> config) {
66-
return ProtocolAdapterFactory.super.convertConfigObject(objectMapper, config);
67-
}
68-
6954
}

modules/hivemq-edge-module-s7/src/main/java/com/hivemq/edge/adapters/s7/S7ProtocolAdapterInformation.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
import com.hivemq.adapter.sdk.api.ProtocolAdapterCategory;
2020
import com.hivemq.adapter.sdk.api.ProtocolAdapterInformation;
2121
import com.hivemq.adapter.sdk.api.ProtocolAdapterTag;
22+
import com.hivemq.adapter.sdk.api.config.ProtocolAdapterConfig;
23+
import com.hivemq.adapter.sdk.api.tag.Tag;
24+
import com.hivemq.edge.adapters.s7.config.S7AdapterConfig;
25+
import com.hivemq.edge.adapters.s7.config.S7Tag;
2226
import org.apache.commons.io.IOUtils;
2327
import org.jetbrains.annotations.NotNull;
2428
import org.jetbrains.annotations.Nullable;
@@ -37,6 +41,7 @@ public class S7ProtocolAdapterInformation implements ProtocolAdapterInformation
3741

3842
public static final ProtocolAdapterInformation INSTANCE = new S7ProtocolAdapterInformation();
3943
private static final @NotNull Logger log = LoggerFactory.getLogger(S7ProtocolAdapterInformation.class);
44+
public static final String PROTOCOL_ID = "s7-new";
4045

4146

4247
protected S7ProtocolAdapterInformation() {
@@ -49,7 +54,7 @@ protected S7ProtocolAdapterInformation() {
4954

5055
@Override
5156
public @NotNull String getProtocolId() {
52-
return "s7-new";
57+
return PROTOCOL_ID;
5358
}
5459

5560
@Override
@@ -115,4 +120,19 @@ public List<ProtocolAdapterTag> getTags() {
115120
return null;
116121
}
117122
}
123+
124+
@Override
125+
public @NotNull Class<? extends Tag> tagConfigurationClass() {
126+
return S7Tag.class;
127+
}
128+
129+
@Override
130+
public @NotNull Class<? extends ProtocolAdapterConfig> configurationClassReading() {
131+
return S7AdapterConfig.class;
132+
}
133+
134+
@Override
135+
public @NotNull Class<? extends ProtocolAdapterConfig> configurationClassWriting() {
136+
return S7AdapterConfig.class;
137+
}
118138
}

modules/hivemq-edge-module-s7/src/main/java/com/hivemq/edge/adapters/s7/config/S7AdapterConfig.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
import java.util.List;
2626
import java.util.Objects;
27+
import java.util.Set;
28+
import java.util.stream.Collectors;
2729

2830
public class S7AdapterConfig implements ProtocolAdapterConfig {
2931

@@ -207,4 +209,9 @@ public int getPort() {
207209
public @NotNull List<S7ToMqttConfig> getS7ToMqttMappings() {
208210
return s7ToMqttConfig;
209211
}
212+
213+
@Override
214+
public @NotNull Set<String> calculateAllUsedTags() {
215+
return s7ToMqttConfig.stream().map(S7ToMqttConfig::getTagName).collect(Collectors.toSet());
216+
}
210217
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.hivemq.edge.adapters.s7.config;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.hivemq.adapter.sdk.api.annotations.ModuleConfigField;
5+
import com.hivemq.adapter.sdk.api.tag.Tag;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import java.util.Objects;
9+
10+
public class S7Tag implements Tag {
11+
12+
@JsonProperty(value = "name", required = true)
13+
@ModuleConfigField(title = "name",
14+
description = "name of the tag to be used in mappings",
15+
required = true)
16+
private final @NotNull String name;
17+
18+
@JsonProperty(value = "description", required = true)
19+
@ModuleConfigField(title = "description",
20+
description = "A human readable description of the tag",
21+
required = true)
22+
private final @NotNull String description;
23+
24+
@JsonProperty(value = "definition", required = true)
25+
@ModuleConfigField(title = "definition",
26+
description = "The actual definition of the tag on the device",
27+
required = true)
28+
private final @NotNull S7TagDefinition definition;
29+
30+
31+
public S7Tag(
32+
@JsonProperty(value = "name", required = true) final @NotNull String name,
33+
@JsonProperty(value = "description", required = true) final @NotNull String description,
34+
@JsonProperty(value = "definition", required = true) final @NotNull S7TagDefinition definiton) {
35+
this.name = name;
36+
this.description = description;
37+
this.definition = definiton;
38+
}
39+
40+
@Override
41+
public @NotNull S7TagDefinition getDefinition() {
42+
return definition;
43+
}
44+
45+
@Override
46+
public @NotNull String getName() {
47+
return name;
48+
}
49+
50+
@Override
51+
public @NotNull String getDescription() {
52+
return description;
53+
}
54+
55+
@Override
56+
public boolean equals(final Object o) {
57+
if (this == o) return true;
58+
if (o == null || getClass() != o.getClass()) return false;
59+
final S7Tag s7Tag = (S7Tag) o;
60+
return Objects.equals(name, s7Tag.name) &&
61+
Objects.equals(description, s7Tag.description) &&
62+
Objects.equals(definition, s7Tag.definition);
63+
}
64+
65+
@Override
66+
public int hashCode() {
67+
return Objects.hash(name, description, definition);
68+
}
69+
70+
@Override
71+
public String toString() {
72+
return "S7Tag{" +
73+
"name='" +
74+
name +
75+
'\'' +
76+
", description='" +
77+
description +
78+
'\'' +
79+
", definition=" +
80+
definition +
81+
'}';
82+
}
83+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.hivemq.edge.adapters.s7.config;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.hivemq.adapter.sdk.api.annotations.ModuleConfigField;
5+
import com.hivemq.adapter.sdk.api.tag.TagDefinition;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import java.util.Objects;
9+
10+
public class S7TagDefinition implements TagDefinition {
11+
12+
@JsonProperty(value = "address", required = true)
13+
@ModuleConfigField(title = "Tag Address",
14+
description = "The well formed address of the tag to read",
15+
required = true)
16+
private final @NotNull String address;
17+
18+
@JsonProperty(value = "dataType", required = true)
19+
@ModuleConfigField(title = "Data Type", description = "The expected data type of the tag", enumDisplayValues = {
20+
"Boolean",
21+
"Byte",
22+
"Int16",
23+
"UInt16",
24+
"Int32",
25+
"UInt32",
26+
"Int64",
27+
"Real (float 32)",
28+
"LReal (double 64)",
29+
"String",
30+
"Date (DateStamp)",
31+
"Time Of Day (TimeStamp)",
32+
"Date Time (DateTimeStamp)",
33+
"Timing (Duration ms)"}, required = true)
34+
private final @NotNull S7DataType dataType;
35+
36+
public S7TagDefinition(@JsonProperty(value = "address", required = true) @NotNull final String address,@JsonProperty(value = "dataType", required = true) @NotNull final S7DataType dataType) {
37+
this.address = address;
38+
this.dataType = dataType;
39+
}
40+
41+
public @NotNull String getAddress() {
42+
return address;
43+
}
44+
45+
public @NotNull S7DataType getDataType() {
46+
return dataType;
47+
}
48+
49+
@Override
50+
public boolean equals(final Object o) {
51+
if (this == o) return true;
52+
if (o == null || getClass() != o.getClass()) return false;
53+
final S7TagDefinition that = (S7TagDefinition) o;
54+
return Objects.equals(address, that.address) && dataType == that.dataType;
55+
}
56+
57+
@Override
58+
public int hashCode() {
59+
return Objects.hash(address, dataType);
60+
}
61+
62+
@Override
63+
public String toString() {
64+
return "S7TagDefinition{" + "address='" + address + '\'' + ", dataType=" + dataType + '}';
65+
}
66+
}

0 commit comments

Comments
 (0)