This is an automated email from the ASF dual-hosted git repository.

tmitsch pushed a commit to branch extend-Field-with-type-information
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit f31bf7946ffc857e851f635019a2a791c5ae8e03
Author: Julian Feinauer <[email protected]>
AuthorDate: Thu Mar 7 10:20:12 2019 +0100

    Necessary changes to make the (new) plc scraper driver agnostic:
    * The PlcField interface has a (default) method to return the expected java 
type (to know this upfront)
    * The PlcConnection interface has a new "parse()" method which allows to 
explicitly create a Field instance for a given type.
    * Integration of java-type into TriggeredScraper
    * Tested and added a TriggeredScraper for Modbus
---
 .../org/apache/plc4x/java/api/PlcConnection.java   | 12 +++
 .../org/apache/plc4x/java/api/model/PlcField.java  | 16 ++++
 .../plc4x/java/s7/connection/S7PlcConnection.java  |  8 ++
 .../java/s7/connection/S7PlcConnectionTests.java   | 15 ++++
 .../org/apache/plc4x/java/s7/model/S7Field.java    | 31 ++++++++
 .../apache/plc4x/java/s7/model/S7FieldTests.java   |  8 ++
 plc4j/utils/scraper/pom.xml                        | 10 +++
 .../triggerhandler/TriggerConfiguration.java       | 90 +++++++++++++---------
 .../java/scraper/TriggeredScraperRunnerModbus.java | 60 +++++++++++++++
 .../triggerhandler/TriggerConfigurationTest.java   |  4 +-
 .../resources/example_triggered_scraper_modbus.yml | 30 ++++++++
 11 files changed, 246 insertions(+), 38 deletions(-)

diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java
index a4732e1..e7d9a83 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java
@@ -19,12 +19,15 @@ under the License.
 package org.apache.plc4x.java.api;
 
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
 import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
+import org.apache.plc4x.java.api.model.PlcField;
 
 /**
  * Interface defining the most basic methods a PLC4X connection should support.
@@ -53,6 +56,15 @@ public interface PlcConnection extends AutoCloseable {
     void close() throws Exception;
 
     /**
+     * Parse a fieldQuery for the given connection type.
+     *
+     * @throws PlcRuntimeException If the string cannot be parsed
+     */
+    default PlcField parse(String fieldQuery) throws PlcInvalidFieldException {
+        throw new PlcRuntimeException("Parse method is not implemented for 
this connection / driver");
+    }
+
+    /**
      * Provides connection metadata.
      */
     PlcConnectionMetadata getMetadata();
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcField.java 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcField.java
index 280e244..6851667 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcField.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcField.java
@@ -32,4 +32,20 @@ package org.apache.plc4x.java.api.model;
  */
 public interface PlcField {
 
+    /**
+     * Returns the "default" type of the response one can expect from this 
field as java type.
+     * I.e., a call to getXXX for the ResponseItem should succeed.
+     *
+     * The contract is not to return the exact type which is internally hold 
by PLC4X but to
+     * return a "casteable" type, i.e., a type whiches getXXX method succeeds.
+     * So for example if a type is internally a short, but the getInt() method 
is implemented, it
+     * is allowed to return Integer.class by this method.
+     *
+     * <b>This method should always return the BOXED type for primitives. E.g. 
not bool.class but Boolean.class</b>
+     * @return Either specific type or Object.class if no specific type is 
known.
+     */
+    default Class<?> getDefaultJavaType() {
+        return Object.class;
+    }
+
 }
diff --git 
a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
 
b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
index da65b9a..e3e9aec 100644
--- 
a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
+++ 
b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
@@ -24,10 +24,13 @@ import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.SystemConfiguration;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.ChannelFactory;
 import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
@@ -40,6 +43,7 @@ import 
org.apache.plc4x.java.isotp.protocol.model.tpdus.DisconnectRequestTpdu;
 import org.apache.plc4x.java.isotp.protocol.model.types.DeviceGroup;
 import org.apache.plc4x.java.isotp.protocol.model.types.DisconnectReason;
 import org.apache.plc4x.java.isotp.protocol.model.types.TpduSize;
+import org.apache.plc4x.java.s7.model.S7Field;
 import org.apache.plc4x.java.s7.netty.Plc4XS7Protocol;
 import org.apache.plc4x.java.s7.netty.S7Protocol;
 import org.apache.plc4x.java.s7.netty.model.types.MemoryArea;
@@ -200,6 +204,10 @@ public class S7PlcConnection extends NettyPlcConnection 
implements PlcReader, Pl
         channel.pipeline().fireUserEventTriggered(new ConnectEvent());
     }
 
+    @Override public PlcField parse(String fieldQuery) throws 
PlcInvalidFieldException {
+        return S7Field.of(fieldQuery);
+    }
+
     public int getRack() {
         return rack;
     }
diff --git 
a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java
 
b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java
index 65d37ba..c0d938d 100644
--- 
a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java
+++ 
b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java
@@ -19,7 +19,11 @@
 
 package org.apache.plc4x.java.s7.connection;
 
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException;
+import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.s7.model.S7Field;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -75,4 +79,15 @@ public class S7PlcConnectionTests {
         assertThrows(PlcUnsupportedOperationException.class, () -> 
SUT.unsubscriptionRequestBuilder());
     }
 
+    @Test
+    public void parse() {
+        final PlcField field = SUT.parse("%DB1.DBX38.1:BOOL");
+        assertThat(field.getClass(), equalTo(S7Field.class));
+        assertThat(((S7Field) field).getDataType(), 
equalTo(TransportSize.BOOL));
+    }
+
+    @Test(expected = PlcInvalidFieldException.class)
+    public void parseFails() {
+        SUT.parse("this is a bad field query");
+    }
 }
\ No newline at end of file
diff --git 
a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java 
b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
index 8f7e555..7bced35 100644
--- 
a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
+++ 
b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
@@ -18,6 +18,7 @@ under the License.
 */
 package org.apache.plc4x.java.s7.model;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.s7.netty.model.types.MemoryArea;
@@ -89,6 +90,36 @@ public class S7Field implements PlcField {
             ADDRESS_PATTERN.matcher(fieldString).matches();
     }
 
+    /**
+     * @return Java type of expected response.
+     *
+     * TODO implement all Methods
+     */
+    @Override
+    public Class<?> getDefaultJavaType() {
+        switch (dataType){
+            case STRING:
+                return String.class;
+            case USINT:
+            case SINT:
+            case UINT:
+            case INT:
+            case DINT:
+                return Integer.class;
+            case UDINT:
+            case ULINT:
+            case LINT:
+                return Long.class;
+            case BOOL:
+                return Boolean.class;
+            case REAL:
+            case LREAL:
+                return Double.class;
+            default:
+                throw new NotImplementedException("The response type for 
datatype " + dataType + " is not yet implemented");
+        }
+    }
+
     public static S7Field of(String fieldString) {
         Matcher matcher = DATA_BLOCK_ADDRESS_PATTERN.matcher(fieldString);
         if(matcher.matches()) {
diff --git 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
index 015562d..a412b67 100644
--- 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
+++ 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
@@ -20,6 +20,7 @@ under the License.
 package org.apache.plc4x.java.s7.model;
 
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.s7.netty.model.types.MemoryArea;
 import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.apache.plc4x.test.FastTests;
@@ -86,6 +87,13 @@ class S7FieldTests {
     }
 
     @Test
+    void getDefaultJavaType() {
+        final PlcField field = S7Field.of("%DB1.DBX38.1:BOOL");
+
+        assertThat(field.getDefaultJavaType(), equalTo(Boolean.class));
+    }
+
+    @Test
     void checkGreedyNumFieldsParsing() {
         S7Field field = S7Field.of("%DB56.DBB100:SINT[25]");
 
diff --git a/plc4j/utils/scraper/pom.xml b/plc4j/utils/scraper/pom.xml
index 69b4481..a0f7d7e 100644
--- a/plc4j/utils/scraper/pom.xml
+++ b/plc4j/utils/scraper/pom.xml
@@ -104,17 +104,27 @@
       <version>0.4.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
+
+
     <dependency>
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
       <scope>test</scope>
     </dependency>
+
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-utils-test-utils</artifactId>
       <version>0.4.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-modbus</artifactId>
+      <version>0.4.0-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+
 
   </dependencies>
 
diff --git 
a/plc4j/utils/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
 
b/plc4j/utils/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
index b1da407..9d89b6c 100644
--- 
a/plc4j/utils/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
+++ 
b/plc4j/utils/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
@@ -20,6 +20,7 @@
 package org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler;
 
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.s7.model.S7Field;
 import org.apache.plc4x.java.scraper.exception.ScraperException;
 import org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScrapeJobImpl;
@@ -43,14 +44,16 @@ public class TriggerConfiguration{
         
Pattern.compile("\\((?<strategy>[A-Z_0-9]+),(?<scheduledInterval>\\d+)(,(\\((?<triggerVar>\\S+)\\))((?<comp>[!=<>]{1,2}))(\\((?<compVar>[a-z0-9.\\-]+)\\)))?\\)");
 
     private final TriggerType triggerType;
-    private final long scrapeInterval;
+    private final Long scrapeInterval;
     private final String triggerVariable;
     private final String comparator;
     private Comparators comparatorType;
     private TriggeredScrapeJobImpl triggeredScrapeJobImpl;
 
     private final Object compareValue;
-    private final S7Field s7Field;
+    private final PlcField plcField;
+
+
 
     /**
      * default constructor when an S7Field should be used for triggering
@@ -66,18 +69,25 @@ public class TriggerConfiguration{
         this.triggerType = triggerType;
         this.triggeredScrapeJobImpl = triggeredScrapeJobImpl;
         this.scrapeInterval = parseScrapeInterval(scrapeInterval);
+        this.triggerVariable = triggerVariable;
+        this.comparator = comparator;
 
-        //test for valid field-connection string, on exception quit job and 
return message to user
-        try {
-            this.s7Field = S7Field.of(triggerVariable);
+        if(this.triggerType.equals(TriggerType.S7_TRIGGER_VAR)) {
+            //test for valid field-connection string, on exception quit job 
and return message to user
+            try {
+                this.plcField = S7Field.of(triggerVariable);
+            } catch (PlcInvalidFieldException e) {
+                logger.debug(e.getMessage(), e);
+                String exceptionMessage = String.format("Invalid trigger Field 
for Job %s: %s", triggeredScrapeJobImpl.getJobName(), triggerVariable);
+                throw new ScraperException(exceptionMessage);
+            }
+            //ToDo add more and other trigger
         }
-        catch (PlcInvalidFieldException e){
-            logger.debug(e.getMessage(),e);
-            String exceptionMessage = String.format("Invalid trigger Field for 
Job %s: %s",triggeredScrapeJobImpl.getJobName(), triggerVariable);
+        else{
+            String exceptionMessage = String.format("TriggerType %s is not yet 
implemented", this.triggerType);
             throw new ScraperException(exceptionMessage);
         }
-        this.triggerVariable = triggerVariable;
-        this.comparator = comparator;
+
 
         this.compareValue = convertCompareValue(compareValue);
         detectComparatorType();
@@ -97,8 +107,9 @@ public class TriggerConfiguration{
         this.triggerVariable = null;
         this.comparator = null;
         this.compareValue = null;
-        this.s7Field = null;
+        this.plcField = null;
         this.comparatorType = null;
+
     }
 
     /**
@@ -125,7 +136,7 @@ public class TriggerConfiguration{
      * @throws ScraperException when something goes wrong
      */
     boolean evaluateTrigger(Object value) throws ScraperException {
-        if(detectVariableType().equals(Boolean.class)){
+        if(validateDataType().equals(Boolean.class)){
             boolean currentValue;
             boolean refValue;
             try{
@@ -143,7 +154,7 @@ public class TriggerConfiguration{
                 return currentValue != refValue;
             }
         }
-        if(detectVariableType().equals(Double.class)) {
+        if(validateDataType().equals(Double.class)) {
             double currentValue;
             double refValue;
             try{
@@ -209,9 +220,9 @@ public class TriggerConfiguration{
      * @throws ScraperException when invalid combination is detected
      */
     private void matchTypeAndComparator() throws ScraperException {
-        if(detectVariableType().equals(Boolean.class)
+        if(validateDataType().equals(Boolean.class)
             && !(this.comparatorType.equals(Comparators.EQUAL) || 
this.comparatorType.equals(Comparators.UNEQUAL))){
-            String exceptionMessage = String.format("Trigger-Data-Type (%s) 
and Comparator (%s) do not 
match",this.s7Field.getDataType(),this.comparatorType);
+            String exceptionMessage = String.format("Trigger-Data-Type (%s) 
and Comparator (%s) do not 
match",this.plcField.getDefaultJavaType(),this.comparatorType);
             throw new ScraperException(exceptionMessage);
         }
         //all other combinations are valid
@@ -223,24 +234,24 @@ public class TriggerConfiguration{
      * @throws ScraperException when an unsupported S7-Type is choosen,which 
is not (yet) implemented for comparison
      * ToDo check how to handle time-variables if needed
      */
-    private Class detectVariableType() throws ScraperException {
-        switch (this.s7Field.getDataType()){
-            case BOOL:
-                return Boolean.class;
-            case INT:
-            case UINT:
-            case SINT:
-            case USINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-                return Double.class;
-            default:
-                throw new ScraperException("Unsupported trigger data-type 
used: "+this.s7Field.getDataType());
+    private Class<?> validateDataType() throws ScraperException {
+        if(this.plcField!=null){
+            Class<?> javaDataType = this.plcField.getDefaultJavaType();
+            if(!javaDataType.equals(Boolean.class)
+                && !javaDataType.equals(Integer.class)
+                && !javaDataType.equals(Long.class)
+                && !javaDataType.equals(Double.class)
+            ){
+                String exceptionMessage = String.format("Unsupported 
plc-trigger variable %s with converted data-type %s 
used",this.plcField,this.plcField.getDefaultJavaType());
+                throw new ScraperException(exceptionMessage);
+            }
+            return javaDataType;
+        }
+        else{
+            String exceptionMessage = String.format("Unsupported plc-trigger 
variable %s with converted data-type %s 
used",this.plcField,this.plcField.getDefaultJavaType());
+            throw new ScraperException(exceptionMessage);
         }
+
     }
 
     /**
@@ -250,7 +261,8 @@ public class TriggerConfiguration{
      * @throws ScraperException when something does not match or parsing fails
      */
     private Object convertCompareValue(String compareValue) throws 
ScraperException {
-        if(detectVariableType().equals(Boolean.class)){
+        Class<?> javaDataType =validateDataType();
+        if(javaDataType.equals(Boolean.class)){
             switch (compareValue){
                 case "1":
                 case "true":
@@ -263,8 +275,12 @@ public class TriggerConfiguration{
                     throw new ScraperException(exceptionMessage);
             }
         }
-        if(detectVariableType().equals(Double.class)){
+        if(javaDataType.equals(Double.class)
+            || javaDataType.equals(Integer.class)
+            || javaDataType.equals(Long.class)){
             try {
+                //everything fits to Double for conversion ... so for first 
step use only double
+                //ToDo if different handling dependent on specific datatype is 
needed then differ
                 return Double.parseDouble(compareValue);
             }
             catch (Exception e){
@@ -272,7 +288,7 @@ public class TriggerConfiguration{
                 throw new ScraperException(exceptionMessage);
             }
         }
-        String exceptionMessage = "Invalid Datatype detected ... should not 
happen and be catched earlier - please report";
+        String exceptionMessage = "Invalid Datatype detected ... should not 
happen and be catcht earlier - please report";
         throw new ScraperException(exceptionMessage);
     }
 
@@ -333,11 +349,11 @@ public class TriggerConfiguration{
         return triggerVariable;
     }
 
-    public Comparators getComparatorType() {
+    Comparators getComparatorType() {
         return comparatorType;
     }
 
-    public Object getCompareValue() {
+    Object getCompareValue() {
         return compareValue;
     }
 
diff --git 
a/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/TriggeredScraperRunnerModbus.java
 
b/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/TriggeredScraperRunnerModbus.java
new file mode 100644
index 0000000..3ed4fe3
--- /dev/null
+++ 
b/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/TriggeredScraperRunnerModbus.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.plc4x.java.scraper;
+
+import org.apache.plc4x.java.modbus.connection.ModbusConnectionFactory;
+import 
org.apache.plc4x.java.scraper.config.triggeredscraper.TriggeredScraperConfiguration;
+import org.apache.plc4x.java.scraper.exception.ScraperException;
+import org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+public class TriggeredScraperRunnerModbus {
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(TriggeredScraperRunnerModbus.class);
+
+    /**
+     * testing of TriggeredScraper vs real device (Modbus)
+     */
+    public static void main(String[] args) throws IOException, 
ScraperException {
+        TriggeredScraperConfiguration configuration = 
TriggeredScraperConfiguration.fromFile("plc4j/utils/scraper/src/test/resources/example_triggered_scraper_modbus.yml");
+        TriggeredScraperImpl scraper = new TriggeredScraperImpl(configuration, 
(j, a, m) -> {
+            LOGGER.info("Results from {}/{}: {}", j, a, m);
+            for(Map.Entry<String, Object> entry:m.entrySet()){
+                for(Object object:(List<Object>)entry.getValue()){
+                    LOGGER.info("{}",object);
+                }
+            }
+        });
+
+        scraper.start();
+    }
+
+    /**
+     * dummy function to have Modbus Driver available in DriverManager
+     */
+    private void dummy(){
+        ModbusConnectionFactory modbusConnectionFactory = new 
ModbusConnectionFactory();
+    }
+}
diff --git 
a/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfigurationTest.java
 
b/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfigurationTest.java
index 513e445..3bd4d98 100644
--- 
a/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfigurationTest.java
+++ 
b/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfigurationTest.java
@@ -67,7 +67,9 @@ class TriggerConfigurationTest {
             Arguments.of("(S7_TRIGGER_VAR,50,(%DB111:DBX10:BOOL)==(33))"),
             Arguments.of("(S7_TRIGGER_VAR,50,(%DB111:DBX10.1:BOOL)==(33))"),
             Arguments.of("(S7_TRIGGER_VAR,50,(%DB111:DBX10.1:BOOL)<=(true))"),
-            Arguments.of("(S7_TRIGGER_VAR,50,(%DB111:DBW10:INT)<=(true))")
+            Arguments.of("(S7_TRIGGER_VAR,50,(%DB111:DBW10:INT)<=(true))"),
+            Arguments.of("(MODBUS_TRIGGER_VAR,50)"),
+            Arguments.of("(MODBUS_TRIGGER_VAR,50,(%DB111:DBW10:INT)<=(11))")
         );
     }
 
diff --git 
a/plc4j/utils/scraper/src/test/resources/example_triggered_scraper_modbus.yml 
b/plc4j/utils/scraper/src/test/resources/example_triggered_scraper_modbus.yml
new file mode 100644
index 0000000..6122ae9
--- /dev/null
+++ 
b/plc4j/utils/scraper/src/test/resources/example_triggered_scraper_modbus.yml
@@ -0,0 +1,30 @@
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+---
+sources:
+  LABJACK_PI: modbus:tcp://192.168.167.149:502
+
+jobs:
+  - name: scheduled-demo-job1
+    triggerConfig: (SCHEDULED,100)
+    sources:
+      - LABJACK_PI
+    fields:
+      test1: 'readholdingregisters:49100[2]'
+

Reply via email to