From 04b4e3a6f32da40d977e6055fb6ff31aeebaeca1 Mon Sep 17 00:00:00 2001
From: Frank Rohde <frank.rohde@tu-dresden.de>
Date: Wed, 9 Feb 2022 17:49:10 +0100
Subject: [PATCH] IPos-FW can perform rawdata-filtering PositionMonitoring:    
 read new field of MonitoringRequest "property" into EventFilterCondition    
 function that handles UWBRawDataEvents now passes rawdata to suitable
 eventFilter-function EventFilterCondition: new Field "propertyCondition"
 eventFilter: new function to filter rawdata Triangulation: function "update"
 is able to decide whether a position can be calculated from the received
 rawdata, or not GenericSensorValueProcessor: Rawdata is published over this
 class added tooz-testdata and adapted init_Industrierobotik.txt for testing
 forwarding of rawdata (new monitoringRequest)

---
 emf_datamodel/model/iPos_Datamodel.aird       | 16 ++++-
 emf_datamodel/model/iPos_Datamodel.ecore      |  1 +
 emf_datamodel/model/iPos_Datamodel.genmodel   |  1 +
 init_Industrierobotik.txt                     |  4 +-
 .../ipos/project/CustomLoggingFilter.java     |  2 +-
 .../service/SimpleSceneTransformer.java       |  4 +-
 .../iPos_Datamodel/EventFilterCondition.java  | 23 ++++++++
 .../iPos_Datamodel/IPos_DatamodelPackage.java | 30 +++++++++-
 .../impl/EventFilterConditionImpl.java        | 57 ++++++++++++++++++
 .../impl/IPos_DatamodelPackageImpl.java       | 13 ++++
 .../project/Functionality/Triangulation.java  | 38 +++++++++++-
 .../eventfilter/BeaconFilteringResult.java    | 29 +++++++++
 .../eventfilter/eventFilter.java              | 37 ++++++++++++
 .../Functionality/eventfilter/readConfig.java | 33 ++++++++++-
 src/main/java/ipos/project/MainApp.java       |  3 +
 .../GenericSensorValueProcessor.java          | 36 ++++++++++-
 .../Service/GenericSensorTransformer.java     | 22 +++++--
 .../UseCaseController/PositionMonitoring.java | 59 +++++++++++++++----
 src/main/resources/application.yml            |  1 +
 testdata_raw_tooz.txt                         |  4 ++
 20 files changed, 383 insertions(+), 30 deletions(-)
 create mode 100644 src/main/java/ipos/project/Functionality/eventfilter/BeaconFilteringResult.java
 create mode 100644 testdata_raw_tooz.txt

diff --git a/emf_datamodel/model/iPos_Datamodel.aird b/emf_datamodel/model/iPos_Datamodel.aird
index a5275bf..8b8c995 100644
--- a/emf_datamodel/model/iPos_Datamodel.aird
+++ b/emf_datamodel/model/iPos_Datamodel.aird
@@ -5,7 +5,7 @@
     <semanticResources>iPos_Datamodel.genmodel</semanticResources>
     <ownedViews xmi:type="viewpoint:DView" uid="_EpwecAQNEey-kNQ7esRa_g">
       <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
-      <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_Et4wgAQNEey-kNQ7esRa_g" name="iPos_Datamodel" repPath="#_Es-xkAQNEey-kNQ7esRa_g" changeId="3f9b6c14-7502-4721-83eb-e39042109149">
+      <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_Et4wgAQNEey-kNQ7esRa_g" name="iPos_Datamodel" repPath="#_Es-xkAQNEey-kNQ7esRa_g" changeId="0678978b-7913-4092-aa95-af020ffe817b">
         <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
         <target xmi:type="ecore:EPackage" href="iPos_Datamodel.ecore#/"/>
       </ownedRepresentationDescriptors>
@@ -611,6 +611,10 @@
               <styles xmi:type="notation:FontStyle" xmi:id="_iWqJIR_NEeyaJIyxidrtuQ" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/>
               <layoutConstraint xmi:type="notation:Location" xmi:id="_iWqJIh_NEeyaJIyxidrtuQ"/>
             </children>
+            <children xmi:type="notation:Node" xmi:id="_Fx5DEIThEeybc9Dj6t-c7Q" type="3010" element="_Fvq1gIThEeybc9Dj6t-c7Q">
+              <styles xmi:type="notation:FontStyle" xmi:id="_Fx5DEYThEeybc9Dj6t-c7Q" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/>
+              <layoutConstraint xmi:type="notation:Location" xmi:id="_Fx5DEoThEeybc9Dj6t-c7Q"/>
+            </children>
             <styles xmi:type="notation:SortingStyle" xmi:id="_D9ZrhQc-Eey-kNQ7esRa_g"/>
             <styles xmi:type="notation:FilteringStyle" xmi:id="_D9Zrhgc-Eey-kNQ7esRa_g"/>
           </children>
@@ -2600,7 +2604,7 @@
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
       <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
       <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
-      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_TIvV4jASEeys5_IXgF_hBA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_KjE6L4ThEeybc9Dj6t-c7Q" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
         <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
       </ownedStyle>
       <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
@@ -2684,6 +2688,14 @@
         </ownedStyle>
         <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
       </ownedElements>
+      <ownedElements xmi:type="diagram:DNodeListElement" uid="_Fvq1gIThEeybc9Dj6t-c7Q" name="propertyCondition : StringList" tooltipText="">
+        <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/propertyCondition"/>
+        <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/propertyCondition"/>
+        <ownedStyle xmi:type="diagram:BundledImage" uid="_KjLn1YThEeybc9Dj6t-c7Q" labelAlignment="LEFT">
+          <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
+      </ownedElements>
     </ownedDiagramElements>
     <ownedDiagramElements xmi:type="diagram:DEdge" uid="_JkOxSgc-Eey-kNQ7esRa_g" name="[0..*] eventfiltercondition" sourceNode="_IOFwkAZtEey-kNQ7esRa_g" targetNode="_D9Ka8Ac-Eey-kNQ7esRa_g">
       <target xmi:type="ecore:EReference" href="iPos_Datamodel.ecore#//EventFilterConfiguration/eventfiltercondition"/>
diff --git a/emf_datamodel/model/iPos_Datamodel.ecore b/emf_datamodel/model/iPos_Datamodel.ecore
index b5a51eb..9b325ff 100644
--- a/emf_datamodel/model/iPos_Datamodel.ecore
+++ b/emf_datamodel/model/iPos_Datamodel.ecore
@@ -225,6 +225,7 @@
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="idCondition" eType="#//StringList"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="categoryCondition" eType="#//StringList"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="propertyCondition" eType="#//StringList"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EDataType" name="StringList" instanceClassName="java.util.List&lt;java.lang.String>"/>
   <eClassifiers xsi:type="ecore:EDataType" name="StringArray" instanceClassName="java.util.ArrayList&lt;java.lang.String[]>"/>
diff --git a/emf_datamodel/model/iPos_Datamodel.genmodel b/emf_datamodel/model/iPos_Datamodel.genmodel
index a63721d..a1f0d8b 100644
--- a/emf_datamodel/model/iPos_Datamodel.genmodel
+++ b/emf_datamodel/model/iPos_Datamodel.genmodel
@@ -164,6 +164,7 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCells"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/idCondition"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/categoryCondition"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/propertyCondition"/>
     </genClasses>
     <genClasses ecoreClass="iPos_Datamodel.ecore#//ZoneDescriptor">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//ZoneDescriptor/zoneId"/>
diff --git a/init_Industrierobotik.txt b/init_Industrierobotik.txt
index ae7321c..42f77f3 100644
--- a/init_Industrierobotik.txt
+++ b/init_Industrierobotik.txt
@@ -1,5 +1,5 @@
 {"frames": [{"id": "cobot1_door_zone", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 2.0,"y": 0.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 6.0, "y": 4.0, "z":6.0}]}, {"id": "cobot1_window_zone", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 2.0,"y": 4.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 6.0, "y": 4.0, "z":6.0}]}, {"id": "robolab_east", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 4.0,"y": 2.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 4.0, "y": 4.0, "z":4.0}]}, {"id": "robolab_west", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": -4.0,"y": 2.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 8.0, "y": 10.0, "z":6.0}]}, {"id": "robolab_armarea", "space": [{"position": {"refSystemId": "CETI_ROBOTARM_CELL", "point": {"x": 0.0,"y": 0.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 8.0, "y": 10.0, "z":6.0}]} ]}
 {"refSystems": [{"id": "ROOT"}, {"id": "CETI_ROOT", "position": {"refSystemId": "ROOT", "point": {"x": 0.5,"y": 0.75,"z": 1.0}, "accuracy": 1.0}, "orientation": {"x": 0.7071067811865477,"y": 0.0,"z": 0.0, "w": 0.7071067811865477}}, {"id": "CETI_ROBOLAB", "position": {"refSystemId": "CETI_ROOT", "point": {"x": 0.2,"y": 0.2,"z": 0.2}, "accuracy": 1.0}, "orientation": {"x": 0.4082481001180531,"y": 0.4082481001180531,"z": 0.4082481001180531, "w": 0.7071067811865477}}, {"id": "CETI_OFFICE", "position": {"refSystemId": "CETI_ROOT", "point": {"x": 2.0,"y": 2.0,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0}}, {"id": "TL_TESTHALL", "position": {"refSystemId": "ROOT", "point": {"x": 40.0,"y": 60.0,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.21643961393810285, "w": 0.9762960071199334}}, {"id": "CETI_ROBOTARM_CELL", "position": {"refSystemId": "CETI_ROBOLAB", "point": {"x": 0.0,"y": 1.2,"z": 2.2}, "accuracy": 1.0}, "orientation": {"x": 0.2705992818596786,"y": 0.2705992818596786,"z": 0.0, "w": 0.9238795325112868}}]}
-{"objectConfigs": [{"agentId": "Employee_1", "sensorId": "UWB_2", "agentType": "HUMAN", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "UWB_1", "agentType": "ROBOT", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "98:CD:AC:26:2D:18", "agentType": "ROBOT", "sensorType": "RFID_SCANNER"}, {"agentId": "turtlebot", "sensorId": "handy1", "agentType": "ROBOT", "sensorType": "IMU"}]}
+{"objectConfigs": [{"agentId": "Employee_1", "sensorId": "UWB_2", "agentType": "HUMAN", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "UWB_1", "agentType": "ROBOT", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "98:CD:AC:26:2D:18", "agentType": "ROBOT", "sensorType": "RFID_SCANNER"}, {"agentId": "turtlebot", "sensorId": "handy1", "agentType": "ROBOT", "sensorType": "IMU"}, {"agentId": "tooz_employee", "sensorId": "tooz_employee_uwb", "agentType": "HUMAN", "sensorType": "UWB"}]}
 {"pois": [{"id": "UWB_BEACON_1", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 3.1,"y": 0.5,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "UWB_BEACON_2", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": -0.3,"y": 4.5,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0}}, {"id": "83221710", "description": "RFID_TAG", "data": {"type" : "NFC"}, "position": {"refSystemId": "ROOT", "point": {"x": 2.1,"y": 0.4,"z": 0.5}, "accuracy": 0.1}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "31762128", "description": "RFID_TAG", "data": {"type" : "NFC"}, "position": {"refSystemId": "ROOT", "point": {"x": 2.2,"y": 3.4,"z": 0.5}, "accuracy": 0.1}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "885", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 0,"y": 0,"z": 0.97}, "accuracy": 0.01}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "2934", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 4.24,"y": 1.33,"z": 1.0}, "accuracy": 0.01}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "3383", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 1.25,"y": 5.89,"z": 1.06}, "accuracy": 0.01}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "1107", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 4.24,"y": 5.83,"z": 1.05}, "accuracy": 0.01}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }]}
-{"monitoringRequests": [{"frameIds": ["cobot1_door_zone", "cobot1_window_zone"], "monitoringTaskId": "RobolabMonitoringCeti", "refSystemId": "CETI_ROBOTARM_CELL", "serializationType": "protobuf"}, {"frameIds": ["cobot1_door_zone", "cobot1_window_zone"], "monitoringTaskId": "RobolabMonitoringFrontend", "refSystemId": "CETI_ROBOTARM_CELL", "serializationType": "json"}]}
\ No newline at end of file
+{"monitoringRequests": [{"frameIds": ["cobot1_door_zone", "cobot1_window_zone"], "monitoringTaskId": "RobolabMonitoringCeti", "refSystemId": "CETI_ROBOTARM_CELL", "serializationType": "protobuf"}, {"frameIds": ["cobot1_door_zone", "cobot1_window_zone"], "monitoringTaskId": "RobolabMonitoringFrontend", "refSystemId": "ROOT", "serializationType": "json"}, {"id": ["tooz_employee_uwb"], "properties": ["distance"], "monitoringTaskId": "tooz_employee_distances", "refSystemId": "ROOT", "serializationType": "json"}]}
\ No newline at end of file
diff --git a/src/main/java/ipos/project/CustomLoggingFilter.java b/src/main/java/ipos/project/CustomLoggingFilter.java
index e464195..d5e865d 100644
--- a/src/main/java/ipos/project/CustomLoggingFilter.java
+++ b/src/main/java/ipos/project/CustomLoggingFilter.java
@@ -29,7 +29,7 @@ public class CustomLoggingFilter extends Filter<ILoggingEvent> {
         }else if (event.getMessage().contains("SHELL:")){
             return FilterReply.ACCEPT;
         } else {
-            return FilterReply.DENY;
+            return FilterReply.ACCEPT;
         }
 
     }
diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java
index ec72104..50e829f 100644
--- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java
+++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java
@@ -38,9 +38,9 @@ public class SimpleSceneTransformer {
     }
 
     private static List<String> toJavaStringList(ProtocolStringList protoList){
-        List<String> javaList = new ArrayList<String>();
+        List<String> javaList = new ArrayList<>();
         for(int i = 0; i < protoList.size(); i++ ){
-            javaList.set(i, protoList.get(i));
+            javaList.add(protoList.get(i));
         }
         return javaList;
     }
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java
index 5c3ad50..1011992 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java
@@ -27,6 +27,7 @@ import org.eclipse.emf.ecore.EObject;
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCells <em>Position Condition Cells</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getIdCondition <em>Id Condition</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getCategoryCondition <em>Category Condition</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPropertyCondition <em>Property Condition</em>}</li>
  * </ul>
  *
  * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getEventFilterCondition()
@@ -254,4 +255,26 @@ public interface EventFilterCondition extends EObject {
 	 */
 	void setCategoryCondition(List<String> value);
 
+	/**
+	 * Returns the value of the '<em><b>Property Condition</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Property Condition</em>' attribute.
+	 * @see #setPropertyCondition(List)
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getEventFilterCondition_PropertyCondition()
+	 * @model dataType="ipos.project.DataModellntegration.iPos_Datamodel.StringList"
+	 * @generated
+	 */
+	List<String> getPropertyCondition();
+
+	/**
+	 * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPropertyCondition <em>Property Condition</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Property Condition</em>' attribute.
+	 * @see #getPropertyCondition()
+	 * @generated
+	 */
+	void setPropertyCondition(List<String> value);
+
 } // EventFilterCondition
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java
index d65d870..fd26e45 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java
@@ -2111,6 +2111,15 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 */
 	int EVENT_FILTER_CONDITION__CATEGORY_CONDITION = 9;
 
+	/**
+	 * The feature id for the '<em><b>Property Condition</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EVENT_FILTER_CONDITION__PROPERTY_CONDITION = 10;
+
 	/**
 	 * The number of structural features of the '<em>Event Filter Condition</em>' class.
 	 * <!-- begin-user-doc -->
@@ -2118,7 +2127,7 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int EVENT_FILTER_CONDITION_FEATURE_COUNT = 10;
+	int EVENT_FILTER_CONDITION_FEATURE_COUNT = 11;
 
 	/**
 	 * The number of operations of the '<em>Event Filter Condition</em>' class.
@@ -3539,6 +3548,17 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 */
 	EAttribute getEventFilterCondition_CategoryCondition();
 
+	/**
+	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPropertyCondition <em>Property Condition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Property Condition</em>'.
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPropertyCondition()
+	 * @see #getEventFilterCondition()
+	 * @generated
+	 */
+	EAttribute getEventFilterCondition_PropertyCondition();
+
 	/**
 	 * Returns the meta object for class '{@link ipos.project.DataModellntegration.iPos_Datamodel.ZoneDescriptor <em>Zone Descriptor</em>}'.
 	 * <!-- begin-user-doc -->
@@ -4707,6 +4727,14 @@ public interface IPos_DatamodelPackage extends EPackage {
 		 */
 		EAttribute EVENT_FILTER_CONDITION__CATEGORY_CONDITION = eINSTANCE.getEventFilterCondition_CategoryCondition();
 
+		/**
+		 * The meta object literal for the '<em><b>Property Condition</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute EVENT_FILTER_CONDITION__PROPERTY_CONDITION = eINSTANCE.getEventFilterCondition_PropertyCondition();
+
 		/**
 		 * The meta object literal for the '{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.ZoneDescriptorImpl <em>Zone Descriptor</em>}' class.
 		 * <!-- begin-user-doc -->
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java
index d88c0ec..efe5d18 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java
@@ -34,6 +34,7 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getPositionConditionCells <em>Position Condition Cells</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getIdCondition <em>Id Condition</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getCategoryCondition <em>Category Condition</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getPropertyCondition <em>Property Condition</em>}</li>
  * </ul>
  *
  * @generated
@@ -229,6 +230,26 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 	 */
 	protected List<String> categoryCondition = CATEGORY_CONDITION_EDEFAULT;
 
+	/**
+	 * The default value of the '{@link #getPropertyCondition() <em>Property Condition</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPropertyCondition()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final List<String> PROPERTY_CONDITION_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getPropertyCondition() <em>Property Condition</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPropertyCondition()
+	 * @generated
+	 * @ordered
+	 */
+	protected List<String> propertyCondition = PROPERTY_CONDITION_EDEFAULT;
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -475,6 +496,29 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 					categoryCondition));
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public List<String> getPropertyCondition() {
+		return propertyCondition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPropertyCondition(List<String> newPropertyCondition) {
+		List<String> oldPropertyCondition = propertyCondition;
+		propertyCondition = newPropertyCondition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION, oldPropertyCondition,
+					propertyCondition));
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -503,6 +547,8 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 			return getIdCondition();
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION:
 			return getCategoryCondition();
+		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION:
+			return getPropertyCondition();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -546,6 +592,9 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION:
 			setCategoryCondition((List<String>) newValue);
 			return;
+		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION:
+			setPropertyCondition((List<String>) newValue);
+			return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -588,6 +637,9 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION:
 			setCategoryCondition(CATEGORY_CONDITION_EDEFAULT);
 			return;
+		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION:
+			setPropertyCondition(PROPERTY_CONDITION_EDEFAULT);
+			return;
 		}
 		super.eUnset(featureID);
 	}
@@ -625,6 +677,9 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION:
 			return CATEGORY_CONDITION_EDEFAULT == null ? categoryCondition != null
 					: !CATEGORY_CONDITION_EDEFAULT.equals(categoryCondition);
+		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION:
+			return PROPERTY_CONDITION_EDEFAULT == null ? propertyCondition != null
+					: !PROPERTY_CONDITION_EDEFAULT.equals(propertyCondition);
 		}
 		return super.eIsSet(featureID);
 	}
@@ -660,6 +715,8 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		result.append(idCondition);
 		result.append(", categoryCondition: ");
 		result.append(categoryCondition);
+		result.append(", propertyCondition: ");
+		result.append(propertyCondition);
 		result.append(')');
 		return result.toString();
 	}
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java
index 42c0605..5bbbef6 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java
@@ -1530,6 +1530,15 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		return (EAttribute) eventFilterConditionEClass.getEStructuralFeatures().get(9);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getEventFilterCondition_PropertyCondition() {
+		return (EAttribute) eventFilterConditionEClass.getEStructuralFeatures().get(10);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1813,6 +1822,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS);
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__ID_CONDITION);
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__CATEGORY_CONDITION);
+		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__PROPERTY_CONDITION);
 
 		zoneDescriptorEClass = createEClass(ZONE_DESCRIPTOR);
 		createEAttribute(zoneDescriptorEClass, ZONE_DESCRIPTOR__ZONE_ID);
@@ -2249,6 +2259,9 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		initEAttribute(getEventFilterCondition_CategoryCondition(), this.getStringList(), "categoryCondition", null, 0,
 				1, EventFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID,
 				IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getEventFilterCondition_PropertyCondition(), this.getStringList(), "propertyCondition", null, 0,
+				1, EventFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID,
+				IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(zoneDescriptorEClass, ZoneDescriptor.class, "ZoneDescriptor", !IS_ABSTRACT, !IS_INTERFACE,
 				IS_GENERATED_INSTANCE_CLASS);
diff --git a/src/main/java/ipos/project/Functionality/Triangulation.java b/src/main/java/ipos/project/Functionality/Triangulation.java
index a157732..576a3fc 100644
--- a/src/main/java/ipos/project/Functionality/Triangulation.java
+++ b/src/main/java/ipos/project/Functionality/Triangulation.java
@@ -21,14 +21,20 @@ import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.MissingResourceException;
+import java.util.Optional;
 
 public class Triangulation {
+    private static final int MIN_NUMBER_OF_BEACONS = 3;
     private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
 
     private static IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE;
 
-    public static PositionEvent update(UWB uwbRawDataEvent) throws ParseException {
-        
+    public static Optional<PositionEvent> update(UWB uwbRawDataEvent) throws ParseException {
+
+        if(eventNotApplicable(uwbRawDataEvent)){
+            return Optional.empty();
+        }
+
         double[][] positions = new double[][]{{0, 0}, {0, 0}, {0, 0}, {0, 0}};
         double[] distances = new double[]{0,0,0,0};
         HashMap uwbData = (HashMap) uwbRawDataEvent.getDistances();
@@ -66,9 +72,35 @@ public class Triangulation {
         tagPosition.setReferenceSystem(DataServices.getReferenceSystemByIdOrNull("ROOT"));
         tagPlacing.setPosition(tagPosition);
         tagPlacing.setOrientation(modelFactory.createQuaternion());
-        return createPosEvent(uwbRawDataEvent.getSensorId(), uwbRawDataEvent.getTimeStamp(), tagPlacing);
+        return Optional.of(createPosEvent(uwbRawDataEvent.getSensorId(), uwbRawDataEvent.getTimeStamp(), tagPlacing));
 
     }
+
+    private static boolean eventNotApplicable(UWB uwbRawDataEvent) {
+        return notEnoughBeaconDistances(uwbRawDataEvent) || includesUnknownBeacon(uwbRawDataEvent);
+    }
+
+    private static boolean includesUnknownBeacon(UWB uwbRawDataEvent) {
+        HashMap<String, Double> uwbData = (HashMap<String, Double>) uwbRawDataEvent.getDistances();
+        for (String beaconId : uwbData.keySet()){
+            if (null == DataServices.getPoiByIdOrNull(beaconId)){
+                LOG.info("UWBRawDataEvent contains unknown beacon: " + beaconId);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static boolean notEnoughBeaconDistances(UWB uwbRawDataEvent) {
+        HashMap uwbData = (HashMap) uwbRawDataEvent.getDistances();
+        if(uwbData.keySet().size() < Triangulation.MIN_NUMBER_OF_BEACONS){
+            LOG.info("UWBRawDataEvent only contains " + uwbData.keySet().size() + " beacon-distances. Can not calculate a position");
+            return true;
+        }else {
+            return false;
+        }
+    }
+
     private static double[] getPositionFromBeaconId(String beaconId) {
         Point3D beaconPos = modelFactory.createPoint3D();
         beaconPos = (Point3D) DataServices.getPoiByIdOrNull(beaconId).getPlacing().getPosition().getPoint();
diff --git a/src/main/java/ipos/project/Functionality/eventfilter/BeaconFilteringResult.java b/src/main/java/ipos/project/Functionality/eventfilter/BeaconFilteringResult.java
new file mode 100644
index 0000000..f78c359
--- /dev/null
+++ b/src/main/java/ipos/project/Functionality/eventfilter/BeaconFilteringResult.java
@@ -0,0 +1,29 @@
+package ipos.project.Functionality.eventfilter;
+
+import ipos.project.DataModellntegration.iPos_Datamodel.Beacon;
+
+public class BeaconFilteringResult {
+
+    private Beacon beaconRawdataEvent;
+    private String monitoringTaskId;
+    private boolean isBlocking;
+
+    public BeaconFilteringResult(String monitoringTaskId, Beacon beaconRawdataEvent, Boolean isBlocking) {
+        this.beaconRawdataEvent = beaconRawdataEvent;
+        this.monitoringTaskId = monitoringTaskId;
+        this.isBlocking = isBlocking;
+    }
+
+    public Beacon getBeaconRawdataEvent() {
+        return beaconRawdataEvent;
+    }
+
+    public String getMonitoringTaskId() {
+        return monitoringTaskId;
+    }
+
+    public boolean hasBlockedEvent(){
+        return this.isBlocking;
+    }
+
+}
diff --git a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
index e95840f..6b1af87 100644
--- a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
+++ b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
@@ -16,6 +16,9 @@ import java.util.*;
 public class eventFilter {
     private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
 
+    public static final String MONREQ_DISTANCE_PROPERTY = "distance";
+    public static final List<String> MONREQ_ALLOWED_PROPERTIES = Arrays.asList("position", "id", "type", MONREQ_DISTANCE_PROPERTY);
+
     private boolean[] filterStructure;
     //
     private PositionEvent last_position_event;
@@ -59,6 +62,7 @@ public class eventFilter {
     private float positionDelta;
     private Map<String, ArrayList<Float[][]>> positionConditionCells; // zoneId -> PositionConditionCell
     private EventFilterCondition filterConditionConfig;
+    private List<String> propertyCondition;
 
     public void init(EventFilterCondition conf) {
         filterStructure = conf.getFilterStructure();
@@ -71,6 +75,7 @@ public class eventFilter {
         timeMinInterval = conf.getTimeMinInterval();
         positionDelta = conf.getPositionDelta();
         positionConditionCells = conf.getPositionConditionCells();
+        propertyCondition = conf.getPropertyCondition();
         this.filterConditionConfig = conf;
     }
 
@@ -106,6 +111,38 @@ public class eventFilter {
         }
     }
 
+    public BeaconFilteringResult processRawdata(Beacon beaconRawdataEvent){
+        LocalizableObject lObject = DataServices.getLObjectByIdOrNull(beaconRawdataEvent.getSensorId());
+        if (null == lObject){
+            LOG.info("EventFilter: Warning: Received beaconRawdataEvent from sensor with unknown sensor-id: " + beaconRawdataEvent.getSensorId());
+            return new BeaconFilteringResult(getMonitoringTaskId(), beaconRawdataEvent, true);
+        }
+
+        if (null == propertyCondition){
+            // assumption: default value of property is 'position' and not 'distance' or any other rawdata.
+            // so we will not publish rawdata if property-field is unset
+            return new BeaconFilteringResult(getMonitoringTaskId(), beaconRawdataEvent, true);
+        }
+
+        boolean isBlocking = false; //false for pass, true for block
+        if (sensorIdCondition != null){
+            String rawdataSensorId = beaconRawdataEvent.getSensorId();
+            if (!sensorIdCondition.contains(rawdataSensorId)){
+                isBlocking = true; // important: once true, isBlocking must not be switched to false again, i.e., once blocked dont unblock anymore
+            }
+        }
+
+        // rawdata-filter should block, if something other than rawdata is requested.
+        // for case propertyCondition == null: see above
+        if (propertyCondition != null){
+            // currently we only accept 'distance' as a keyword to indicate the request for publishing rawdata
+            if (! propertyCondition.contains(MONREQ_DISTANCE_PROPERTY)){
+                return new BeaconFilteringResult(getMonitoringTaskId(), beaconRawdataEvent, true);
+            }
+        }
+        return new BeaconFilteringResult(getMonitoringTaskId(), beaconRawdataEvent, isBlocking);
+    }
+
     public FilteringResult process(PositionEvent event) throws ParseException {
         IPos_DatamodelFactory dataModelFactory = IPos_DatamodelFactory.eINSTANCE;
         LocalizableObject lObject = DataServices.getLObjectByIdOrNull(event.getLObjectId());
diff --git a/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java b/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java
index 5bac059..3fe1a07 100644
--- a/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java
+++ b/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java
@@ -29,15 +29,46 @@ public class readConfig {
         for (String frameId : monReq.getFrameIds()){
             Zone zone_monReq = DataServices.getZoneByIdOrNull(frameId);
             if (null == zone_monReq){
-                LOG.warn("MonitoringRequest contained an invalid Zone-id");
+                LOG.warn("MonitoringRequest contained an invalid Zone-id: " + frameId);
                 return false;
             }
             ArrayList<Float[][]> positionConditionCell = transformZone2PositionConditionCell(zone_monReq);
             config.getPositionConditionCells().put(frameId, positionConditionCell);
         }
+
+        try {
+            monReq.getId().forEach(sensorId -> addSensorIdToFilterConfig(sensorId, config));
+        }catch (RuntimeException e){
+            LOG.warn(e.getMessage());
+            return false;
+        }
+
+        try {
+            monReq.getProperties().forEach(property -> addPropertyToFilterConfig(property, config));
+        }catch (RuntimeException e){
+            LOG.warn(e.getMessage());
+            return false;
+        }
+
         return true;
     }
 
+    private static void addPropertyToFilterConfig(String property, EventFilterCondition config) {
+        if (eventFilter.MONREQ_ALLOWED_PROPERTIES.contains(property)){
+            config.getPropertyCondition().add(property);
+        }else{
+            throw new RuntimeException("MonitoringRequest contained an invalid: " + property);
+        }
+    }
+
+    private static void addSensorIdToFilterConfig(String sensorId, EventFilterCondition config) {
+        LocalizableObject lObject = DataServices.getLObjectByIdOrNull(sensorId);
+        if (null == lObject){
+            throw new RuntimeException("MonitoringRequest contained an invalid sensor-id: " + sensorId);
+        }
+        config.getSensorIdCondition().add(sensorId);
+    }
+
     public static ArrayList<Float[][]> transformZone2PositionConditionCell(Zone zone) {
         // TODO: support Point-Types other than Point3D
         ArrayList<Float[][]> position_condition_cell = new ArrayList<>();
diff --git a/src/main/java/ipos/project/MainApp.java b/src/main/java/ipos/project/MainApp.java
index 6018fea..e8a4f91 100644
--- a/src/main/java/ipos/project/MainApp.java
+++ b/src/main/java/ipos/project/MainApp.java
@@ -26,10 +26,12 @@ public class MainApp {
     public static final String TESTDATA_OP = "./testdata_raw_orderpicker.txt";
     public static final String TESTDATA_OP_EVTS = "testdata_raw_orderpicker_posEvts.txt";
     public static final String TESTDATA_SDF = "testdata_raw_sdf.txt";
+    public static final String TESTDATA_TOOZ = "testdata_raw_tooz.txt";
     public static final String COMMAND_INDFRO = "indfro testdata"; // Industrierobotik_Frontend
     public static final String COMMAND_OP = "oppl testdata";
     public static final String COMMAND_OP_EVTS = "opevts testdata";
     public static final String COMMAND_SDF = "sdf testdata";
+    public static final String COMMAND_TOOZ = "tooz testdata";
     public static final String COMMAND_EXIT = "exit";
     public static final String COMMAND_HELP = "help";
     public static final String COMMAND_QUERY = "query";
@@ -58,6 +60,7 @@ public class MainApp {
                     case COMMAND_EXIT : proceed = false; break;
                     case COMMAND_HELP: printCommands(); break;
                     case COMMAND_INDFRO: GenericSensorValueProcessor.processTestData(TESTDATA_INDFRO); break;
+                    case COMMAND_TOOZ: GenericSensorValueProcessor.processTestData(TESTDATA_TOOZ); break;
                     case COMMAND_SDF: GenericSensorValueProcessor.processTestData(TESTDATA_SDF); break;
                     case COMMAND_OP : OFBizOrderPicker.processPicklistTestData(TESTDATA_OP); break;
                     case COMMAND_OP_EVTS: OFBizOrderPicker.processPosEvtTestData(TESTDATA_OP_EVTS); break;
diff --git a/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java
index d67d5b1..43ad387 100644
--- a/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java
+++ b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java
@@ -2,12 +2,18 @@ package ipos.project.SensorValueIntegration;
 
 import com.google.protobuf.InvalidProtocolBufferException;
 import ipos.models.GenericSensor;
+import ipos.models.SimpleScene;
 import ipos.models.SimpleScene.IposPosition;
+import ipos.project.DataModellntegration.SimpleSceneIntegration.service.SimpleSceneTransformer;
+import ipos.project.DataModellntegration.iPos_Datamodel.UWB;
+import ipos.project.SensorValueIntegration.Service.GenericSensorTransformer;
+import ipos.project.UseCaseController.PositionMonitoring;
 import ipos.project.devkit.utility.ExternalPubServiceImpl;
 import ipos.project.SensorValueIntegration.api.MqttPositionHandler;
 import ipos.project.devkit.utility.OtherUtility;
 import ipos.project.devkit.utility.ProtoJsonMap;
 import org.apache.logging.log4j.LogManager;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jms.annotation.JmsListener;
 import org.springframework.stereotype.Component;
@@ -19,7 +25,12 @@ public class GenericSensorValueProcessor {
     private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
 
     @Autowired
-    private ExternalPubServiceImpl mqttService;
+    public GenericSensorValueProcessor(ExternalPubServiceImpl mqttService_){
+        mqttService = mqttService_;
+    }
+
+    // @Autowired
+    private static ExternalPubServiceImpl mqttService;
 
     @JmsListener(destination = "/positions", containerFactory = "jmsListenFactory")
     public void receiveMessage(IposPosition pos) {
@@ -44,4 +55,27 @@ public class GenericSensorValueProcessor {
         }
     }
 
+    public static void receiveMessage(UWB beaconRawdataEvent, String monitoringTaskId, String serializationType) {
+        GenericSensor.UWBRawDataEvent rawdataEvent_proto = GenericSensorTransformer.uwb_internal2GSensor(beaconRawdataEvent);
+        MqttMessage uwbRawDataEvent_mqttMessage = mqttService.createMqttMsg(rawdataEvent_proto, 0, false);
+        String uwbRawDataEvent_jsonString = ProtoJsonMap.toJson(rawdataEvent_proto);
+        LOG.info("OP: Publishing UWBRawDataEvent on topic " + monitoringTaskId + " with serialization type " + serializationType + ": " + uwbRawDataEvent_jsonString);
+        LOG.info("OP: ");
+        publishRespectingSerializationType(monitoringTaskId, serializationType, uwbRawDataEvent_jsonString, uwbRawDataEvent_mqttMessage);
+    }
+
+    private static void publishRespectingSerializationType(String topic, String serializationType, String jsonString, MqttMessage mqttMessage) {
+        // publishes protobuf over MQTT
+        if (PositionMonitoring.PROTOBUF_SERIALIZATION_TYPE.equals(serializationType)){
+            mqttService.publish(topic, mqttMessage);
+            LOG.info("publishing protobuf mqttMessage. JSON-representation:" + jsonString + " on topic: " + topic);
+        }
+
+        // publishes JSON over MQTT
+        if (PositionMonitoring.JSON_SERIALIZATION_TYPE.equals(serializationType)){
+            mqttService.publish(topic, jsonString, 0, false);
+            LOG.info("publishing JSON mqttMessage:" + jsonString + " on topic: " + topic);
+        }
+    }
+
 }
diff --git a/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java
index 2a55243..fde844d 100644
--- a/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java
+++ b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java
@@ -10,10 +10,7 @@ import org.apache.logging.log4j.LogManager;
 import org.eclipse.emf.ecore.EObject;
 
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 public class GenericSensorTransformer {
 
@@ -125,6 +122,23 @@ public class GenericSensorTransformer {
         return outputMap;
 
    }
+
+    public static GenericSensor.UWBRawDataEvent uwb_internal2GSensor(UWB beaconRawdataEvent) {
+        GenericSensor.UWBRawDataEvent.Builder protoUWBRawDataEvent = GenericSensor.UWBRawDataEvent.newBuilder();
+        protoUWBRawDataEvent.setTimestamp(beaconRawdataEvent.getTimeStamp());
+        protoUWBRawDataEvent.setSensorId(beaconRawdataEvent.getSensorId());
+        protoUWBRawDataEvent.putAllDistances(beaconDistances_internal2GSensor(beaconRawdataEvent.getDistances()));
+        protoUWBRawDataEvent.setType(beaconRawdataEvent.getType());
+        return protoUWBRawDataEvent.build();
+   }
+
+    private static Map<String, String> beaconDistances_internal2GSensor(Map<String, Double> distances) {
+        HashMap<String, String> distancesGSensor = new HashMap<>();
+        for (Map.Entry<String, Double> distanceEntry : distances.entrySet()){
+            distancesGSensor.put(distanceEntry.getKey(), String.valueOf(distanceEntry.getValue().doubleValue()));
+        }
+        return distancesGSensor;
+    }
 }
 
 
diff --git a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
index beef934..cc63b56 100644
--- a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
+++ b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
@@ -6,9 +6,9 @@ import ipos.project.DataModellntegration.iPos_Datamodel.IPosDevKit.DataStorageQu
 import ipos.project.DataModellntegration.iPos_Datamodel.IPosDevKit.IPosDevKitFactory;
 import ipos.project.DataModellntegration.iPos_Datamodel.IPosDevKit.MonitoringRequest;
 import ipos.project.Functionality.*;
-import ipos.project.Functionality.eventfilter.FilteringResult;
-import ipos.project.Functionality.eventfilter.eventFilter;
-import ipos.project.Functionality.eventfilter.readConfig;
+import ipos.project.Functionality.eventfilter.*;
+import ipos.project.Functionality.eventfilter.BeaconFilteringResult;
+import ipos.project.SensorValueIntegration.GenericSensorValueProcessor;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.jms.annotation.JmsListener;
 import org.springframework.stereotype.Component;
@@ -62,24 +62,50 @@ public class PositionMonitoring {
     }
 
     public static void receiveMessage (UWB uwbRawDataEvent){
-        PositionEvent positionEvent = null;
+        calculateAndProcessPosition(uwbRawDataEvent);
+        List<BeaconFilteringResult> beaconFilteringResults = filterRawdata((Beacon) uwbRawDataEvent);
+        processBeaconFilteringResults(beaconFilteringResults);
+    }
+
+    private static void calculateAndProcessPosition(UWB uwbRawDataEvent) {
+        Optional<PositionEvent> optionalPositionEvent = Optional.empty();
         try {
-            positionEvent = Triangulation.update(uwbRawDataEvent);
+            optionalPositionEvent = Triangulation.update(uwbRawDataEvent);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        if (optionalPositionEvent.isPresent()) {
+            PositionEvent positionEvent = optionalPositionEvent.get();
             LOG.info("OP:");
             LOG.info("OP:");
             LOG.info("OP:");
             LOG.info("OP:----PositionMonitoring--------------------------");
             LOG.info("OP: position: " + logPosition(positionEvent.getPlacing()));
-
-        } catch (ParseException e) {
-            e.printStackTrace();
-        }
-        if (positionEvent != null) {
             updateLocalizableObject(positionEvent);
             receiveMessage(positionEvent);
+        }else {
+            LOG.info("OP: No position could be calculated from UWBRawDataEvent");
         }
     }
 
+    private static void processBeaconFilteringResults(List<BeaconFilteringResult> beaconFilteringResults) {
+        for (BeaconFilteringResult beaconFilteringResult : beaconFilteringResults){
+            if (beaconFilteringResult.hasBlockedEvent()){ // don't publish Beacon-rawdata on behalf of an eventFilter that has blocked the event
+                continue;
+            }
+            eventFilter eFilter = getEventFilterByIdOrNull(beaconFilteringResult.getMonitoringTaskId());
+            GenericSensorValueProcessor.receiveMessage((UWB) beaconFilteringResult.getBeaconRawdataEvent(), beaconFilteringResult.getMonitoringTaskId(), eFilter.getSerializationType());
+        }
+    }
+
+    private static List<BeaconFilteringResult> filterRawdata(Beacon beaconRawDataEvent) {
+        List<BeaconFilteringResult> beaconFilteringResults = new LinkedList<BeaconFilteringResult>();
+        for (eventFilter eFilter : eventFilters){
+            beaconFilteringResults.add(eFilter.processRawdata(beaconRawDataEvent));
+        }
+        return beaconFilteringResults;
+    }
+
     static int imuCount = 0;
 
     // JMS-topic: imuRawdataEvent
@@ -151,14 +177,13 @@ public class PositionMonitoring {
     public static void receiveMessage(MonitoringRequest monReq) {
         LOG.info("Received MonitoringRequest <" + monReq + ">");
         eventFilter filter = new eventFilter(monReq);
-        EventFilterCondition config = modelFactory.createEventFilterCondition();
-        config.setPositionConditionCells(new HashMap<>());
+        EventFilterCondition config = createAndInitEventFilterCondition();
         if (! readConfig.readFilterConfigFromMonitoringRequest(monReq, config)){
             return; // monitoringRequest could not be read
         }
         filter.init(config);
         eventFilters.add(filter);
-        LOG.info("EventFilter was created: " + filter.toString() + "; monitoringTaskId: " + filter.getMonitoringTaskId() + "; zone-ids:" + filter.getFilterConditionConfig().getPositionConditionCells().keySet());
+        LOG.info("EventFilter was created: " + filter.toString() + "; monitoringTaskId: " + filter.getMonitoringTaskId() + "; zone-ids:" + filter.getFilterConditionConfig().getPositionConditionCells().keySet() + "; property: " + new HashSet(filter.getFilterConditionConfig().getPropertyCondition()));
 
         /*
          * trackingTaskId equals MonitoringTaskId + '_tracking' (which equals the name
@@ -171,6 +196,14 @@ public class PositionMonitoring {
         DataServices.initTrackingTask(trackingTaskId);
     }
 
+    private static EventFilterCondition createAndInitEventFilterCondition() {
+        EventFilterCondition config = modelFactory.createEventFilterCondition();
+        config.setPositionConditionCells(new HashMap<>());
+        config.setSensorIdCondition(new LinkedList<>());
+        config.setPropertyCondition(new LinkedList<>());
+        return config;
+    }
+
     private static boolean isDoor = false;
     private static boolean isCentre = false;
     private static boolean isWindow = false;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 2933f2c..f14f376 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -15,6 +15,7 @@ mqtt:
   # hostname: 192.168.0.111 # ceti-laptop robolab
   # hostname: broker.hivemq.com # online
   # hostname: 192.168.0.143 # Frank-laptop robolab
+  # hostname: localhost # locally-running mosquitto
   hostname: localhost
   port: 1883
 
diff --git a/testdata_raw_tooz.txt b/testdata_raw_tooz.txt
new file mode 100644
index 0000000..96672a1
--- /dev/null
+++ b/testdata_raw_tooz.txt
@@ -0,0 +1,4 @@
+{"uwbRawDataEvent" : [ {"timestamp" : "2022-02-02T16:03:20+00:00", "sensorId" : "tooz_employee_uwb",  "distances": {"beacon_1" : "2.5", "beacon_2" : "5.5", "beacon_3" : "8.5"}, "type": "UWB"}]}
+{"uwbRawDataEvent" : [ {"timestamp" : "2022-02-02T16:04:20+00:00", "sensorId" : "tooz_employee_uwb", "distances": {"beacon_4" : "2.8"}, "type": "UWB"}]}
+{"uwbRawDataEvent" : [ {"timestamp" : "2022-02-02T16:05:20+00:00", "sensorId" : "tooz_employee_uwb", "distances": {"beacon_5" : "5.8"}, "type": "UWB"}]}
+{"uwbRawDataEvent" : [ {"timestamp" : "2022-02-02T16:06:20+00:00", "sensorId" : "tooz_employee_uwb", "distances": {"beacon_6" : "8.8"}, "type": "UWB"}]}
\ No newline at end of file
-- 
GitLab