You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/05/15 13:50:01 UTC

[plc4x] branch rel/0.7 updated: - Merged changes from the develop branch

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

cdutz pushed a commit to branch rel/0.7
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/rel/0.7 by this push:
     new 41ebb4d  - Merged changes from the develop branch
41ebb4d is described below

commit 41ebb4db731464eb981c720b4f1122125313f30d
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri May 15 15:49:47 2020 +0200

    - Merged changes from the develop branch
---
 plc4j/integrations/apache-camel/pom.xml            |  12 ++-
 .../apache-camel/src/main/docs/PLC4X.adoc          |  46 ++++++++-
 .../java/org/apache/plc4x/camel/Constants.java     |   3 +-
 .../org/apache/plc4x/camel/Plc4XComponent.java     |  16 ++-
 .../java/org/apache/plc4x/camel/Plc4XConsumer.java | 111 +++++++++++++++------
 .../java/org/apache/plc4x/camel/Plc4XEndpoint.java |  93 +++++++++++------
 .../apache/plc4x/camel/Plc4XPollingConsumer.java   |  27 +++--
 .../java/org/apache/plc4x/camel/Plc4XProducer.java |  27 ++---
 .../main/java/org/apache/plc4x/camel/TagData.java  |  12 +++
 .../org/apache/plc4x/camel/Plc4XComponentTest.java |  10 +-
 plc4j/karaf-features/camel/pom.xml                 |   2 +-
 plc4j/tools/scraper/pom.xml                        |  14 ---
 .../triggerhandler/TriggerConfiguration.java       |  12 +--
 .../triggeredscraper/TriggeredScraperImplTest.java |   3 +-
 .../test/resources/example_triggered_scraper.yml   |   8 +-
 .../src/test/resources/mock-scraper-config.yml     |   4 +-
 pom.xml                                            |   2 +-
 17 files changed, 273 insertions(+), 129 deletions(-)

diff --git a/plc4j/integrations/apache-camel/pom.xml b/plc4j/integrations/apache-camel/pom.xml
index 1a9057b..53c2b05 100644
--- a/plc4j/integrations/apache-camel/pom.xml
+++ b/plc4j/integrations/apache-camel/pom.xml
@@ -135,6 +135,17 @@
     </dependency>
 
     <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-connection-pool</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-scraper</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-core-engine</artifactId>
       <version>${camel.version}</version>
@@ -160,7 +171,6 @@
       <version>${camel.version}</version>
     </dependency>
 
-
     <!-- Support camel documentation-->
     <!-- TODO: Do we need this? -->
     <!--dependency>
diff --git a/plc4j/integrations/apache-camel/src/main/docs/PLC4X.adoc b/plc4j/integrations/apache-camel/src/main/docs/PLC4X.adoc
index 3aa5fe8..4b0dfc8 100644
--- a/plc4j/integrations/apache-camel/src/main/docs/PLC4X.adoc
+++ b/plc4j/integrations/apache-camel/src/main/docs/PLC4X.adoc
@@ -15,8 +15,50 @@
 //  limitations under the License.
 //
 
-// component options: START
-// component options: END
+:icons: font
+
+== Camel-PLC4X Component
+The Camel Component for PLC4X allows you to create routes using the PLC4X API to read from a PLC device or write to it.
+
+=== Maven dependency
+To use the Camel component, just add following dependency to your project
+----
+<dependency>
+  <groupId>org.apache.plc4x</groupId>
+  <artifactId>plc4j-apache-camel</artifactId>
+  <version>{current-last-released-version}</version>
+</dependency>
+----
+
+== Endpoint
+[cols="2"]
+|===
+|Name |Value
+
+|*Tags*   | The tags to read as `Map<String,String>` containing the tagname associated to its query
+|*Trigger*|(*Consumer*) Query to a trigger. On a rising edge of the trigger, the tags will be read once
+|*Period* |(*Consumer*) Interval on which the Trigger should be checked
+|*Driver parameters* | Every Parameter unknown to the Component will be passed to the driver
+|===
+=== URI Format
+----
+plc4x:[driver-code]://[IP|host][?parameters]
+----
+Note that sometimes you want to add the `Transport` code after the `Driver` code:
+
+----
+plc4x:[driver-code]:[transport-code]://[IP|host][?parameters]
+----
+== Consumer
+The consumer supports one-time reading or Triggered Reading. (_Schedulded Reading using Period only soon_).To read from
+the PLC, use a  `Map<String,String>` containing the Alias and Queries for the Data you want.
+
+The Body create by the Consumer will be a `Map<String,Object>` containing the Aliases and there associated value
+read from the PLC.
+
+== Producer
+To write data to the PLC, we also use a `Map`. The difference with the Producer is that the `Value` of the Map has also to
+be a Map. Also, this `Map` has to be set into the `Body` of the `Message`
 
 // endpoint options: START
 // endpoint options: END
\ No newline at end of file
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Constants.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Constants.java
index 733e269..e5bfd12 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Constants.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Constants.java
@@ -22,7 +22,8 @@ public class Constants {
 
     public static final String FIELD_NAME_HEADER = "fieldName";
     public static final String FIELD_QUERY_HEADER = "fieldQuery";
-
+    public final static String TRIGGER = "TRIGGER_VAR";
+    public final static String PLC_NAME = "PLC";
     private Constants() {
       throw new IllegalStateException("Utility class!");
     }
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XComponent.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XComponent.java
index 82763ff..b629bd2 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XComponent.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XComponent.java
@@ -21,11 +21,10 @@ package org.apache.plc4x.camel;
 import org.apache.camel.Endpoint;
 import org.apache.camel.support.DefaultComponent;
 import org.apache.camel.util.IntrospectionSupport;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 
 public class Plc4XComponent extends DefaultComponent {
@@ -34,10 +33,21 @@ public class Plc4XComponent extends DefaultComponent {
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
         Endpoint endpoint = new Plc4XEndpoint(uri, this);
-        List<TagData>tags = getAndRemoveOrResolveReferenceParameter(parameters,"tags", List.class);
+        //Tags have a Name, a query and an optional value (for writing)
+        //Reading --> Map<String,String>
+        //Writing --> Map<String,Map.Entry<String,Object>>
+        Map<String, Object> tags = getAndRemoveOrResolveReferenceParameter(parameters, "tags", Map.class);
         if(tags!=null){
             ((Plc4XEndpoint)endpoint).setTags(tags);
         }
+        String trigger = getAndRemoveOrResolveReferenceParameter(parameters,"trigger",String.class);
+        if(trigger!=null){
+            ((Plc4XEndpoint)endpoint).setTrigger(trigger);
+        }
+        Object period = getAndRemoveOrResolveReferenceParameter(parameters,"period",Integer.class);
+        if(period!=null && period instanceof Integer){
+            ((Plc4XEndpoint)endpoint).setPeriod((int)period);
+        }
         setProperties(endpoint,parameters);
         return endpoint;
     }
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java
index 18161db..c81fe66 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XConsumer.java
@@ -25,15 +25,22 @@ import org.apache.camel.support.DefaultConsumer;
 import org.apache.camel.spi.ExceptionHandler;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcException;
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
+import org.apache.plc4x.java.scraper.ScrapeJob;
+import org.apache.plc4x.java.scraper.config.JobConfigurationImpl;
+import org.apache.plc4x.java.scraper.config.ScraperConfiguration;
+import org.apache.plc4x.java.scraper.config.triggeredscraper.ScraperConfigurationTriggeredImpl;
+import org.apache.plc4x.java.scraper.exception.ScraperException;
+import org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScrapeJobImpl;
+import org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl;
+import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollector;
+import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.*;
 
 public class Plc4XConsumer extends DefaultConsumer {
@@ -41,19 +48,23 @@ public class Plc4XConsumer extends DefaultConsumer {
 
     private ExceptionHandler exceptionHandler;
     private PlcConnection plcConnection;
-    private  List<TagData> tags;
-    private Map parameters;
+    private  Map<String,Object> tags;
+    private String trigger;
     private PlcSubscriptionResponse subscriptionResponse;
     private Plc4XEndpoint plc4XEndpoint;
 
     private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
     private ScheduledFuture<?> future;
 
+
+
     public Plc4XConsumer(Plc4XEndpoint endpoint, Processor processor) throws PlcException {
         super(endpoint, processor);
         plc4XEndpoint =endpoint;
         this.plcConnection = endpoint.getConnection();
         this.tags = endpoint.getTags();
+        this.trigger= endpoint.getTrigger();
+        plc4XEndpoint=endpoint;
     }
 
     @Override
@@ -76,41 +87,75 @@ public class Plc4XConsumer extends DefaultConsumer {
 
     @Override
     protected void doStart() throws InterruptedException, ExecutionException {
-        PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
-        if (tags.size()==1){
-            TagData tag = tags.get(0);
-            builder.addItem(tag.getTagName(),tag.getQuery());
-
-        }
-        else{
-           for(TagData tag : tags){
-               builder.addItem(tag.getTagName(),tag.getQuery());
-           }
-        }
-        PlcReadRequest request = builder.build();
-        future = executorService.schedule(() -> {
-            request.execute().thenAccept(response -> {
+        if(trigger==null) {
+            PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
+            for( String tag : tags.keySet()){
+                try{
+                    String query = (String)tags.get(tag);
+                    builder.addItem(tag,query);
+                }
+                catch (PlcIncompatibleDatatypeException e){
+                    LOGGER.error("For consumer, please use Map<String,String>, currently using {}",tags.getClass().getSimpleName());
+                }
+            }
+            PlcReadRequest request = builder.build();
+            future = executorService.schedule(() -> {
+                request.execute().thenAccept(response -> {
                     try {
                         Exchange exchange = plc4XEndpoint.createExchange();
-                        if (tags.size()>1){
-                            List<TagData> values = new ArrayList<>();
-                            for(TagData tag : tags){
-                                tag.setValue(response.getObject(tag.getTagName()));
-                                values.add(tag);
-                            }
-                            exchange.getIn().setBody(values);
-                        }
-                        else {
-                            TagData tag = tags.get(0);
-                            tag.setValue(response.getAllObjects(tag.getTagName()));
-                            exchange.getIn().setBody(tag);
+                        Map<String,Object> rsp = new HashMap<>();
+                        for(String field : response.getFieldNames()){
+                            rsp.put(field,response.getObject(field));
                         }
+                        exchange.getIn().setBody(rsp);
                         getProcessor().process(exchange);
                     } catch (Exception e) {
                         exceptionHandler.handleException(e);
                     }
                 });
-        }, 500, TimeUnit.MILLISECONDS);
+            }, 500, TimeUnit.MILLISECONDS);
+        }
+        else{
+            try {
+                ScraperConfiguration configuration =  getScraperConfig(validateTags());
+                TriggerCollector collector = new TriggerCollectorImpl(plc4XEndpoint.getPlcDriverManager());
+
+                TriggeredScraperImpl scraper = new TriggeredScraperImpl(configuration, (job, alias, response) -> {
+                    try {
+                        Exchange exchange = plc4XEndpoint.createExchange();
+                        exchange.getIn().setBody(response);
+                        getProcessor().process(exchange);
+                    } catch (Exception e) {
+                        exceptionHandler.handleException(e);
+                    };
+                    },collector);
+                scraper.start();
+                collector.start();
+            } catch (ScraperException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private Map<String, String> validateTags() {
+        Map<String, String> map = new HashMap<>();
+        for(Map.Entry<String,Object>tag: tags.entrySet()){
+            if(tag.getValue() instanceof String){
+                map.put(tag.getKey(),(String)tag.getValue());
+            }
+        }
+        if(map.size()!=tags.size()){
+            LOGGER.error("At least one entry does not match the format : Map.Entry<String,String> ");
+            return null;
+        }
+        else return map;
+    }
+
+    private ScraperConfigurationTriggeredImpl getScraperConfig(Map<String,String> tagList){
+        String config = "(TRIGGER_VAR,"+plc4XEndpoint.getPeriod()+",("+ plc4XEndpoint.getTrigger() +")==(true))";
+        List<JobConfigurationImpl> job = Collections.singletonList(new JobConfigurationImpl("PLC4X-Camel",config,0,Collections.singletonList(Constants.PLC_NAME),tagList));
+        Map<String,String> source = Collections.singletonMap(Constants.PLC_NAME,plc4XEndpoint.getUri());
+        return new ScraperConfigurationTriggeredImpl(source,job);
     }
 
     @Override
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XEndpoint.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XEndpoint.java
index c7e6a0e..e14e9f5 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XEndpoint.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XEndpoint.java
@@ -24,10 +24,11 @@ import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
+import org.apache.commons.math3.util.Pair;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.slf4j.LoggerFactory;
+import org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager;
 
 import java.util.List;
 import java.util.Map;
@@ -36,26 +37,60 @@ import java.util.Objects;
 @UriEndpoint(scheme = "plc4x", title = "PLC4X", syntax = "plc4x:driver", label = "plc4x")
 public class Plc4XEndpoint extends DefaultEndpoint {
 
-    @UriPath @Metadata(required = true)
+    @UriPath
+    @Metadata(required = true)
     private String driver;
 
     @UriParam
-    private List<TagData> tags;
+    private Map<String, Object> tags;
 
+    @UriParam
+    private String trigger;
+
+    @UriParam
+    private int period;
+
+    public int getPeriod() {
+        return period;
+    }
+
+    public void setPeriod(int period) {
+        this.period = period;
+    }
 
-    private final PlcDriverManager plcDriverManager;
-    private  PlcConnection connection;
+    private  PlcDriverManager plcDriverManager;
+    private PlcConnection connection;
     private String uri;
 
+    public String getUri() {
+        return uri;
+    }
+
+    public String getTrigger() {
+        return trigger;
+    }
+
+    public void setTrigger(String trigger) {
+        this.trigger = trigger;
+        plcDriverManager = new PooledPlcDriverManager();
+        String plc4xURI = uri.replaceFirst("plc4x:/?/?", "");
+        uri=plc4xURI;
+        try {
+            connection = plcDriverManager.getConnection(plc4xURI);
+        } catch (PlcConnectionException e) {
+            e.printStackTrace();
+        }
+    }
+
     public Plc4XEndpoint(String endpointUri, Component component) {
         super(endpointUri, component);
-        plcDriverManager= new PlcDriverManager();
+        plcDriverManager = new PlcDriverManager();
         uri = endpointUri;
-
         //Here we establish the connection in the endpoint, as it is created once during the context
         // to avoid disconnecting and reconnecting for every request
         try {
             String plc4xURI = uri.replaceFirst("plc4x:/?/?", "");
+            uri = plc4xURI;
             connection = plcDriverManager.getConnection(plc4xURI);
 
         } catch (PlcConnectionException e) {
@@ -75,11 +110,10 @@ public class Plc4XEndpoint extends DefaultEndpoint {
     @Override
     public Producer createProducer() throws Exception {
         //Checking if connection is still up and reconnecting if not
-        if(!connection.isConnected()){
-            try{
-                connection= plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
-            }
-            catch (Exception e){
+        if (!connection.isConnected()) {
+            try {
+                connection = plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
+            } catch (Exception e) {
                 e.printStackTrace();
             }
         }
@@ -89,11 +123,10 @@ public class Plc4XEndpoint extends DefaultEndpoint {
     @Override
     public Consumer createConsumer(Processor processor) throws Exception {
         //Checking if connection is still up and reconnecting if not
-        if(!connection.isConnected()){
-            try{
-                connection= plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
-            }
-            catch (Exception e){
+        if (!connection.isConnected()) {
+            try {
+                connection = plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
+            } catch (Exception e) {
                 e.printStackTrace();
             }
         }
@@ -103,11 +136,10 @@ public class Plc4XEndpoint extends DefaultEndpoint {
     @Override
     public PollingConsumer createPollingConsumer() throws Exception {
         //Checking if connection is still up and reconnecting if not
-        if(!connection.isConnected()){
-            try{
-                connection= plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
-            }
-            catch (Exception e){
+        if (!connection.isConnected()) {
+            try {
+                connection = plcDriverManager.getConnection(uri.replaceFirst("plc4x:/?/?", ""));
+            } catch (Exception e) {
                 e.printStackTrace();
             }
         }
@@ -131,11 +163,11 @@ public class Plc4XEndpoint extends DefaultEndpoint {
         this.driver = driver;
     }
 
-    public List<TagData> getTags() {
+    public Map<String, Object> getTags() {
         return tags;
     }
 
-    public void setTags(List<TagData> tags) {
+    public void setTags(Map<String, Object> tags) {
         this.tags = tags;
     }
 
@@ -158,20 +190,19 @@ public class Plc4XEndpoint extends DefaultEndpoint {
 
     @Override
     public int hashCode() {
-        return Objects.hash(super.hashCode(), getDriver(), getTags(),getPlcDriverManager());
+        return Objects.hash(super.hashCode(), getDriver(), getTags(), getPlcDriverManager());
     }
 
     @Override
-    public void doStop(){
+    public void doStop() {
         //Shutting down the connection when leaving the Context
-        try{
-            if(connection!=null){
-                if(connection.isConnected()){
+        try {
+            if (connection != null) {
+                if (connection.isConnected()) {
                     connection.close();
                 }
             }
-        }
-        catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java
index a261606..c6c369e 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XPollingConsumer.java
@@ -26,8 +26,14 @@ import org.apache.camel.spi.ExceptionHandler;
 import org.apache.camel.support.LoggingExceptionHandler;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcException;
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.scraper.config.ScraperConfiguration;
+import org.apache.plc4x.java.scraper.exception.ScraperException;
+import org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl;
+import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollector;
+import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,14 +50,17 @@ public class Plc4XPollingConsumer implements PollingConsumer {
     private ExceptionHandler exceptionHandler;
     private PlcConnection plcConnection;
     private PlcReadRequest.Builder requestBuilder;
-    private Map parameters;
-
+    private  Map<String,Object> tags;
+    private String trigger;
 
+//TODO Is this still needed with the scraper working?
     public Plc4XPollingConsumer(Plc4XEndpoint endpoint) throws PlcException {
         plc4XEndpoint=endpoint;
         this.exceptionHandler = new LoggingExceptionHandler(endpoint.getCamelContext(), getClass());
         String plc4xURI = endpoint.getEndpointUri().replaceFirst("plc4x:/?/?", "");
         this.plcConnection = endpoint.getConnection();
+        this.tags = endpoint.getTags();
+        this.trigger= endpoint.getTrigger();
     }
 
     @Override
@@ -73,7 +82,7 @@ public class Plc4XPollingConsumer implements PollingConsumer {
     }
 
     @Override
-    public Exchange receive() {
+    public Exchange receive() {/**
         Exchange exchange = plc4XEndpoint.createExchange();
         try {
             PlcReadResponse read = createReadRequest().execute().get();
@@ -96,7 +105,8 @@ public class Plc4XPollingConsumer implements PollingConsumer {
         } catch (ExecutionException e) {
             exchange.setException(e);
         }
-        return exchange;
+        return exchange;*/
+    return null;
     }
 
     @Override
@@ -105,7 +115,7 @@ public class Plc4XPollingConsumer implements PollingConsumer {
     }
 
     @Override
-    public Exchange receive(long timeout) {
+    public Exchange receive(long timeout) {/**
         Exchange exchange = plc4XEndpoint.createExchange();
         CompletableFuture<? extends PlcReadResponse> read = createReadRequest().execute();
         try {
@@ -129,11 +139,12 @@ public class Plc4XPollingConsumer implements PollingConsumer {
             } catch(ExecutionException | TimeoutException e){
                 exchange.setException(e);
             }
-        return exchange;
+        return exchange;*/
+    return null;
     }
 
 
-    private PlcReadRequest createReadRequest() {
+    private PlcReadRequest createReadRequest() {/**
         requestBuilder = plcConnection.readRequestBuilder();
         if (plc4XEndpoint.getTags().size()>1){
             for(TagData tag : plc4XEndpoint.getTags()){
@@ -145,7 +156,7 @@ public class Plc4XPollingConsumer implements PollingConsumer {
             requestBuilder.addItem(tag.getTagName(),tag.getQuery());
         }
         return requestBuilder.build();
-    }
+    */return null;}
 
     private Object unwrapIfSingle(Collection collection) {
         if (collection.isEmpty()) {
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java
index 2dd64ba..2325d3a 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/Plc4XProducer.java
@@ -22,6 +22,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.support.DefaultAsyncProducer;
+import org.apache.commons.math3.util.Pair;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
@@ -30,7 +31,8 @@ import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
+import java.util.Iterator;
+import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -54,20 +56,19 @@ public class Plc4XProducer extends DefaultAsyncProducer {
         Message in = exchange.getIn();
         Object body = in.getBody();
         PlcWriteRequest.Builder builder = plcConnection.writeRequestBuilder();
-        if (body instanceof List) { //Check if we have a List
-            if(((List) body).get(0) instanceof TagData){    //Check if this List contains TagData
-                List<TagData> tags =(List<TagData>) body;
-                for(TagData tag : tags){
-                    builder.addItem(tag.getTagName(),tag.getQuery(),tag.getValue());
-                }
+        if (body instanceof Map) { //Check if we have a Map
+            Map<String, Map<String, Object>> tags = (Map<String, Map<String, Object>>) body;
+            for (Map.Entry<String, Map<String, Object>> entry : tags.entrySet()) {
+                //Tags are stored like this --> Map<Tagname,Map<Query,Value>> for writing
+                String name = entry.getKey();
+                String query = entry.getValue().keySet().iterator().next();
+                Object value = entry.getValue().get(query);
+                builder.addItem(name,query,value);
             }
-            else {
-                throw new PlcInvalidFieldException("Parameter 'tags' has to be a List of TagData");
-            }
-        }
-        else {
-            throw new PlcInvalidFieldException("Parameter 'tags' has to be a List");
+        } else {
+            throw new PlcInvalidFieldException("The body must contain a Map<String,Map<String,Object>");
         }
+
         CompletableFuture<? extends PlcWriteResponse> completableFuture = builder.build().execute();
         int currentlyOpenRequests = openRequests.incrementAndGet();
         try {
diff --git a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/TagData.java b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/TagData.java
index f57774f..c6b5d53 100644
--- a/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/TagData.java
+++ b/plc4j/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/TagData.java
@@ -18,7 +18,10 @@ under the License.
 */
 package org.apache.plc4x.camel;
 
+import org.slf4j.LoggerFactory;
+
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
 
@@ -114,4 +117,13 @@ public class TagData {
 
 
     }
+
+    public static Map<String,String> toMap(List<TagData> tags){
+        Map<String,String> map = new HashMap<>();
+        LoggerFactory.getLogger(TagData.class).info("Classloader {} ", Thread.currentThread().getContextClassLoader());
+        for(TagData tag : tags){
+            map.put(tag.getTagName(),tag.getQuery());
+        }
+        return map;
+    }
 }
diff --git a/plc4j/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XComponentTest.java b/plc4j/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XComponentTest.java
index 168e2e5..7d8f78d 100644
--- a/plc4j/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XComponentTest.java
+++ b/plc4j/integrations/apache-camel/src/test/java/org/apache/plc4x/camel/Plc4XComponentTest.java
@@ -25,10 +25,7 @@ import org.apache.camel.test.junit5.CamelTestSupport;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.junit.jupiter.api.Test;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 public class Plc4XComponentTest extends CamelTestSupport {
@@ -49,9 +46,8 @@ public class Plc4XComponentTest extends CamelTestSupport {
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                List<TagData> tags = new ArrayList<>();
-                tags.add(new TagData("testTagName","testTagAddress"));
-                tags.add(new TagData("testTagName2","testTagAddress2"));
+               Map<String,Object> tags = new HashMap<>();
+               tags.put("Test1","%TestQuery");
                 Plc4XEndpoint producer = getContext().getEndpoint("plc4x:mock:10.10.10.1/1/1", Plc4XEndpoint.class);
                 producer.setTags(tags);
                 from("direct:plc4x")
diff --git a/plc4j/karaf-features/camel/pom.xml b/plc4j/karaf-features/camel/pom.xml
index bbedb00..8c17998 100644
--- a/plc4j/karaf-features/camel/pom.xml
+++ b/plc4j/karaf-features/camel/pom.xml
@@ -29,7 +29,7 @@
 
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>camel-feature</artifactId>
+  <artifactId>camel-plc4x</artifactId>
   <name>PLC4J: Karaf-Features: Camel</name>
   <packaging>pom</packaging>
 
diff --git a/plc4j/tools/scraper/pom.xml b/plc4j/tools/scraper/pom.xml
index c5d1ff4..b577758 100644
--- a/plc4j/tools/scraper/pom.xml
+++ b/plc4j/tools/scraper/pom.xml
@@ -104,18 +104,4 @@
     </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <usedDependencies combine.children="append">
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-          </usedDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
 </project>
\ No newline at end of file
diff --git a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
index 0f3ddc3..8035270 100644
--- a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
+++ b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
@@ -40,7 +40,6 @@ import java.util.regex.Pattern;
 public class TriggerConfiguration{
     private static final Logger logger = LoggerFactory.getLogger(TriggerConfiguration.class);
 
-    //private static final String S_7_TRIGGER_VAR = "S7_TRIGGER_VAR";
     private static final String TRIGGER = "TRIGGER_VAR";
     private static final String SCHEDULED       = "SCHEDULED";
     private static final String PREVIOUS_DEF    = "PREV";
@@ -56,7 +55,7 @@ public class TriggerConfiguration{
     private List<TriggerElement> triggerElementList;
 
     /**
-     * default constructor when an S7Field should be used for triggering
+     * default constructor when an Field should be used for triggering
      * @param triggerType type of trigger from enum
      * @param scrapeInterval scrape interval of triggered variable
      * @param triggerElementList list of triggerElemts with concat that combined is used as triger
@@ -75,10 +74,10 @@ public class TriggerConfiguration{
 
         String exceptionMessage;
 
-        if(this.triggerType.equals(TriggerType.S7_TRIGGER_VAR) ||this.triggerType.equals(TriggerType.TRIGGER_VAR) ) {
+        if(this.triggerType.equals(TriggerType.TRIGGER_VAR) ) {
             //test for valid field-connection string, on exception quit job and return message to user
             if(this.triggerElementList.isEmpty()){
-                exceptionMessage = String.format("No items in trigger List for trigger-type S7_TRIGGER_VAR for Job %s!", triggeredScrapeJobImpl.getJobName());
+                exceptionMessage = String.format("No items in trigger List for trigger-type TRIGGER_VAR for Job %s!", triggeredScrapeJobImpl.getJobName());
                 throw new ScraperConfigurationException(exceptionMessage);
             }
             checkTriggerVarList();
@@ -150,7 +149,7 @@ public class TriggerConfiguration{
     /**
      * defines the used base type for comparison
      * @return the detected base type
-     * @throws ScraperException when an unsupported S7-Type is chosen,which is not (yet) implemented for comparison
+     * @throws ScraperException when an unsupported Type is chosen,which is not (yet) implemented for comparison
      * ToDo check how to handle time-variables if needed
      */
     private static Class<?> validateDataType(PlcField plcField) throws ScraperConfigurationException {
@@ -541,12 +540,11 @@ public class TriggerConfiguration{
             this.plcConnectionString = plcConnectionString;
             if(triggerStrategy.equals(TRIGGER)){
                 try {
-                    //this.plcField = S7Field.of(this.plcFieldString);
                     this.plcField = prepareField(plcFieldString);
                 }
                 catch (Exception e){
                     if(logger.isDebugEnabled()) {
-                        logger.debug("Exception occurred parsing a S7Field");
+                        logger.debug("Exception occurred parsing a PlcField");
                     }
                     throw new ScraperConfigurationException("Exception on parsing S7Field (" + plcField + "): " + e.getMessage());
                 }
diff --git a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java
index a35dd12..691fd7f 100644
--- a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java
+++ b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java
@@ -32,6 +32,7 @@ import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.T
 import org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl;
 import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -73,7 +74,7 @@ public class TriggeredScraperImplTest {
     /**
      * Test is added because we assume some strange behavior.
      */
-    //@Test
+    @Test
     public void scrapeMultipleTargets() throws ScraperException, IOException, InterruptedException {
         // Prepare the Mocking
         // Scrate Jobs 1 and 2
diff --git a/plc4j/tools/scraper/src/test/resources/example_triggered_scraper.yml b/plc4j/tools/scraper/src/test/resources/example_triggered_scraper.yml
index ec79e17..30ab0af 100644
--- a/plc4j/tools/scraper/src/test/resources/example_triggered_scraper.yml
+++ b/plc4j/tools/scraper/src/test/resources/example_triggered_scraper.yml
@@ -29,14 +29,14 @@ jobs:
       test1: '%DB810:DBB0:USINT'
 
   - name: triggered-demo-job1
-    triggerConfig: (S7_TRIGGER_VAR,10,(%M0.3:BOOL)==(true))
+    triggerConfig: (TRIGGER_VAR,10,(%M0.3:BOOL)==(true))
     sources:
       - S7_PI
     fields:
       test1: '%DB810:DBW0:INT'
 
   - name: triggered-demo-job2
-    triggerConfig: (S7_TRIGGER_VAR,1000,(%M0.7:BOOL)==(true))
+    triggerConfig: (TRIGGER_VAR,1000,(%M0.7:BOOL)==(true))
     sources:
       - S7_PI
     fields:
@@ -60,14 +60,14 @@ jobs:
 
 
   - name: triggered-demo-job3-prev_value
-    triggerConfig: (S7_TRIGGER_VAR,500,(%M0:USINT)>=(PREV))
+    triggerConfig: (TRIGGER_VAR,500,(%M0:USINT)>=(PREV))
     sources:
       - S7_PI
     fields:
       test1: '%DB810:DBW0:INT'
 
   - name: triggered-demo-job4-combinded-condition
-    triggerConfig: (S7_TRIGGER_VAR,5,(%M0.1:BOOL)==(true)OR(%M0.2:BOOL)==(true))
+    triggerConfig: (TRIGGER_VAR,5,(%M0.1:BOOL)==(true)OR(%M0.2:BOOL)==(true))
     sources:
       - S7_PI
     fields:
diff --git a/plc4j/tools/scraper/src/test/resources/mock-scraper-config.yml b/plc4j/tools/scraper/src/test/resources/mock-scraper-config.yml
index face235..af9163a 100644
--- a/plc4j/tools/scraper/src/test/resources/mock-scraper-config.yml
+++ b/plc4j/tools/scraper/src/test/resources/mock-scraper-config.yml
@@ -40,7 +40,7 @@ jobs:
 
 
   - name: triggered-demo-job1
-    triggerConfig: (S7_TRIGGER_VAR,10,(%M0.3:BOOL)==(true))
+    triggerConfig: (TRIGGER_VAR,10,(%M0.3:BOOL)==(true))
     sources:
       - MOCK_1
       - MOCK_2
@@ -49,7 +49,7 @@ jobs:
 
 
   - name: triggered-demo-job2
-    triggerConfig: (S7_TRIGGER_VAR,10,(%M0.7:BOOL)==(true))
+    triggerConfig: (TRIGGER_VAR,10,(%M0.7:BOOL)==(true))
     sources:
       - MOCK_1
       - MOCK_2
diff --git a/pom.xml b/pom.xml
index d466ac3..8dadd50 100644
--- a/pom.xml
+++ b/pom.xml
@@ -155,7 +155,7 @@
     <pcap4j.version>1.8.2</pcap4j.version>
     <scala.version>2.12.6</scala.version>
     <slf4j.version>1.7.25</slf4j.version>
-    <snakeyaml.version>1.23</snakeyaml.version>
+    <snakeyaml.version>1.24</snakeyaml.version>
     <spock-reports.version>1.6.1</spock-reports.version>
     <spock.version>1.2-groovy-2.5</spock.version>
     <t-digest.version>3.2</t-digest.version>