diff --git a/.github/workflows/cepact-code-quality-check.yml b/.github/workflows/cepact-code-quality-check.yml
new file mode 100644
index 0000000..5cd884c
--- /dev/null
+++ b/.github/workflows/cepact-code-quality-check.yml
@@ -0,0 +1,37 @@
+name: CEPAct Code Quality Check
+
+on:
+ pull_request:
+ branches: [ main ]
+ push:
+ branches: [ main ]
+
+jobs:
+ test:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: '3.12'
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install -r requirements.txt
+ pip install -r requirements-dev.txt
+
+ - name: Run tests
+ run: |
+ export PYTHONPATH=.
+ pytest
+
+ - name: Lint with pylint
+ run: |
+ pylint cepact --disable=too-few-public-methods
+
+ - name: Type checking with mypy
+ run: |
+ mypy cepact --strict
diff --git a/.gitignore b/.gitignore
index 15201ac..d86e4ff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -165,7 +165,7 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
-#.idea/
+.idea/
# PyPI configuration file
.pypirc
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..2e03996
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,42 @@
+# Get Started!
+
+Ready to contribute? Here's how to set up `cepact` for local development.
+
+1. Fork the repo on GitHub.
+2. Clone your fork locally.
+
+3. Install the requirements using virtualenv (first create a virtualenv): `pip install -r requirements.txt`
+
+4. To get the necessary developer tools, run `pip install -r requirements-dev.txt`
+
+5. Create a branch for local development. Now you can make your changes locally.
+
+6. When you're done making changes, check that your changes pass several requirements `./code-check.sh`. If needed add/modify tests.
+7. Commit your changes and push your branch to GitHub.
+8. Submit a pull request through the GitHub website.
+
+# Pull Request Guidelines
+
+Before you submit a pull request, check that it meets these guidelines:
+
+1. The pull request should include tests.
+2. If the pull request adds functionality, the docs should be updated. Put
+ your new functionality into a function with a docstring, and add the
+ feature to the list in README.md.
+3. The pull request should work for Python 3.12. Make sure that the pipeline passes.
+
+
+# Deploying
+
+A reminder for the maintainers on how to deploy. Deployment happens manually.
+Make sure all your changes are committed (including an entry in HISTORY.md),
+and that the pipelines all pass.
+Modify the relevant fields in setup.cfg and/or cepact/__init__.py.
+Then run::
+
+```
+python3 -m pip install --upgrade build
+python3 -m build
+python3 -m pip install --upgrade twine
+python3 -m twine upload dist/*
+```
\ No newline at end of file
diff --git a/HISTORY.md b/HISTORY.md
new file mode 100644
index 0000000..d50d979
--- /dev/null
+++ b/HISTORY.md
@@ -0,0 +1,6 @@
+# History
+
+Add new entries to the top of the list.
+
+## 2024-02-12, v0.1.0
+- First release of the `cepact` package.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index f288702..0ad25db 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,5 +1,5 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
@@ -7,17 +7,15 @@
Preamble
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
+our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
+software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
@@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
The precise terms and conditions for copying, distribution and
modification follow.
@@ -72,7 +60,7 @@ modification follow.
0. Definitions.
- "This License" refers to version 3 of the GNU General Public License.
+ "This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
@@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
- 13. Use with the GNU Affero General Public License.
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
+under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
+Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
+GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
+versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
@@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ GNU Affero General Public License for more details.
- You should have received a copy of the GNU General Public License
+ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- Copyright (C)
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
+For more information on this, and how to apply and follow the GNU AGPL, see
.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
diff --git a/README.md b/README.md
index 5f1aec5..689e13d 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,77 @@
-# activity-detection-services-generator
\ No newline at end of file
+[](https://fairsoftwarechecklist.net/v0.2?f=31&a=31112&i=32321&r=133)
+
+# CEPAct
+
+Generate complex event processing (Siddhi) activity detection apps based on IoT data and expert annotations. The general input/output and flow of the application can be seen in the following UML sequence diagram:
+
+
+
+The application is generally structured as seen in the UML class diagram below.
+
+
+
+## Usage
+
+An exemplary usage of the application can be seen in the following code snippet:
+
+```python
+from cepact import (SiddhiConfig, DAGConfig, DetServiceGenerator, LocalIgnoreSensorFetcher, InfluxFetcher, GrafanaFetcher, LocalDiscretizationFetcher, AllHighLevelPatternQuery, First50HighLevelPatternQuery)
+
+siddhi_conf = SiddhiConfig(mqtt_url = "url", mqtt_user = "usr", mqtt_pwd = "pwd", topic_prefix = "SOMEPREFIX", map_sensor_name_data_to_mqtt = {})
+
+dag_conf = DAGConfig(
+ det_methods = [AllHighLevelPatternQuery(), First50HighLevelPatternQuery()],
+ out_dir = "out",
+ sampling_freq = 1,
+ siddhi_config = siddhi_conf,
+ signature_fetcher = InfluxFetcher(url = "url", auth = "authkey", org = "org", influx_station_bucket_map = {}),
+ annotation_param_fetcher = GrafanaFetcher(url = "url", auth = "authkey"),
+ ignore_sensor_fetcher = LocalIgnoreSensorFetcher("in"),
+ discretization_fetcher = LocalDiscretizationFetcher("in"))
+
+generator = DetServiceGenerator(dag_conf)
+generator.run()
+```
+As can be seen in the usage example, the features include:
+- Annotations and IoT data can be provided from **various input sources**; users can implement and provide **custom fetchers** for required inputs or use **included fetchers**.
+- Generated detection services apps and supporting files are written to a user-specified **output directory** in the local file system.
+- Users can customize the detection service generation using a **configuration** object.
+- Selection of included **detection methods** are supported, and custom implementations can be added by implementing provided interfaces.
+- The package generates output according to the provided **Siddhi configuration**, ensuring compatibility with downstream systems.
+
+There are potentially multiple concrete instantiations of the abstract data fetchers, meaning that the input of IoT data and annotations can be done in different ways. For the local input fetchers, please refer to the exemplary files in `tests/local_input_mocks/.../in`, as well as the documentation accompanying the fetcher implementations.
+
+For the input of annotations from Grafana and the data coming from InfluxDB, we provide some guidelines for the annotations below.
+
+## Contributing
+Contributions are welcome. Both PRs from forks and issues in this repository are appreciated.
+Possible (non-exhaustive list) contributions include:
+- Adding new data fetchers for different data sources
+- Adding new detection methods
+- Improving the existing codebase
+- Adding new tests
+- Improving the documentation
+- Adding new features (e.g. support for more complex patterns, multiple signatures per activity, etc.)
+- Adding new output writers besides Siddhi (for other CEP platforms)
+
+For more information on contributing, please refer to the [CONTRIBUTING.md](./CONTRIBUTING.md) file.
+
+## Grafana Annotation Guidelines
+Generates CEP apps and signatures based on Grafana annotations.
+Annotation rules:
+- Name of _start_ annotation `START_Activity-Name-Here`
+ - Note, that the activity name must match the activity name in the Camunda log for evaluation
+- Analogous for `END_`
+- First tag must be some unique key
+- Second tag must be `activity`
+- Third tag must be _station_ code, e.g. `OV_1`, `HYGIENE_STATION`
+ - For detection apps spanning multiple components/stations/resources, this tag needs to include all of them separated by a hyphen, e.g. `HYGIENE_STATION-LEFT_DONATION`
+- Fourth tag and all others behind can be used to _ignore_ certain _sensors_ in the activity signature and for the creation
+of the CEP Siddhi apps (can be either at START or END annotation):
+ - add `ignore-SENSORNAME` to the tag to ignore the sensor for only this activity-signature/-app, e.g. `ignore-light_l5`
+ - if you want to ignore a certain sensor in general, i.e. for all activities, and don't want to repeat the tag, just
+ tag it with `ignoregen-SENSORENAME`, e.g. `ignoregen-movepos_x`
+
+## InfluxDB Guidelines
+The IoT time series data to extract the activity signature from can be stored on InfluxDB. The data should be stored in a bucket with and the naming
+should be specified in the `influx_station_bucket_map` in the `DAGConfig`.
diff --git a/cepact/__init__.py b/cepact/__init__.py
new file mode 100644
index 0000000..bfb2f77
--- /dev/null
+++ b/cepact/__init__.py
@@ -0,0 +1,22 @@
+""" Top-level package of detection app generating package. """
+from .conf import DAGConfig, SiddhiConfig
+from .cepact import DetServiceGenerator
+from .input_processor import (AnnotationParamFetcher, DiscretizationFetcher, SignatureFetcher,
+ IgnoreSensorFetcher, GrafanaFetcher, InfluxFetcher,
+ LocalDiscretizationFetcher, LocalAnnotationParamFetcher,
+ LocalSignatureFetcher, LocalIgnoreSensorFetcher)
+from .output_producer import (AllHighLevelPatternQuery, First50HighLevelPatternQuery,
+ FirstLastLowLevelPatternQuery, Any25LowLevelPatternQuery,
+ Any50LowLevelPatternQuery, Any75LowLevelPatternQuery,
+ InstanceLevelDetQuery)
+
+__all__ = ['DetServiceGenerator', 'DAGConfig', 'SiddhiConfig',
+ 'AnnotationParamFetcher', 'DiscretizationFetcher', 'SignatureFetcher',
+ 'IgnoreSensorFetcher', 'GrafanaFetcher', 'InfluxFetcher',
+ 'LocalDiscretizationFetcher', 'LocalAnnotationParamFetcher',
+ 'LocalSignatureFetcher', 'LocalIgnoreSensorFetcher', 'AllHighLevelPatternQuery',
+ 'First50HighLevelPatternQuery', 'FirstLastLowLevelPatternQuery',
+ 'Any25LowLevelPatternQuery', 'Any50LowLevelPatternQuery',
+ 'Any75LowLevelPatternQuery', 'InstanceLevelDetQuery']
+
+__version__ = '0.1.0'
diff --git a/cepact/cepact.py b/cepact/cepact.py
new file mode 100644
index 0000000..fd1f5d2
--- /dev/null
+++ b/cepact/cepact.py
@@ -0,0 +1,23 @@
+""" Central mediator of package, delegates and orchestrates work. Entrypoint of exc. """
+from .conf import DAGConfig
+from .input_processor.input_processor import InputProcessor
+from .output_producer import OutputProducer
+
+
+class DetServiceGenerator():
+ """ Central mediating class, entrypoint of execution. """
+
+ def __init__(self, config: DAGConfig):
+ self._config: DAGConfig = config
+
+ def run(self) -> None:
+ """ Run extraction, processing and generation of signatures, changes and apps. """
+ input_processor = InputProcessor(self._config)
+ activities = input_processor.get_activities()
+ discretization = input_processor.get_discretization()
+ output_producer = OutputProducer(discretization, self._config)
+ for activity in activities:
+ output_producer.write_signature(activity)
+ output_producer.write_changes(activity)
+ output_producer.write_app(activity)
+ output_producer.write_log()
diff --git a/cepact/conf.py b/cepact/conf.py
new file mode 100644
index 0000000..cd12214
--- /dev/null
+++ b/cepact/conf.py
@@ -0,0 +1,56 @@
+""" Configuration classes for detection app generation. """
+from dataclasses import dataclass
+from typing import List, Dict, TYPE_CHECKING
+from .input_processor.abstract_fetchers import (IgnoreSensorFetcher, SignatureFetcher,
+ AnnotationParamFetcher, DiscretizationFetcher)
+
+if TYPE_CHECKING:
+ from .output_producer import InstanceLevelDetQuery
+
+@dataclass(frozen=True, kw_only=True)
+class SiddhiConfig():
+ """ Configurations for Siddhi app generation.
+
+ Attributes:
+ - mqtt_url: URL of the MQTT broker.
+ - mqtt_user: Username for the MQTT broker.
+ - mqtt_pwd: Password for the MQTT broker.
+ - topic_prefix: Prefix for the MQTT topics.
+ - map_sensor_name_data_to_mqtt: Mapping of sensor names to MQTT topics.
+ """
+ mqtt_url: str
+ mqtt_user: str
+ mqtt_pwd: str
+ topic_prefix: str
+ map_sensor_name_data_to_mqtt: Dict[str, str]
+
+
+# pylint: disable=too-many-instance-attributes
+@dataclass(frozen=True, kw_only=True)
+class DAGConfig():
+ """ Configurations for creation of detection apps.
+
+ Attributes:
+ - det_methods: List of detection methods to use.
+ - siddhi_config: Configuration for Siddhi apps.
+ - out_dir: Output directory for the generated apps and files.
+ - sampling_freq: Sampling frequency of the IoT data (important for cross-station activities).
+ - signature_fetcher: Fetcher for the activity signatures.
+ - annotation_param_fetcher: Fetcher for the activity annotations.
+ - ignore_sensor_fetcher: Fetcher for the ignore sensors.
+ - discretization_fetcher: Fetcher for the discretization of the IoT data.
+ """
+ det_methods: List['InstanceLevelDetQuery']
+ siddhi_config: SiddhiConfig
+ out_dir: str
+ sampling_freq: float
+ signature_fetcher: SignatureFetcher
+ annotation_param_fetcher: AnnotationParamFetcher
+ ignore_sensor_fetcher: IgnoreSensorFetcher
+ discretization_fetcher: DiscretizationFetcher
+
+ # validate the configuration
+ def __post_init__(self) -> None:
+ """ Validate the configuration. """
+ if len(self.det_methods) == 0:
+ raise ValueError("No detection method selected.")
diff --git a/cepact/input_processor/__init__.py b/cepact/input_processor/__init__.py
new file mode 100644
index 0000000..1e9a548
--- /dev/null
+++ b/cepact/input_processor/__init__.py
@@ -0,0 +1,11 @@
+""" Sub-package for input processing. """
+from .abstract_fetchers import (AnnotationParamFetcher, DiscretizationFetcher, SignatureFetcher,
+ IgnoreSensorFetcher)
+from .concrete_fetchers import (GrafanaFetcher, InfluxFetcher, LocalDiscretizationFetcher,
+ LocalAnnotationParamFetcher, LocalSignatureFetcher,
+ LocalIgnoreSensorFetcher)
+from .input_processor import InputProcessor
+
+__all__ = ["InputProcessor", "AnnotationParamFetcher", "DiscretizationFetcher", "SignatureFetcher",
+ "IgnoreSensorFetcher", "GrafanaFetcher", "InfluxFetcher", "LocalDiscretizationFetcher",
+ "LocalAnnotationParamFetcher", "LocalSignatureFetcher", "LocalIgnoreSensorFetcher"]
diff --git a/cepact/input_processor/abstract_fetchers.py b/cepact/input_processor/abstract_fetchers.py
new file mode 100644
index 0000000..7363dcb
--- /dev/null
+++ b/cepact/input_processor/abstract_fetchers.py
@@ -0,0 +1,48 @@
+""" This module contains abstract classes for fetchers. """
+from abc import ABC, abstractmethod
+from typing import List, Dict
+
+from ..representations import AnnotationParams, Discretization, Signature
+
+
+class SignatureFetcher(ABC):
+ """ Abstract class for fetching time series data. """
+
+ @abstractmethod
+ def get_signature(self,
+ annotation_params: AnnotationParams,
+ ignore_sensors: Dict[str, List[str]],
+ sampling_freq: float) -> Signature:
+ """ Fetch the signature for a certain activity annotation. """
+
+
+class AnnotationParamFetcher(ABC):
+ """ Abstract class for fetching activity parameters. """
+
+ @abstractmethod
+ def get_annotation_params(self) -> List[AnnotationParams]:
+ """ Fetch the annotation parameters. """
+
+
+class DiscretizationFetcher(ABC):
+ """ Abstract class for fetching discretization. """
+
+ @abstractmethod
+ def get_discretization(self) -> Discretization:
+ """ Fetch the discretization. """
+
+
+class IgnoreSensorFetcher(ABC):
+ """ Abstract class for fetching sensors to ignore. """
+
+ @abstractmethod
+ def get_ignore_sensors(self) -> Dict[str, List[str]]:
+ """ Fetch the ignore sensors.
+
+ Structure of return dict:
+ {
+ "general": List[str],
+ "activitaName1": List[str],
+ "activitaName2": List[str],
+ ...
+ """
diff --git a/cepact/input_processor/concrete_fetchers/__init__.py b/cepact/input_processor/concrete_fetchers/__init__.py
new file mode 100644
index 0000000..5b31751
--- /dev/null
+++ b/cepact/input_processor/concrete_fetchers/__init__.py
@@ -0,0 +1,10 @@
+""" This module contains the concrete fetchers that are used to fetch data from different srcs. """
+from .grafana_fetcher import GrafanaFetcher
+from .influx_fetcher import InfluxFetcher
+from .local_ann_params_fetcher import LocalAnnotationParamFetcher
+from .local_discretization_fetcher import LocalDiscretizationFetcher
+from .local_ign_sensor_fetcher import LocalIgnoreSensorFetcher
+from .local_signature_fetcher import LocalSignatureFetcher
+
+__all__ = ["GrafanaFetcher", "InfluxFetcher", "LocalDiscretizationFetcher",
+ "LocalIgnoreSensorFetcher", "LocalAnnotationParamFetcher", "LocalSignatureFetcher"]
diff --git a/cepact/input_processor/concrete_fetchers/grafana_fetcher.py b/cepact/input_processor/concrete_fetchers/grafana_fetcher.py
new file mode 100644
index 0000000..15e3c7d
--- /dev/null
+++ b/cepact/input_processor/concrete_fetchers/grafana_fetcher.py
@@ -0,0 +1,176 @@
+""" The grafana fetcher that fetcher both the general activity params and ignore sensors. """
+import datetime
+from datetime import datetime as dt
+from typing import List, Dict, Tuple, Any, Union
+
+import requests
+from requests.structures import CaseInsensitiveDict
+
+from ..abstract_fetchers import AnnotationParamFetcher, IgnoreSensorFetcher
+from ...representations import AnnotationParams
+
+
+def _handle_text_annotation(text: str) -> Tuple[str, str]:
+ """ Get activity name and lifecycle from the text annotation.
+
+ Args: Text annotation from Grafana.
+ Returns: Tuple of lifecycle and activity name, in that order.
+ """
+ stat_pos = text.find("_") # Naming scheme for Text: START/END_Activity name
+ return text[:stat_pos], text[stat_pos + 1:].replace("-", " ")
+
+
+def _handle_ignore_tags(tags: List[str], act_id: str) -> Tuple[
+ List[str], Dict[str, List[str]]]:
+ sensors_to_ignore_general = []
+ sensors_to_ignore_specific = {}
+ for tag in tags:
+ sensor_to_ignore = tag.split("-")[1]
+ if tag.split("-")[0] == "ignoregen":
+ if sensor_to_ignore not in sensors_to_ignore_general:
+ sensors_to_ignore_general.append(sensor_to_ignore)
+ if tag.split("-")[0] == "ignore":
+ if act_id not in sensors_to_ignore_specific:
+ sensors_to_ignore_specific[act_id] = [sensor_to_ignore]
+ elif sensor_to_ignore not in sensors_to_ignore_specific[act_id]:
+ sensors_to_ignore_specific[act_id].append(sensor_to_ignore)
+ return sensors_to_ignore_general, sensors_to_ignore_specific
+
+
+def _extend_sensor_ignore_dicts(original_gen: List[str],
+ original_spec: Dict[str, List[str]],
+ tags: List[str],
+ act_id: str) \
+ -> Tuple[List[str], Dict[str, List[str]]]:
+ """ Merge two sensor ignore dicts.
+
+ Returns the merged ignore sensors.
+ """
+ new_gen, new_spec = _handle_ignore_tags(tags, act_id)
+ original_gen += new_gen
+ original_gen = list(set(original_gen))
+ for key, value in new_spec.items():
+ if key in original_spec:
+ original_spec[key] += value
+ original_spec[key] = list(set(original_spec[key]))
+ else:
+ original_spec[key] = value
+ return original_gen, original_spec
+
+
+class GrafanaFetcher(AnnotationParamFetcher, IgnoreSensorFetcher):
+ """ Fetches the general activity parameters and ignore sensors from Grafana.
+ Generates CEP apps and signatures based on Grafana annotations.
+ Annotation rules:
+ - Name of _start_ annotation `START_Activity-Name-Here`
+ - Note, that the activity name must match the activity name in the Camunda log for evaluation
+ - Analogous for `END_`
+ - First tag must be some unique key
+ - Second tag must be `activity`
+ - Third tag must be _station_ code, e.g. `OV_1`, `HYGIENE_STATION`
+ - For detection apps spanning multiple components/stations/resources, this
+ tag needs to include all of them separated by a hyphen, e.g. `HYGIENE_STATION-LEFT_DONATION`
+ - Fourth tag and all others behind can be used to _ignore_ certain _sensors_ in the activity
+ signature and for the creation
+ of the CEP Siddhi apps (can be either at START or END annotation):
+ - add `ignore-SENSORNAME` to the tag to ignore the sensor for only this
+ activity-signature/-app, e.g. `ignore-light_l5`
+ - if you want to ignore a certain sensor in general, i.e. for all activities, and don't
+ want to repeat the tag, just
+ tag it with `ignoregen-SENSORENAME`, e.g. `ignoregen-movepos_x`
+ """
+
+ def __init__(self,
+ url: str,
+ auth: str) -> None:
+ self._grafana_url = url
+ self._grafana_auth = auth
+ self._activity_params: Union[None, List[AnnotationParams]] = None
+ self._sensors_to_ignore_general: Union[None, List[str]] = None
+ self._sensors_to_ignore_specific: Union[None, Dict[str, List[str]]] = None
+
+ def get_annotation_params(self) -> List[AnnotationParams]:
+ """ Fetch the general activity parameters. """
+ if self._activity_params is None:
+ (self._activity_params,
+ self._sensors_to_ignore_general,
+ self._sensors_to_ignore_specific) = self._get_grafana_data()
+ return self._activity_params
+
+ def get_ignore_sensors(self) -> Dict[str, List[str]]:
+ """ Fetch the ignore sensors. """
+ if self._sensors_to_ignore_general is None or self._sensors_to_ignore_specific is None:
+ (self._activity_params,
+ self._sensors_to_ignore_general,
+ self._sensors_to_ignore_specific) = self._get_grafana_data()
+ return {"general": self._sensors_to_ignore_general,
+ **self._sensors_to_ignore_specific}
+
+ def _get_grafana_data(self) -> Tuple[List[AnnotationParams], List[str], Dict[str, List[str]]]:
+ """
+ Get annotations from Grafana (activities)
+ :return: activities, in a dict with their IDs as a key (id from Grafana annotation)
+ """
+ annotations = requests.get(self._grafana_url + '/api/annotations?tags=activity',
+ headers=CaseInsensitiveDict(
+ {"Accept": "application/json",
+ "Authorization": "Bearer " + self._grafana_auth}),
+ timeout=5).json()
+ activities: Dict[str, Dict[str, Any]] = {}
+ activities_list: List[AnnotationParams] = []
+ sensors_to_ignore_general: List[str] = []
+ sensors_to_ignore_specific: Dict[str, List[str]] = {}
+
+ for anno in annotations:
+ if "det_activity" in anno['tags']:
+ continue
+ lifecycle, activity_name = _handle_text_annotation(anno['text'])
+ time = dt.fromtimestamp(anno['time'] / 1000, datetime.UTC)
+ act_id = anno['tags'][
+ 0] # Tags for two events belonging together need to have the same
+ # unique tag (id); tag[0] = id; tag[1] = "activity"; tag[2] = component
+ anno_type = anno['tags'][1]
+ sensors_to_ignore_general, sensors_to_ignore_specific = _extend_sensor_ignore_dicts(
+ sensors_to_ignore_general,
+ sensors_to_ignore_specific,
+ anno['tags'][3:],
+ act_id)
+ if anno_type == "activity":
+ resources = anno['tags'][2].split("-")
+ resources = [resource.upper() for resource in resources]
+ if act_id in activities:
+ activity = activities[act_id]
+ if lifecycle == "START":
+ activity["start"] = time
+ elif lifecycle == "END":
+ if activity["start"] == time:
+ raise ValueError(f"Annotated lifecycle {lifecycle} "
+ f"has the same timestamp as the start.")
+ activity["end"] = time
+ else:
+ raise ValueError(f"Annotated lifecycle {lifecycle} not recognized."
+ f"Lifecycle must be either START or END.")
+ if (activity["start"] is None) or (activity["end"] is None):
+ raise ValueError(f"Annotation {activity['annotationId']} "
+ f"has no start or end.")
+ activities_list.append(AnnotationParams(activity_name=activity["name"],
+ start=activity["start"],
+ end=activity["end"],
+ stations=activity["stations"],
+ annotation_id=activity[
+ "annotation_id"]))
+ # remove the activity from the dict
+ del activities[act_id]
+ else:
+ activities[act_id] = {"annotation_id": act_id,
+ "name": activity_name,
+ "start": time if lifecycle == "START" else None,
+ "end": time if lifecycle == "END" else None,
+ "stations": resources,
+ "grafana_dashboard": (
+ anno['dashboardUID'], anno['panelId'])}
+
+ # raise error of activities are not empty
+ if activities:
+ raise ValueError(f"Activities not properly annotated: {activities}.")
+ return activities_list, sensors_to_ignore_general, sensors_to_ignore_specific
diff --git a/cepact/input_processor/concrete_fetchers/influx_fetcher.py b/cepact/input_processor/concrete_fetchers/influx_fetcher.py
new file mode 100644
index 0000000..0380059
--- /dev/null
+++ b/cepact/input_processor/concrete_fetchers/influx_fetcher.py
@@ -0,0 +1,70 @@
+""" The influx fetcher, that fetches the iot data from the influx db. """
+from typing import List, Dict
+
+from influxdb_client import InfluxDBClient # type: ignore
+
+from ..abstract_fetchers import SignatureFetcher
+from ...representations import AnnotationParams, Signature, SignatureItem, SignatureBuilder
+
+
+class InfluxFetcher(SignatureFetcher):
+ """ Fetches the iot data from the influxDB.
+
+ The IoT time series data to extract the activity signature from can be stored on InfluxDB.
+ The data should be stored in a bucket with and the naming should be specified in
+ the `influx_station_bucket_map` in the `DAGConfig`."""
+
+ def __init__(self,
+ url: str,
+ auth: str,
+ org: str,
+ station_bucket_map: Dict[str, str]) -> None:
+ self._influx_url = url
+ self._influx_auth = auth
+ self._influx_org = org
+ self._influx_station_bucket_map = station_bucket_map
+
+ def get_signature(self, annotation_params: AnnotationParams,
+ ignore_sensors: Dict[str, List[str]],
+ sampling_freq: float) -> Signature:
+ """
+ Extract activity signatures for given activity from InfluxDB
+ :param details: enable console printouts, default off
+ :param activity: Relevant activity
+ :return: Signature of the activity
+ """
+ signature_builder: SignatureBuilder = SignatureBuilder(
+ activity_name=annotation_params.activity_name,
+ annotation_id=annotation_params.annotation_id,
+ sampling_freq=sampling_freq
+ )
+ rel_sensors_ignore = ignore_sensors["general"].copy()
+ if annotation_params.activity_name in ignore_sensors:
+ rel_sensors_ignore += ignore_sensors[annotation_params.activity_name]
+ rel_sensors_ignore = list(set(rel_sensors_ignore))
+
+ with InfluxDBClient(url=self._influx_url,
+ token=self._influx_auth,
+ org=self._influx_org) as client:
+ for resource in annotation_params.stations:
+ query_api = client.query_api()
+ query = (
+ f'from(bucket:"'
+ f'{self._influx_station_bucket_map[resource]}")'
+ f'|> range(start: {annotation_params.start.strftime("%Y-%m-%dT%H:%M:%SZ")}, '
+ f'stop: {annotation_params.end.strftime("%Y-%m-%dT%H:%M:%SZ")})'
+ f'|> yield()')
+ result = query_api.query(org=self._influx_org,
+ query=query)
+ for table in result:
+ for record in table.records:
+ if record.get_field() not in rel_sensors_ignore:
+ signature_builder.add_signature_item(SignatureItem(
+ station=resource,
+ timestamp=record['_time'],
+ sensor=record.get_field(),
+ value=record.get_value())
+ )
+ client.close()
+
+ return signature_builder.build()
diff --git a/cepact/input_processor/concrete_fetchers/local_ann_params_fetcher.py b/cepact/input_processor/concrete_fetchers/local_ann_params_fetcher.py
new file mode 100644
index 0000000..56a7929
--- /dev/null
+++ b/cepact/input_processor/concrete_fetchers/local_ann_params_fetcher.py
@@ -0,0 +1,70 @@
+""" Fetch annotation parameters from local files. """
+import os
+from typing import List
+
+import pandas as pd
+
+from ..abstract_fetchers import AnnotationParamFetcher
+from ...representations import AnnotationParams
+
+
+class LocalAnnotationParamFetcher(AnnotationParamFetcher):
+ """ Get annotation params from local files.
+
+ Imports the annotation parameters from a local file. The file should be in the format of
+ a CSV file with the following columns:
+ - annotation_id: unique identifier for the annotation
+ - activity_name: name of the activity
+ - start: start time of the annotation
+ - end: end time of the annotation
+ - stations: stations that are relevant for the activity
+ """
+
+ def __init__(self, local_in_dir: str) -> None:
+ self._local_in_dir = local_in_dir
+
+ def _validate_annotation_params(self, annotation_params: pd.DataFrame) -> None:
+ """ Check if the annotation parameters are valid.
+
+ | Column | Constraints |
+ | ------------- | --------------------------------- |
+ | annotation_id | must be unique |
+ | activity_name | can be repeated |
+ | start | datetime |
+ | end | datetime |
+ | stations | could be multiple, separated by - |
+
+ """
+
+ if annotation_params["annotation_id"].nunique() != len(annotation_params):
+ raise ValueError("Annotation IDs must be unique.")
+ if not all(isinstance(x, str) for x in annotation_params["annotation_id"]):
+ raise ValueError("Annotation IDs must be strings.")
+ if not all(isinstance(x, str) for x in annotation_params["activity_name"]):
+ raise ValueError("Activity names must be strings.")
+ if not all(isinstance(x, pd.Timestamp) for x in annotation_params["start"]):
+ raise ValueError("Start must be a datetime.")
+ if not all(isinstance(x, pd.Timestamp) for x in annotation_params["end"]):
+ raise ValueError("End must be a datetime.")
+ if not all(isinstance(x, str) for x in annotation_params["stations"]):
+ raise ValueError("Stations must be strings.")
+
+ def get_annotation_params(self) -> List[AnnotationParams]:
+ """ Fetch the annotation parameters. """
+ ign_sens_path = self._local_in_dir + "/anno_params.csv"
+ if ign_sens_path is None or not os.path.exists(ign_sens_path):
+ raise ValueError("Annotation parameters file not found.")
+ # open file
+ annotation_params = pd.read_csv(ign_sens_path)
+ annotation_params['start'] = pd.to_datetime(annotation_params['start'])
+ annotation_params['end'] = pd.to_datetime(annotation_params['end'])
+ if not all(isinstance(x, str) for x in annotation_params["annotation_id"]):
+ annotation_params["annotation_id"] = annotation_params["annotation_id"].astype(str)
+ self._validate_annotation_params(annotation_params)
+ return [AnnotationParams(
+ annotation_id=row["annotation_id"],
+ activity_name=row["activity_name"],
+ start=row["start"],
+ end=row["end"],
+ stations=row["stations"].split("-")
+ ) for _, row in annotation_params.iterrows()]
diff --git a/cepact/input_processor/concrete_fetchers/local_discretization_fetcher.py b/cepact/input_processor/concrete_fetchers/local_discretization_fetcher.py
new file mode 100644
index 0000000..bded72a
--- /dev/null
+++ b/cepact/input_processor/concrete_fetchers/local_discretization_fetcher.py
@@ -0,0 +1,147 @@
+""" The local fetcher, that fetches the discretization annotation. """
+import os
+import re
+from typing import Any, Union
+
+import pandas as pd
+
+from ..abstract_fetchers import DiscretizationFetcher
+from ...representations import Discretization, DiscretizationBuilder
+
+
+class LocalDiscretizationFetcher(DiscretizationFetcher):
+ """ Fetches the discretization annotation.
+
+ Imports the discretization annotation from a local file. The file should be in the format of a
+ CSV file with the following columns:
+ - sensor: name of the sensor
+ - source: what range of the sensor values should be mapped to the target
+ - target: target of the sensor
+
+ Note that whenever a sensor is included, the source should cover the whole range of the
+ sensor values.
+ Possible source values are:
+ - x: values greater than x
+ - <=x: values less than or equal to x
+ - >=x: values greater than or equal to x
+ - [x,y]: values between x and y
+ - [x,y[: values between x and y, excluding y
+ - ]x,y]: values between x and y, excluding x
+ - ]x,y[: values between x and y, excluding x and y
+ """
+
+ def __init__(self, local_in_dir: str) -> None:
+ self._local_in_dir = local_in_dir
+
+ def _get_sorted_sensor_mapping(self) -> Union[pd.DataFrame, None]:
+ """ Get the sorted sensor mapping. """
+ sensor_mapping_path = self._local_in_dir + "/discr_mapping.csv"
+ if sensor_mapping_path is None or not os.path.exists(sensor_mapping_path):
+ raise ValueError("Sensor mapping file not found.")
+ # check if file is empty, if so return None
+ if os.stat(sensor_mapping_path).st_size == 0:
+ return None
+ # open file
+ sensor_mapping = pd.read_csv(sensor_mapping_path)
+ # check whether file has columns sensor, source, target
+ if not all(col in sensor_mapping.columns for col in ["sensor", "source", "target"]):
+ raise ValueError("Sensor mapping file must have columns 'sensor', 'source', 'target'")
+ # check whether all sensors have all areas covered
+ # check whether for each sensor there is a source entry starting with < and >
+ for sensor in sensor_mapping["sensor"].unique():
+ sensor_map = sensor_mapping[sensor_mapping["sensor"] == sensor]
+ if not all(area in "".join(list(sensor_map["source"].unique())) for area in ["<", ">"]):
+ raise ValueError(f"Sensor {sensor} must have areas '<' and '>' covered")
+ return sensor_mapping.sort_values(by="sensor")
+
+ def _get_casted_target(self, target: Any) -> Any:
+ """ Cast the target to the most suitable type. """
+ try:
+ return int(target)
+ except ValueError:
+ try:
+ return float(target)
+ except ValueError:
+ if target == "True":
+ return True
+ if target == "False":
+ return False
+ return target
+
+ def get_discretization(self) -> Discretization:
+ """ Fetch the discretization. """
+ # import sensor discretization mapping from file, file of csv format
+ # some things that need to be done:
+ # - validate that all sensors mentioned have all areas covered
+ # - convert from semantics to valid python format as seen above
+ # validate that there are no overlapping ranges
+ discretization_builder = DiscretizationBuilder()
+ # sort by sensor
+ sensor_mapping = self._get_sorted_sensor_mapping()
+ if sensor_mapping is None:
+ return discretization_builder.build()
+ # go through the sorted dataframe row by row
+ for _, row in sensor_mapping.iterrows():
+ sensor = row["sensor"]
+ source = row["source"]
+ target = row["target"]
+ target_casted = self._get_casted_target(target)
+ # check wether source matches some regex
+ if not re.fullmatch(r"^([<>]=?\s*-?\d+(\.\d+)?|"
+ r"[\[\]]\s*-?\d+(\.\d+)?\s*,\s*-?\d+(\.\d+)?\s*[\[\]]|)$", source):
+ raise ValueError(f"Source {source} for sensor {sensor} is not valid.")
+ # remove all whitespaces from source
+ source = source.replace(" ", "")
+ if source[:2] == "<=":
+ l_bound = float("-inf")
+ u_bound = float(source[2:])
+ discretization_builder.add_discretization_item(sensor, l_bound,
+ u_bound, True, True,
+ target_casted)
+ elif source[:2] == ">=":
+ l_bound = float(source[2:])
+ u_bound = float("inf")
+ discretization_builder.add_discretization_item(sensor, l_bound, u_bound,
+ True, True,
+ target_casted)
+ elif source[0] == "<":
+ l_bound = float("-inf")
+ u_bound = float(source[1:])
+ discretization_builder.add_discretization_item(sensor, l_bound, u_bound,
+ True, False,
+ target_casted)
+ elif source[0] == ">":
+ l_bound = float(source[1:])
+ u_bound = float("inf")
+ discretization_builder.add_discretization_item(sensor, l_bound, u_bound,
+ False, True,
+ target_casted)
+ elif source[0] == "[" and source[-1] == "]":
+ bounds = source[1:-1].split(",")
+ discretization_builder.add_discretization_item(sensor, float(bounds[0]),
+ float(bounds[1]),
+ True,
+ True, target_casted)
+ elif source[0] == "[" and source[-1] == "[":
+ bounds = source[1:-1].split(",")
+ discretization_builder.add_discretization_item(sensor, float(bounds[0]),
+ float(bounds[1]),
+ True,
+ False, target_casted)
+ elif source[0] == "]" and source[-1] == "]":
+ bounds = source[1:-1].split(",")
+ discretization_builder.add_discretization_item(sensor, float(bounds[0]),
+ float(bounds[1]),
+ False,
+ True, target_casted)
+ elif source[0] == "]" and source[-1] == "[":
+ bounds = source[1:-1].split(",")
+ discretization_builder.add_discretization_item(sensor, float(bounds[0]),
+ float(bounds[1]),
+ False,
+ False, target_casted)
+ else:
+ raise ValueError(f"Source {source} for sensor {sensor} is not valid.")
+ # make sure that the whole range is covered
+ return discretization_builder.build()
diff --git a/cepact/input_processor/concrete_fetchers/local_ign_sensor_fetcher.py b/cepact/input_processor/concrete_fetchers/local_ign_sensor_fetcher.py
new file mode 100644
index 0000000..77e97d7
--- /dev/null
+++ b/cepact/input_processor/concrete_fetchers/local_ign_sensor_fetcher.py
@@ -0,0 +1,74 @@
+""" The local fetcher, that fetches the sensor ignore annotation. """
+import json
+import os
+from typing import Dict, List
+
+import jsonschema
+
+from ..abstract_fetchers import IgnoreSensorFetcher
+
+
+class LocalIgnoreSensorFetcher(IgnoreSensorFetcher):
+ """ Fetches the ignore sensor annotation.
+
+ Imports the ignore sensor annotation from a local file. The format of the file is
+ given by the following JSON Schema:
+ {
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "required": [
+ "general"
+ ],
+ "properties": {
+ "general": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "patternProperties": {
+ "^.*$": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+
+ This schema enforces that the JSON file has a "general" key with a list of strings
+ as values, and any other key should have a list of strings as values.
+ This means that all the sensors that are to be ignored for all activities should be in the
+ "general" key, and the sensors that are to be ignored for a specific activity should be in a
+ key with the name of the activity.
+ """
+
+ def __init__(self, local_in_dir: str) -> None:
+ self._local_in_dir = local_in_dir
+
+ def get_ignore_sensors(self) -> Dict[str, List[str]]:
+ """ Fetch the ignore sensors.
+
+ Structure of return dict:
+ {
+ "general": List[str],
+ "activityName1": List[str],
+ "activityName2": List[str]
+ }
+ """
+ ign_sens_path = self._local_in_dir + "/ignore_sensors.json"
+ if ign_sens_path is None or not os.path.exists(ign_sens_path):
+ raise ValueError("Ignore sensor file not found.")
+ # open file
+ ignore_sensors: Dict[str, List[str]]
+ with open(ign_sens_path, "r", encoding="utf-8") as f:
+ ignore_sensors = json.load(f)
+ # validate schema
+ with open(os.path.join(os.path.dirname(__file__), "static", "ignore_sensors_schema.json"),
+ "r",
+ encoding="utf-8") as f:
+ schema = json.load(f)
+ jsonschema.validate(ignore_sensors, schema)
+ return ignore_sensors
diff --git a/cepact/input_processor/concrete_fetchers/local_signature_fetcher.py b/cepact/input_processor/concrete_fetchers/local_signature_fetcher.py
new file mode 100644
index 0000000..8772310
--- /dev/null
+++ b/cepact/input_processor/concrete_fetchers/local_signature_fetcher.py
@@ -0,0 +1,83 @@
+""" Fetches the signature from local files. """
+import json
+import os
+from typing import Dict, List
+
+import jsonschema
+import pandas as pd
+
+from ..abstract_fetchers import SignatureFetcher
+from ...representations import AnnotationParams, Signature, SignatureBuilder, SignatureItem
+
+
+class LocalSignatureFetcher(SignatureFetcher):
+ """ Fetches the signature from local files.
+
+ Imports the signature from a local file. The file should be in the format of a JSONL file with
+ the following JSON schema for each line:
+ {
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "required": [
+ "station",
+ "timestamp"
+ ],
+ "properties": {
+ "station": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ }
+ """
+
+ def __init__(self, local_in_dir: str) -> None:
+ self._local_in_dir = local_in_dir
+ with open(
+ os.path.join(os.path.dirname(__file__), "static", "timeseries_schema.json"),
+ "r",
+ encoding="utf-8") as schema_file:
+ self._schema = json.load(schema_file)
+
+ def get_signature(self,
+ annotation_params: AnnotationParams,
+ ignore_sensors: Dict[str, List[str]],
+ sampling_freq: float) -> Signature:
+ """ Fetch the signature for a certain activity annotation from local file. """
+ overall_ignore = ignore_sensors["general"].copy()
+ signature_builder: SignatureBuilder = SignatureBuilder(
+ activity_name=annotation_params.activity_name,
+ annotation_id=annotation_params.annotation_id,
+ sampling_freq=sampling_freq
+ )
+ if annotation_params.activity_name in ignore_sensors:
+ overall_ignore += ignore_sensors[annotation_params.activity_name]
+ ts_path = self._local_in_dir + "/timeseries.jsonl"
+ if ts_path is None or not os.path.exists(ts_path):
+ raise ValueError("Timeseries file not found.")
+ with open(ts_path, "r", encoding="utf-8") as f:
+ for line in f:
+ record = json.loads(line)
+ # validate schema
+ jsonschema.validate(record, self._schema)
+ station = record['station']
+ timestamp = pd.to_datetime(record['timestamp']).to_pydatetime()
+ if (timestamp < annotation_params.start) or (timestamp > annotation_params.end):
+ continue
+ if station not in annotation_params.stations:
+ continue
+ # iterate through all other fields
+ for field, value in record.items():
+ if field not in overall_ignore and field not in ["station", "timestamp", "id"]:
+ signature_builder.add_signature_item(
+ SignatureItem(
+ station=station,
+ timestamp=timestamp,
+ sensor=field,
+ value=value
+ )
+ )
+ return signature_builder.build()
diff --git a/cepact/input_processor/concrete_fetchers/static/ignore_sensors_schema.json b/cepact/input_processor/concrete_fetchers/static/ignore_sensors_schema.json
new file mode 100644
index 0000000..7359c35
--- /dev/null
+++ b/cepact/input_processor/concrete_fetchers/static/ignore_sensors_schema.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "required": [
+ "general"
+ ],
+ "properties": {
+ "general": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "patternProperties": {
+ "^.*$": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/cepact/input_processor/concrete_fetchers/static/timeseries_schema.json b/cepact/input_processor/concrete_fetchers/static/timeseries_schema.json
new file mode 100644
index 0000000..48ae3ff
--- /dev/null
+++ b/cepact/input_processor/concrete_fetchers/static/timeseries_schema.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "required": [
+ "station",
+ "timestamp"
+ ],
+ "properties": {
+ "station": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+}
diff --git a/cepact/input_processor/input_processor.py b/cepact/input_processor/input_processor.py
new file mode 100644
index 0000000..8de6414
--- /dev/null
+++ b/cepact/input_processor/input_processor.py
@@ -0,0 +1,54 @@
+""" This module contains the InputProcessor class. """
+from typing import List, TYPE_CHECKING, Dict
+
+from ..representations import Activity, Discretization, Signature
+
+if TYPE_CHECKING:
+ from ..conf import DAGConfig
+
+
+class InputProcessor():
+ """ Extract important information from the input data. """
+
+ def __init__(self, dag_conf: 'DAGConfig') -> None:
+ self._dag_conf = dag_conf
+ self._annotation_param_fetcher = self._dag_conf.annotation_param_fetcher
+ self._ignore_sensor_fetcher = self._dag_conf.ignore_sensor_fetcher
+ self._discretization_fetcher = self._dag_conf.discretization_fetcher
+ self._signature_fetcher = self._dag_conf.signature_fetcher
+
+ def get_activities(self) -> List[Activity]:
+ """ Get activities from the input data. """
+ # create suitable concrete fetchers
+ # call annotation processor and timeseries processor
+ # first call annotation processor overall
+ ann_params = self._annotation_param_fetcher.get_annotation_params()
+ sensor_ignores = self._ignore_sensor_fetcher.get_ignore_sensors()
+ # then call timeseries processor (somehow related to the annotated activities)
+
+ signatures: Dict[str, List[Signature]] = {}
+ for annotation in ann_params:
+ if annotation.activity_name not in signatures:
+ signatures[annotation.activity_name] = []
+ signatures[annotation.activity_name].append(
+ self._signature_fetcher.get_signature(annotation,
+ sensor_ignores,
+ self._dag_conf.sampling_freq)
+ )
+ # create activity objects --> use annotations and ts data to create signatures and changes
+ activities = []
+ general_sensors_to_ignore = sensor_ignores["general"]
+ for annotation in ann_params:
+ act_name = annotation.activity_name
+ sensor_to_ignore_act = sensor_ignores[act_name] if act_name in sensor_ignores else []
+ signature = signatures[act_name]
+ activity = Activity(annotation_params=annotation,
+ signatures=signature,
+ sensors_to_ignore=general_sensors_to_ignore + sensor_to_ignore_act)
+ activities.append(activity)
+ # return list of activities
+ return activities
+
+ def get_discretization(self) -> Discretization:
+ """ Extract the discretization. """
+ return self._discretization_fetcher.get_discretization()
diff --git a/cepact/misc.py b/cepact/misc.py
new file mode 100644
index 0000000..894d188
--- /dev/null
+++ b/cepact/misc.py
@@ -0,0 +1,2 @@
+""" Miscellaneous helper things. """
+REPORT_BUG_CTA = "This is most likely a bug. Please report."
diff --git a/cepact/output_producer/__init__.py b/cepact/output_producer/__init__.py
new file mode 100644
index 0000000..386647b
--- /dev/null
+++ b/cepact/output_producer/__init__.py
@@ -0,0 +1,13 @@
+""" This sub-package is responsible for producing the output: Signature file and CEP apps. """
+from .concrete_instance_level_det_queries import (AllHighLevelPatternQuery,
+ First50HighLevelPatternQuery,
+ FirstLastLowLevelPatternQuery,
+ Any25LowLevelPatternQuery,
+ Any50LowLevelPatternQuery,
+ Any75LowLevelPatternQuery)
+from .abstract_instance_level_det_query import InstanceLevelDetQuery
+from .output_producer import OutputProducer
+
+__all__ = ['OutputProducer', 'AllHighLevelPatternQuery', 'First50HighLevelPatternQuery',
+ 'FirstLastLowLevelPatternQuery', 'Any25LowLevelPatternQuery',
+ 'Any50LowLevelPatternQuery', 'Any75LowLevelPatternQuery', 'InstanceLevelDetQuery']
diff --git a/cepact/output_producer/abstract_instance_level_det_query.py b/cepact/output_producer/abstract_instance_level_det_query.py
new file mode 100644
index 0000000..f757b5d
--- /dev/null
+++ b/cepact/output_producer/abstract_instance_level_det_query.py
@@ -0,0 +1,10 @@
+""" Abstract instance level query for strategy pattern. """
+from abc import ABC, abstractmethod
+
+
+class InstanceLevelDetQuery(ABC):
+ """ Abstract instance level query for strategy pattern. """
+
+ @abstractmethod
+ def generate(self, num_changes: int, act_name: str) -> str:
+ """ Generate the query. """
diff --git a/cepact/output_producer/concrete_instance_level_det_queries.py b/cepact/output_producer/concrete_instance_level_det_queries.py
new file mode 100644
index 0000000..aba1781
--- /dev/null
+++ b/cepact/output_producer/concrete_instance_level_det_queries.py
@@ -0,0 +1,194 @@
+""" Concrete instance level detection query classes (strategy pattern). """
+from math import ceil
+
+from .abstract_instance_level_det_query import InstanceLevelDetQuery
+
+DATETIME_FORMAT = 'yyyy-MM-dd HH:mm:ss.SS'
+
+
+class AllHighLevelPatternQuery(InstanceLevelDetQuery):
+ """ Concrete instance level detection query for all high level patterns. """
+
+ def generate(self, num_changes: int, act_name: str) -> str:
+ """ Generate the query. """
+ ahli_query = (
+ f'@info(name="Detect-AllHighLevelPattern-InstanceLevelActivity")\n'
+ f'from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] '
+ f'-> not HelperStream[event == "HighToLow"] and '
+ f'e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-{num_changes}"]\n'
+ f'select "{act_name}" as activity, '
+ f'"AllHighLevelPattern" as detection_type, '
+ f"e1.ts_second as ts_start, "
+ f"time:timestampInMilliseconds(e1.ts_second, '{DATETIME_FORMAT}') as ts_start_unix, "
+ f'e2.ts_second as ts_end, '
+ f"time:timestampInMilliseconds(e2.ts_second, '{DATETIME_FORMAT}') as ts_end_unix"
+ f'\n'
+ f'insert into DetectedInstanceLevelActivities;'
+ )
+ return ahli_query
+
+
+class First50HighLevelPatternQuery(InstanceLevelDetQuery):
+ """ Concrete instance level detection query for first 50% high level patterns. """
+
+ def generate(self, num_changes: int, act_name: str) -> str:
+ """ Generate the query. """
+ if num_changes > 2:
+ ffpi_query = (
+ f'@info(name="Detect-First50HighLevelPattern-InstanceLevelActivity")\n'
+ f'from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] '
+ f'-> not HelperStream[event == "HighToLow"] '
+ f'and e2 = DetectedHighLevelActivityEvents'
+ f'[event == "HighLevel-Pattern-{ceil(num_changes / 2)}"]\n'
+ f'select "{act_name}" as activity, '
+ f'"First50HighLevelPattern" as detection_type, '
+ f'e1.ts_second as ts_start, '
+ f"time:timestampInMilliseconds"
+ f"(e1.ts_second, '{DATETIME_FORMAT}') as ts_start_unix, "
+ f'e2.ts_second as ts_end, '
+ f"time:timestampInMilliseconds(e2.ts_second, '{DATETIME_FORMAT}') as ts_end_unix"
+ f'\n'
+ f'insert into DetectedInstanceLevelActivities;'
+ )
+ elif num_changes in [1, 2]:
+ ffpi_query = (
+ f'@info(name="Detect-First50HighLevelPattern-InstanceLevelActivity")\n'
+ f'from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"]\n'
+ f'select "{act_name}" as activity, '
+ f'"First50HighLevelPattern" as detection_type, '
+ f'e1.ts_second as ts_start, '
+ f"time:timestampInMilliseconds"
+ f"(e1.ts_second, '{DATETIME_FORMAT}') as ts_start_unix, "
+ f'e1.ts_second as ts_end, '
+ f"time:timestampInMilliseconds(e1.ts_second, '{DATETIME_FORMAT}') as ts_end_unix"
+ f'\n'
+ f'insert into DetectedInstanceLevelActivities;'
+ )
+ else:
+ raise ValueError(f"Number of distinct change timestamps must "
+ f"be greater than 0; act_name: {act_name}")
+ return ffpi_query
+
+
+class FirstLastLowLevelPatternQuery(InstanceLevelDetQuery):
+ """ Concrete instance level detection query for first last low level patterns. """
+
+ def generate(self, num_changes: int, act_name: str) -> str:
+ """ Generate the query. """
+ fllli_query = (
+ f'@info(name="Detect-FirstLastLowLevelPattern-InstanceLevelActivity")\n'
+ f'from every e1 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"] '
+ f'-> not HelperStream[event == "HighToLow"] '
+ f'and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-{num_changes}"]\n'
+ f'select "{act_name}" as activity, '
+ f'"FirstLastLowLevelPattern" as detection_type, e1.ts_second as ts_start, '
+ f"time:timestampInMilliseconds(e1.ts_second, '{DATETIME_FORMAT}') as ts_start_unix, "
+ f'e2.ts_second as ts_end, '
+ f"time:timestampInMilliseconds(e2.ts_second, '{DATETIME_FORMAT}') as ts_end_unix"
+ f'\n'
+ f'insert into DetectedInstanceLevelActivities;'
+ )
+ return fllli_query
+
+
+def create_any_quartile_low_level_instance_query(num_changes: int,
+ activity_name: str,
+ percentage_req: int) -> str:
+ """ Create the query for any quartile low level instance detection. """
+ if percentage_req not in [25, 50, 75]:
+ raise ValueError("Error during app creation. Percentage must be 25, 50 or 75.")
+ upper_bound = ceil(num_changes * (percentage_req / 100))
+ afpi_query = (
+ f'@info(name="Detect-Any{percentage_req}LowLevelPattern'
+ f'-InstanceLevelActivity-Startup")\n'
+ f'from e1 = DetectedLowLevelActivityEvents,\n') if (upper_bound > 1) else (
+ f'@info(name="Detect-Any{percentage_req}LowLevelPattern'
+ f'-InstanceLevelActivity-Startup")\n'
+ f'from e1 = DetectedLowLevelActivityEvents\n')
+ for i in range(2, (upper_bound + 1)):
+ if i < upper_bound:
+ afpi_query += (f'\te{i} = DetectedLowLevelActivityEvents'
+ f'[e{i - 1}.ll_pattern_num < ll_pattern_num and '
+ f'time:timestampInMilliseconds(e{i - 1}.ts_second, \'yyyy-MM-dd '
+ f'HH:mm:ss.SS\') <= time:timestampInMilliseconds(ts_second, '
+ f'\'yyyy-MM-dd HH:mm:ss.SS\')],\n')
+ else:
+ afpi_query += (f'\te{i} = DetectedLowLevelActivityEvents'
+ f'[e{i - 1}.ll_pattern_num < ll_pattern_num and '
+ f'time:timestampInMilliseconds(e{i - 1}.ts_second, \'yyyy-MM-dd '
+ f'HH:mm:ss.SS\') <= time:timestampInMilliseconds(ts_second, '
+ f'\'yyyy-MM-dd HH:mm:ss.SS\')]\n')
+ afpi_query += (
+ f'select "{activity_name}" as activity, '
+ f'"Any{percentage_req}LowLevelPattern" as detection_type, '
+ f'e1.ts_second as ts_start, '
+ f"time:timestampInMilliseconds(e1.ts_second, '{DATETIME_FORMAT}') as ts_start_unix, "
+ f'e{upper_bound}.ts_second as ts_end, '
+ f"time:timestampInMilliseconds(e{upper_bound}.ts_second, "
+ f"'{DATETIME_FORMAT}') as ts_end_unix"
+ f'\n')
+ afpi_query += 'insert into DetectedInstanceLevelActivities;\n\n'
+
+ afpi_query += (
+ f'@info(name="Detect-Any{percentage_req}LowLevelPattern-InstanceLevelActivity")\n'
+ f'from every e1 = DetectedLowLevelActivityEvents,\n')
+ for i in range(2, (upper_bound + 2)):
+ if i == 2:
+ afpi_query += ('\te2 = DetectedLowLevelActivityEvents'
+ '[e1.ll_pattern_num >= ll_pattern_num and '
+ 'time:timestampInMilliseconds(e1.ts_second, \'yyyy-MM-dd '
+ 'HH:mm:ss.SS\') <= time:timestampInMilliseconds(ts_second, \'yyyy-MM-dd '
+ 'HH:mm:ss.SS\')],\n') if (
+ upper_bound > 1) else ('\te2 = DetectedLowLevelActivityEvents'
+ '[e1.ll_pattern_num >= ll_pattern_num and '
+ 'time:timestampInMilliseconds(e1.ts_second, '
+ '\'yyyy-MM-dd HH:mm:ss.SS\') <= '
+ 'time:timestampInMilliseconds(ts_second, \'yyyy-MM-dd '
+ 'HH:mm:ss.SS\')]\n')
+ elif i < upper_bound + 1:
+ afpi_query += (f'\te{i} = DetectedLowLevelActivityEvents'
+ f'[e{i - 1}.ll_pattern_num < ll_pattern_num and '
+ f'time:timestampInMilliseconds(e{i - 1}.ts_second, \'yyyy-MM-dd '
+ f'HH:mm:ss.SS\') <= time:timestampInMilliseconds(ts_second, '
+ f'\'yyyy-MM-dd HH:mm:ss.SS\')],\n')
+ else:
+ afpi_query += (f'\te{i} = DetectedLowLevelActivityEvents'
+ f'[e{i - 1}.ll_pattern_num < ll_pattern_num and '
+ f'time:timestampInMilliseconds(e{i - 1}.ts_second, \'yyyy-MM-dd '
+ f'HH:mm:ss.SS\') <= time:timestampInMilliseconds(ts_second, '
+ f'\'yyyy-MM-dd HH:mm:ss.SS\')]\n')
+ afpi_query += (
+ f'select "{activity_name}" as activity, '
+ f'"Any{percentage_req}LowLevelPattern" as detection_type, '
+ f'e2.ts_second as ts_start, '
+ f"time:timestampInMilliseconds(e2.ts_second, '{DATETIME_FORMAT}') as ts_start_unix, "
+ f'e{upper_bound + 1}.ts_second as ts_end, '
+ f"time:timestampInMilliseconds(e{upper_bound + 1}.ts_second, "
+ f"'{DATETIME_FORMAT}') as ts_end_unix"
+ f'\n')
+ afpi_query += 'insert into DetectedInstanceLevelActivities;'
+ return afpi_query
+
+
+class Any25LowLevelPatternQuery(InstanceLevelDetQuery):
+ """ Concrete instance level detection query for any 25% low level patterns. """
+
+ def generate(self, num_changes: int, act_name: str) -> str:
+ """ Generate the query. """
+ return create_any_quartile_low_level_instance_query(num_changes, act_name, 25)
+
+
+class Any50LowLevelPatternQuery(InstanceLevelDetQuery):
+ """ Concrete instance level detection query for any 50% low level patterns. """
+
+ def generate(self, num_changes: int, act_name: str) -> str:
+ """ Generate the query. """
+ return create_any_quartile_low_level_instance_query(num_changes, act_name, 50)
+
+
+class Any75LowLevelPatternQuery(InstanceLevelDetQuery):
+ """ Concrete instance level detection query for any 75% low level patterns. """
+
+ def generate(self, num_changes: int, act_name: str) -> str:
+ """ Generate the query. """
+ return create_any_quartile_low_level_instance_query(num_changes, act_name, 75)
diff --git a/cepact/output_producer/output_producer.py b/cepact/output_producer/output_producer.py
new file mode 100644
index 0000000..0bdbc74
--- /dev/null
+++ b/cepact/output_producer/output_producer.py
@@ -0,0 +1,93 @@
+""" Here we orchestrate the generation of the output files of the application. """
+import os
+from datetime import datetime
+from typing import List
+
+from .abstract_instance_level_det_query import InstanceLevelDetQuery
+from .siddhi_producer import SiddhiProducer
+from ..conf import DAGConfig
+from ..representations import Activity, Discretization
+
+
+class OutputProducer():
+ """ Orchestrates the generation of the output files of the application. """
+
+ def __init__(self, discretization: Discretization, conf: DAGConfig):
+ # establish logging for debugging
+ self._log_store: List[str] = []
+ self._log('OutputProducer initialized')
+ self._discretization = discretization
+ self._conf = conf
+ self._check_instance_level_detection_queries()
+ self._active_il_queries: List[InstanceLevelDetQuery] = self._conf.det_methods
+ self._prep_output_dir()
+
+ def _log(self, msg: str) -> None:
+ """ Log a message. """
+ current_time: str = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
+ self._log_store.append(f'{current_time}: {msg}')
+
+ def _prep_output_dir(self) -> None:
+ """ Prepare the output directory. """
+ if not os.path.exists(self._conf.out_dir):
+ os.makedirs(self._conf.out_dir)
+ # make sure the output directory is empty, delete any files and also files in nested dirs
+ for root, dirs, files in os.walk(self._conf.out_dir, topdown=False):
+ for name in files:
+ os.remove(os.path.join(root, name))
+ for name in dirs:
+ os.rmdir(os.path.join(root, name))
+
+ def _check_instance_level_detection_queries(self) -> None:
+ # check that self._conf.det_methods does not
+ # contain multiple instances of the same query (class)
+ query_classes = [query.__class__ for query in self._conf.det_methods]
+ if len(query_classes) != len(set(query_classes)):
+ raise ValueError("Multiple instances of the same detection query class.")
+
+ def write_signature(self, activity: Activity) -> None:
+ """ Write the signature to the output directory. """
+ if not self._enough_change_ts(activity):
+ self._log(
+ f'Writing of signature failed, not enough distinct change '
+ f'timestamps {activity.get_annotation_params().activity_name}')
+ return
+ signatures = activity.get_signature()
+ for signature in signatures:
+ signature.create_signature_file(self._conf.out_dir)
+
+ def write_changes(self, activity: Activity) -> None:
+ """ Write the changes to the output directory. """
+ if not self._enough_change_ts(activity):
+ self._log(
+ f'Writing of changes failed, not enough distinct change '
+ f'timestamps {activity.get_annotation_params().activity_name}')
+ return
+ changes = activity.get_changes(self._discretization)
+ changes.create_changes_file(self._conf.out_dir,
+ activity.get_annotation_params().activity_name)
+
+ def write_app(self, activity: Activity) -> None:
+ """ Write the application to the output directory. """
+ if not self._enough_change_ts(activity):
+ self._log(
+ f'Writing of Siddhi App failed, not enough '
+ f'distinct change timestamps {activity.get_annotation_params().activity_name}')
+ return
+ siddhi_producer = SiddhiProducer(il_queries=self._active_il_queries,
+ activity=activity,
+ discretization=self._discretization,
+ dag_conf=self._conf)
+ siddhi_producer.write_siddhi_app()
+
+ def _enough_change_ts(self, activity: Activity) -> bool:
+ """ Check if there are enough change timestamps to detect the activity. """
+ return activity.get_number_distinct_change_timestamps(self._discretization) > 0
+
+ def write_log(self) -> None:
+ """ Write the log to the output directory. """
+ with open(os.path.join(self._conf.out_dir, "log.txt"),
+ 'w',
+ encoding="utf-8") as file:
+ for line in self._log_store:
+ file.write(f'{line}\n')
diff --git a/cepact/output_producer/siddhi_producer.py b/cepact/output_producer/siddhi_producer.py
new file mode 100644
index 0000000..280bbcb
--- /dev/null
+++ b/cepact/output_producer/siddhi_producer.py
@@ -0,0 +1,109 @@
+""" This module is responsible for orchestrating the generation of the Siddhi apps. """
+import os.path
+from typing import List
+
+from .abstract_instance_level_det_query import InstanceLevelDetQuery
+from .sink_source_pattern_helper import define_source, define_sink, define_discretization_query, \
+ create_high_to_low_helper, create_low_high_level_pattern_queries
+from ..conf import DAGConfig
+from ..representations import Activity, Signature, Discretization
+
+
+class SiddhiProducer():
+ """ Orchestrates the generation of Siddhi apps. """
+
+ def __init__(self,
+ il_queries: List[InstanceLevelDetQuery],
+ activity: Activity,
+ discretization: Discretization,
+ dag_conf: DAGConfig):
+ self._il_queries = il_queries
+ self._act = activity
+ self._conf = dag_conf
+ self._discretization = discretization
+
+ def _get_header(self) -> str:
+ """ Get the header of the Siddhi app. (AppName)"""
+ return f'@App:name(\'Detect{self._act.get_annotation_params()
+ .activity_name.replace(" ", "")}App\')'
+
+ def _get_sources(self) -> str:
+ """ Get the sources of the Siddhi app. """
+ signature: Signature = self._act.get_signature()[0]
+ relevant_stations = signature.stations
+ source_str = ""
+ for idx, station in enumerate(relevant_stations):
+ source_str += define_source(station,
+ self._act.get_annotation_params().activity_name,
+ signature.get_sensors_with_types_per_station()[station],
+ signature.get_sensors_with_discretized_types_per_station(
+ discretization=self._discretization)[
+ station],
+ self._conf.siddhi_config)
+ if not idx == len(relevant_stations) - 1:
+ source_str += "\n\n"
+ return source_str
+
+ def _get_sinks(self) -> str:
+ """ Get the sinks of the Siddhi app. """
+ return define_sink(self._act,
+ self._conf.siddhi_config)
+
+ def _get_discretization_helpers(self) -> str:
+ """ Get the discretization helpers of the Siddhi app. """
+ discr_helper_str = ""
+ for idx, station in enumerate(self._act.get_signature()[0].stations):
+ discr_helper_str += define_discretization_query(
+ station,
+ self._discretization,
+ self._act.get_signature()[0].get_sensors_with_discretized_types_per_station(
+ discretization=self._discretization)[station],
+ self._conf.siddhi_config)
+ if not idx == len(self._act.get_signature()[0].stations) - 1:
+ discr_helper_str += "\n\n"
+ return discr_helper_str
+
+ def _get_change_queries(self) -> str:
+ """ Get the change queries of the Siddhi app and the accompanying high to low helper. """
+ queries = ""
+ queries += create_high_to_low_helper() + "\n"
+ l_h_quers = create_low_high_level_pattern_queries(
+ self._act.get_changes(self._discretization), self._act.get_annotation_params(),
+ self._conf.sampling_freq,
+ self._conf.siddhi_config)
+ for query in l_h_quers:
+ queries += "\n" + query
+ return queries
+
+ def _get_instance_level_detection_queries(self) -> str:
+ """ Get the instance level detection queries of the Siddhi app. """
+ num_changes = len(self._act.get_changes(self._discretization).timestamps)
+ act_name = self._act.get_annotation_params().activity_name
+ queries = ""
+ for idx, il_query in enumerate(self._il_queries):
+ queries += il_query.generate(num_changes, act_name)
+ if not idx == len(self._il_queries) - 1:
+ queries += "\n\n"
+ return queries
+
+ def write_siddhi_app(self) -> None:
+ """ Write the Siddhi app to the output directory. """
+ filename = ("Detect" + self._act.get_annotation_params()
+ .activity_name.replace(" ", "") + "App.siddhi")
+ # create directory if not exists
+ if not os.path.exists(os.path.join(self._conf.out_dir, "apps")):
+ os.makedirs(os.path.join(self._conf.out_dir, "apps"))
+ with open(os.path.join(self._conf.out_dir, "apps", filename), "w",
+ encoding="utf-8") as f:
+ f.write(self._get_header())
+ f.write("\n\n")
+ f.write(self._get_sources())
+ f.write("\n\n")
+ f.write(self._get_sinks())
+ f.write("\n\n")
+ f.write(self._get_discretization_helpers())
+ f.write("\n\n")
+ f.write(self._get_change_queries())
+ f.write("\n\n")
+ f.write(self._get_instance_level_detection_queries())
+ f.write("\n")
diff --git a/cepact/output_producer/sink_source_pattern_helper.py b/cepact/output_producer/sink_source_pattern_helper.py
new file mode 100644
index 0000000..54abfc3
--- /dev/null
+++ b/cepact/output_producer/sink_source_pattern_helper.py
@@ -0,0 +1,362 @@
+""" Various functions to create the source, sink, pattern and helper queries for the siddhi app. """
+from datetime import datetime
+from typing import Dict, List, Tuple
+
+from ..conf import SiddhiConfig
+from ..representations import Activity, Discretization, Changes, AnnotationParams, Change
+
+
+def _map_sensor_name_iot_to_mqtt(sensor_name: str, sensor_name_mapping: Dict[str, str]) -> str:
+ """ Map the sensor name from iot to mqtt """
+ return sensor_name if sensor_name not in sensor_name_mapping else \
+ sensor_name_mapping[sensor_name]
+
+
+def _stringify_sensors_types(sensor_types: Dict[str, type],
+ sensor_name_mapping: Dict[str, str]) -> str:
+ """return (sensorname type, ....) string"""
+ namemap: Dict[type, str] = {int: 'int', float: 'float', str: 'string'}
+ return '(' + ', '.join([
+ f"{_map_sensor_name_iot_to_mqtt(sensor, sensor_name_mapping)} "
+ f"{namemap[sensor_types[sensor]]}"
+ for sensor in sensor_types]) + ')'
+
+
+def define_source(station: str,
+ activityname: str,
+ sensor_types: Dict[str, type],
+ sensor_discr_types: Dict[str, type],
+ siddhi_config: SiddhiConfig) -> str:
+ """ Define the source for the siddhi app """
+ map_anno = ''
+ if len(sensor_types) == 0:
+ map_anno += "@map(type = 'json')"
+ else:
+ map_anno += "@map(type = 'json', @attributes("
+ for idx, sensor in enumerate(sensor_types):
+ map_anno += f"{sensor if sensor not in siddhi_config.map_sensor_name_data_to_mqtt
+ else siddhi_config.map_sensor_name_data_to_mqtt[sensor]} = '$.{sensor}'"
+ # if not last sensor, add comma
+ if idx != len(sensor_types) - 1:
+ map_anno += ", "
+ map_anno += "))"
+ source_anno = (f"@source(type = 'mqtt', url = '{siddhi_config.mqtt_url}',"
+ f" client.id = 'mqtt.{station}.{activityname}', "
+ f"topic = '{siddhi_config.topic_prefix}/{station}', "
+ f"username = '{siddhi_config.mqtt_user}', "
+ f"password = '{siddhi_config.mqtt_pwd}',\n"
+ f"{map_anno})")
+ source_stream = f"{source_anno}\ndefine stream {station}Stream{_stringify_sensors_types(
+ sensor_types,
+ siddhi_config.map_sensor_name_data_to_mqtt)};"
+ # create a stream that maps the source to the discretized version
+ source_stream += f"\n\ndefine stream {station}StreamDisc{_stringify_sensors_types(
+ sensor_discr_types,
+ siddhi_config.map_sensor_name_data_to_mqtt)};"
+ return source_stream
+
+
+def define_discretization_query(station: str,
+ discretization: Discretization,
+ sensor_discr_types: Dict[str, type],
+ siddhi_config: SiddhiConfig) -> str:
+ """ Define the discretization query for the siddhi app """
+ discretization_query = ""
+ discretization_query += (f"@info(name = '{station}DiscSourceMapper')\n"
+ f"from {station}Stream\n"
+ "select ")
+ for sensor in sensor_discr_types:
+ sensor = sensor if sensor not in siddhi_config.map_sensor_name_data_to_mqtt else \
+ siddhi_config.map_sensor_name_data_to_mqtt[sensor]
+ if not discretization.is_discretized(sensor):
+ discretization_query += f"{sensor} as {sensor}, "
+ else:
+ sensor_mapping = discretization.get_mapping_for_sensor(sensor)
+ # order by the first element of the tuple
+ ordered_mapping = dict(sorted(sensor_mapping.items(), key=lambda item: item[0]))
+ for key, value in ordered_mapping.items():
+ if key[0][0] == float("-inf"):
+ discretization_query += f"ifThenElse({sensor} {
+ '<=' if key[1][1] == 'incl' else '<'} {key[0][1]
+ }, {
+ "'" + value + "'" if isinstance(value, str) else value
+ }, "
+ elif key[0][1] == float("inf"):
+ discretization_query += f"ifThenElse({sensor} {
+ '>=' if key[1][0] == 'incl' else '>'
+ } {key[0][0]}, {
+ "'" + value + "'" if isinstance(value, str) else value
+ }, "
+ else:
+ discretization_query += f"ifThenElse({sensor} {
+ '>=' if key[1][0] == 'incl' else '>'
+ } {key[0][0]} and {sensor} {
+ '<=' if key[1][1] == 'incl' else '<'
+ } {key[0][1]}, {
+ "'" + value + "'" if isinstance(value, str) else value
+ }, "
+ discretization_query += "'ERROR'"
+ for _ in range(len(ordered_mapping)):
+ discretization_query += ")"
+ discretization_query += f" as {sensor}, "
+ discretization_query = discretization_query[:-2] + "\n"
+ discretization_query += f"insert into {station}StreamDisc;"
+ return discretization_query
+
+
+def define_sink(activity: Activity,
+ siddhi_config: SiddhiConfig,
+ base_source_case_topic: Tuple[str, str, str] = ('DefaultBase',
+ 'DefaultSource',
+ 'DefaultCase')) -> str:
+ """ Define the sink for the siddhi app """
+ act_params = activity.get_annotation_params()
+ activityname = act_params.activity_name
+ sink = (f"@sink(type = 'log', prefix = 'LowLevel Log', priority = 'INFO')\n"
+ f"@sink(type = 'mqtt', url = '{siddhi_config.mqtt_url}', "
+ f"client.id = 'mqtt.{act_params.stations_str}.{activityname}.ll', "
+ f"topic = 'ActivityEvents/LowLevel', username = '{siddhi_config.mqtt_user}', "
+ f"password = '{siddhi_config.mqtt_pwd}', "
+ f"@map(type = 'json'))\n"
+ f"define Stream DetectedLowLevelActivityEvents(event string, "
+ f"activity string, ts_first string, ts_second "
+ f"string, ll_pattern_num int);\n\n")
+
+ sink += (f"@sink(type = 'log', prefix = 'HighLevel Log', priority = 'INFO')\n"
+ f"@sink(type = 'mqtt', url = '{siddhi_config.mqtt_url}', "
+ f"client.id = 'mqtt.{act_params.stations_str}.{activityname}.hl', "
+ f"topic = 'ActivityEvents/HighLevel', username = '{siddhi_config.mqtt_user}', "
+ f"password = '{siddhi_config.mqtt_pwd}', "
+ f"@map(type = 'json'))\n"
+ f"define Stream DetectedHighLevelActivityEvents(event string, "
+ f"next_pattern string, activity string, "
+ f"ts_first string, ts_second string);\n\n")
+
+ mqtt_xes_topic = (f'{base_source_case_topic[0]}/'
+ f'{base_source_case_topic[1]}/'
+ f'{base_source_case_topic[2]}/'
+ f'{activityname}')
+
+ def mqtt_xes_sink(option: str) -> str:
+ """ Create the mqtt xes sink for the siddhi app """
+ if option not in ['start', 'complete']:
+ raise ValueError("Type must be either 'start' or 'complete'")
+ return (f"@sink(type = 'mqtt', url = '{siddhi_config.mqtt_url}', "
+ f"client.id = 'mqtt.{act_params.stations_str}.{activityname}.il.{option}', "
+ f"topic = '{mqtt_xes_topic}', username = '{siddhi_config.mqtt_user}', "
+ f"password = '{siddhi_config.mqtt_pwd}', "
+ '@map(type = \'json\', enclosing.element = \'$.event\', validate.json = \'true\', '
+ '@payload("""{"lifecycle:transition":"'
+ f'{option}'
+ '","time:timestamp":"{{'
+ f'{"ts_start" if option == "start" else "ts_end"}'
+ '}}", "detection:type": "{{detection_type}}"}""")))\n')
+
+ sink += (f"@sink(type = 'log', prefix = 'InstanceLevel Log', priority = 'INFO')\n"
+ f"{mqtt_xes_sink('start')}"
+ f"{mqtt_xes_sink('complete')}"
+ f"define Stream DetectedInstanceLevelActivities(activity string, "
+ f"detection_type string, "
+ f"ts_start string, "
+ f"ts_start_unix long, "
+ f"ts_end string, "
+ f"ts_end_unix long);")
+ return sink
+
+
+def create_high_to_low_helper() -> str:
+ """ Create the high to low helper query for the siddhi app """
+ htl_helper = ('@info(name="HighToLow-Helper")\n'
+ 'from every e1 = DetectedLowLevelActivityEvents, '
+ 'e2 = DetectedLowLevelActivityEvents['
+ 'e1.ll_pattern_num >= '
+ 'e2.ll_pattern_num]\n'
+ 'select "HighToLow" as event\n'
+ 'insert into HelperStream;')
+ return htl_helper
+
+
+def low_high_level_pattern_case_1(llchanges: List[Change],
+ activity_params: AnnotationParams,
+ counter: int,
+ siddhi_config: SiddhiConfig) -> str:
+ """ Create the low and high level pattern queries for the siddhi app at timestamps
+ where only one station is active """
+ query = (f'@info(name="Detect-LowLevel-Pattern-{counter}")\n'
+ f'from every '
+ f'e1 = {llchanges[0].station}StreamDisc, '
+ f'e2 = {llchanges[0].station}StreamDisc[')
+ for z, llchange in enumerate(llchanges):
+ sensorname = _map_sensor_name_iot_to_mqtt(llchange.sensor,
+ siddhi_config.map_sensor_name_data_to_mqtt)
+ query += (
+ f'(e1.{sensorname}=={("'" + llchange.prev_value + "'") if
+ isinstance(llchange.prev_value, str) else llchange.prev_value} '
+ f'and e2.{sensorname}=={("'" + llchange.value + "'")
+ if isinstance(llchange.value, str) else llchange.value})'
+ )
+ if z == (len(llchanges) - 1):
+ query += ']\n'
+ else:
+ query += ' and '
+ query += (
+ f'select "LowLevel-Pattern-{counter}" as event, "{activity_params.activity_name}" '
+ f'as activity, e1.timestamp as '
+ f'ts_first, e2.timestamp as ts_second, {counter} as ll_pattern_num\n')
+ query += "insert into DetectedLowLevelActivityEvents;\n"
+ return query
+
+
+def query_hlstream(activity_params: AnnotationParams,
+ counter: int,
+ is_last: bool) -> str:
+ """ Create the high level pattern queries for the siddhi app """
+ quer = f'@info(name="Detect-HighLevel-Pattern-{counter}")\n'
+ if counter > 1:
+ quer += (f'from every e1 = DetectedHighLevelActivityEvents[event == '
+ f'"HighLevel-Pattern-{counter - 1}"] '
+ f'-> not HelperStream[event == "HighToLow"] and '
+ f'e2 = DetectedLowLevelActivityEvents[event '
+ f'== "LowLevel-Pattern-{counter}" '
+ f'and time:timestampInMilliseconds(e1.ts_second, \'yyyy-MM-dd HH:mm:ss.SS\') '
+ f'<= time:timestampInMilliseconds(ts_second, \'yyyy-MM-dd HH:mm:ss.SS\')]\n')
+ quer += (
+ f'select "HighLevel-Pattern-{counter}" as event, '
+ f'"LowLevel-Pattern-{counter + 1}" as '
+ f'next_pattern, "{activity_params.activity_name}" '
+ f'as activity, e2.ts_first as ts_first, e2.ts_second as '
+ f'ts_second\n')
+ else:
+ quer += (f'from DetectedLowLevelActivityEvents[event '
+ f'== "LowLevel-Pattern-{counter}"]\n')
+ quer += (
+ f'select "HighLevel-Pattern-{counter}" as event, '
+ f'"LowLevel-Pattern-{counter + 1}" as '
+ f'next_pattern, "{activity_params.activity_name}" as activity, '
+ f'ts_first, ts_second\n')
+ quer += ("insert into DetectedHighLevelActivityEvents;")
+ if not is_last:
+ quer += "\n"
+ return quer
+
+
+def get_time_from_hz(sampling_freq: float) -> str:
+ """ Get the time in the Siddhi format from the frequency """
+ # time as datetime.timedelta
+ time = (1 / sampling_freq) / 3
+ # if more than one hour raise error
+ if time > 3600:
+ raise ValueError("Sampling frequency is too low.")
+ # return time as x minutes y seconds z milliseconds (only if not 0), using datetime features
+ if time >= 60:
+ return str(datetime.fromtimestamp(time).strftime("%M minutes %S seconds %f milliseconds"))
+ if time >= 1:
+ return str(datetime.fromtimestamp(time).strftime("%S seconds %f milliseconds"))
+ return str(datetime.fromtimestamp(time).strftime("%f milliseconds"))
+
+
+# pylint: disable=too-many-arguments
+def low_high_level_pattern_case_multi(timestamp: datetime,
+ changes: Changes,
+ activity_params: AnnotationParams,
+ counter: int,
+ sampling_freq: float,
+ siddhi_config: SiddhiConfig) -> str:
+ """ Create the low and high level pattern queries in case of multiple stations active """
+ # multiple stations active at the same time
+ res_at_ts = changes.get_stations_at_ts(timestamp)
+ query = ""
+ for station in res_at_ts:
+ llchanges = changes.get_changes_at_ts_station(timestamp, station)
+ if len(llchanges) == 0:
+ continue
+ query += f'@info(name="Detect-PartLowLevel-Pattern-{counter}-{station}")\n'
+ query += 'from every '
+ query += f'e1 = {station}StreamDisc, '
+ query += f'e2 = {station}StreamDisc['
+ for z, llchange in enumerate(llchanges):
+ sensorname = _map_sensor_name_iot_to_mqtt(
+ llchange.sensor,
+ siddhi_config.map_sensor_name_data_to_mqtt)
+ query += (
+ f'(e1.{sensorname} == {("'" + llchange.prev_value + "'")
+ if isinstance(llchange.prev_value, str) else llchange.prev_value} '
+ f'and e2.{sensorname} == {("'" + llchange.value + "'")
+ if isinstance(llchange.value, str) else llchange.value})')
+ if z == (len(llchanges) - 1):
+ query += ']\n'
+ else:
+ query += ' and '
+ query += (
+ f'select "PartLowLevel-Pattern-{counter}-{station}" as event, '
+ f'"{activity_params.activity_name}" as activity, e1.timestamp as '
+ f'ts_first, e2.timestamp as ts_second, {counter} as ll_pattern_num\n')
+ query += f"insert into PartLowLevelPattern{station}Events;"
+ query += "\n\n"
+ query += f'@info(name="Detect-LowLevel-Pattern-{counter}")\n'
+ query += 'from every ('
+
+ for station in res_at_ts:
+ query += (f'e{station} = PartLowLevelPattern{station}Events[ll_pattern_num '
+ f'== {counter}] and ')
+ query = query[:-5]
+ query += f') within {get_time_from_hz(sampling_freq)}\n'
+ # choose smallest start timestamp and largest end timestamp as
+ # overall start and end timestamp
+ query += (f'select "LowLevel-Pattern-{counter}" as event, '
+ f'"{activity_params.activity_name}" as activity, ')
+ if len(res_at_ts) > 2:
+ raise ValueError("More than two stations active at the same time is not supported (yet).")
+ query += (f"ifThenElse(time:timestampInMilliseconds(e{res_at_ts[0]}.ts_first, "
+ f"'yyyy-MM-dd HH:mm:ss.SS') "
+ f"<= time:timestampInMilliseconds(e{res_at_ts[1]}.ts_first, "
+ f"'yyyy-MM-dd HH:mm:ss.SS'), e{res_at_ts[0]}.ts_first, "
+ f"e{res_at_ts[1]}.ts_first) as ts_first, "
+ f"ifThenElse(time:timestampInMilliseconds(e{res_at_ts[0]}.ts_second, "
+ f"'yyyy-MM-dd HH:mm:ss.SS') > "
+ f"time:timestampInMilliseconds(e{res_at_ts[1]}.ts_second, "
+ f"'yyyy-MM-dd HH:mm:ss.SS'), e{res_at_ts[0]}.ts_second, "
+ f"e{res_at_ts[1]}.ts_second) as ts_second, ")
+ query += f'{counter} as ll_pattern_num\n'
+ query += "insert into DetectedLowLevelActivityEvents;\n"
+ return query
+
+
+def create_low_high_level_pattern_queries(changes: Changes,
+ activity_params: AnnotationParams,
+ sampling_freq: float,
+ siddhi_config: SiddhiConfig) -> List[str]:
+ """ Create the low and high level pattern queries for the siddhi app """
+ queries = []
+ counter = 1
+ for idx, timestamp in enumerate(changes.timestamps):
+ res_at_ts = changes.get_stations_at_ts(timestamp)
+ if len(res_at_ts) <= 0:
+ raise ValueError(
+ f"No resources found at timestamp {res_at_ts}. This is a bug. Please report it.")
+ if len(res_at_ts) == 1:
+ # only one station active at the time
+ llchanges = changes.get_changes_at_ts_station(timestamp, next(iter(res_at_ts)))
+ queries.append(low_high_level_pattern_case_1(llchanges,
+ activity_params,
+ counter,
+ siddhi_config))
+ else:
+ queries.append(low_high_level_pattern_case_multi(timestamp,
+ changes,
+ activity_params,
+ counter,
+ sampling_freq,
+ siddhi_config))
+
+ # High-Level Pattern queries
+ queries.append(query_hlstream(
+ activity_params,
+ counter,
+ idx == len(changes.timestamps) - 1)
+ )
+
+ if counter < len(changes):
+ counter += 1
+
+ return queries
diff --git a/cepact/representations/__init__.py b/cepact/representations/__init__.py
new file mode 100644
index 0000000..532ff2e
--- /dev/null
+++ b/cepact/representations/__init__.py
@@ -0,0 +1,9 @@
+""" This module contains the classes representing the activities. """
+from .activity import Activity
+from .annotation_params import AnnotationParams
+from .changes import Changes, Change
+from .discretization import Discretization, DiscretizationBuilder
+from .signature import Signature, SignatureItem, SignatureBuilder
+
+__all__ = ["Activity", "AnnotationParams", "Changes", "Discretization", "Signature",
+ "SignatureItem", "DiscretizationBuilder", "SignatureBuilder", "Change"]
diff --git a/cepact/representations/activity.py b/cepact/representations/activity.py
new file mode 100644
index 0000000..fa50cbb
--- /dev/null
+++ b/cepact/representations/activity.py
@@ -0,0 +1,37 @@
+""" Activity class definition """
+from typing import List
+
+from .annotation_params import AnnotationParams
+from .changes import Changes
+from .discretization import Discretization
+from .signature import Signature
+
+
+class Activity():
+ """ Activity class definition """
+
+ # pylint: disable=too-many-arguments
+ def __init__(self,
+ annotation_params: AnnotationParams,
+ signatures: List[Signature],
+ sensors_to_ignore: List[str]):
+ """ Initialize Activity object """
+ self._annotation_params = annotation_params
+ self._signature = signatures
+ self._sensors_to_ignore = sensors_to_ignore
+
+ def get_changes(self, discretization: Discretization) -> Changes:
+ """ Get changes """
+ return Changes(self._signature, discretization)
+
+ def get_annotation_params(self) -> AnnotationParams:
+ """ Get annotation parameters """
+ return self._annotation_params
+
+ def get_signature(self) -> List[Signature]:
+ """ Get signature """
+ return self._signature
+
+ def get_number_distinct_change_timestamps(self, discretization: Discretization) -> int:
+ """ Get number of distinct change timestamps """
+ return len(self.get_changes(discretization).timestamps)
diff --git a/cepact/representations/annotation_params.py b/cepact/representations/annotation_params.py
new file mode 100644
index 0000000..bce66a1
--- /dev/null
+++ b/cepact/representations/annotation_params.py
@@ -0,0 +1,26 @@
+""" This module contains the ActivityParams class. """
+from dataclasses import dataclass
+from datetime import datetime
+from functools import cached_property
+from typing import List
+
+
+@dataclass(frozen=True, kw_only=True)
+class AnnotationParams():
+ """ ActivityParams class definition
+
+ Attributes:
+ annotation_id: str: unique identifier for the annotation
+ (there might be more than one annotation for the same activity)
+ """
+ annotation_id: str
+ activity_name: str
+ start: datetime
+ end: datetime
+ stations: List[str]
+
+ @cached_property
+ def stations_str(self) -> str:
+ """ Get the stations as a string. """
+ self.stations.sort()
+ return "-".join(self.stations)
diff --git a/cepact/representations/changes.py b/cepact/representations/changes.py
new file mode 100644
index 0000000..36bcfac
--- /dev/null
+++ b/cepact/representations/changes.py
@@ -0,0 +1,151 @@
+""" Changes represent the changes in the signature, used later for detection. """
+import os.path
+from dataclasses import dataclass
+from datetime import datetime
+from functools import cached_property
+from typing import List, Any, Dict
+
+from .discretization import Discretization
+from .signature import Signature, SignatureItem
+
+
+@dataclass(kw_only=True, frozen=True)
+class Change:
+ """ Represents a change in a low-level pattern """
+ station: str
+ sensor: str
+ timestamp: datetime
+ prev_value: Any
+ value: Any
+
+
+class Changes():
+ """ Changes class definition """
+
+ def __init__(self, signatures: List[Signature], discretization: Discretization) -> None:
+ self._signature_analyzed = False
+ self._signatures = signatures
+ self._changes: List[Change] = []
+ self._analyze_signatures(discretization)
+
+ def __len__(self) -> int:
+ return len(self._changes)
+
+ @cached_property
+ def timestamps(self) -> List[datetime]:
+ """ Get all distinct timestamps """
+ return sorted({change.timestamp for change in self._changes})
+
+ def _add_change(self, change: Change) -> None:
+ self._changes.append(change)
+
+ @cached_property
+ def changes(self) -> List[Change]:
+ """ Get all changes, sorted by timestamp """
+ self._changes.sort(key=lambda x: x.timestamp)
+ return self._changes
+
+ def get_stations_at_ts(self, timestamp: datetime) -> List[str]:
+ """ Get all stations for a specific timestamp, sorted by station """
+ station_list = list({change.station for change
+ in self._changes if change.timestamp == timestamp})
+ station_list.sort()
+ return station_list
+
+ def get_changes_at_ts_station(self, timestamp: datetime, station: str) -> List[Change]:
+ """ Get all changes for a specific timestamp and station, sorted by sensor """
+ chs = [change for change in self._changes if
+ change.station == station and change.timestamp == timestamp]
+ chs.sort(key=lambda x: x.sensor)
+ return chs
+
+ def get_changes_at_ts(self, timestamp: datetime) -> List[Change]:
+ """ Get all changes for a specific ts, sorted by station and sensor """
+ chs = [change for change in self._changes if change.timestamp == timestamp]
+ chs.sort(key=lambda x: (x.station, x.sensor))
+ return chs
+
+ def create_changes_file(self, path: str, activity_name: str) -> None:
+ """ Create a file with the changes.
+ JSONL, each line is a JSON object with the following fields:
+ - timestamp: timestamp of the change
+ - changes: list of changes, all that happened at the same time
+ The changes each have the fields:
+ - station: station of the change
+ - sensor: sensor of the change
+ - prev_value: previous value of the sensor
+ - value: new value of the sensor
+ """
+ filename = activity_name.replace(" ", "") + "_changes.jsonl"
+ if not os.path.exists(os.path.join(path, "changes")):
+ os.makedirs(os.path.join(path, "changes"))
+ with open(os.path.join(path, "changes", filename), "w", encoding="utf-8") as file:
+ for timestamp in self.timestamps:
+ relevant_changes = [change for change in self._changes
+ if change.timestamp == timestamp]
+ file.write(f'{{"timestamp": "{
+ timestamp.strftime("%Y-%m-%d %H:%M:%S.%f")[:-4]
+ }", "changes": [')
+ for i, change in enumerate(relevant_changes):
+ file.write(f'{{"station": "{change.station}", "sensor": "{change.sensor}", '
+ f'"prev_value": {
+ change.prev_value if (isinstance(change.prev_value, (float, int)))
+ else f'"{change.prev_value}"'
+ }, '
+ f'"value": '
+ f'{change.value if (isinstance(change.value, (float, int)))
+ else f'"{change.value}"'}}}')
+ if i != len(relevant_changes) - 1:
+ file.write(", ")
+ file.write("]}\n")
+
+ def _analyze_signatures(self, discretization: Discretization) -> None:
+ """ Analyze the signature for changes """
+ if len(self._signatures) != 1:
+ raise ValueError("Currently only one annotation/signature is supported per activity")
+ if self._signature_analyzed:
+ raise ValueError("Signature already analyzed")
+ self._signature_analyzed = True
+ sig = self._signatures[0]
+ sig_dict = sig.get_sigs_by_ts_station()
+ timestamps = list(sig_dict.keys())
+ prev_entries_stat_sens: Dict[str, Dict[str, List[SignatureItem]]] = {"": {}}
+ timestamps.sort()
+ for ts in timestamps:
+ res: str
+ current_list_sigs: List[SignatureItem]
+ for res, current_list_sigs in sig_dict[ts].items():
+ if res not in prev_entries_stat_sens:
+ prev_entries_stat_sens[res] = {}
+ sig_item: SignatureItem
+ for sig_item in current_list_sigs:
+ if sig_item.sensor not in prev_entries_stat_sens[res]:
+ prev_entries_stat_sens[res][sig_item.sensor] = [sig_item]
+ continue
+ prev = prev_entries_stat_sens[res][sig_item.sensor][-1] if len(
+ prev_entries_stat_sens[res][sig_item.sensor]) > 0 else None
+ if prev is None:
+ raise ValueError("Previous entry not found")
+ if (sig_item.value != prev.value
+ and not discretization.is_discretized(sig_item.sensor)):
+ self._add_change(Change(station=res,
+ sensor=sig_item.sensor,
+ timestamp=sig_item.timestamp,
+ prev_value=prev.value,
+ value=sig_item.value))
+ if (sig_item.value != prev.value and sig_item.sensor
+ and discretization.is_discretized(sig_item.sensor)
+ and (discretization.discretize(sig_item.sensor, prev.value)
+ != discretization.discretize(sig_item.sensor, sig_item.value))):
+ # the last part above checks if the change is
+ # from one discretization to another
+ self._add_change(Change(station=res,
+ sensor=sig_item.sensor,
+ timestamp=sig_item.timestamp,
+ prev_value=discretization.discretize(
+ sig_item.sensor,
+ prev.value),
+ value=discretization.discretize(
+ sig_item.sensor,
+ sig_item.value)))
+ prev_entries_stat_sens[res][sig_item.sensor].append(sig_item)
diff --git a/cepact/representations/discretization.py b/cepact/representations/discretization.py
new file mode 100644
index 0000000..45e8ef7
--- /dev/null
+++ b/cepact/representations/discretization.py
@@ -0,0 +1,129 @@
+""" Class representing the mapping from continuous to discrete values. """
+from typing import Union, Dict, Tuple, Any
+
+
+def _discretize(sensor: str, value: Any, discretization_map: Dict[str, \
+ Dict[Tuple[Tuple[float, float], Tuple[str, str]], Any]]) -> Any:
+ """ Return discretized value if in some range. If not, return None."""
+ if sensor in discretization_map:
+ for interval, discretization in discretization_map[sensor].items():
+ if interval[1][0] == "incl" and interval[1][1] == "incl":
+ if interval[0][0] <= value <= interval[0][1]:
+ return discretization
+ elif interval[1][0] == "incl" and interval[1][1] == "excl":
+ if interval[0][0] <= value < interval[0][1]:
+ return discretization
+ elif interval[1][0] == "excl" and interval[1][1] == "incl":
+ if interval[0][0] < value <= interval[0][1]:
+ return discretization
+ elif interval[1][0] == "excl" and interval[1][1] == "excl":
+ if interval[0][0] < value < interval[0][1]:
+ return discretization
+ return None
+
+
+class Discretization():
+ """ Class representing the mapping from continuous to discrete values. """
+
+ def __init__(self, discretization_map: Dict[str, \
+ Dict[Tuple[Tuple[float, float], Tuple[str, str]], Any]]) -> None:
+ self._discretization_map: Dict[str, \
+ Dict[Tuple[Tuple[float, float], Tuple[str, str]], Any]] = discretization_map
+
+ def discretize(self, sensor: str, value: Any) -> Any:
+ """ Return discretized value if in some range. If not, return None."""
+ return _discretize(sensor, value, self._discretization_map)
+
+ def discretized_type(self, sensor: str) -> type:
+ """ Return the type of the discretized values for a sensor. """
+ if sensor in self._discretization_map:
+ sensor_map = self._discretization_map[sensor]
+ if all(isinstance(key, str) for key in sensor_map.values()):
+ return str
+ if all(isinstance(key, int) for key in sensor_map.values()):
+ return int
+ if all(isinstance(key, float) for key in sensor_map.values()):
+ return float
+ if all(isinstance(key, bool) for key in sensor_map.values()):
+ return bool
+ raise ValueError("Discretization map values must be of the same type")
+ raise ValueError(f"Sensor {sensor} not in sensor discretization map")
+
+ def is_discretized(self, sensor: str) -> bool:
+ """ Check if the sensor is discretized. """
+ return sensor in self._discretization_map
+
+ def get_mapping_for_sensor(self, sensor: str) -> Dict[
+ Tuple[Tuple[float, float], Tuple[str, str]], Any]:
+ """ Get the mapping for a sensor. """
+ return self._discretization_map[sensor]
+
+
+class DiscretizationBuilder():
+ """ Class for building immutable discretization object. """
+
+ def __init__(self) -> None:
+ self._discretization_map: Dict[str, \
+ Dict[Tuple[Tuple[float, float], Tuple[str, str]], Any]] = {}
+
+ # pylint: disable=too-many-arguments
+ def _check_overlapping_mapping_range(self,
+ sensor: str,
+ l_bound: float,
+ u_bound: float,
+ l_bound_type: str,
+ u_bound_type: str) -> None:
+ """ Check if the mapping range overlaps with an existing one.
+
+ In which case, raise an error (since not permissible). """
+ if _discretize(sensor, l_bound, self._discretization_map) is not None:
+ if l_bound_type == "incl":
+ raise ValueError(f"Sensor {sensor} already has a mapping for {l_bound}")
+ for interval, _ in self._discretization_map[sensor].items():
+ if interval[0][1] == l_bound:
+ return
+ raise ValueError(f"Sensor {sensor} already has a mapping for {l_bound}")
+ if _discretize(sensor, u_bound, self._discretization_map) is not None:
+ if u_bound_type == "incl":
+ raise ValueError(f"Sensor {sensor} already has a mapping for {u_bound}")
+ for interval, _ in self._discretization_map[sensor].items():
+ if interval[0][0] == u_bound:
+ return
+ raise ValueError(f"Sensor {sensor} already has a mapping for {u_bound}")
+
+ # pylint: disable=too-many-arguments
+ def add_discretization_item(self, sensor: str,
+ beg: float, to: float,
+ beg_incl: bool, to_incl: bool,
+ target_value: Union[str, int, float, bool]) -> None:
+ """ Add an item to the discretization mapping. """
+ self._check_overlapping_mapping_range(sensor, beg, to, "incl" if beg_incl else "excl",
+ "incl" if to_incl else "excl")
+ if sensor not in self._discretization_map:
+ self._discretization_map[sensor] = {}
+ beg_incl_str = "incl" if beg_incl else "excl"
+ to_incl_str = "incl" if to_incl else "excl"
+ self._discretization_map[sensor][(beg, to), (beg_incl_str, to_incl_str)] = target_value
+
+ def _check_overall_discretization_validity(self) -> bool:
+ """ Check if the discretization is valid. """
+ for sensor, curr_discr in self._discretization_map.items():
+ if float("-inf") not in [key[0][0] for key in curr_discr.keys()]:
+ raise ValueError(f"Sensor {sensor} must have a mapping for the whole range.")
+ if float("inf") not in [key[0][1] for key in curr_discr.keys()]:
+ raise ValueError(f"Sensor {sensor} must have a mapping for the whole range.")
+ # sort by the first element of the tuple
+ ordered_mapping = dict(
+ sorted(curr_discr.items(), key=lambda item: item[0]))
+ # make sure that the previous upper bound is equal to the next lower bound
+ previous_upper_bound = float("-inf")
+ for key in ordered_mapping.keys():
+ if key[0][0] != previous_upper_bound:
+ raise ValueError(f"Undefined source range in sensor {sensor} mapping.")
+ previous_upper_bound = key[0][1]
+ return True
+
+ def build(self) -> Discretization:
+ """ Mark the discretization as complete (and then immutable), checking for validity. """
+ self._check_overall_discretization_validity()
+ return Discretization(self._discretization_map.copy())
diff --git a/cepact/representations/signature.py b/cepact/representations/signature.py
new file mode 100644
index 0000000..81c676f
--- /dev/null
+++ b/cepact/representations/signature.py
@@ -0,0 +1,306 @@
+""" Relevant sensor values in annotated data. """
+import json
+import os
+from dataclasses import dataclass
+from datetime import datetime
+from functools import cached_property
+from typing import Any, List, Dict, Union, Set
+
+from .discretization import Discretization
+
+
+@dataclass(frozen=True, kw_only=True)
+class SignatureItem:
+ """ Represents an item of an annotation signature """
+ station: str
+ timestamp: datetime
+ sensor: str
+ value: Any
+
+
+class Signature():
+ """ Represents the signature of an annotation. """
+
+ def __init__(self,
+ activity_name: str,
+ annotation_id: str,
+ signature: List[SignatureItem],
+ sensors_types_per_station: Dict[str, Dict[str, type]]):
+ self._signature: List[SignatureItem] = signature
+ self.activity_name = activity_name
+ self.annotation_id = annotation_id
+ self._sensors_types_per_station: Dict[str, Dict[str, type]] = sensors_types_per_station
+
+ def __len__(self) -> int:
+ return len(self._signature)
+
+ @cached_property
+ def timestamps(self) -> List[datetime]:
+ """ Get all timestamps """
+ return sorted({sig.timestamp for sig in self._signature})
+
+ def get_sensors_with_types_per_station(self) -> Dict[str, Dict[str, type]]:
+ """ Get sensor types per station """
+ return self._sensors_types_per_station
+
+ def get_sensors_with_discretized_types_per_station(self, discretization: Discretization) -> \
+ Dict[str, Dict[str, type]]:
+ """ Get sensor types per station """
+ sensors_with_discretized_types_per_station: Dict[str, Dict[str, type]] = {}
+ for station, sensors_with_types in self._sensors_types_per_station.items():
+ sensors_with_discretized_types_per_station[station] = {}
+ for sensor, sensor_type in sensors_with_types.items():
+ if discretization.is_discretized(sensor):
+ sensors_with_discretized_types_per_station[station][
+ sensor] = discretization.discretized_type(sensor)
+ else:
+ sensors_with_discretized_types_per_station[station][sensor] = sensor_type
+ return sensors_with_discretized_types_per_station
+
+ def get_signature_items(self) -> List[SignatureItem]:
+ """ Get all signature items, sorted by timestamp """
+ return sorted(self._signature, key=lambda x: x.timestamp)
+
+ def get_sigs_at_ts(self, timestamp: datetime) -> List[SignatureItem]:
+ """ Get all signature items at timestamp """
+ return [sig for sig in self._signature if sig.timestamp == timestamp]
+
+ def get_sigs_at_ts_station(self, timestamp: datetime, station: str) -> List[SignatureItem]:
+ """ Get all signature items at timestamp and station """
+ return [sig for sig in self._signature
+ if sig.timestamp == timestamp and sig.station == station]
+
+ def get_sigs_by_ts_station(self) -> Dict[datetime, Dict[str, List[SignatureItem]]]:
+ """
+ Get all signature items (sensor readings) by timestamp, separated by station.
+ :param signature:
+ :return:
+ """
+ sigs_by_ts: Dict[datetime, Dict[str, List[SignatureItem]]] = {}
+ for sig_item in self._signature:
+ if sig_item.timestamp not in sigs_by_ts:
+ sigs_by_ts[sig_item.timestamp] = {}
+ if sig_item.station not in sigs_by_ts[sig_item.timestamp].keys():
+ sigs_by_ts[sig_item.timestamp][sig_item.station] = []
+ sigs_by_ts[sig_item.timestamp][sig_item.station].append(sig_item)
+ return sigs_by_ts
+
+ @cached_property
+ def stations(self) -> List[str]:
+ """ Get all stations """
+ stations = []
+ for sig_item in self._signature:
+ if sig_item.station not in stations:
+ stations.append(sig_item.station)
+ stations.sort()
+ return stations
+
+ def create_signature_file(self,
+ path: str) -> None:
+ """
+ Create a signature file for the annotation.
+ :param path: Path to the directory where the signature file is to be created.
+ """
+ # empty the destination file
+ filename = (self.activity_name.replace(" ", "") + "_"
+ + self.annotation_id.replace(" ", "") + "_signature.jsonl")
+ sigs_by_ts_res = self.get_sigs_by_ts_station()
+ sen_dict_keys_prior: Dict[str, List[str]] = {}
+ ts: datetime
+ stations: Dict[str, List[SignatureItem]]
+ for ts, stations in sigs_by_ts_res.items():
+ # turn timestamp to string with format "2023-02-06 14:00:05.04", only two decimals
+ ts_dict: Dict[str, Union[datetime, str, List[Dict[str, Any]]]] = {
+ "timestamp": ts.strftime("%Y-%m-%d %H:%M:%S.%f")[:-4],
+ "measurements": []
+ }
+ station: str
+ signatures: List[SignatureItem]
+ for station, signatures in stations.items():
+ sen_dict = {}
+ sig: SignatureItem # annotating the type of sig
+ for sig in signatures:
+ sen_dict[sig.sensor] = sig.value
+ if sig.station not in sen_dict:
+ sen_dict_keys_prior[sig.station] = list(sen_dict.keys())
+ if sen_dict_keys_prior[sig.station] != list(sen_dict.keys()):
+ raise ValueError(f"Sensor values for {sig.station} are not consistent")
+ sen_dict_keys_prior[sig.station] = list(sen_dict.keys())
+ s = {
+ "station": station,
+ **sen_dict
+ }
+ if isinstance(ts_dict["measurements"], list):
+ ts_dict["measurements"].append(s)
+ else:
+ raise ValueError("Measurements must be a list")
+ # create directory if not exists
+ if not os.path.exists(os.path.join(path, "signatures")):
+ os.makedirs(os.path.join(path, "signatures"))
+ with open(os.path.join(path, "signatures", filename), 'a',
+ encoding="utf-8") as outfile:
+ json.dump(ts_dict, outfile)
+ outfile.write('\n')
+
+ def get_exemplary_datapoints_per_resource(self) -> Dict[str, Dict[str, Any]]:
+ """ Get exemplary data points per station. """
+ data_points: Dict[str, Dict[str, Any]] = {}
+ sen_dict_keys_prior: Dict[str, List[str]] = {}
+ sigs_by_ts_res = self.get_sigs_by_ts_station()
+ ts: datetime
+ stations: Dict[str, List[SignatureItem]]
+ for ts, stations in sigs_by_ts_res.items():
+ station: str
+ signatures: List[SignatureItem]
+ for station, signatures in stations.items():
+ sen_dict = {}
+ sig: SignatureItem # annotating the type of sig
+ for sig in signatures:
+ sen_dict[sig.sensor] = sig.value
+ if sig.station not in sen_dict:
+ sen_dict_keys_prior[sig.station] = list(sen_dict.keys())
+ if sen_dict_keys_prior[sig.station] != list(sen_dict.keys()):
+ raise ValueError(f"Sensor values for {sig.station} are not consistent")
+ sen_dict_keys_prior[sig.station] = list(sen_dict.keys())
+ s = {
+ "station": station,
+ **sen_dict
+ }
+ if station not in data_points:
+ data_points[station] = {
+ "timestamp": ts,
+ **s
+ }
+ return data_points
+
+
+class SignatureBuilder():
+ """ Builder for signature of an annotation. """
+
+ def __init__(self, activity_name: str, annotation_id: str, sampling_freq: float) -> None:
+ self._signature: List[SignatureItem] = []
+ self.activity_name = activity_name
+ self.annotation_id = annotation_id
+ self._sampling_freq = sampling_freq
+ self._sensors_types_per_station: Dict[str, Dict[str, type]] = {}
+
+ def __len__(self) -> int:
+ return len(self._signature)
+
+ def add_signature_item(self, sig_item: SignatureItem) -> None:
+ """ Add a signature item to the signature.
+
+ Raises: ValueError if sensor value type is not consistent with
+ previously added signature items."""
+ self._signature.append(sig_item)
+ if sig_item.station not in self._sensors_types_per_station:
+ self._sensors_types_per_station[sig_item.station] = {
+ "timestamp": str
+ }
+ if sig_item.sensor not in self._sensors_types_per_station[sig_item.station]:
+ self._sensors_types_per_station[sig_item.station][sig_item.sensor] = type(
+ sig_item.value)
+ if not isinstance(sig_item.value,
+ self._sensors_types_per_station[sig_item.station][sig_item.sensor]):
+ raise ValueError(
+ f"Sensor value type for sensor {sig_item.sensor} at "
+ f"station {sig_item.station} is not consistent.")
+ self._signature.sort(key=lambda x: x.timestamp)
+
+ def _check_if_stations_have_consistent_sensors(self) -> None:
+ """ Check if all stations have the same sensors at all timestamps they are present.
+
+ Note that consistent sensor types are already validated during adding signature items.
+ Raises: ValueError if sensors are not consistent."""
+ station_sensors: Dict[str, Set[str]] = {}
+ timestamps = {sig.timestamp for sig in self._signature}
+ for timestamp in timestamps:
+ stations = {sig.station for sig in self._signature if sig.timestamp == timestamp}
+ for station in stations:
+ sensors_at_station_timestamp = {sig.sensor for sig in self._signature if
+ sig.station == station
+ and sig.timestamp == timestamp}
+ if station not in station_sensors:
+ station_sensors[station] = sensors_at_station_timestamp
+ continue
+ if station_sensors[station] != sensors_at_station_timestamp:
+ raise ValueError(
+ f"Stations do not have the same sensors at timestamp {timestamp}")
+
+ def _get_all_ts_wo_station(self) -> Dict[str, List[datetime]]:
+ """ Get all timestamps without those only associated with a station. """
+ all_timestamps_without_station: Dict[str, List[datetime]] = {}
+ # create empty lists for all stations
+ for sig in self._signature:
+ if sig.station not in all_timestamps_without_station:
+ all_timestamps_without_station[sig.station] = []
+ # add timestamps to lists
+ for sig in self._signature:
+ for station, ts_wo_curr_st in all_timestamps_without_station.items():
+ if sig.station != station:
+ ts_wo_curr_st.append(sig.timestamp)
+ for station, timestamps in all_timestamps_without_station.items():
+ all_timestamps_without_station[station] = sorted(timestamps)
+ return all_timestamps_without_station
+
+ def _get_all_ts_for_station(self) -> Dict[str, List[datetime]]:
+ all_timestamps_for_station: Dict[str, List[datetime]] = {}
+ for sig in self._signature:
+ if sig.station not in all_timestamps_for_station:
+ all_timestamps_for_station[sig.station] = []
+ all_timestamps_for_station[sig.station].append(sig.timestamp)
+ return all_timestamps_for_station
+
+ def _combine_close_timestamps(self) -> None:
+ """ Combines close timestamps to one timestamp, based on the sampling frequency. """
+ # only if stations are different,
+ # we can combine timestamps (otherwise we might "erase" changes)
+ # get all timestamps, ascending; create mapping to new timestamps
+ all_timestamps_without_station: Dict[str, List[datetime]] = self._get_all_ts_wo_station()
+ all_timestamps_for_station: Dict[str, List[datetime]] = self._get_all_ts_for_station()
+ new_timestamps_per_station: Dict[str, Dict[datetime, datetime]] = {}
+ # for each timestamp, if distance to previous timestamp in other stations
+ # is less than half the sampling frequency, combine them (make the current timestamp the
+ # same as the previous one
+ for station, timestamps in all_timestamps_without_station.items():
+ new_timestamps_per_station[station] = {}
+ curr_idx = 0
+ for i, ts in enumerate(all_timestamps_for_station[station]):
+ if i == 0 or len(timestamps) == 0:
+ new_timestamps_per_station[station][ts] = ts
+ continue
+ while (ts - timestamps[curr_idx]).total_seconds() > (1 / self._sampling_freq) / 2:
+ if curr_idx < len(timestamps) - 1:
+ curr_idx += 1
+ else:
+ break
+ if (0 <= (ts - timestamps[curr_idx]).total_seconds()
+ <= (1 / self._sampling_freq) / 3):
+ new_timestamps_per_station[station][ts] = timestamps[curr_idx]
+ else:
+ new_timestamps_per_station[station][ts] = ts
+
+ # remap the timestamps in the signature items (we need to create new signature items)
+ new_signature = []
+ for sig in self._signature:
+ new_signature.append(SignatureItem(
+ station=sig.station,
+ timestamp=new_timestamps_per_station[sig.station][sig.timestamp],
+ sensor=sig.sensor,
+ value=sig.value
+ ))
+ self._signature = new_signature
+
+ def build(self) -> Signature:
+ """ Complete the signature. """
+ self._combine_close_timestamps()
+ self._check_if_stations_have_consistent_sensors()
+ sensor_types_per_station = self._sensors_types_per_station.copy()
+ for station, sensors in sensor_types_per_station.items():
+ # sort by sensor name
+ # add timestamp as first element
+ sensor_types_per_station[station] = {'timestamp': str} | dict(sorted(sensors.items()))
+ return Signature(activity_name=self.activity_name,
+ annotation_id=self.annotation_id,
+ signature=self._signature.copy(),
+ sensors_types_per_station=sensor_types_per_station.copy())
diff --git a/code-check.sh b/code-check.sh
new file mode 100755
index 0000000..0561c5c
--- /dev/null
+++ b/code-check.sh
@@ -0,0 +1,6 @@
+pylint cepact --disable=too-few-public-methods
+mypy cepact --strict
+# Test and coverage
+export PYTHONPATH=.
+coverage run --source=cepact --branch -m pytest
+coverage report -m
diff --git a/misc/DetAppGenerationUML.puml b/misc/DetAppGenerationUML.puml
new file mode 100644
index 0000000..81f7cb3
--- /dev/null
+++ b/misc/DetAppGenerationUML.puml
@@ -0,0 +1,141 @@
+@startuml
+
++class DAGConfig <> {
+ + ActiveFeatures active_features
+ + SourceDestConfig source_dest_conf
+ + SiddhiConfig siddhi_config
+ + str annotation_param_fetcher
+ + str signature_fetcher
+ + str ignore_sensor_fetcher
+ + str discretization_fetcher
+}
+
+class DetAppGenerator <> {
+ DetAppGenerator(DAGConfig conf)
+ +run()
+}
+
+Activity "produces" <.. InputProcessor
+Discretization "produces" <.. InputProcessor
+Activity "used by" ..> OutputProducer
+DetAppGenerator ..> DAGConfig
+
+class InputProcessor <> {
++InputProcessor(DAGConfig dag_conf)
++List[Activity] get_activities()
++Discretization get_discretization()
+}
+
+class Discretization <> {
++Discretization()
++any discretize(str sensor, any value)
++type discretized_type(str sensor)
++none add_discretization_item(str sensor, float beg,
+float to, bool beg_incl, bool to_incl, any target_value)
+}
+
+
+class OutputProducer <> {
+ +OutputProducer(Discretization, DAGConfig)
+ +writeSignature(Activity)
+ +writeApp(Activity)
+ +writeChanges(Activity)
+}
+
+class Activity <> {
++Actvity(AnnotionParams, Signature, Dict sensors_to_ignore)
+}
+
+DetAppGenerator --> InputProcessor : delegates
+DetAppGenerator *--"many" Activity
+DetAppGenerator --> OutputProducer : delegates
+
+
+InputProcessor --> SignatureFetcher : delegates
+InputProcessor --> DiscretizationFetcher : delegates
+InputProcessor --> AnnotationParamFetcher : delegates
+InputProcessor --> IgnoreSensorFetcher : delegates
+
+abstract class AnnotationParamFetcher {
+ + AnnotationParamFetcher(SourceDestConfig)
+ + List[AnnotationParams] get_activity_params()
+}
+
+abstract class IgnoreSensorFetcher {
+ + AnnotationParamFetcher(SourceDestConfig)
+ + Dict get_ignore_sensors()
+}
+
+abstract class DiscretizationFetcher {
+ + DiscretizationFetcher(SourceDestConfig)
+ + Discretization get_discretization()
+}
+abstract class SignatureFetcher {
+ +TSDataFetcher(DAGConfig)
+ + Signature getSignature(AnnotationParams ann_param, Dict ignoresensors)
+}
+
+class Signature <> {
++Signature(str activity_name, str annotation_id)
++Dict get_sigs_by_ts_res()
++None add_signature_item(SignatureItem sig_item)
++None create_signature_file()
++Dict get_exemplary_datapoints_per_resource()
+}
+
+class Changes {
++Changes(List[Signature], Discretization)
++List[datetime] timestamps
++List[Change] get_changes()
++List[str] get_stations_at_ts(str)
++List[Change] get_changes_by_ts_station(datetime, str)
++int get_ts_counter(datetime)
+}
+
+Activity *-- AnnotationParams
+DetAppGenerator *-- "one" Discretization
+Activity *-- "one or many" Signature
+Activity *-- "one" Changes
+Signature <-- Changes : "depends on"
+
+class AnnotationParams {
+ str name
+ List[str]str stations
+ str start
+ str end
+ str grafana_dashboard_url
+ str annotation_id
+}
+
+class GrafanaFetcher implements AnnotationParamFetcher
+class GrafanaFetcher implements IgnoreSensorFetcher
+class LocalDiscretizaionFetcher implements DiscretizationFetcher
+class InfluxFetcher implements SignatureFetcher
+class LocalAnnotationParamFetcher implements AnnotationParamFetcher
+class LocalIgnoreSensorFetcher implements IgnoreSensorFetcher
+class LocalSignatureFetcher implements SignatureFetcher
+
+
+OutputProducer --> SiddhiWriter : delegates
+
+class SiddhiWriter{
+ + writeSiddhiApp()
+ + SiddhiWriter(List[IntanceLevelDetQuery], Activity, Discretization, DAGConfig)
+}
+
+
+
+SiddhiWriter -- IntanceLevelDetQuery
+
+abstract class IntanceLevelDetQuery <> {
+ + generate(int num_changes, str act_name)
+}
+
+class All50HLDetQuery extends IntanceLevelDetQuery
+class First50HLDetQuery extends IntanceLevelDetQuery
+class FirstLastLLDetQuery extends IntanceLevelDetQuery
+class Any25LLDetQuery extends IntanceLevelDetQuery
+class Any50LLDetQuery extends IntanceLevelDetQuery
+class Any75LLDetQuery extends IntanceLevelDetQuery
+
+@enduml
\ No newline at end of file
diff --git a/misc/data_fetchers_class_diagram.puml b/misc/data_fetchers_class_diagram.puml
new file mode 100644
index 0000000..9262c35
--- /dev/null
+++ b/misc/data_fetchers_class_diagram.puml
@@ -0,0 +1,36 @@
+@startuml
+
+
+class InputProcessor <> {
+}
+abstract class AnnotationParamFetcher <> {
++ {abstract} get_annotation_params()\n\t-> List[AnnotationParams]
+}
+
+abstract class IgnoreSensorFetcher <> {
++ {abstract} get_ignore_sensors()\n\t-> Dict[str, List[str]]
+}
+
+abstract class DiscretizationFetcher <> {
++ {abstract} get_discretization() -> Discretization
+}
+
+abstract class SignatureFetcher <> {
++ {abstract} get_signature(\n\tannotation_params: AnnotationParams,\n\tignore_sensors: Dict[str, List[str]],\n\tsampling_freq: float\n) -> Signature
+}
+
+
+
+InputProcessor ..> AnnotationParamFetcher : delegates
+InputProcessor ..> IgnoreSensorFetcher : delegates
+InputProcessor ..> DiscretizationFetcher : delegates
+InputProcessor ..> SignatureFetcher : delegates
+
+IgnoreSensorFetcher <|-- LocalIgnoreSensorFetcher
+IgnoreSensorFetcher <|-- GrafanaFetcher
+AnnotationParamFetcher <|-- GrafanaFetcher
+SignatureFetcher <|-- InfluxFetcher
+SignatureFetcher <|-- LocalSignatureFetcher
+AnnotationParamFetcher <|-- LocalAnnotationParamFetcher
+DiscretizationFetcher <|-- LocalDiscretizationFetcher
+@enduml
\ No newline at end of file
diff --git a/misc/overview_class_diagram.puml b/misc/overview_class_diagram.puml
new file mode 100644
index 0000000..76dae39
--- /dev/null
+++ b/misc/overview_class_diagram.puml
@@ -0,0 +1,84 @@
+@startuml
+
+class DAGConfig <> {
+}
+
+class DetAppGenerator <> {
+}
+
+package "input_processor" {
+class InputProcessor <> {
+}
+abstract class AnnotationParamFetcher <> {
+}
+
+abstract class IgnoreSensorFetcher <> {
+}
+
+abstract class DiscretizationFetcher <> {
+}
+
+abstract class SignatureFetcher <> {
+}
+}
+
+package "representations" {
+class Discretization <> {
+}
+
+
+
+class Activity <> {
+}
+
+
+
+class AnnotationParams {
+}
+
+class Changes {
+}
+
+class Signature <> {
+}
+}
+
+package "output_producer" {
+
+class OutputProducer <> {
+}
+
+class SiddhiWriter {
+}
+
+abstract class InstanceLevelDetQuery <> {
+}
+}
+
+Activity "1" *-- "1" AnnotationParams
+Activity "1" *-- "1...*" Signature
+Activity "1" *-- "1" Changes
+Changes ..> Signature
+Changes ..> Discretization
+
+DetAppGenerator ..> InputProcessor : delegates
+DetAppGenerator ..> OutputProducer : delegates
+DetAppGenerator "1" o. "1" DAGConfig
+
+
+InputProcessor .> AnnotationParamFetcher : delegates
+InputProcessor ..> IgnoreSensorFetcher : delegates
+InputProcessor ..> DiscretizationFetcher : delegates
+InputProcessor ..> SignatureFetcher : delegates
+
+OutputProducer ..> SiddhiWriter : delegates
+
+SiddhiWriter ..> InstanceLevelDetQuery: delegates
+
+InputProcessor ...> Activity : produces
+InputProcessor ..> Discretization : produces
+
+OutputProducer ..> Activity : uses
+OutputProducer ..> Discretization : uses
+
+@enduml
diff --git a/misc/overview_sequence_diagram.puml b/misc/overview_sequence_diagram.puml
new file mode 100644
index 0000000..54becc0
--- /dev/null
+++ b/misc/overview_sequence_diagram.puml
@@ -0,0 +1,45 @@
+@startuml
+actor User
+
+User -> User: Create annotations,\nprepare IoT data
+
+User -> DetAppGenerator: Supply //DAGConf//,\nwith fetchers\nand detection instances
+activate DetAppGenerator
+
+box "Input Processing" #LightBlue
+DetAppGenerator -> InputProcessor: //Fetchers//
+activate InputProcessor
+InputProcessor -> "Data Fetchers"
+activate "Data Fetchers"
+"Data Fetchers" -> InputProcessor
+deactivate "Data Fetchers"
+InputProcessor -> DetAppGenerator: //Activities//,\n//Discretization//
+deactivate InputProcessor
+end box
+
+box "Output Generation" #LightGreen
+DetAppGenerator -> OutputProducer: //Activities//,\n//Discretization//,\n//Detection instances//
+deactivate DetAppGenerator
+activate OutputProducer
+OutputProducer -> Signature
+activate Signature
+Signature -> OutputProducer
+deactivate Signature
+OutputProducer -> Changes
+activate Changes
+Changes -> OutputProducer
+deactivate Changes
+OutputProducer -> SiddhiWriter
+activate SiddhiWriter
+SiddhiWriter -> InstanceLevelDetQueries
+activate InstanceLevelDetQueries
+InstanceLevelDetQueries -> SiddhiWriter
+deactivate InstanceLevelDetQueries
+SiddhiWriter -> OutputProducer
+deactivate SiddhiWriter
+OutputProducer -> User: Detection apps,\nsignature files,\nchanges files
+deactivate OutputProducer
+end box
+
+
+@enduml
diff --git a/misc/representations_class_diagram.puml b/misc/representations_class_diagram.puml
new file mode 100644
index 0000000..1641c84
--- /dev/null
+++ b/misc/representations_class_diagram.puml
@@ -0,0 +1,46 @@
+@startuml
+
+class Discretization <> {
+}
+
+class Activity {
++ Activity(\n\tannotation_params: AnnotationParams,\n\tsignatures: List[Signature],\n\tsensors_to_ignore: List[str]\n)
++ get_changes(discretization: Discretization)\n\t-> Changes
+}
+
+class AnnotationParams {
++ annotation_id: str
++ activity_name: str
++ start: datetime
++ end: datetime
++ stations: List[str]
+}
+
+class Changes {
++ Changes(\n\tsignatures: List[Signature],\n\tdiscretization: Discretization,\n\tsensors_to_ignore: List[str]\n)
+}
+
+class Signature <> {
+}
+
+class SignatureBuilder {
++ add_signature_item(\n\tit: SignatureItem\n)-> None
++ build() -> Signature
+}
+
+Signature .> SignatureBuilder
+
+class DiscretizationBuilder {
++ add_discretization_item(\n\tsensor: str,\n\tbeg: float,\n\tto: float,\n\tbeg_incl: bool,\n\tto_incl: bool,\n\ttarget_value:\n\t\tUnion[str, int, float, bool]\n) -> None
++ build() -> Discretization
+}
+
+Discretization .> DiscretizationBuilder
+
+Activity "1" *-- "1" AnnotationParams
+Activity "1" *-- "1...*" Signature
+Activity "1" *-- "1" Changes
+Changes ..> Signature
+Changes ..> Discretization
+
+@enduml
diff --git a/misc/seq_uml_simpl.png b/misc/seq_uml_simpl.png
new file mode 100644
index 0000000..df28c8a
Binary files /dev/null and b/misc/seq_uml_simpl.png differ
diff --git a/misc/uml_class.png b/misc/uml_class.png
new file mode 100644
index 0000000..5cd152a
Binary files /dev/null and b/misc/uml_class.png differ
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..638dd9c
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
diff --git a/requirements-dev.txt b/requirements-dev.txt
new file mode 100644
index 0000000..7c22abb
--- /dev/null
+++ b/requirements-dev.txt
@@ -0,0 +1,8 @@
+pytest~=7.4.3
+coverage~=7.6.4
+pylint~=3.0.3
+typing_extensions~=4.9.0
+mypy~=1.12.0
+types-requests~=2.32.0
+pandas-stubs~=2.2.3
+types-jsonschema~=4.23.0
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..1a54b34
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,4 @@
+requests~=2.31.0
+pandas~=2.2.3
+influxdb_client==1.47.0
+jsonschema~=4.23.0
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..d2e54d1
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,37 @@
+[metadata]
+name = cepact
+version = attr: cepact.__version__
+author = "Aaron Kurz, Ronny Seiger"
+author_email = "aaron.kurz@unisg.ch, ronny.seiger@unisg.ch"
+description = Create CEP activity detection services from expert annotations and IoT data.
+long_description = file: README.md, HISTORY.md
+keywords = activity detection, iot, pattern recognition, domain experts, smart factory
+license = GNU Affero General Public License v3 (AGPLv3)
+url = https://github.com/ics-unisg/activity-detection-services-generator
+project_urls =
+ Bug Tracker = https://github.com/ics-unisg/activity-detection-services-generator/issues
+classifiers =
+ Development Status :: 4 - Beta
+ Intended Audience :: Science/Research
+ License :: OSI Approved :: GNU Affero General Public License v3
+ Programming Language :: Python :: 3.12
+ Topic :: Scientific/Engineering
+
+[options]
+packages = find:
+install_requires = file: requirements.txt
+include_package_data = True
+
+python_requires = >=3.12
+
+[options.packages.find]
+include =
+ cepact
+ cepact.*
+
+[options.package_data]
+* = static/*
+
+[options.extras_require]
+testing =
+ pytest>=3
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/input_processor_test/__init__.py b/tests/input_processor_test/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/input_processor_test/grafana_fetcher_test.py b/tests/input_processor_test/grafana_fetcher_test.py
new file mode 100644
index 0000000..1600fc6
--- /dev/null
+++ b/tests/input_processor_test/grafana_fetcher_test.py
@@ -0,0 +1,150 @@
+""" Test grafana fetcher """
+import datetime
+from datetime import datetime as dt
+from typing import List
+from unittest import mock
+from unittest.mock import Mock
+
+import pytest
+from cepact.input_processor.concrete_fetchers import GrafanaFetcher
+from cepact.representations import AnnotationParams
+
+response_mock = Mock()
+response_mock.json.return_value = [
+ {'time': 1679309568446, 'text': 'END_Move-to-DPS', 'tags': ['vgr5', 'activity', 'VGR_1'],
+ 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309542198, 'text': 'START_Move-to-DPS', 'tags': ['vgr5', 'activity', 'VGR_1'],
+ 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309528344, 'text': 'END_Get-Workpiece-from-Pickup-Station',
+ 'tags': ['vgr4', 'activity', 'VGR_1'], 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309498989, 'text': 'START_Get-Workpiece-from-Pickup-Station',
+ 'tags': ['vgr4', 'activity', 'VGR_1'], 'dashboardUID': 'mock', 'panelId': 'mock'}]
+
+response_ignoregen_mock = Mock()
+response_ignoregen_mock.json.return_value = [
+ {'time': 1679309568446, 'text': 'END_Move-to-DPS',
+ 'tags': ['vgr5', 'activity', 'VGR_1', 'ignoregen'
+ '-new_sensor_to_ignore1'],
+ 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309542198, 'text': 'START_Move-to-DPS', 'tags': ['vgr5', 'activity', 'VGR_1'],
+ 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309528344, 'text': 'END_Get-Workpiece-from-Pickup-Station',
+ 'tags': ['vgr4', 'activity', 'VGR_1']
+ , 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309498989, 'text': 'START_Get-Workpiece-from-Pickup-Station',
+ 'tags': ['vgr4', 'activity', 'VGR_1', 'ignoregen-new_sensor_to_ignore2',
+ 'ignoregen-new_sensor_to_ignore3'], 'dashboardUID': 'mock', 'panelId': 'mock'}]
+
+response_ignorespec_mock = Mock()
+response_ignorespec_mock.json.return_value = [
+ {'time': 1679309568446, 'text': 'END_Move-to-DPS',
+ 'tags': ['vgr5', 'activity', 'VGR_1', 'ignore'
+ '-new_sensor_to_ignore1'],
+ 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309542198, 'text': 'START_Move-to-DPS', 'tags': ['vgr5', 'activity', 'VGR_1'],
+ 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309528344, 'text': 'END_Get-Workpiece-from-Pickup-Station',
+ 'tags': ['vgr4', 'activity', 'VGR_1'], 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309498989, 'text': 'START_Get-Workpiece-from-Pickup-Station',
+ 'tags': ['vgr4', 'activity', 'VGR_1', 'ignore-new_sensor_to_ignore2',
+ 'ignore-new_sensor_to_ignore3'], 'dashboardUID': 'mock', 'panelId': 'mock'}]
+
+response_ignoreboth_mock = Mock()
+response_ignoreboth_mock.json.return_value = [
+ {'time': 1679309568446, 'text': 'END_Move-to-DPS',
+ 'tags': ['vgr5', 'activity', 'VGR_1', 'ignore'
+ '-new_sensor_to_ignore1'],
+ 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309542198, 'text': 'START_Move-to-DPS', 'tags': ['vgr5', 'activity', 'VGR_1'],
+ 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309528344, 'text': 'END_Get-Workpiece-from-Pickup-Station',
+ 'tags': ['vgr4', 'activity', 'VGR_1', 'ignoregen-new_sensor_to_ignore4'],
+ 'dashboardUID': 'mock', 'panelId': 'mock'},
+ {'time': 1679309498989, 'text': 'START_Get-Workpiece-from-Pickup-Station',
+ 'tags': ['vgr4', 'activity', 'VGR_1', 'ignore-new_sensor_to_ignore2',
+ 'ignore-new_sensor_to_ignore3'], 'dashboardUID': 'mock', 'panelId': 'mock'}]
+
+
+@pytest.fixture(scope='module', autouse=True)
+def before_all():
+ """ Preparations
+ """
+ # ^ Will be executed before the first test
+ yield
+ # v Will be executed after the last test
+
+
+def test_without_ignore_tags():
+ """ Grafana has no ignore/gen- tags """
+ with mock.patch('requests.get', return_value=response_mock):
+ grafana_fetcher = GrafanaFetcher(url="http://localhost:3000",
+ auth="mock")
+ activity_params: List[AnnotationParams] = grafana_fetcher.get_annotation_params()
+ assert grafana_fetcher.get_ignore_sensors() == {"general": []}
+ assert "vgr5" in [act_param.annotation_id for act_param in activity_params]
+ assert "vgr4" in [act_param.annotation_id for act_param in activity_params]
+ assert len(activity_params) == 2
+ vgr4_4_act_param = \
+ [act_param for act_param in activity_params if act_param.annotation_id == "vgr4"][0]
+ vgr5_5_act_param = \
+ [act_param for act_param in activity_params if act_param.annotation_id == "vgr5"][0]
+ assert vgr4_4_act_param.activity_name == "Get Workpiece from Pickup Station"
+ assert vgr5_5_act_param.activity_name == "Move to DPS"
+ assert abs(vgr4_4_act_param.start - dt.fromtimestamp(1679309498989 / 1000,
+ datetime.UTC)) <= datetime.timedelta(
+ seconds=1)
+ assert abs(vgr4_4_act_param.end - dt.fromtimestamp(1679309528344 / 1000,
+ datetime.UTC)) <= datetime.timedelta(
+ seconds=1)
+ assert abs(vgr5_5_act_param.start - dt.fromtimestamp(1679309542198 / 1000,
+ datetime.UTC)) <= datetime.timedelta(
+ seconds=1)
+ assert abs(vgr5_5_act_param.end - dt.fromtimestamp(1679309568446 / 1000,
+ datetime.UTC)) <= datetime.timedelta(
+ seconds=1)
+
+
+def test_with_general_ignore_tags():
+ """ Grafana has ignoregen- tags"""
+ with mock.patch('requests.get', return_value=response_ignoregen_mock):
+ grafana_fetcher = GrafanaFetcher(url="http://localhost:3000",
+ auth="mock")
+ activity_params: List[AnnotationParams] = grafana_fetcher.get_annotation_params()
+ ignore_sensors: dict = grafana_fetcher.get_ignore_sensors()
+ assert "vgr5" in [act_param.annotation_id for act_param in activity_params]
+ assert "vgr4" in [act_param.annotation_id for act_param in activity_params]
+ assert len(activity_params) == 2
+ assert 3 == len(ignore_sensors["general"])
+ assert "new_sensor_to_ignore1" in ignore_sensors["general"]
+ assert "new_sensor_to_ignore2" in ignore_sensors["general"]
+ assert "new_sensor_to_ignore3" in ignore_sensors["general"]
+
+
+def test_with_specific_ignore_tags():
+ """ Grafana has ignore- tags"""
+ with mock.patch('requests.get', return_value=response_ignorespec_mock):
+ grafana_fetcher = GrafanaFetcher(url="http://localhost:3000",
+ auth="mock")
+ activity_params: List[AnnotationParams] = grafana_fetcher.get_annotation_params()
+ ignore_sensors: dict = grafana_fetcher.get_ignore_sensors()
+ assert "vgr5" in [act_param.annotation_id for act_param in activity_params]
+ assert "vgr4" in [act_param.annotation_id for act_param in activity_params]
+ assert len(activity_params) == 2
+ assert len(ignore_sensors["general"]) == 0
+ assert ignore_sensors["vgr4"] == ["new_sensor_to_ignore2", "new_sensor_to_ignore3"]
+ assert ignore_sensors["vgr5"] == ["new_sensor_to_ignore1"]
+
+
+def test_with_both_ignore_tags():
+ """ Grafana has both ignore- and ignoregen- tags """
+ with mock.patch('requests.get', return_value=response_ignoreboth_mock):
+ grafana_fetcher = GrafanaFetcher(url="http://localhost:3000",
+ auth="mock")
+ activity_params: List[AnnotationParams] = grafana_fetcher.get_annotation_params()
+ ignore_sensors: dict = grafana_fetcher.get_ignore_sensors()
+ assert "vgr5" in [act_param.annotation_id for act_param in activity_params]
+ assert "vgr4" in [act_param.annotation_id for act_param in activity_params]
+ assert len(activity_params) == 2
+ assert "new_sensor_to_ignore4" in ignore_sensors["general"]
+ assert ignore_sensors["vgr4"] == ["new_sensor_to_ignore2", "new_sensor_to_ignore3"]
+ assert ignore_sensors["vgr5"] == ["new_sensor_to_ignore1"]
diff --git a/tests/input_processor_test/influx_fetcher_test.py b/tests/input_processor_test/influx_fetcher_test.py
new file mode 100644
index 0000000..57c53a6
--- /dev/null
+++ b/tests/input_processor_test/influx_fetcher_test.py
@@ -0,0 +1,115 @@
+""" Test influx fetcher """
+import datetime
+from datetime import datetime as dt
+from types import SimpleNamespace
+from unittest import mock
+from unittest.mock import Mock
+
+import pytest
+from cepact.input_processor.concrete_fetchers import InfluxFetcher
+from cepact.representations import AnnotationParams, Signature
+
+
+class Record:
+ def __init__(self, **kwargs):
+ self._data = kwargs # Store data as dictionary
+
+ def __getitem__(self, key):
+ # Enable dictionary-like access
+ return self._data.get(key)
+
+ def get_field(self):
+ # Define a custom method
+ return self._data.get('field') # Adjust 'field' as needed
+
+ def get_value(self):
+ # Define another custom method
+ return self._data.get('value') # Adjust 'value' as needed
+
+
+record1 = Record(_time=dt.fromisoformat("2022-03-19T00:00:00Z"), field="VDY_accel_x", value=7000)
+record2 = Record(_time=dt.fromisoformat("2022-03-19T00:00:00Z"), field="VDY_accel_y", value=7001)
+record3 = Record(_time=dt.fromisoformat("2022-03-19T00:00:01Z"), field="VDY_accel_x", value=7000)
+record4 = Record(_time=dt.fromisoformat("2022-03-19T00:00:01Z"), field="VDY_accel_y", value=7001)
+
+mock_influx_client = Mock()
+mock_query_api = Mock()
+mock_influx_client.query_api.return_value = mock_query_api
+mock_query_api.query.return_value = [SimpleNamespace(records=[record1]),
+ SimpleNamespace(records=[record2]),
+ SimpleNamespace(records=[record3]),
+ SimpleNamespace(records=[record4])]
+mock_influx_client.__enter__ = Mock(return_value=mock_influx_client)
+mock_influx_client.__exit__ = Mock(return_value=None)
+
+mock_influx_client2 = Mock()
+mock_query_api2 = Mock()
+mock_influx_client2.query_api.return_value = mock_query_api2
+mock_query_api2.query.return_value = [SimpleNamespace(records=[record1]),
+ SimpleNamespace(records=[record4])]
+mock_influx_client2.__enter__ = Mock(return_value=mock_influx_client2)
+mock_influx_client2.__exit__ = Mock(return_value=None)
+
+
+@pytest.fixture(scope='module', autouse=True)
+def before_all():
+ """ Preparations
+ """
+ # ^ Will be executed before the first test
+ yield
+ # v Will be executed after the last test
+
+
+def test_basic():
+ """ Test basic functioning. """
+ with mock.patch(
+ 'cepact.input_processor.concrete_fetchers.influx_fetcher.InfluxDBClient',
+ return_value=mock_influx_client):
+ influx_fetcher = InfluxFetcher(url="http://localhost:8086",
+ auth="mock",
+ org="mock",
+ station_bucket_map={"mock":
+ "mock"})
+ mock_annotation_params = AnnotationParams(activity_name="mock",
+ annotation_id="mock",
+ stations=["mock"],
+ start=datetime.datetime.now(),
+ end=datetime.datetime.now())
+ sig: Signature = influx_fetcher.get_signature(mock_annotation_params,
+ {"general": []},
+ sampling_freq=2)
+ assert isinstance(sig, Signature)
+ assert len(sig) == 4
+ sig_ign_gen: Signature = influx_fetcher.get_signature(mock_annotation_params,
+ {"general": ["VDY_accel_x"]},
+ sampling_freq=2)
+ assert len(sig_ign_gen) == 2
+ sig_ign_act: Signature = influx_fetcher.get_signature(
+ mock_annotation_params, {
+ "general": [],
+ "mock": ["VDY_accel_y"]
+ },
+ sampling_freq=2
+ )
+ assert len(sig_ign_act) == 2
+
+
+def test_inconsistent_sensors_at_timestamps_exception():
+ """ Test exception handling. """
+ with mock.patch(
+ 'cepact.input_processor.concrete_fetchers.influx_fetcher.InfluxDBClient',
+ return_value=mock_influx_client2):
+ influx_fetcher = InfluxFetcher(url="http://localhost:8086",
+ auth="mock",
+ org="mock",
+ station_bucket_map={"mock":
+ "mock"})
+ mock_annotation_params = AnnotationParams(activity_name="mock",
+ annotation_id="mock",
+ stations=["mock"],
+ start=datetime.datetime.now(),
+ end=datetime.datetime.now())
+ with pytest.raises(ValueError):
+ influx_fetcher.get_signature(mock_annotation_params,
+ {"general": []},
+ sampling_freq=2)
diff --git a/tests/input_processor_test/input_processor_e2e_test.py b/tests/input_processor_test/input_processor_e2e_test.py
new file mode 100644
index 0000000..6320745
--- /dev/null
+++ b/tests/input_processor_test/input_processor_e2e_test.py
@@ -0,0 +1,121 @@
+import json
+import os
+from datetime import datetime
+
+import pandas as pd
+import pytest
+from cepact import (DAGConfig, SiddhiConfig, LocalSignatureFetcher,
+ LocalAnnotationParamFetcher, LocalIgnoreSensorFetcher,
+ LocalDiscretizationFetcher, AllHighLevelPatternQuery,
+ First50HighLevelPatternQuery, FirstLastLowLevelPatternQuery,
+ Any25LowLevelPatternQuery, Any50LowLevelPatternQuery,
+ Any75LowLevelPatternQuery)
+from cepact.input_processor import InputProcessor
+
+test_path = os.path.join("tests", "local_input_mocks")
+test_cases = [f for f in os.listdir(test_path) if os.path.isdir(os.path.join(test_path, f))]
+# Define the format
+format_str = '%Y-%m-%d %H:%M:%S.%f'
+
+
+# Convert to datetime object
+
+@pytest.mark.parametrize("testcase_dir", test_cases)
+def test_activites_signature_changes(testcase_dir):
+ """ Test basic functioning. """
+ local_in_dir = os.path.join(test_path, testcase_dir, "in")
+ mock_siddhi_conf = SiddhiConfig(mqtt_url="mock",
+ mqtt_user="mock",
+ mqtt_pwd="mock",
+ topic_prefix="mock",
+ map_sensor_name_data_to_mqtt={"mock": "mock"})
+ mock_dag_conf = DAGConfig(det_methods=[AllHighLevelPatternQuery(),
+ First50HighLevelPatternQuery(),
+ FirstLastLowLevelPatternQuery(),
+ Any25LowLevelPatternQuery(),
+ Any50LowLevelPatternQuery(),
+ Any75LowLevelPatternQuery()],
+ out_dir="mock",
+ sampling_freq=2,
+ siddhi_config=mock_siddhi_conf,
+ signature_fetcher=LocalSignatureFetcher(local_in_dir),
+ annotation_param_fetcher=LocalAnnotationParamFetcher(local_in_dir),
+ ignore_sensor_fetcher=LocalIgnoreSensorFetcher(local_in_dir),
+ discretization_fetcher=LocalDiscretizationFetcher(local_in_dir))
+ # run the input processor
+ input_processor = InputProcessor(mock_dag_conf)
+ activities = input_processor.get_activities()
+ discretization = input_processor.get_discretization()
+ # check if correct activities are returned
+ # get all activity names from directory names in "test_path + testcase_dir + assert"
+ activities_to_check = [f for f in os.listdir(os.path.join(test_path, testcase_dir, "assert"))
+ if os.path.isdir(os.path.join(test_path, testcase_dir, "assert", f))]
+ assert len(activities) == len(activities_to_check)
+ for act_ass_n in activities_to_check:
+ # get correct activity based on name
+ acts_test = [a for a in activities if a.get_annotation_params().activity_name == act_ass_n]
+ assert len(acts_test) == 1
+ act_test = acts_test[0]
+ # check if the changes are correct
+ changes = act_test.get_changes(discretization)
+ changes_counter = 0
+ with open(os.path.join(test_path, testcase_dir, "assert", act_ass_n, "changes.jsonl"), "r",
+ encoding="utf-8") as chgs_file:
+ for line in chgs_file:
+ rec = json.loads(line)
+ timestamp = datetime.strptime(rec["timestamp"], format_str)
+ assert {ci.sensor for ci in changes.get_changes_at_ts(timestamp)} == {ca["sensor"]
+ for ca in rec[
+ "changes"]}
+ for change in rec["changes"]:
+ changes_counter += 1
+ rel_chs = changes.get_changes_at_ts_station(timestamp, change["station"])
+ rel_chs_2 = [c for c in rel_chs if c.sensor == change["sensor"]]
+ assert len(rel_chs_2) == 1
+ rel_ch = rel_chs_2[0]
+ assert rel_ch.station == change["station"]
+ assert rel_ch.sensor == change["sensor"]
+ assert rel_ch.value == change["value"]
+ assert rel_ch.prev_value == change["prev_value"]
+ assert changes_counter == len(changes.changes)
+
+ # get all unique activity_name annotation_id combos
+ anno_params = pd.read_csv(os.path.join(test_path, testcase_dir, "in", "anno_params.csv"))
+ unique_activity_annotation_ids = set(
+ anno_params.apply(lambda x: (x["activity_name"], x["annotation_id"]), axis=1))
+ for activity_name, annotation_id in unique_activity_annotation_ids:
+ relevant_activities = [a for a in activities if
+ a.get_annotation_params().activity_name == activity_name]
+ assert len(relevant_activities) == 1
+ curr_act = relevant_activities[0]
+ # check if the signatures are correct
+ signature_all = curr_act.get_signature()
+ signature_filtered = [sig for sig in signature_all if sig.annotation_id == annotation_id]
+ if len(signature_filtered) == 0:
+ raise ValueError(
+ "No signature found for activity_name: " + activity_name + " and annotation_id: " + annotation_id)
+ elif len(signature_filtered) > 1:
+ raise ValueError(
+ "Multiple signatures found for activity_name: " + activity_name + " and annotation_id: " + annotation_id)
+ signature_ts_rs = signature_filtered[0].get_sigs_by_ts_station()
+ line_counter = 0
+ with open(os.path.join(test_path, testcase_dir, "assert", activity_name, annotation_id,
+ "signature.jsonl"), "r",
+ encoding="utf-8") as sig_file:
+ for line in sig_file:
+ line_counter += 1
+ rec = json.loads(line)
+
+ timestamp = datetime.strptime(rec["timestamp"], format_str)
+ for measurement in rec["measurements"]:
+ station = measurement["station"]
+ current_sigs = signature_ts_rs[timestamp][station]
+ assert {"station"} | {sig.sensor for sig in current_sigs} == set(
+ measurement.keys())
+ for field, value in measurement.items():
+ if field == "station":
+ continue
+ rel_sigs = [sig for sig in current_sigs if sig.sensor == field]
+ assert len(rel_sigs) == 1
+ assert rel_sigs[0].value == value
+ assert line_counter == len(signature_ts_rs.keys())
diff --git a/tests/input_processor_test/local_discretization_fetcher_test.py b/tests/input_processor_test/local_discretization_fetcher_test.py
new file mode 100644
index 0000000..143d27a
--- /dev/null
+++ b/tests/input_processor_test/local_discretization_fetcher_test.py
@@ -0,0 +1,32 @@
+""" Test local input fetcher """
+from unittest import mock
+from unittest.mock import Mock
+
+import pandas as pd
+import pytest
+from cepact.input_processor.concrete_fetchers import LocalDiscretizationFetcher
+from cepact.representations import Discretization
+
+response_mock = pd.read_csv('tests/input_processor_test/mocks/hc_discr.csv')
+mock_stat = Mock()
+mock_stat.st_size = 1
+
+
+@pytest.fixture(scope='module', autouse=True)
+def before_all():
+ """ Preparations
+ """
+ # ^ Will be executed before the first test
+ yield
+ # v Will be executed after the last test
+
+
+def test_basic():
+ """ Test basic fucntioning. """
+ with mock.patch('pandas.read_csv', return_value=response_mock), \
+ mock.patch('os.path.exists', return_value=True), \
+ mock.patch('os.stat', return_value=mock_stat):
+ fetcher = LocalDiscretizationFetcher(local_in_dir="mocks")
+ disc = fetcher.get_discretization()
+ assert isinstance(disc, Discretization)
+ assert disc.discretize("VDY_accel_x", 7000) == "baseline"
diff --git a/tests/input_processor_test/mocks/hc_discr.csv b/tests/input_processor_test/mocks/hc_discr.csv
new file mode 100644
index 0000000..0e8b7b1
--- /dev/null
+++ b/tests/input_processor_test/mocks/hc_discr.csv
@@ -0,0 +1,21 @@
+sensor,source,target
+s23xq_load_cell_weight,<=300,low
+s23xq_load_cell_weight,>300,high
+TGJ_ir_short_distance,<=6,low
+TGJ_ir_short_distance,"]6,18]",medium
+TGJ_ir_short_distance,">18",high
+s25JW_ambient_light_illuminance,<60,low
+s25JW_ambient_light_illuminance,"[60,200]",medium
+s25JW_ambient_light_illuminance,>200,high
+SeG_ir_long_distance,>120,high
+SeG_ir_long_distance,"[45,120]",medium
+SeG_ir_long_distance,<45,low
+VDY_accel_x,"[6600,7600]",baseline
+VDY_accel_x,>7600,direction1
+VDY_accel_x,<6600,direction2
+VDY_accel_z,"[-7500,-5500]",baseline
+VDY_accel_z,<-7500,direction1
+VDY_accel_z,>-5500,direction2
+VDY_accel_y,"[-250,100]",baseline
+VDY_accel_y,<-250,direction1
+VDY_accel_y,>100,direction2
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr/assert/Burn/app.siddhi b/tests/local_input_mocks/basic_discr/assert/Burn/app.siddhi
new file mode 100644
index 0000000..e90964e
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr/assert/Burn/app.siddhi
@@ -0,0 +1,152 @@
+@App:name('DetectBurnApp')
+
+@source(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn', topic = 'mockpref/stat1', username = 'mockuser', password = 'mockpw',
+@map(type = 'json', @attributes(timestamp = '$.timestamp', i1_pos_switch = '$.i1_pos_switch', i2_pos_switch = '$.i2_pos_switch', i5_light_barrier = '$.i5_light_barrier', m1_speed = '$.m1_speed', o7_valve = '$.o7_valve', o8_compressor = '$.o8_compressor')))
+define stream stat1Stream(timestamp string, i1_pos_switch int, i2_pos_switch int, i5_light_barrier int, m1_speed int, o7_valve int, o8_compressor int);
+
+define stream stat1StreamDisc(timestamp string, i1_pos_switch int, i2_pos_switch int, i5_light_barrier int, m1_speed int, o7_valve string, o8_compressor int);
+
+@sink(type = 'log', prefix = 'LowLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.ll', topic = 'ActivityEvents/LowLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedLowLevelActivityEvents(event string, activity string, ts_first string, ts_second string, ll_pattern_num int);
+
+@sink(type = 'log', prefix = 'HighLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.hl', topic = 'ActivityEvents/HighLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedHighLevelActivityEvents(event string, next_pattern string, activity string, ts_first string, ts_second string);
+
+@sink(type = 'log', prefix = 'InstanceLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.il.start', topic = 'DefaultBase/DefaultSource/DefaultCase/Burn', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"start","time:timestamp":"{{ts_start}}", "detection:type": "{{detection_type}}"}""")))
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.il.complete', topic = 'DefaultBase/DefaultSource/DefaultCase/Burn', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"complete","time:timestamp":"{{ts_end}}", "detection:type": "{{detection_type}}"}""")))
+define Stream DetectedInstanceLevelActivities(activity string, detection_type string, ts_start string, ts_start_unix long, ts_end string, ts_end_unix long);
+
+@info(name = 'stat1DiscSourceMapper')
+from stat1Stream
+select timestamp as timestamp, i1_pos_switch as i1_pos_switch, i2_pos_switch as i2_pos_switch, i5_light_barrier as i5_light_barrier, m1_speed as m1_speed, ifThenElse(o7_valve < 400.0, 'low', ifThenElse(o7_valve >= 400.0, 'high', 'ERROR')) as o7_valve, o8_compressor as o8_compressor
+insert into stat1StreamDisc;
+
+@info(name="HighToLow-Helper")
+from every e1 = DetectedLowLevelActivityEvents, e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= e2.ll_pattern_num]
+select "HighToLow" as event
+insert into HelperStream;
+
+@info(name="Detect-LowLevel-Pattern-1")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.m1_speed==0 and e2.m1_speed==-512) and (e1.o7_valve=='low' and e2.o7_valve=='high')]
+select "LowLevel-Pattern-1" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 1 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-1")
+from DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"]
+select "HighLevel-Pattern-1" as event, "LowLevel-Pattern-2" as next_pattern, "Burn" as activity, ts_first, ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-2")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i1_pos_switch==0 and e2.i1_pos_switch==1) and (e1.m1_speed==-512 and e2.m1_speed==0)]
+select "LowLevel-Pattern-2" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 2 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-2")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-2" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-2" as event, "LowLevel-Pattern-3" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-3")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.o7_valve=='high' and e2.o7_valve=='low')]
+select "LowLevel-Pattern-3" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 3 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-3")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-2"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-3" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-3" as event, "LowLevel-Pattern-4" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-4")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i1_pos_switch==1 and e2.i1_pos_switch==0) and (e1.m1_speed==0 and e2.m1_speed==512) and (e1.o7_valve=='low' and e2.o7_valve=='high')]
+select "LowLevel-Pattern-4" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 4 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-4")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-3"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-4" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-4" as event, "LowLevel-Pattern-5" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-5")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i2_pos_switch==0 and e2.i2_pos_switch==1) and (e1.m1_speed==512 and e2.m1_speed==0)]
+select "LowLevel-Pattern-5" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 5 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-5")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-4"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-5" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-5" as event, "LowLevel-Pattern-6" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-6")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i2_pos_switch==1 and e2.i2_pos_switch==0) and (e1.o7_valve=='high' and e2.o7_valve=='low')]
+select "LowLevel-Pattern-6" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 6 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-6")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-5"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-6" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-6" as event, "LowLevel-Pattern-7" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-AllHighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-6"]
+select "Burn" as activity, "AllHighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-First50HighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-3"]
+select "Burn" as activity, "First50HighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-FirstLastLowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-6"]
+select "Burn" as activity, "FirstLastLowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any25LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any25LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e3.ts_second as ts_end, time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any50LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e3.ts_second as ts_end, time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e4 = DetectedLowLevelActivityEvents[e3.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any50LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e4.ts_second as ts_end, time:timestampInMilliseconds(e4.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e4 = DetectedLowLevelActivityEvents[e3.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e5 = DetectedLowLevelActivityEvents[e4.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e4.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any75LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e5.ts_second as ts_end, time:timestampInMilliseconds(e5.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e4 = DetectedLowLevelActivityEvents[e3.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e5 = DetectedLowLevelActivityEvents[e4.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e4.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e6 = DetectedLowLevelActivityEvents[e5.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e5.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any75LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e6.ts_second as ts_end, time:timestampInMilliseconds(e6.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
diff --git a/tests/local_input_mocks/basic_discr/assert/Burn/changes.jsonl b/tests/local_input_mocks/basic_discr/assert/Burn/changes.jsonl
new file mode 100644
index 0000000..0170a0d
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr/assert/Burn/changes.jsonl
@@ -0,0 +1,6 @@
+{"timestamp":"2023-02-06 14:00:01.00","changes":[{"station":"stat1","sensor":"m1_speed","prev_value":0,"value":-512},{"station":"stat1","sensor":"o7_valve","prev_value":"low", "value":"high"}]}
+{"timestamp":"2023-02-06 14:00:02.00","changes":[{"station":"stat1","sensor":"i1_pos_switch","prev_value":0,"value":1},{"station":"stat1","sensor":"m1_speed","prev_value":-512,"value":0}]}
+{"timestamp":"2023-02-06 14:00:04.00","changes":[{"station":"stat1","sensor":"o7_valve","prev_value":"high","value":"low"}]}
+{"timestamp":"2023-02-06 14:00:09.00","changes":[{"station":"stat1","sensor":"i1_pos_switch","prev_value":1,"value":0},{"station":"stat1","sensor":"m1_speed","prev_value":0,"value":512},{"station":"stat1","sensor":"o7_valve","prev_value":"low","value":"high"}]}
+{"timestamp":"2023-02-06 14:00:11.00","changes":[{"station":"stat1","sensor":"i2_pos_switch","prev_value":0,"value":1},{"station":"stat1","sensor":"m1_speed","prev_value":512,"value":0}]}
+{"timestamp":"2023-02-06 14:00:12.00","changes":[{"station":"stat1","sensor":"i2_pos_switch","prev_value":1,"value":0},{"station":"stat1","sensor":"o7_valve","prev_value":"high","value":"low"}]}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr/assert/Burn/number1/signature.jsonl b/tests/local_input_mocks/basic_discr/assert/Burn/number1/signature.jsonl
new file mode 100644
index 0000000..84ba48b
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr/assert/Burn/number1/signature.jsonl
@@ -0,0 +1,13 @@
+{"timestamp": "2023-02-06 14:00:00.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:01.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": -512, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:02.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:03.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:04.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:05.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:06.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:07.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:08.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:09.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:10.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:11.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:12.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr/in/anno_params.csv b/tests/local_input_mocks/basic_discr/in/anno_params.csv
new file mode 100644
index 0000000..a19eff6
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr/in/anno_params.csv
@@ -0,0 +1,2 @@
+annotation_id,activity_name,start,end,stations
+number1,"Burn",2023-02-06 14:00:00.00,2023-02-06 14:00:12.00,stat1
diff --git a/tests/local_input_mocks/basic_discr/in/discr_mapping.csv b/tests/local_input_mocks/basic_discr/in/discr_mapping.csv
new file mode 100644
index 0000000..13a013f
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr/in/discr_mapping.csv
@@ -0,0 +1,3 @@
+sensor,source,target
+o7_valve,<400,low
+o7_valve,>=400,high
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr/in/ignore_sensors.json b/tests/local_input_mocks/basic_discr/in/ignore_sensors.json
new file mode 100644
index 0000000..c9c5980
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr/in/ignore_sensors.json
@@ -0,0 +1,3 @@
+{
+ "general": []
+}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr/in/timeseries.jsonl b/tests/local_input_mocks/basic_discr/in/timeseries.jsonl
new file mode 100644
index 0000000..3af8a34
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr/in/timeseries.jsonl
@@ -0,0 +1,20 @@
+{"id": "-2", "station": "stat1", "timestamp": "2023-02-06 13:59:58.00", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 511, "o7_valve": 0, "o8_compressor": 1}
+{"id": "-1", "station": "stat1", "timestamp": "2023-02-06 13:59:59.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "0", "station": "stat1", "timestamp": "2023-02-06 14:00:00.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "1", "station": "stat1", "timestamp": "2023-02-06 14:00:01.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": -512, "o7_valve": 512, "o8_compressor": 0}
+{"id": "2", "station": "stat1", "timestamp": "2023-02-06 14:00:02.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
+{"id": "3", "station": "stat1", "timestamp": "2023-02-06 14:00:03.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
+{"id": "4", "station": "stat1", "timestamp": "2023-02-06 14:00:04.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "5", "station": "stat1", "timestamp": "2023-02-06 14:00:05.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "6", "station": "stat1", "timestamp": "2023-02-06 14:00:06.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "7", "station": "stat1", "timestamp": "2023-02-06 14:00:07.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "8", "station": "stat1", "timestamp": "2023-02-06 14:00:08.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "9", "station": "stat1", "timestamp": "2023-02-06 14:00:09.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}
+{"id": "10", "station": "stat1", "timestamp": "2023-02-06 14:00:10.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}
+{"id": "11", "station": "stat1", "timestamp": "2023-02-06 14:00:11.00", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
+{"id": "12", "station": "stat1", "timestamp": "2023-02-06 14:00:12.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "13", "station": "stat1", "timestamp": "2023-02-06 14:00:13.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "14", "station": "stat1", "timestamp": "2023-02-06 14:00:14.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "15", "station": "stat1", "timestamp": "2023-02-06 14:00:15.00", "i1_pos_switch": 1, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": -512, "o7_valve": 0, "o8_compressor": 1}
+{"id": "16", "station": "stat1", "timestamp": "2023-02-06 14:00:16.00", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 1}
+{"id": "17", "station": "stat1", "timestamp": "2023-02-06 14:00:17.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr_plus_ign_sens/assert/Burn/app.siddhi b/tests/local_input_mocks/basic_discr_plus_ign_sens/assert/Burn/app.siddhi
new file mode 100644
index 0000000..df1b610
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr_plus_ign_sens/assert/Burn/app.siddhi
@@ -0,0 +1,140 @@
+@App:name('DetectBurnApp')
+
+@source(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn', topic = 'mockpref/stat1', username = 'mockuser', password = 'mockpw',
+@map(type = 'json', @attributes(timestamp = '$.timestamp', i1_pos_switch = '$.i1_pos_switch', i5_light_barrier = '$.i5_light_barrier', o7_valve = '$.o7_valve', o8_compressor = '$.o8_compressor')))
+define stream stat1Stream(timestamp string, i1_pos_switch int, i5_light_barrier int, o7_valve int, o8_compressor int);
+
+define stream stat1StreamDisc(timestamp string, i1_pos_switch int, i5_light_barrier int, o7_valve string, o8_compressor int);
+
+@sink(type = 'log', prefix = 'LowLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.ll', topic = 'ActivityEvents/LowLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedLowLevelActivityEvents(event string, activity string, ts_first string, ts_second string, ll_pattern_num int);
+
+@sink(type = 'log', prefix = 'HighLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.hl', topic = 'ActivityEvents/HighLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedHighLevelActivityEvents(event string, next_pattern string, activity string, ts_first string, ts_second string);
+
+@sink(type = 'log', prefix = 'InstanceLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.il.start', topic = 'DefaultBase/DefaultSource/DefaultCase/Burn', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"start","time:timestamp":"{{ts_start}}", "detection:type": "{{detection_type}}"}""")))
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.il.complete', topic = 'DefaultBase/DefaultSource/DefaultCase/Burn', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"complete","time:timestamp":"{{ts_end}}", "detection:type": "{{detection_type}}"}""")))
+define Stream DetectedInstanceLevelActivities(activity string, detection_type string, ts_start string, ts_start_unix long, ts_end string, ts_end_unix long);
+
+@info(name = 'stat1DiscSourceMapper')
+from stat1Stream
+select timestamp as timestamp, i1_pos_switch as i1_pos_switch, i5_light_barrier as i5_light_barrier, ifThenElse(o7_valve < 400.0, 'low', ifThenElse(o7_valve >= 400.0, 'high', 'ERROR')) as o7_valve, o8_compressor as o8_compressor
+insert into stat1StreamDisc;
+
+@info(name="HighToLow-Helper")
+from every e1 = DetectedLowLevelActivityEvents, e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= e2.ll_pattern_num]
+select "HighToLow" as event
+insert into HelperStream;
+
+@info(name="Detect-LowLevel-Pattern-1")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.o7_valve=='low' and e2.o7_valve=='high')]
+select "LowLevel-Pattern-1" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 1 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-1")
+from DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"]
+select "HighLevel-Pattern-1" as event, "LowLevel-Pattern-2" as next_pattern, "Burn" as activity, ts_first, ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-2")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i1_pos_switch==0 and e2.i1_pos_switch==1)]
+select "LowLevel-Pattern-2" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 2 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-2")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-2" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-2" as event, "LowLevel-Pattern-3" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-3")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.o7_valve=='high' and e2.o7_valve=='low')]
+select "LowLevel-Pattern-3" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 3 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-3")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-2"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-3" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-3" as event, "LowLevel-Pattern-4" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-4")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i1_pos_switch==1 and e2.i1_pos_switch==0) and (e1.o7_valve=='low' and e2.o7_valve=='high')]
+select "LowLevel-Pattern-4" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 4 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-4")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-3"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-4" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-4" as event, "LowLevel-Pattern-5" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-5")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.o7_valve=='high' and e2.o7_valve=='low')]
+select "LowLevel-Pattern-5" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 5 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-5")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-4"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-5" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-5" as event, "LowLevel-Pattern-6" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-AllHighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-5"]
+select "Burn" as activity, "AllHighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-First50HighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-3"]
+select "Burn" as activity, "First50HighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-FirstLastLowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-5"]
+select "Burn" as activity, "FirstLastLowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any25LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any25LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e3.ts_second as ts_end, time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any50LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e3.ts_second as ts_end, time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e4 = DetectedLowLevelActivityEvents[e3.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any50LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e4.ts_second as ts_end, time:timestampInMilliseconds(e4.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e4 = DetectedLowLevelActivityEvents[e3.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any75LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e4.ts_second as ts_end, time:timestampInMilliseconds(e4.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e4 = DetectedLowLevelActivityEvents[e3.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e5 = DetectedLowLevelActivityEvents[e4.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e4.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any75LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e5.ts_second as ts_end, time:timestampInMilliseconds(e5.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
diff --git a/tests/local_input_mocks/basic_discr_plus_ign_sens/assert/Burn/changes.jsonl b/tests/local_input_mocks/basic_discr_plus_ign_sens/assert/Burn/changes.jsonl
new file mode 100644
index 0000000..86cd562
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr_plus_ign_sens/assert/Burn/changes.jsonl
@@ -0,0 +1,5 @@
+{"timestamp":"2023-02-06 14:00:01.00","changes":[{"station":"stat1","sensor":"o7_valve","prev_value":"low", "value":"high"}]}
+{"timestamp":"2023-02-06 14:00:02.00","changes":[{"station":"stat1","sensor":"i1_pos_switch","prev_value":0,"value":1}]}
+{"timestamp":"2023-02-06 14:00:04.00","changes":[{"station":"stat1","sensor":"o7_valve","prev_value":"high","value":"low"}]}
+{"timestamp":"2023-02-06 14:00:09.00","changes":[{"station":"stat1","sensor":"i1_pos_switch","prev_value":1,"value":0},{"station":"stat1","sensor":"o7_valve","prev_value":"low","value":"high"}]}
+{"timestamp":"2023-02-06 14:00:12.00","changes":[{"station":"stat1","sensor":"o7_valve","prev_value":"high","value":"low"}]}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr_plus_ign_sens/assert/Burn/number1/signature.jsonl b/tests/local_input_mocks/basic_discr_plus_ign_sens/assert/Burn/number1/signature.jsonl
new file mode 100644
index 0000000..22772f0
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr_plus_ign_sens/assert/Burn/number1/signature.jsonl
@@ -0,0 +1,13 @@
+{"timestamp": "2023-02-06 14:00:00.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i5_light_barrier": 1, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:01.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i5_light_barrier": 1, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:02.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i5_light_barrier": 1, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:03.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i5_light_barrier": 1, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:04.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i5_light_barrier": 1, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:05.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i5_light_barrier": 1, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:06.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i5_light_barrier": 1, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:07.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i5_light_barrier": 1, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:08.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i5_light_barrier": 1, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:09.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i5_light_barrier": 1, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:10.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i5_light_barrier": 1, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:11.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i5_light_barrier": 1, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:12.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i5_light_barrier": 1, "o7_valve": 0, "o8_compressor": 0}]}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr_plus_ign_sens/in/anno_params.csv b/tests/local_input_mocks/basic_discr_plus_ign_sens/in/anno_params.csv
new file mode 100644
index 0000000..a19eff6
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr_plus_ign_sens/in/anno_params.csv
@@ -0,0 +1,2 @@
+annotation_id,activity_name,start,end,stations
+number1,"Burn",2023-02-06 14:00:00.00,2023-02-06 14:00:12.00,stat1
diff --git a/tests/local_input_mocks/basic_discr_plus_ign_sens/in/discr_mapping.csv b/tests/local_input_mocks/basic_discr_plus_ign_sens/in/discr_mapping.csv
new file mode 100644
index 0000000..13a013f
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr_plus_ign_sens/in/discr_mapping.csv
@@ -0,0 +1,3 @@
+sensor,source,target
+o7_valve,<400,low
+o7_valve,>=400,high
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr_plus_ign_sens/in/ignore_sensors.json b/tests/local_input_mocks/basic_discr_plus_ign_sens/in/ignore_sensors.json
new file mode 100644
index 0000000..23ff2c2
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr_plus_ign_sens/in/ignore_sensors.json
@@ -0,0 +1,4 @@
+{
+ "general": ["m1_speed"],
+ "Burn": ["i2_pos_switch"]
+}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_discr_plus_ign_sens/in/timeseries.jsonl b/tests/local_input_mocks/basic_discr_plus_ign_sens/in/timeseries.jsonl
new file mode 100644
index 0000000..3af8a34
--- /dev/null
+++ b/tests/local_input_mocks/basic_discr_plus_ign_sens/in/timeseries.jsonl
@@ -0,0 +1,20 @@
+{"id": "-2", "station": "stat1", "timestamp": "2023-02-06 13:59:58.00", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 511, "o7_valve": 0, "o8_compressor": 1}
+{"id": "-1", "station": "stat1", "timestamp": "2023-02-06 13:59:59.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "0", "station": "stat1", "timestamp": "2023-02-06 14:00:00.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "1", "station": "stat1", "timestamp": "2023-02-06 14:00:01.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": -512, "o7_valve": 512, "o8_compressor": 0}
+{"id": "2", "station": "stat1", "timestamp": "2023-02-06 14:00:02.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
+{"id": "3", "station": "stat1", "timestamp": "2023-02-06 14:00:03.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
+{"id": "4", "station": "stat1", "timestamp": "2023-02-06 14:00:04.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "5", "station": "stat1", "timestamp": "2023-02-06 14:00:05.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "6", "station": "stat1", "timestamp": "2023-02-06 14:00:06.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "7", "station": "stat1", "timestamp": "2023-02-06 14:00:07.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "8", "station": "stat1", "timestamp": "2023-02-06 14:00:08.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "9", "station": "stat1", "timestamp": "2023-02-06 14:00:09.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}
+{"id": "10", "station": "stat1", "timestamp": "2023-02-06 14:00:10.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}
+{"id": "11", "station": "stat1", "timestamp": "2023-02-06 14:00:11.00", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
+{"id": "12", "station": "stat1", "timestamp": "2023-02-06 14:00:12.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "13", "station": "stat1", "timestamp": "2023-02-06 14:00:13.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "14", "station": "stat1", "timestamp": "2023-02-06 14:00:14.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "15", "station": "stat1", "timestamp": "2023-02-06 14:00:15.00", "i1_pos_switch": 1, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": -512, "o7_valve": 0, "o8_compressor": 1}
+{"id": "16", "station": "stat1", "timestamp": "2023-02-06 14:00:16.00", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 1}
+{"id": "17", "station": "stat1", "timestamp": "2023-02-06 14:00:17.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_paper/assert/Burn/app.siddhi b/tests/local_input_mocks/basic_paper/assert/Burn/app.siddhi
new file mode 100644
index 0000000..59ce137
--- /dev/null
+++ b/tests/local_input_mocks/basic_paper/assert/Burn/app.siddhi
@@ -0,0 +1,152 @@
+@App:name('DetectBurnApp')
+
+@source(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn', topic = 'mockpref/stat1', username = 'mockuser', password = 'mockpw',
+@map(type = 'json', @attributes(timestamp = '$.timestamp', i1_pos_switch = '$.i1_pos_switch', i2_pos_switch = '$.i2_pos_switch', i5_light_barrier = '$.i5_light_barrier', m1_speed = '$.m1_speed', o7_valve = '$.o7_valve', o8_compressor = '$.o8_compressor')))
+define stream stat1Stream(timestamp string, i1_pos_switch int, i2_pos_switch int, i5_light_barrier int, m1_speed int, o7_valve int, o8_compressor int);
+
+define stream stat1StreamDisc(timestamp string, i1_pos_switch int, i2_pos_switch int, i5_light_barrier int, m1_speed int, o7_valve int, o8_compressor int);
+
+@sink(type = 'log', prefix = 'LowLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.ll', topic = 'ActivityEvents/LowLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedLowLevelActivityEvents(event string, activity string, ts_first string, ts_second string, ll_pattern_num int);
+
+@sink(type = 'log', prefix = 'HighLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.hl', topic = 'ActivityEvents/HighLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedHighLevelActivityEvents(event string, next_pattern string, activity string, ts_first string, ts_second string);
+
+@sink(type = 'log', prefix = 'InstanceLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.il.start', topic = 'DefaultBase/DefaultSource/DefaultCase/Burn', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"start","time:timestamp":"{{ts_start}}", "detection:type": "{{detection_type}}"}""")))
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.stat1.Burn.il.complete', topic = 'DefaultBase/DefaultSource/DefaultCase/Burn', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"complete","time:timestamp":"{{ts_end}}", "detection:type": "{{detection_type}}"}""")))
+define Stream DetectedInstanceLevelActivities(activity string, detection_type string, ts_start string, ts_start_unix long, ts_end string, ts_end_unix long);
+
+@info(name = 'stat1DiscSourceMapper')
+from stat1Stream
+select timestamp as timestamp, i1_pos_switch as i1_pos_switch, i2_pos_switch as i2_pos_switch, i5_light_barrier as i5_light_barrier, m1_speed as m1_speed, o7_valve as o7_valve, o8_compressor as o8_compressor
+insert into stat1StreamDisc;
+
+@info(name="HighToLow-Helper")
+from every e1 = DetectedLowLevelActivityEvents, e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= e2.ll_pattern_num]
+select "HighToLow" as event
+insert into HelperStream;
+
+@info(name="Detect-LowLevel-Pattern-1")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.m1_speed==0 and e2.m1_speed==-512) and (e1.o7_valve==0 and e2.o7_valve==512)]
+select "LowLevel-Pattern-1" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 1 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-1")
+from DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"]
+select "HighLevel-Pattern-1" as event, "LowLevel-Pattern-2" as next_pattern, "Burn" as activity, ts_first, ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-2")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i1_pos_switch==0 and e2.i1_pos_switch==1) and (e1.m1_speed==-512 and e2.m1_speed==0)]
+select "LowLevel-Pattern-2" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 2 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-2")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-2" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-2" as event, "LowLevel-Pattern-3" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-3")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.o7_valve==512 and e2.o7_valve==0)]
+select "LowLevel-Pattern-3" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 3 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-3")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-2"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-3" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-3" as event, "LowLevel-Pattern-4" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-4")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i1_pos_switch==1 and e2.i1_pos_switch==0) and (e1.m1_speed==0 and e2.m1_speed==512) and (e1.o7_valve==0 and e2.o7_valve==512)]
+select "LowLevel-Pattern-4" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 4 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-4")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-3"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-4" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-4" as event, "LowLevel-Pattern-5" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-5")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i2_pos_switch==0 and e2.i2_pos_switch==1) and (e1.m1_speed==512 and e2.m1_speed==0)]
+select "LowLevel-Pattern-5" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 5 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-5")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-4"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-5" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-5" as event, "LowLevel-Pattern-6" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-6")
+from every e1 = stat1StreamDisc, e2 = stat1StreamDisc[(e1.i2_pos_switch==1 and e2.i2_pos_switch==0) and (e1.o7_valve==512 and e2.o7_valve==0)]
+select "LowLevel-Pattern-6" as event, "Burn" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 6 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-6")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-5"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-6" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-6" as event, "LowLevel-Pattern-7" as next_pattern, "Burn" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-AllHighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-6"]
+select "Burn" as activity, "AllHighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-First50HighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-3"]
+select "Burn" as activity, "First50HighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-FirstLastLowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-6"]
+select "Burn" as activity, "FirstLastLowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any25LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any25LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e3.ts_second as ts_end, time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any50LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e3.ts_second as ts_end, time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e4 = DetectedLowLevelActivityEvents[e3.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any50LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e4.ts_second as ts_end, time:timestampInMilliseconds(e4.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e4 = DetectedLowLevelActivityEvents[e3.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e5 = DetectedLowLevelActivityEvents[e4.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e4.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any75LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e5.ts_second as ts_end, time:timestampInMilliseconds(e5.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e4 = DetectedLowLevelActivityEvents[e3.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e5 = DetectedLowLevelActivityEvents[e4.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e4.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e6 = DetectedLowLevelActivityEvents[e5.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e5.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Burn" as activity, "Any75LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e6.ts_second as ts_end, time:timestampInMilliseconds(e6.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
diff --git a/tests/local_input_mocks/basic_paper/assert/Burn/changes.jsonl b/tests/local_input_mocks/basic_paper/assert/Burn/changes.jsonl
new file mode 100644
index 0000000..63db71d
--- /dev/null
+++ b/tests/local_input_mocks/basic_paper/assert/Burn/changes.jsonl
@@ -0,0 +1,6 @@
+{"timestamp":"2023-02-06 14:00:01.00","changes":[{"station":"stat1","sensor":"m1_speed","prev_value":0,"value":-512},{"station":"stat1","sensor":"o7_valve","prev_value":0,"value":512}]}
+{"timestamp":"2023-02-06 14:00:02.00","changes":[{"station":"stat1","sensor":"i1_pos_switch","prev_value":0,"value":1},{"station":"stat1","sensor":"m1_speed","prev_value":-512,"value":0}]}
+{"timestamp":"2023-02-06 14:00:04.00","changes":[{"station":"stat1","sensor":"o7_valve","prev_value":512,"value":0}]}
+{"timestamp":"2023-02-06 14:00:09.00","changes":[{"station":"stat1","sensor":"i1_pos_switch","prev_value":1,"value":0},{"station":"stat1","sensor":"m1_speed","prev_value":0,"value":512},{"station":"stat1","sensor":"o7_valve","prev_value":0,"value":512}]}
+{"timestamp":"2023-02-06 14:00:11.00","changes":[{"station":"stat1","sensor":"i2_pos_switch","prev_value":0,"value":1},{"station":"stat1","sensor":"m1_speed","prev_value":512,"value":0}]}
+{"timestamp":"2023-02-06 14:00:12.00","changes":[{"station":"stat1","sensor":"i2_pos_switch","prev_value":1,"value":0},{"station":"stat1","sensor":"o7_valve","prev_value":512,"value":0}]}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_paper/assert/Burn/number1/signature.jsonl b/tests/local_input_mocks/basic_paper/assert/Burn/number1/signature.jsonl
new file mode 100644
index 0000000..84ba48b
--- /dev/null
+++ b/tests/local_input_mocks/basic_paper/assert/Burn/number1/signature.jsonl
@@ -0,0 +1,13 @@
+{"timestamp": "2023-02-06 14:00:00.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:01.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": -512, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:02.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:03.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:04.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:05.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:06.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:07.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:08.00", "measurements": [{"station": "stat1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:09.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:10.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:11.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2023-02-06 14:00:12.00", "measurements": [{"station": "stat1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_paper/in/anno_params.csv b/tests/local_input_mocks/basic_paper/in/anno_params.csv
new file mode 100644
index 0000000..a19eff6
--- /dev/null
+++ b/tests/local_input_mocks/basic_paper/in/anno_params.csv
@@ -0,0 +1,2 @@
+annotation_id,activity_name,start,end,stations
+number1,"Burn",2023-02-06 14:00:00.00,2023-02-06 14:00:12.00,stat1
diff --git a/tests/local_input_mocks/basic_paper/in/discr_mapping.csv b/tests/local_input_mocks/basic_paper/in/discr_mapping.csv
new file mode 100644
index 0000000..e69de29
diff --git a/tests/local_input_mocks/basic_paper/in/ignore_sensors.json b/tests/local_input_mocks/basic_paper/in/ignore_sensors.json
new file mode 100644
index 0000000..c9c5980
--- /dev/null
+++ b/tests/local_input_mocks/basic_paper/in/ignore_sensors.json
@@ -0,0 +1,3 @@
+{
+ "general": []
+}
\ No newline at end of file
diff --git a/tests/local_input_mocks/basic_paper/in/timeseries.jsonl b/tests/local_input_mocks/basic_paper/in/timeseries.jsonl
new file mode 100644
index 0000000..3af8a34
--- /dev/null
+++ b/tests/local_input_mocks/basic_paper/in/timeseries.jsonl
@@ -0,0 +1,20 @@
+{"id": "-2", "station": "stat1", "timestamp": "2023-02-06 13:59:58.00", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 511, "o7_valve": 0, "o8_compressor": 1}
+{"id": "-1", "station": "stat1", "timestamp": "2023-02-06 13:59:59.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "0", "station": "stat1", "timestamp": "2023-02-06 14:00:00.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "1", "station": "stat1", "timestamp": "2023-02-06 14:00:01.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": -512, "o7_valve": 512, "o8_compressor": 0}
+{"id": "2", "station": "stat1", "timestamp": "2023-02-06 14:00:02.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
+{"id": "3", "station": "stat1", "timestamp": "2023-02-06 14:00:03.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
+{"id": "4", "station": "stat1", "timestamp": "2023-02-06 14:00:04.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "5", "station": "stat1", "timestamp": "2023-02-06 14:00:05.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "6", "station": "stat1", "timestamp": "2023-02-06 14:00:06.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "7", "station": "stat1", "timestamp": "2023-02-06 14:00:07.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "8", "station": "stat1", "timestamp": "2023-02-06 14:00:08.00", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "9", "station": "stat1", "timestamp": "2023-02-06 14:00:09.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}
+{"id": "10", "station": "stat1", "timestamp": "2023-02-06 14:00:10.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 512, "o7_valve": 512, "o8_compressor": 0}
+{"id": "11", "station": "stat1", "timestamp": "2023-02-06 14:00:11.00", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
+{"id": "12", "station": "stat1", "timestamp": "2023-02-06 14:00:12.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "13", "station": "stat1", "timestamp": "2023-02-06 14:00:13.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "14", "station": "stat1", "timestamp": "2023-02-06 14:00:14.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}
+{"id": "15", "station": "stat1", "timestamp": "2023-02-06 14:00:15.00", "i1_pos_switch": 1, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": -512, "o7_valve": 0, "o8_compressor": 1}
+{"id": "16", "station": "stat1", "timestamp": "2023-02-06 14:00:16.00", "i1_pos_switch": 0, "i2_pos_switch": 1, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 1}
+{"id": "17", "station": "stat1", "timestamp": "2023-02-06 14:00:17.00", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}
\ No newline at end of file
diff --git a/tests/local_input_mocks/real_hc_scenario/assert/Hand Hygiene/app.siddhi b/tests/local_input_mocks/real_hc_scenario/assert/Hand Hygiene/app.siddhi
new file mode 100644
index 0000000..cf1a6c3
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/assert/Hand Hygiene/app.siddhi
@@ -0,0 +1,100 @@
+@App:name('DetectHandHygieneApp')
+
+@source(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION.Hand Hygiene', topic = 'mockpref/HYGIENE_STATION', username = 'mockuser', password = 'mockpw',
+@map(type = 'json', @attributes(timestamp = '$.timestamp', SeG_ir_long_distance = '$.SeG_ir_long_distance', s22Pa_nfc_tag = '$.s22Pa_nfc_tag', s23UU_button_state = '$.s23UU_button_state', s23xq_load_cell_weight = '$.s23xq_load_cell_weight')))
+define stream HYGIENE_STATIONStream(timestamp string, SeG_ir_long_distance float, s22Pa_nfc_tag int, s23UU_button_state int, s23xq_load_cell_weight int);
+
+define stream HYGIENE_STATIONStreamDisc(timestamp string, SeG_ir_long_distance string, s22Pa_nfc_tag int, s23UU_button_state int, s23xq_load_cell_weight string);
+
+@sink(type = 'log', prefix = 'LowLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION.Hand Hygiene.ll', topic = 'ActivityEvents/LowLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedLowLevelActivityEvents(event string, activity string, ts_first string, ts_second string, ll_pattern_num int);
+
+@sink(type = 'log', prefix = 'HighLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION.Hand Hygiene.hl', topic = 'ActivityEvents/HighLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedHighLevelActivityEvents(event string, next_pattern string, activity string, ts_first string, ts_second string);
+
+@sink(type = 'log', prefix = 'InstanceLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION.Hand Hygiene.il.start', topic = 'DefaultBase/DefaultSource/DefaultCase/Hand Hygiene', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"start","time:timestamp":"{{ts_start}}", "detection:type": "{{detection_type}}"}""")))
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION.Hand Hygiene.il.complete', topic = 'DefaultBase/DefaultSource/DefaultCase/Hand Hygiene', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"complete","time:timestamp":"{{ts_end}}", "detection:type": "{{detection_type}}"}""")))
+define Stream DetectedInstanceLevelActivities(activity string, detection_type string, ts_start string, ts_start_unix long, ts_end string, ts_end_unix long);
+
+@info(name = 'HYGIENE_STATIONDiscSourceMapper')
+from HYGIENE_STATIONStream
+select timestamp as timestamp, ifThenElse(SeG_ir_long_distance < 50.0, 'low', ifThenElse(SeG_ir_long_distance >= 50.0 and SeG_ir_long_distance <= 120.0, 'medium', ifThenElse(SeG_ir_long_distance > 120.0, 'high', 'ERROR'))) as SeG_ir_long_distance, s22Pa_nfc_tag as s22Pa_nfc_tag, s23UU_button_state as s23UU_button_state, ifThenElse(s23xq_load_cell_weight <= 300.0, 'low', ifThenElse(s23xq_load_cell_weight > 300.0, 'high', 'ERROR')) as s23xq_load_cell_weight
+insert into HYGIENE_STATIONStreamDisc;
+
+@info(name="HighToLow-Helper")
+from every e1 = DetectedLowLevelActivityEvents, e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= e2.ll_pattern_num]
+select "HighToLow" as event
+insert into HelperStream;
+
+@info(name="Detect-LowLevel-Pattern-1")
+from every e1 = HYGIENE_STATIONStreamDisc, e2 = HYGIENE_STATIONStreamDisc[(e1.s23xq_load_cell_weight=='low' and e2.s23xq_load_cell_weight=='high')]
+select "LowLevel-Pattern-1" as event, "Hand Hygiene" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 1 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-1")
+from DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"]
+select "HighLevel-Pattern-1" as event, "LowLevel-Pattern-2" as next_pattern, "Hand Hygiene" as activity, ts_first, ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-2")
+from every e1 = HYGIENE_STATIONStreamDisc, e2 = HYGIENE_STATIONStreamDisc[(e1.s23xq_load_cell_weight=='high' and e2.s23xq_load_cell_weight=='low')]
+select "LowLevel-Pattern-2" as event, "Hand Hygiene" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 2 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-2")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-2" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-2" as event, "LowLevel-Pattern-3" as next_pattern, "Hand Hygiene" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-AllHighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-2"]
+select "Hand Hygiene" as activity, "AllHighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-First50HighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"]
+select "Hand Hygiene" as activity, "First50HighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e1.ts_second as ts_end, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-FirstLastLowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-2"]
+select "Hand Hygiene" as activity, "FirstLastLowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents
+select "Hand Hygiene" as activity, "Any25LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e1.ts_second as ts_end, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Hand Hygiene" as activity, "Any25LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents
+select "Hand Hygiene" as activity, "Any50LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e1.ts_second as ts_end, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Hand Hygiene" as activity, "Any50LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Hand Hygiene" as activity, "Any75LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Hand Hygiene" as activity, "Any75LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e3.ts_second as ts_end, time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
diff --git a/tests/local_input_mocks/real_hc_scenario/assert/Hand Hygiene/changes.jsonl b/tests/local_input_mocks/real_hc_scenario/assert/Hand Hygiene/changes.jsonl
new file mode 100644
index 0000000..fa3bfa8
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/assert/Hand Hygiene/changes.jsonl
@@ -0,0 +1,2 @@
+{"timestamp":"2024-07-30 11:26:20.81","changes":[{"station":"HYGIENE_STATION","sensor":"s23xq_load_cell_weight","prev_value":"low","value":"high"}]}
+{"timestamp":"2024-07-30 11:26:21.86","changes":[{"station":"HYGIENE_STATION","sensor":"s23xq_load_cell_weight","prev_value":"high","value":"low"}]}
\ No newline at end of file
diff --git a/tests/local_input_mocks/real_hc_scenario/assert/Hand Hygiene/handhyg1/signature.jsonl b/tests/local_input_mocks/real_hc_scenario/assert/Hand Hygiene/handhyg1/signature.jsonl
new file mode 100644
index 0000000..467fc42
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/assert/Hand Hygiene/handhyg1/signature.jsonl
@@ -0,0 +1,9 @@
+{"timestamp": "2024-07-30 11:26:19.22", "measurements": [{"station": "HYGIENE_STATION", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 26.3, "s23UU_button_state": 0, "s22Pa_nfc_tag": 1}]}
+{"timestamp": "2024-07-30 11:26:19.75", "measurements": [{"station": "HYGIENE_STATION", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_tag": 1}]}
+{"timestamp": "2024-07-30 11:26:20.28", "measurements": [{"station": "HYGIENE_STATION", "s23xq_load_cell_weight": 7, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_tag": 1}]}
+{"timestamp": "2024-07-30 11:26:20.81", "measurements": [{"station": "HYGIENE_STATION", "s23xq_load_cell_weight": 946, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_tag": 1}]}
+{"timestamp": "2024-07-30 11:26:21.34", "measurements": [{"station": "HYGIENE_STATION", "s23xq_load_cell_weight": 928, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_tag": 1}]}
+{"timestamp": "2024-07-30 11:26:21.86", "measurements": [{"station": "HYGIENE_STATION", "s23xq_load_cell_weight": 39, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_tag": 1}]}
+{"timestamp": "2024-07-30 11:26:22.40", "measurements": [{"station": "HYGIENE_STATION", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_tag": 1}]}
+{"timestamp": "2024-07-30 11:26:22.93", "measurements": [{"station": "HYGIENE_STATION", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_tag": 1}]}
+{"timestamp": "2024-07-30 11:26:23.50", "measurements": [{"station": "HYGIENE_STATION", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_tag": 1}]}
diff --git a/tests/local_input_mocks/real_hc_scenario/assert/Take Out Samples/app.siddhi b/tests/local_input_mocks/real_hc_scenario/assert/Take Out Samples/app.siddhi
new file mode 100644
index 0000000..8dd42e4
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/assert/Take Out Samples/app.siddhi
@@ -0,0 +1,121 @@
+@App:name('DetectTakeOutSamplesApp')
+
+@source(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION.Take Out Samples', topic = 'mockpref/HYGIENE_STATION', username = 'mockuser', password = 'mockpw',
+@map(type = 'json', @attributes(timestamp = '$.timestamp', SeG_ir_long_distance = '$.SeG_ir_long_distance', s22Pa_nfc_status = '$.s22Pa_nfc_status', s22Pa_nfc_tag = '$.s22Pa_nfc_tag', s23UU_button_state = '$.s23UU_button_state', s23xq_load_cell_weight = '$.s23xq_load_cell_weight')))
+define stream HYGIENE_STATIONStream(timestamp string, SeG_ir_long_distance float, s22Pa_nfc_status int, s22Pa_nfc_tag int, s23UU_button_state int, s23xq_load_cell_weight int);
+
+define stream HYGIENE_STATIONStreamDisc(timestamp string, SeG_ir_long_distance string, s22Pa_nfc_status int, s22Pa_nfc_tag int, s23UU_button_state int, s23xq_load_cell_weight string);
+
+@source(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.LEFT_DONATION.Take Out Samples', topic = 'mockpref/LEFT_DONATION', username = 'mockuser', password = 'mockpw',
+@map(type = 'json', @attributes(timestamp = '$.timestamp', Sj7_motion_status = '$.Sj7_motion_status', TGJ_ir_short_distance = '$.TGJ_ir_short_distance', VDY_accel_z = '$.VDY_accel_z', VMM_button_l_pressed = '$.VMM_button_l_pressed', VMM_button_r_pressed = '$.VMM_button_r_pressed', s22P4_nfc_status = '$.s22P4_nfc_status', s22P4_nfc_tag = '$.s22P4_nfc_tag', s23V3_button_state = '$.s23V3_button_state', s25JW_ambient_light_illuminance = '$.s25JW_ambient_light_illuminance')))
+define stream LEFT_DONATIONStream(timestamp string, Sj7_motion_status int, TGJ_ir_short_distance float, VDY_accel_z int, VMM_button_l_pressed int, VMM_button_r_pressed int, s22P4_nfc_status int, s22P4_nfc_tag int, s23V3_button_state int, s25JW_ambient_light_illuminance float);
+
+define stream LEFT_DONATIONStreamDisc(timestamp string, Sj7_motion_status int, TGJ_ir_short_distance string, VDY_accel_z string, VMM_button_l_pressed int, VMM_button_r_pressed int, s22P4_nfc_status int, s22P4_nfc_tag int, s23V3_button_state int, s25JW_ambient_light_illuminance string);
+
+@sink(type = 'log', prefix = 'LowLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION-LEFT_DONATION.Take Out Samples.ll', topic = 'ActivityEvents/LowLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedLowLevelActivityEvents(event string, activity string, ts_first string, ts_second string, ll_pattern_num int);
+
+@sink(type = 'log', prefix = 'HighLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION-LEFT_DONATION.Take Out Samples.hl', topic = 'ActivityEvents/HighLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedHighLevelActivityEvents(event string, next_pattern string, activity string, ts_first string, ts_second string);
+
+@sink(type = 'log', prefix = 'InstanceLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION-LEFT_DONATION.Take Out Samples.il.start', topic = 'DefaultBase/DefaultSource/DefaultCase/Take Out Samples', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"start","time:timestamp":"{{ts_start}}", "detection:type": "{{detection_type}}"}""")))
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.HYGIENE_STATION-LEFT_DONATION.Take Out Samples.il.complete', topic = 'DefaultBase/DefaultSource/DefaultCase/Take Out Samples', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload("""{"lifecycle:transition":"complete","time:timestamp":"{{ts_end}}", "detection:type": "{{detection_type}}"}""")))
+define Stream DetectedInstanceLevelActivities(activity string, detection_type string, ts_start string, ts_start_unix long, ts_end string, ts_end_unix long);
+
+@info(name = 'HYGIENE_STATIONDiscSourceMapper')
+from HYGIENE_STATIONStream
+select timestamp as timestamp, ifThenElse(SeG_ir_long_distance < 50.0, 'low', ifThenElse(SeG_ir_long_distance >= 50.0 and SeG_ir_long_distance <= 120.0, 'medium', ifThenElse(SeG_ir_long_distance > 120.0, 'high', 'ERROR'))) as SeG_ir_long_distance, s22Pa_nfc_status as s22Pa_nfc_status, s22Pa_nfc_tag as s22Pa_nfc_tag, s23UU_button_state as s23UU_button_state, ifThenElse(s23xq_load_cell_weight <= 300.0, 'low', ifThenElse(s23xq_load_cell_weight > 300.0, 'high', 'ERROR')) as s23xq_load_cell_weight
+insert into HYGIENE_STATIONStreamDisc;
+
+@info(name = 'LEFT_DONATIONDiscSourceMapper')
+from LEFT_DONATIONStream
+select timestamp as timestamp, Sj7_motion_status as Sj7_motion_status, ifThenElse(TGJ_ir_short_distance <= 10.5, 'low', ifThenElse(TGJ_ir_short_distance > 10.5 and TGJ_ir_short_distance <= 20.0, 'medium', ifThenElse(TGJ_ir_short_distance > 20.0, 'high', 'ERROR'))) as TGJ_ir_short_distance, ifThenElse(VDY_accel_z < -7000.0, 'direction1', ifThenElse(VDY_accel_z >= -7000.0 and VDY_accel_z <= -5000.0, 'baseline', ifThenElse(VDY_accel_z > -5000.0, 'direction2', 'ERROR'))) as VDY_accel_z, VMM_button_l_pressed as VMM_button_l_pressed, VMM_button_r_pressed as VMM_button_r_pressed, s22P4_nfc_status as s22P4_nfc_status, s22P4_nfc_tag as s22P4_nfc_tag, s23V3_button_state as s23V3_button_state, ifThenElse(s25JW_ambient_light_illuminance < 190.0, 'low', ifThenElse(s25JW_ambient_light_illuminance >= 190.0 and s25JW_ambient_light_illuminance <= 350.0, 'medium', ifThenElse(s25JW_ambient_light_illuminance > 350.0, 'high', 'ERROR'))) as s25JW_ambient_light_illuminance
+insert into LEFT_DONATIONStreamDisc;
+
+@info(name="HighToLow-Helper")
+from every e1 = DetectedLowLevelActivityEvents, e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= e2.ll_pattern_num]
+select "HighToLow" as event
+insert into HelperStream;
+
+@info(name="Detect-PartLowLevel-Pattern-1-HYGIENE_STATION")
+from every e1 = HYGIENE_STATIONStreamDisc, e2 = HYGIENE_STATIONStreamDisc[(e1.SeG_ir_long_distance == 'low' and e2.SeG_ir_long_distance == 'medium')]
+select "PartLowLevel-Pattern-1-HYGIENE_STATION" as event, "Take Out Samples" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 1 as ll_pattern_num
+insert into PartLowLevelPatternHYGIENE_STATIONEvents;
+
+@info(name="Detect-PartLowLevel-Pattern-1-LEFT_DONATION")
+from every e1 = LEFT_DONATIONStreamDisc, e2 = LEFT_DONATIONStreamDisc[(e1.VDY_accel_z == 'baseline' and e2.VDY_accel_z == 'direction1')]
+select "PartLowLevel-Pattern-1-LEFT_DONATION" as event, "Take Out Samples" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 1 as ll_pattern_num
+insert into PartLowLevelPatternLEFT_DONATIONEvents;
+
+@info(name="Detect-LowLevel-Pattern-1")
+from every (eHYGIENE_STATION = PartLowLevelPatternHYGIENE_STATIONEvents[ll_pattern_num == 1] and eLEFT_DONATION = PartLowLevelPatternLEFT_DONATIONEvents[ll_pattern_num == 1]) within 166667 milliseconds
+select "LowLevel-Pattern-1" as event, "Take Out Samples" as activity, ifThenElse(time:timestampInMilliseconds(eHYGIENE_STATION.ts_first, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(eLEFT_DONATION.ts_first, 'yyyy-MM-dd HH:mm:ss.SS'), eHYGIENE_STATION.ts_first, eLEFT_DONATION.ts_first) as ts_first, ifThenElse(time:timestampInMilliseconds(eHYGIENE_STATION.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') > time:timestampInMilliseconds(eLEFT_DONATION.ts_second, 'yyyy-MM-dd HH:mm:ss.SS'), eHYGIENE_STATION.ts_second, eLEFT_DONATION.ts_second) as ts_second, 1 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-1")
+from DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"]
+select "HighLevel-Pattern-1" as event, "LowLevel-Pattern-2" as next_pattern, "Take Out Samples" as activity, ts_first, ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-2")
+from every e1 = LEFT_DONATIONStreamDisc, e2 = LEFT_DONATIONStreamDisc[(e1.VDY_accel_z=='direction1' and e2.VDY_accel_z=='direction2')]
+select "LowLevel-Pattern-2" as event, "Take Out Samples" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 2 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-2")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-2" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-2" as event, "LowLevel-Pattern-3" as next_pattern, "Take Out Samples" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-AllHighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-2"]
+select "Take Out Samples" as activity, "AllHighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-First50HighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"]
+select "Take Out Samples" as activity, "First50HighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e1.ts_second as ts_end, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-FirstLastLowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-2"]
+select "Take Out Samples" as activity, "FirstLastLowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents
+select "Take Out Samples" as activity, "Any25LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e1.ts_second as ts_end, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any25LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Take Out Samples" as activity, "Any25LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents
+select "Take Out Samples" as activity, "Any50LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e1.ts_second as ts_end, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any50LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Take Out Samples" as activity, "Any50LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity-Startup")
+from e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Take Out Samples" as activity, "Any75LowLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+
+@info(name="Detect-Any75LowLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedLowLevelActivityEvents,
+ e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= ll_pattern_num and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')],
+ e3 = DetectedLowLevelActivityEvents[e2.ll_pattern_num < ll_pattern_num and time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "Take Out Samples" as activity, "Any75LowLevelPattern" as detection_type, e2.ts_second as ts_start, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e3.ts_second as ts_end, time:timestampInMilliseconds(e3.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
diff --git a/tests/local_input_mocks/real_hc_scenario/assert/Take Out Samples/changes.jsonl b/tests/local_input_mocks/real_hc_scenario/assert/Take Out Samples/changes.jsonl
new file mode 100644
index 0000000..96e9903
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/assert/Take Out Samples/changes.jsonl
@@ -0,0 +1,2 @@
+{"timestamp":"2024-07-30 11:28:51.69","changes":[{"station":"HYGIENE_STATION","sensor":"SeG_ir_long_distance","prev_value":"low","value":"medium"}, {"station": "LEFT_DONATION", "sensor": "VDY_accel_z", "prev_value": "baseline", "value": "direction1"}]}
+{"timestamp":"2024-07-30 11:28:52.51","changes":[{"station": "LEFT_DONATION", "sensor": "VDY_accel_z", "prev_value": "direction1", "value": "direction2"}]}
\ No newline at end of file
diff --git a/tests/local_input_mocks/real_hc_scenario/assert/Take Out Samples/takoutsamp1/signature.jsonl b/tests/local_input_mocks/real_hc_scenario/assert/Take Out Samples/takoutsamp1/signature.jsonl
new file mode 100644
index 0000000..06e9660
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/assert/Take Out Samples/takoutsamp1/signature.jsonl
@@ -0,0 +1,6 @@
+{"timestamp": "2024-07-30 11:28:50.38", "measurements": [{"station":"HYGIENE_STATION", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 31.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1}, {"station":"LEFT_DONATION", "s25JW_ambient_light_illuminance": 571.67, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_z": -6261}]}
+{"timestamp": "2024-07-30 11:28:50.91", "measurements": [{"station":"HYGIENE_STATION", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 40.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1}, {"station":"LEFT_DONATION", "s25JW_ambient_light_illuminance": 569.76, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_z": -6269}]}
+{"timestamp": "2024-07-30 11:28:51.45", "measurements": [{"station":"LEFT_DONATION", "s25JW_ambient_light_illuminance": 557.6, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_z": -6297}]}
+{"timestamp": "2024-07-30 11:28:51.69", "measurements": [{"station":"HYGIENE_STATION", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 74.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1}, {"station": "LEFT_DONATION", "s25JW_ambient_light_illuminance": 540.21, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_z": -10346}]}
+{"timestamp": "2024-07-30 11:28:52.00", "measurements": [{"station":"HYGIENE_STATION", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 73.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1}]}
+{"timestamp": "2024-07-30 11:28:52.51", "measurements": [{"station":"HYGIENE_STATION", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 73.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1}, {"station":"LEFT_DONATION", "s25JW_ambient_light_illuminance": 534.97, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_z": -1057}]}
\ No newline at end of file
diff --git a/tests/local_input_mocks/real_hc_scenario/in/anno_params.csv b/tests/local_input_mocks/real_hc_scenario/in/anno_params.csv
new file mode 100644
index 0000000..8ec8fe4
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/in/anno_params.csv
@@ -0,0 +1,3 @@
+annotation_id,activity_name,start,end,stations
+handhyg1,"Hand Hygiene",2024-07-30 11:26:19.00,2024-07-30 11:26:24.00,HYGIENE_STATION
+takoutsamp1,"Take Out Samples",2024-07-30 11:28:50.00,2024-07-30 11:28:53.00,HYGIENE_STATION-LEFT_DONATION
diff --git a/tests/local_input_mocks/real_hc_scenario/in/discr_mapping.csv b/tests/local_input_mocks/real_hc_scenario/in/discr_mapping.csv
new file mode 100644
index 0000000..d48a193
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/in/discr_mapping.csv
@@ -0,0 +1,21 @@
+sensor,source,target
+s23xq_load_cell_weight,<=300,low
+s23xq_load_cell_weight,>300,high
+TGJ_ir_short_distance,<=10.5,low
+TGJ_ir_short_distance,"]10.5,20]",medium
+TGJ_ir_short_distance,">20",high
+s25JW_ambient_light_illuminance,<190,low
+s25JW_ambient_light_illuminance,"[190,350]",medium
+s25JW_ambient_light_illuminance,>350,high
+SeG_ir_long_distance,>120,high
+SeG_ir_long_distance,"[50,120]",medium
+SeG_ir_long_distance,<50,low
+VDY_accel_x,"[7000,8000]",baseline
+VDY_accel_x,>8000,direction1
+VDY_accel_x,<7000,direction2
+VDY_accel_z,"[-7000,-5000]",baseline
+VDY_accel_z,<-7000,direction1
+VDY_accel_z,>-5000,direction2
+VDY_accel_y,"[-700,-300]",baseline
+VDY_accel_y,<-700,direction1
+VDY_accel_y,>-300,direction2
\ No newline at end of file
diff --git a/tests/local_input_mocks/real_hc_scenario/in/ignore_sensors.json b/tests/local_input_mocks/real_hc_scenario/in/ignore_sensors.json
new file mode 100644
index 0000000..3623c0b
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/in/ignore_sensors.json
@@ -0,0 +1,17 @@
+{
+ "general": [
+ "X2n_air_quality_air_pressure",
+ "X2n_air_quality_humidity"
+ ],
+ "Hand Hygiene": [
+ "X2n_air_quality_temp",
+ "air_quality_iaq",
+ "s22Pa_nfc_status"
+ ],
+ "Take Out Samples": [
+ "X2n_air_quality_temp",
+ "air_quality_iaq",
+ "VDY_accel_x",
+ "VDY_accel_y"
+ ]
+}
\ No newline at end of file
diff --git a/tests/local_input_mocks/real_hc_scenario/in/timeseries.jsonl b/tests/local_input_mocks/real_hc_scenario/in/timeseries.jsonl
new file mode 100644
index 0000000..e8a3809
--- /dev/null
+++ b/tests/local_input_mocks/real_hc_scenario/in/timeseries.jsonl
@@ -0,0 +1,1134 @@
+{"id": "314332a8-7585-4dd0-a5b4-0b600d00ef21", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:25:57.94", "s25JW_ambient_light_illuminance": 606.87, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7564, "VDY_accel_y": -454, "VDY_accel_z": -6187}
+{"id": "e2d63bd9-d890-42c6-965e-f3ce8b5d09c7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:25:57.94", "s25JU_ambient_light_illuminance": 72.54, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 0, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9394, "VEg_accel_y": 712, "VEg_accel_z": -2365}
+{"id": "2fc8bc61-9ce8-4b34-adbb-576e06a11280", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:25:57.95", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 87.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 0, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.8}
+{"id": "0431bdcd-7033-4b3a-b910-8d6754ede0c3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:25:58.46", "s25JW_ambient_light_illuminance": 607.08, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7565, "VDY_accel_y": -466, "VDY_accel_z": -6209}
+{"id": "be3cfe19-0257-4081-b6c6-4c927ac237b4", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:25:58.47", "s25JU_ambient_light_illuminance": 72.46, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 0, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9392, "VEg_accel_y": 695, "VEg_accel_z": -2327}
+{"id": "f2e043ae-7671-4b35-bad6-0dcd52864885", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:25:58.48", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 88.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 0, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.8}
+{"id": "8c26cd49-f557-428a-af3b-89b5b45c68e5", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:25:58.99", "s25JW_ambient_light_illuminance": 605.36, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7553, "VDY_accel_y": -491, "VDY_accel_z": -6130}
+{"id": "1ea40db8-d328-4321-a3b7-0e99a7a15d1a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:25:59.01", "s25JU_ambient_light_illuminance": 72.02, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9382, "VEg_accel_y": 717, "VEg_accel_z": -2296}
+{"id": "f81e40fc-4f02-46b5-9464-c5b6dd1b1d46", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:25:59.01", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 80.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 0, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.8}
+{"id": "de966f69-cace-4f02-a73d-9e6cf00e0e1f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:25:59.53", "s25JW_ambient_light_illuminance": 607.66, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7567, "VDY_accel_y": -479, "VDY_accel_z": -6213}
+{"id": "1beaac7c-ad62-4e45-9555-2e26a3ed6d0e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:25:59.54", "s25JU_ambient_light_illuminance": 72.46, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9401, "VEg_accel_y": 704, "VEg_accel_z": -2246}
+{"id": "d9041a4c-4911-467f-a71c-8e464adfb941", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:25:59.54", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 0, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "d116af35-3e58-4e6d-896e-29350de0d1e6", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:00.06", "s25JW_ambient_light_illuminance": 608.31, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7551, "VDY_accel_y": -521, "VDY_accel_z": -6146}
+{"id": "2b7bb324-5a19-404c-9c6e-c80f8b24bacd", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:00.07", "s25JU_ambient_light_illuminance": 75.7, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9426, "VEg_accel_y": 745, "VEg_accel_z": -2260}
+{"id": "460c2a6c-426b-4635-86dd-f72569ae2316", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:00.08", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 60.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "c7553d1b-95d5-4ab2-8c71-1e0c936be0cc", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:00.59", "s25JW_ambient_light_illuminance": 611.52, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7559, "VDY_accel_y": -478, "VDY_accel_z": -6190}
+{"id": "9e8bd8ea-a5bb-4d05-8383-20a19de08b07", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:00.60", "s25JU_ambient_light_illuminance": 77.12, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9439, "VEg_accel_y": 654, "VEg_accel_z": -2309}
+{"id": "38a244c6-d8a3-45e5-ac36-db6d9ca5dc3d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:00.61", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "1504f84f-5e5b-4cf9-82b3-b0550cc77c1d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:01.12", "s25JW_ambient_light_illuminance": 610.22, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7546, "VDY_accel_y": -455, "VDY_accel_z": -6186}
+{"id": "03e011fc-0abd-46c5-88bd-f033ff1d7697", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:01.13", "s25JU_ambient_light_illuminance": 75.63, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9428, "VEg_accel_y": 701, "VEg_accel_z": -2282}
+{"id": "ae64416e-46c3-407e-9f5c-47ca185f0876", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:01.15", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "5e90e06d-eb15-4bb6-ae59-ec18a07f3dca", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:01.66", "s25JW_ambient_light_illuminance": 608.57, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7566, "VDY_accel_y": -480, "VDY_accel_z": -6145}
+{"id": "c4af8962-6dfe-48a8-a3bd-4b6ef442549a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:01.68", "s25JU_ambient_light_illuminance": 76.62, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9428, "VEg_accel_y": 716, "VEg_accel_z": -2297}
+{"id": "4869b40b-5d6f-4b8a-8983-e6c58057cd41", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:01.68", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "4a41eda5-fc34-44a2-bc0b-fc6be90d76bc", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:02.19", "s25JW_ambient_light_illuminance": 605.45, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7568, "VDY_accel_y": -443, "VDY_accel_z": -6150}
+{"id": "de5cf6a7-7348-4422-8385-f7dd5f0cabea", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:02.20", "s25JU_ambient_light_illuminance": 66.89, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9390, "VEg_accel_y": 702, "VEg_accel_z": -2223}
+{"id": "c5fdc1ee-0e01-4dfb-b7b6-19628020be75", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:02.21", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "f1d8dd76-0dc7-4fc7-b266-388ffae6d6e3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:02.72", "s25JW_ambient_light_illuminance": 598.33, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7540, "VDY_accel_y": -454, "VDY_accel_z": -6163}
+{"id": "17bbf38a-d9c4-48af-a1b9-d03582e1c600", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:02.73", "s25JU_ambient_light_illuminance": 58.88, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9414, "VEg_accel_y": 709, "VEg_accel_z": -2290}
+{"id": "ff483075-6bf4-40ea-a108-a7bbda21c77a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:02.74", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "1d6f734c-ef77-4580-abe3-56b47f79e1b3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:03.25", "s25JW_ambient_light_illuminance": 563.47, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7561, "VDY_accel_y": -455, "VDY_accel_z": -6193}
+{"id": "56ae8ccd-35b0-47f7-ba40-da33db1d6be6", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:03.26", "s25JU_ambient_light_illuminance": 54.09, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9432, "VEg_accel_y": 686, "VEg_accel_z": -2268}
+{"id": "3313dc82-ff22-4d1c-8a03-ad19c921f692", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:03.27", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "ff8eb3e7-421b-47cc-b762-38e222906308", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:03.78", "s25JW_ambient_light_illuminance": 534.72, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7563, "VDY_accel_y": -516, "VDY_accel_z": -6160}
+{"id": "70529dd1-975c-409d-ab6d-af34f9fda0e8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:03.79", "s25JU_ambient_light_illuminance": 58.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9443, "VEg_accel_y": 676, "VEg_accel_z": -2276}
+{"id": "f594da56-39bd-4b4a-99e3-8f8eacf06a34", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:03.80", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "5b40d6d4-76b7-4dae-a8d7-aa4ddebbe7fb", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:04.31", "s25JW_ambient_light_illuminance": 518.68, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7567, "VDY_accel_y": -446, "VDY_accel_z": -6150}
+{"id": "6c06d9b2-5343-486f-ba91-0197e2881911", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:04.32", "s25JU_ambient_light_illuminance": 59.97, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9429, "VEg_accel_y": 707, "VEg_accel_z": -2286}
+{"id": "30accb6b-d07b-4b0b-b33f-a258e50b4d83", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:04.33", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 66.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "e37768ee-25a3-4ae4-ad2b-816cd4c5a70d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:04.84", "s25JW_ambient_light_illuminance": 523.01, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7571, "VDY_accel_y": -462, "VDY_accel_z": -6151}
+{"id": "30892931-3a17-478b-8683-12150e1df779", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:04.85", "s25JU_ambient_light_illuminance": 58.87, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9406, "VEg_accel_y": 726, "VEg_accel_z": -2240}
+{"id": "1af17868-81d5-46ba-93f4-099c2983aa2a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:04.86", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "30cd179e-1391-4616-ad73-85bcbe35ec85", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:05.37", "s25JW_ambient_light_illuminance": 513.7, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7568, "VDY_accel_y": -466, "VDY_accel_z": -6168}
+{"id": "5dc561f4-e3f4-4ecb-b234-b6635f3601c3", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:05.38", "s25JU_ambient_light_illuminance": 59.94, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9434, "VEg_accel_y": 682, "VEg_accel_z": -2300}
+{"id": "b286b8be-19c0-4a21-add8-70ab5e1e2679", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:05.39", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 67.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.81}
+{"id": "b7579672-b8aa-467d-a355-8ecb1c6146f1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:05.90", "s25JW_ambient_light_illuminance": 543.44, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7562, "VDY_accel_y": -493, "VDY_accel_z": -6199}
+{"id": "4396108c-b0bf-4b96-b589-ff5bf9d2c2f1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:05.91", "s25JU_ambient_light_illuminance": 60.16, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9392, "VEg_accel_y": 738, "VEg_accel_z": -2288}
+{"id": "e0cfbda6-863c-465e-b0fc-2dbe379fd070", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:05.92", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.81}
+{"id": "f043aa98-a490-4108-837c-5c30b0207236", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:06.43", "s25JW_ambient_light_illuminance": 533.57, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7530, "VDY_accel_y": -493, "VDY_accel_z": -6175}
+{"id": "68d5ed18-3713-4fb4-8bc8-5888dc9bc45f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:06.44", "s25JU_ambient_light_illuminance": 63.92, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9422, "VEg_accel_y": 757, "VEg_accel_z": -2253}
+{"id": "a0fcbcec-38fb-48fb-a523-e4e597b3a64a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:06.45", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 73.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.81}
+{"id": "b3bc819a-d2d5-4b72-9077-c0e1899645b0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:06.96", "s25JW_ambient_light_illuminance": 458.33, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 28.4, "s23V3_button_state": 0, "VDY_accel_x": 7558, "VDY_accel_y": -453, "VDY_accel_z": -6203}
+{"id": "a46ad976-068a-4261-80f3-db9f524e8d7f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:06.97", "s25JU_ambient_light_illuminance": 76.62, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9423, "VEg_accel_y": 703, "VEg_accel_z": -2360}
+{"id": "433922d4-2a7e-4cc5-b077-0852a4901f33", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:06.98", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 73.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.81}
+{"id": "e421db60-09cc-4c5f-affc-19fa9e1c4fd5", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:07.49", "s25JW_ambient_light_illuminance": 345.0, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 20.2, "s23V3_button_state": 0, "VDY_accel_x": 7562, "VDY_accel_y": -516, "VDY_accel_z": -6126}
+{"id": "9b7c1463-509d-420d-bcdd-fec0c7ff70da", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:07.51", "s25JU_ambient_light_illuminance": 77.71, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 686, "VEg_accel_z": -2254}
+{"id": "0d56d016-3319-41df-99ba-902ed02ee2db", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:07.51", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 71.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.81}
+{"id": "cfefbfca-661e-4297-b1e0-b1f48232ebe7", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:08.02", "s25JW_ambient_light_illuminance": 323.64, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7545, "VDY_accel_y": -499, "VDY_accel_z": -6174}
+{"id": "dce5e88c-0294-4bbd-a54e-4506c7f07e3b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:08.03", "s25JU_ambient_light_illuminance": 78.55, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9476, "VEg_accel_y": 725, "VEg_accel_z": -2334}
+{"id": "35a840a4-55c4-444c-a8e7-ff9a49d97783", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:08.04", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 68.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.81}
+{"id": "2b7ea3ac-9d11-4170-9f9d-f59008bc8554", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:08.56", "s25JW_ambient_light_illuminance": 364.36, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7567, "VDY_accel_y": -492, "VDY_accel_z": -6156}
+{"id": "e62f3d24-32c5-40ee-b1f2-0cea70e02aab", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:08.57", "s25JU_ambient_light_illuminance": 78.96, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9416, "VEg_accel_y": 719, "VEg_accel_z": -2263}
+{"id": "4e3c5127-365e-425e-bceb-42f24c7e2b11", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:08.57", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 68.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "6c4594ee-7ad7-4e8b-9f30-90f2f26b0ff0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:09.09", "s25JW_ambient_light_illuminance": 366.17, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7546, "VDY_accel_y": -426, "VDY_accel_z": -6142}
+{"id": "18a38b42-a846-4b13-9121-c2df4de0dc8f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:09.10", "s25JU_ambient_light_illuminance": 78.5, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9440, "VEg_accel_y": 692, "VEg_accel_z": -2333}
+{"id": "4f838b6e-52db-44bb-b374-126c18cc6781", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:09.10", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 68.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "9ff6667f-69db-4481-8d7a-4c1f113f62ef", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:09.62", "s25JW_ambient_light_illuminance": 308.94, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 26.7, "s23V3_button_state": 0, "VDY_accel_x": 7555, "VDY_accel_y": -444, "VDY_accel_z": -6146}
+{"id": "02728012-4a43-4267-b8bd-1b322c6665cd", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:09.64", "s25JU_ambient_light_illuminance": 77.1, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9419, "VEg_accel_y": 623, "VEg_accel_z": -2280}
+{"id": "97f597c3-1a26-40a4-8491-55835d22be98", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:09.64", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 67.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "52dbc93d-e08f-431c-b56e-e9903ffea253", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:10.16", "s25JW_ambient_light_illuminance": 10.63, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.2, "s23V3_button_state": 0, "VDY_accel_x": 7669, "VDY_accel_y": -489, "VDY_accel_z": -6165}
+{"id": "2bb03243-c533-41b9-b199-f86fa8dff41a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:10.17", "s25JU_ambient_light_illuminance": 76.06, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9562, "VEg_accel_y": 559, "VEg_accel_z": -2435}
+{"id": "252756d9-a920-456e-ab60-233b1f2cfaf3", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:10.18", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 71.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "c33f02ad-f7dd-4de6-b2ae-0faa3163afb6", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:10.69", "s25JW_ambient_light_illuminance": 11.15, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7602, "VDY_accel_y": -501, "VDY_accel_z": -6115}
+{"id": "85174f2f-07a9-4171-97c2-6201456b0852", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:10.70", "s25JU_ambient_light_illuminance": 76.68, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9455, "VEg_accel_y": 619, "VEg_accel_z": -2283}
+{"id": "55fcb883-26ed-46ce-9f9a-73eb481a6278", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:10.71", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 75.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "a55d7dd9-d195-4f94-a462-eff046b671c1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:11.22", "s25JW_ambient_light_illuminance": 12.11, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7547, "VDY_accel_y": -482, "VDY_accel_z": -6114}
+{"id": "1cbabbfa-151a-4dbe-875c-b39e7e611108", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:11.23", "s25JU_ambient_light_illuminance": 77.17, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9428, "VEg_accel_y": 677, "VEg_accel_z": -2299}
+{"id": "9e03d1c8-6d4b-4d8f-a201-e26303aebee1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:11.24", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 73.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.81}
+{"id": "90eef2a2-8373-470d-8bf6-eadde5643310", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:11.75", "s25JW_ambient_light_illuminance": 12.27, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7577, "VDY_accel_y": -467, "VDY_accel_z": -6149}
+{"id": "7592a48d-0b78-4449-8941-ae214449c0d6", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:11.76", "s25JU_ambient_light_illuminance": 78.08, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9433, "VEg_accel_y": 720, "VEg_accel_z": -2299}
+{"id": "44addfd3-2886-4725-9ae2-76a5aef7b69e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:11.77", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 68.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.81}
+{"id": "5750f1b4-023d-4e9b-891e-6fbbf14d2d0f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:12.28", "s25JW_ambient_light_illuminance": 11.69, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7556, "VDY_accel_y": -432, "VDY_accel_z": -6161}
+{"id": "9eb9d56e-6ef3-4125-815d-e213e4539e4a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:12.29", "s25JU_ambient_light_illuminance": 74.77, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9403, "VEg_accel_y": 759, "VEg_accel_z": -2315}
+{"id": "15cd33b1-2053-488f-a56c-5ceb7333ff35", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:12.29", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 78.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.81}
+{"id": "50f4d517-d9da-4fc5-ae6d-130ecb922ebd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:12.80", "s25JW_ambient_light_illuminance": 12.76, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7544, "VDY_accel_y": -505, "VDY_accel_z": -6111}
+{"id": "eb9fcef6-641e-4a80-a1d7-cab4df89fa53", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:12.81", "s25JU_ambient_light_illuminance": 75.71, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9411, "VEg_accel_y": 745, "VEg_accel_z": -2338}
+{"id": "01d65709-dc51-43c7-8432-c95e8b3584ca", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:12.82", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 56.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.81}
+{"id": "6b720bf0-3667-4147-8cff-b692ed6263c6", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:13.33", "s25JW_ambient_light_illuminance": 11.36, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7548, "VDY_accel_y": -467, "VDY_accel_z": -6143}
+{"id": "eceb6868-e081-4706-8c74-f8a9dd1ecd5b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:13.34", "s25JU_ambient_light_illuminance": 53.53, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9378, "VEg_accel_y": 700, "VEg_accel_z": -2352}
+{"id": "ed883a79-42f2-4f08-a815-9b651dfacf04", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:13.35", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 28.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.81}
+{"id": "970c0aec-d421-4c23-8420-449602703a5c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:13.86", "s25JW_ambient_light_illuminance": 11.01, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7551, "VDY_accel_y": -497, "VDY_accel_z": -6169}
+{"id": "4c35b4bc-5ae7-4ce6-bc28-8eba82eded4c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:13.87", "s25JU_ambient_light_illuminance": 52.29, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 674, "VEg_accel_z": -2304}
+{"id": "e1d05f50-ac6a-433a-99fe-f81b6f7816ed", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:13.88", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.81}
+{"id": "4793ce3e-0d43-4c2f-af22-2d6b8cd0fcd9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:14.39", "s25JW_ambient_light_illuminance": 11.33, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7555, "VDY_accel_y": -454, "VDY_accel_z": -6117}
+{"id": "7300b98c-1d92-4414-bf01-47dbacc546fc", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:14.40", "s25JU_ambient_light_illuminance": 51.51, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9433, "VEg_accel_y": 739, "VEg_accel_z": -2296}
+{"id": "bcefd0a9-4687-47f1-97b4-c03bf3cac6ca", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:14.41", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "a4d55f05-6066-44e1-9c29-ca3d4f69e6ee", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:14.92", "s25JW_ambient_light_illuminance": 11.14, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7598, "VDY_accel_y": -497, "VDY_accel_z": -6116}
+{"id": "ad18ef6a-22ec-4275-9b57-36d7fd400efb", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:14.93", "s25JU_ambient_light_illuminance": 50.79, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9430, "VEg_accel_y": 742, "VEg_accel_z": -2277}
+{"id": "f6dc5f98-9da3-4eb3-8678-618ff538e0b1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:14.94", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "a35195d8-bbf9-4c70-9fb8-2f11e24a90cf", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:15.45", "s25JW_ambient_light_illuminance": 11.14, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7556, "VDY_accel_y": -468, "VDY_accel_z": -6119}
+{"id": "a9ee2fd5-bc4d-461e-b00a-49e70fb8a0a2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:15.46", "s25JU_ambient_light_illuminance": 50.59, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9461, "VEg_accel_y": 728, "VEg_accel_z": -2293}
+{"id": "c364040d-90f8-4427-ae7a-9405f4109163", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:15.47", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "63456b16-cf85-4668-9f94-61d2876e20a5", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:15.98", "s25JW_ambient_light_illuminance": 11.5, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7558, "VDY_accel_y": -436, "VDY_accel_z": -6091}
+{"id": "39ec149f-12dd-47c7-b9c1-09d6617fa259", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:15.99", "s25JU_ambient_light_illuminance": 51.42, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9406, "VEg_accel_y": 704, "VEg_accel_z": -2290}
+{"id": "fc84bdce-1bdd-4a79-b8d4-c5c0142a93af", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:15.99", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "4c4bca05-bd6a-439b-9276-7fbfda42c169", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:16.50", "s25JW_ambient_light_illuminance": 10.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7558, "VDY_accel_y": -434, "VDY_accel_z": -6072}
+{"id": "a10b9e80-dbc2-4138-bc75-20721385049a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:16.52", "s25JU_ambient_light_illuminance": 51.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9412, "VEg_accel_y": 770, "VEg_accel_z": -2314}
+{"id": "26486979-c848-4812-bb79-85412ee3c9c8", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:16.53", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "902ea780-33b4-4012-94b7-ab6e49d661e5", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:17.04", "s25JW_ambient_light_illuminance": 11.14, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7584, "VDY_accel_y": -516, "VDY_accel_z": -6213}
+{"id": "ceaaf00b-4e5d-4cc0-9b3e-37ff7ad15ade", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:17.06", "s25JU_ambient_light_illuminance": 52.68, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9474, "VEg_accel_y": 653, "VEg_accel_z": -2410}
+{"id": "73dad1b6-17f3-41e6-a52e-a33c6253abac", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:17.06", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 22.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "22732d23-df9d-4ef5-9f45-d8be35680d44", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:17.57", "s25JW_ambient_light_illuminance": 10.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7572, "VDY_accel_y": -438, "VDY_accel_z": -6152}
+{"id": "1e423c9a-2358-48ec-8e33-05d9f1407e1a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:17.58", "s25JU_ambient_light_illuminance": 52.65, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 727, "VEg_accel_z": -2276}
+{"id": "105f41c8-33c6-4a6e-ab0e-dca3bb1c9edd", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:17.59", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "b490e28c-3af6-4a54-920a-eb813ed4328a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:18.10", "s25JW_ambient_light_illuminance": 10.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7560, "VDY_accel_y": -473, "VDY_accel_z": -6161}
+{"id": "a06ae17f-30a8-4341-9dec-6d0472740ab7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:18.12", "s25JU_ambient_light_illuminance": 52.29, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9398, "VEg_accel_y": 703, "VEg_accel_z": -2239}
+{"id": "2285064e-79ca-4bbc-bbeb-4d8cbe478acb", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:18.12", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "de582d45-6786-4039-ab00-d4158cceaf70", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:18.63", "s25JW_ambient_light_illuminance": 11.33, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7574, "VDY_accel_y": -465, "VDY_accel_z": -6115}
+{"id": "368dd8d2-a4be-4145-8617-5bd3c069c7bb", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:18.64", "s25JU_ambient_light_illuminance": 52.35, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9454, "VEg_accel_y": 686, "VEg_accel_z": -2285}
+{"id": "3e7fc4a4-fa75-42ba-ac9c-37ccf8a1e83b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:18.66", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 31.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "bbea827d-b6ed-4e28-9240-1cc2204661d9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:19.18", "s25JW_ambient_light_illuminance": 11.33, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7528, "VDY_accel_y": -434, "VDY_accel_z": -6096}
+{"id": "22d6fbcd-88fc-42bb-88b4-4292290564ca", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:19.19", "s25JU_ambient_light_illuminance": 52.18, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9417, "VEg_accel_y": 761, "VEg_accel_z": -2268}
+{"id": "9332f6fc-42c3-4f87-a3dc-453e7c5d567a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:19.22", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 26.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "0bcba763-3245-4e25-a7a8-bd4f1b335cf0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:19.73", "s25JW_ambient_light_illuminance": 11.5, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7543, "VDY_accel_y": -462, "VDY_accel_z": -6140}
+{"id": "4c5b1d0f-274c-4aac-8b6b-32ea9ac9fd37", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:19.74", "s25JU_ambient_light_illuminance": 50.62, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 720, "VEg_accel_z": -2347}
+{"id": "a63b6a5d-952d-4aea-bef7-e4d1624608fa", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:19.75", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.79}
+{"id": "267d05ed-48c4-4ce0-8e71-6fa6baec3ab1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:20.26", "s25JW_ambient_light_illuminance": 10.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7543, "VDY_accel_y": -466, "VDY_accel_z": -6142}
+{"id": "9aeab368-4e8b-4e1d-8370-7a9bee4fc544", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:20.27", "s25JU_ambient_light_illuminance": 50.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9414, "VEg_accel_y": 679, "VEg_accel_z": -2289}
+{"id": "c410b2d0-58f3-4a56-8e25-06c0c09a0af7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:20.28", "s23xq_load_cell_weight": 7, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "a5d13483-d039-4cb8-b668-64580c31bc18", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:20.79", "s25JW_ambient_light_illuminance": 10.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7574, "VDY_accel_y": -469, "VDY_accel_z": -6127}
+{"id": "aa9454ec-b654-4466-80e6-21a66279a494", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:20.80", "s25JU_ambient_light_illuminance": 48.91, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9458, "VEg_accel_y": 678, "VEg_accel_z": -2373}
+{"id": "84442f58-700d-4594-9f1e-c01dba04def0", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:20.81", "s23xq_load_cell_weight": 946, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "9e45894c-6d4d-4659-9be8-3f9be33bc76b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:21.32", "s25JW_ambient_light_illuminance": 10.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7559, "VDY_accel_y": -487, "VDY_accel_z": -6164}
+{"id": "7810e2bd-c472-4a30-8409-87721a684e4b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:21.33", "s25JU_ambient_light_illuminance": 49.37, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9444, "VEg_accel_y": 758, "VEg_accel_z": -2249}
+{"id": "2a5ee039-829a-43cf-adc0-45ee3b113236", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:21.34", "s23xq_load_cell_weight": 928, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "268f6d6f-90fc-40e8-9063-322429e180cd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:21.85", "s25JW_ambient_light_illuminance": 10.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7554, "VDY_accel_y": -472, "VDY_accel_z": -6168}
+{"id": "d4f3a564-42f8-40b6-a549-7a49c64d5be1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:21.86", "s25JU_ambient_light_illuminance": 49.89, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9414, "VEg_accel_y": 734, "VEg_accel_z": -2324}
+{"id": "af0b304d-ae83-4aab-b430-c18ce8d75f0d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:21.86", "s23xq_load_cell_weight": 39, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "0e09ff1c-a15e-45aa-9657-6b06fe1aef85", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:22.38", "s25JW_ambient_light_illuminance": 10.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7556, "VDY_accel_y": -480, "VDY_accel_z": -6133}
+{"id": "ec963b6c-f1a1-4f68-9c01-6c8733f54bdd", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:22.39", "s25JU_ambient_light_illuminance": 50.75, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9428, "VEg_accel_y": 766, "VEg_accel_z": -2287}
+{"id": "4148751b-77a0-4cfc-bdcb-1420ab030567", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:22.40", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "cbc5cb21-104f-4473-888d-b34e79b0bc46", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:22.91", "s25JW_ambient_light_illuminance": 10.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7551, "VDY_accel_y": -505, "VDY_accel_z": -6168}
+{"id": "6713623e-8b66-4d89-8b85-a17151da41c8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:22.92", "s25JU_ambient_light_illuminance": 51.98, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9443, "VEg_accel_y": 723, "VEg_accel_z": -2268}
+{"id": "54f5814b-0c14-4b3f-950e-5bede6c2e83b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:22.93", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.82}
+{"id": "3048040c-bb5a-48b9-bd78-4edd24bdb8b9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:23.47", "s25JW_ambient_light_illuminance": 10.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7579, "VDY_accel_y": -488, "VDY_accel_z": -6126}
+{"id": "208ed7c9-2c2c-49f7-8de1-276f938d1d5c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:23.49", "s25JU_ambient_light_illuminance": 51.95, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9451, "VEg_accel_y": 712, "VEg_accel_z": -2316}
+{"id": "b52ec8ab-a326-4fa8-af84-e722c92b668d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:23.50", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.82}
+{"id": "a036e479-81d3-49c1-8947-bbac6cf790fc", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:24.01", "s25JW_ambient_light_illuminance": 10.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7556, "VDY_accel_y": -454, "VDY_accel_z": -6168}
+{"id": "a78eba57-b27a-4261-8a17-ed83aebb0b56", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:24.02", "s25JU_ambient_light_illuminance": 52.37, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9425, "VEg_accel_y": 708, "VEg_accel_z": -2267}
+{"id": "dce5b27b-2d71-4846-a92e-850a4e79eba6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:24.03", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.82}
+{"id": "ba2809d1-faf7-4d6f-9175-7ded8b6b4e55", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:24.54", "s25JW_ambient_light_illuminance": 10.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7575, "VDY_accel_y": -462, "VDY_accel_z": -6168}
+{"id": "85e8c526-daee-4e04-aabe-e6db9bf7f754", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:24.55", "s25JU_ambient_light_illuminance": 51.64, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9435, "VEg_accel_y": 744, "VEg_accel_z": -2277}
+{"id": "bf10921f-c3c2-4453-8eca-14d80445072b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:24.56", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 24.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.82}
+{"id": "6b433c1f-f600-4180-bcd7-84b7699f89a3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:25.08", "s25JW_ambient_light_illuminance": 10.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7560, "VDY_accel_y": -426, "VDY_accel_z": -6118}
+{"id": "30363f44-0497-4064-800a-588a2a05bd86", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:25.09", "s25JU_ambient_light_illuminance": 51.63, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9372, "VEg_accel_y": 729, "VEg_accel_z": -2279}
+{"id": "7a607e8f-9243-4d7d-8971-792cd4789a69", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:25.10", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 29.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.82}
+{"id": "c5547567-0eb5-4386-b1ca-03136d6558c7", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:25.63", "s25JW_ambient_light_illuminance": 10.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7539, "VDY_accel_y": -494, "VDY_accel_z": -6137}
+{"id": "9d7903e7-7d06-4851-bde4-e9dd5ed97f80", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:25.64", "s25JU_ambient_light_illuminance": 53.19, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9409, "VEg_accel_y": 729, "VEg_accel_z": -2244}
+{"id": "9fb72f4e-d32c-435f-b2d0-9f71f3fd0497", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:25.66", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 29.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.28, "X2n_air_quality_air_pressure": 942.82}
+{"id": "52bd4de1-a80e-46e6-9cc9-fc22c1c6f699", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:26.22", "s25JW_ambient_light_illuminance": 11.14, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7579, "VDY_accel_y": -501, "VDY_accel_z": -6101}
+{"id": "fbb724bc-ea26-4452-b604-de627e6474d1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:26.23", "s25JU_ambient_light_illuminance": 51.63, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9429, "VEg_accel_y": 750, "VEg_accel_z": -2325}
+{"id": "c0d9e2f3-9282-45db-9ebe-7e7fb3ddd323", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:26.24", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 35.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "9678ed09-0d1d-4616-b48a-9a8d69dcf007", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:26.84", "s25JW_ambient_light_illuminance": 10.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7550, "VDY_accel_y": -474, "VDY_accel_z": -6105}
+{"id": "5d600c2f-fa97-4db5-938a-3eac563d63b6", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:26.86", "s25JU_ambient_light_illuminance": 52.35, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9435, "VEg_accel_y": 780, "VEg_accel_z": -2252}
+{"id": "c29ab950-de66-435a-9e18-018b49f819b4", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:26.86", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 51.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "e26e70f9-4d33-417d-9d49-d047cdb7ddba", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:27.37", "s25JW_ambient_light_illuminance": 11.27, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7581, "VDY_accel_y": -421, "VDY_accel_z": -6117}
+{"id": "22715bc6-754b-4c98-ae3c-b6b5a4d597ef", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:27.39", "s25JU_ambient_light_illuminance": 51.55, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9478, "VEg_accel_y": 747, "VEg_accel_z": -2265}
+{"id": "862c3d92-129f-4c2d-8085-68519b20e079", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:27.40", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 66.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "a471b4df-8582-49fd-aca2-10b222a6b935", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:27.91", "s25JW_ambient_light_illuminance": 10.69, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7150, "VDY_accel_y": -1195, "VDY_accel_z": -9324}
+{"id": "aa7cc1cd-a668-4ffb-ba72-39043440f454", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:27.93", "s25JU_ambient_light_illuminance": 49.08, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9443, "VEg_accel_y": 753, "VEg_accel_z": -2296}
+{"id": "7d18f666-f2fc-4637-8470-56c9961d76e2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:27.94", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 75.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "81a67849-1b7a-4050-8bd1-7092c368e1a4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:28.45", "s25JW_ambient_light_illuminance": 11.05, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 9804, "VDY_accel_y": 261, "VDY_accel_z": -1748}
+{"id": "0d3f4105-3ba2-496e-895d-c78a27f3c5fa", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:28.46", "s25JU_ambient_light_illuminance": 50.7, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9395, "VEg_accel_y": 748, "VEg_accel_z": -2207}
+{"id": "6ec045ab-6806-46c6-8ea9-31acc55f8564", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:28.47", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 79.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "464a915f-ab3a-4849-bdc9-355dd9e35335", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:28.98", "s25JW_ambient_light_illuminance": 11.24, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 9790, "VDY_accel_y": 354, "VDY_accel_z": -377}
+{"id": "4df7caf8-c90a-4f87-8cb1-e9078b9909f0", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:29.01", "s25JU_ambient_light_illuminance": 49.8, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9425, "VEg_accel_y": 677, "VEg_accel_z": -2357}
+{"id": "23b44fbd-f55c-4922-b8c1-509b980d2548", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:29.01", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 73.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "498d202e-333a-4bbf-b62b-e7291f553852", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:29.52", "s25JW_ambient_light_illuminance": 10.69, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 5646, "VDY_accel_y": -789, "VDY_accel_z": -8063}
+{"id": "906fc325-bd0e-4f10-b446-985582322ceb", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:29.54", "s25JU_ambient_light_illuminance": 49.28, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9412, "VEg_accel_y": 718, "VEg_accel_z": -2211}
+{"id": "42e5df46-7143-4b3a-a4b2-5f109a146a63", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:29.54", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 75.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "3207d5ca-732b-4d30-9ddc-1fc9729ac3eb", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:30.05", "s25JW_ambient_light_illuminance": 10.89, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 3364, "VDY_accel_y": -917, "VDY_accel_z": -8977}
+{"id": "6b8165bb-0d9d-4a9f-92cb-1931b3d00b99", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:30.06", "s25JU_ambient_light_illuminance": 49.25, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9418, "VEg_accel_y": 748, "VEg_accel_z": -2284}
+{"id": "15691664-9577-45b6-a44d-7aea72f4d67b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:30.07", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 80.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "0e3c27e6-bf5d-4365-9e6c-3681fdd0187e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:30.65", "s25JW_ambient_light_illuminance": 10.53, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7385, "VDY_accel_y": -545, "VDY_accel_z": -6492}
+{"id": "fe3aff1d-2405-4b79-bc5e-6abd22482f5b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:30.66", "s25JU_ambient_light_illuminance": 50.98, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9451, "VEg_accel_y": 745, "VEg_accel_z": -2237}
+{"id": "451b12cc-21ff-45ad-bda9-072820ee8922", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:30.67", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 71.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "364f6b84-fddd-460d-bac5-cd00a1d0ec1c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:31.18", "s25JW_ambient_light_illuminance": 10.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7398, "VDY_accel_y": -524, "VDY_accel_z": -6461}
+{"id": "88c579c0-2e41-4469-b8e6-1d51715fc5a9", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:31.19", "s25JU_ambient_light_illuminance": 51.7, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9377, "VEg_accel_y": 762, "VEg_accel_z": -2274}
+{"id": "1968dcec-afcb-4d64-a4a7-a7d5996e9825", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:31.20", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 72.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "04aa8241-8653-4221-bda4-7cfb28f538bd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:31.71", "s25JW_ambient_light_illuminance": 11.82, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7440, "VDY_accel_y": -535, "VDY_accel_z": -6448}
+{"id": "26c8d5dc-3650-4cc3-9406-4f874ea136d3", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:31.72", "s25JU_ambient_light_illuminance": 58.8, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9408, "VEg_accel_y": 720, "VEg_accel_z": -2358}
+{"id": "7835ff2d-d896-4af7-a37f-6546d5b196ed", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:31.73", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 76.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.8}
+{"id": "91cb6d2b-4133-4182-996c-d8e5cf04b6a7", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:32.24", "s25JW_ambient_light_illuminance": 10.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7462, "VDY_accel_y": -491, "VDY_accel_z": -6403}
+{"id": "944a4f5b-0b0a-4448-9f84-ab42fd50f434", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:32.25", "s25JU_ambient_light_illuminance": 53.76, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9395, "VEg_accel_y": 791, "VEg_accel_z": -2303}
+{"id": "dfa37131-4ed3-4856-8aa5-b89b28e2a6a9", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:32.25", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 76.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.8}
+{"id": "780cc8d2-b6c7-4715-8f11-a70bdc4e2778", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:32.77", "s25JW_ambient_light_illuminance": 10.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7412, "VDY_accel_y": -480, "VDY_accel_z": -6371}
+{"id": "d211e937-2dea-434e-9424-76ba2593d851", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:32.78", "s25JU_ambient_light_illuminance": 59.5, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9467, "VEg_accel_y": 687, "VEg_accel_z": -2281}
+{"id": "042f1b78-23a6-46ef-bb00-8170162f2ef7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:32.80", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 48.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.8}
+{"id": "3cdeb8ac-03c7-4a9e-b0ee-0ee10311a15d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:33.31", "s25JW_ambient_light_illuminance": 10.07, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7442, "VDY_accel_y": -511, "VDY_accel_z": -6347}
+{"id": "26d57148-792c-4589-ac7e-1743d86ed418", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:33.32", "s25JU_ambient_light_illuminance": 58.01, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9426, "VEg_accel_y": 688, "VEg_accel_z": -2253}
+{"id": "35bac410-d888-4a45-a94f-244aeb432af0", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:33.32", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 75.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.8}
+{"id": "0fe4046e-22d7-4827-8638-48cf90db52a1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:33.84", "s25JW_ambient_light_illuminance": 10.75, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7476, "VDY_accel_y": -466, "VDY_accel_z": -6326}
+{"id": "a7811a81-394e-4d4e-9123-ca735a390c45", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:33.85", "s25JU_ambient_light_illuminance": 53.24, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9400, "VEg_accel_y": 690, "VEg_accel_z": -2234}
+{"id": "76afca80-26c4-467f-9fc0-dbe1f0894263", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:33.85", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 74.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.8}
+{"id": "b6cf8d85-4975-4a5d-bc70-f875b4c96608", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:34.37", "s25JW_ambient_light_illuminance": 11.24, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7480, "VDY_accel_y": -509, "VDY_accel_z": -6389}
+{"id": "c0255529-d309-481a-add1-7f27023a5cf9", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:34.38", "s25JU_ambient_light_illuminance": 52.06, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9425, "VEg_accel_y": 795, "VEg_accel_z": -2236}
+{"id": "078301a9-490d-4020-8649-bb8d61f90e1b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:34.39", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 67.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.8}
+{"id": "45df842d-194e-4c99-ac1c-612186506358", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:34.90", "s25JW_ambient_light_illuminance": 11.37, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7476, "VDY_accel_y": -504, "VDY_accel_z": -6410}
+{"id": "be62246d-38af-4679-af62-071fa39c4e91", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:34.91", "s25JU_ambient_light_illuminance": 51.1, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9405, "VEg_accel_y": 711, "VEg_accel_z": -2371}
+{"id": "7d84db8a-f685-45e2-919b-b8d140fcea5d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:34.92", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 77.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.79}
+{"id": "ce3d6e02-9142-4fe3-ba21-3a48c234b0ef", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:35.43", "s25JW_ambient_light_illuminance": 10.3, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7451, "VDY_accel_y": -435, "VDY_accel_z": -6341}
+{"id": "804fca57-8c23-489a-95cb-d4b5d06cb915", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:35.44", "s25JU_ambient_light_illuminance": 51.01, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9448, "VEg_accel_y": 687, "VEg_accel_z": -2266}
+{"id": "64979dd7-632a-4785-bf6c-f55c1e4305d7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:35.45", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 71.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.79}
+{"id": "ca103b40-0112-4ad9-a5c0-ac6b88952f0b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:35.96", "s25JW_ambient_light_illuminance": 7.75, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.9, "s23V3_button_state": 0, "VDY_accel_x": 7474, "VDY_accel_y": -511, "VDY_accel_z": -6283}
+{"id": "57c827db-162c-4d07-b630-4970a0372b0d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:35.97", "s25JU_ambient_light_illuminance": 60.76, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9393, "VEg_accel_y": 749, "VEg_accel_z": -2139}
+{"id": "eefa4e6c-8bb4-48fd-b116-9368ae503f77", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:35.98", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 72.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.79}
+{"id": "d575f155-f210-466c-b430-2ca0166e50fe", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:36.50", "s25JW_ambient_light_illuminance": 8.42, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7478, "VDY_accel_y": -468, "VDY_accel_z": -6334}
+{"id": "a0a8dc2c-12ec-4cb0-85dd-df9b521f8a42", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:36.50", "s25JU_ambient_light_illuminance": 71.33, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9436, "VEg_accel_y": 670, "VEg_accel_z": -2337}
+{"id": "e444e750-7352-4bb3-b116-37f42d5b0d48", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:36.51", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 82.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.79}
+{"id": "e5e1b99f-599b-4af1-ae7b-0ec9cb81dedd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:37.02", "s25JW_ambient_light_illuminance": 235.47, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7467, "VDY_accel_y": -486, "VDY_accel_z": -6378}
+{"id": "1f6fff73-6ed2-4475-90d4-9ba16e7976ec", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:37.03", "s25JU_ambient_light_illuminance": 77.0, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9401, "VEg_accel_y": 734, "VEg_accel_z": -2333}
+{"id": "dd9bbb92-7e6d-4ee5-91be-d6a7b57548ac", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:37.04", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 79.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.79}
+{"id": "23786ff9-5051-4a41-bb86-a8cb034cccca", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:37.55", "s25JW_ambient_light_illuminance": 234.59, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -513, "VDY_accel_z": -6348}
+{"id": "25a0c19f-b629-469c-85ee-ba9c86e71dfb", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:37.56", "s25JU_ambient_light_illuminance": 74.65, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9407, "VEg_accel_y": 714, "VEg_accel_z": -2258}
+{"id": "7d45f6b8-1258-4dc5-93e0-f5072177b12d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:37.57", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 71.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.51, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.79}
+{"id": "92573616-d39d-45f5-94af-0208916bf322", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:38.08", "s25JW_ambient_light_illuminance": 220.91, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7511, "VDY_accel_y": -494, "VDY_accel_z": -6361}
+{"id": "387c3685-686c-4923-91d4-8683bade0b72", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:38.09", "s25JU_ambient_light_illuminance": 74.56, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9433, "VEg_accel_y": 758, "VEg_accel_z": -2196}
+{"id": "99320ce4-fdef-4e29-9171-3147d57e5ada", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:38.10", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 77.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "b7f1de04-8691-426a-ab38-97879faf2cd1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:38.61", "s25JW_ambient_light_illuminance": 139.09, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -497, "VDY_accel_z": -6249}
+{"id": "6db68082-4404-4dbc-b3fa-af1e70eeaf50", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:38.62", "s25JU_ambient_light_illuminance": 75.36, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 713, "VEg_accel_z": -2341}
+{"id": "e00f1f3a-a1f2-438b-91fa-9f7c42ddbd94", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:38.64", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 74.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "ca785221-ecee-4ad3-8ec8-7054e86d2a5b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:39.15", "s25JW_ambient_light_illuminance": 132.71, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7448, "VDY_accel_y": -528, "VDY_accel_z": -6278}
+{"id": "b00a14f2-9755-4a8c-8c6e-051ec593352e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:39.16", "s25JU_ambient_light_illuminance": 74.97, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9433, "VEg_accel_y": 778, "VEg_accel_z": -2276}
+{"id": "c0b6c2b5-f85c-4586-98f7-d69e73947704", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:39.17", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 70.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "8061a9b0-9ced-400c-b072-525341a2779a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:39.68", "s25JW_ambient_light_illuminance": 128.18, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7471, "VDY_accel_y": -471, "VDY_accel_z": -6386}
+{"id": "460681ad-329d-4594-acd4-694f84a13088", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:39.70", "s25JU_ambient_light_illuminance": 74.67, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9390, "VEg_accel_y": 754, "VEg_accel_z": -2308}
+{"id": "7ac66f15-73b2-4316-a89f-e59fe788c52f", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:39.70", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 76.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "0a10002e-2c52-48ef-95b2-39d7a57ea584", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:40.21", "s25JW_ambient_light_illuminance": 145.16, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7468, "VDY_accel_y": -460, "VDY_accel_z": -6278}
+{"id": "ac35167a-7a83-40f1-96f3-4f90e354ba15", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:40.22", "s25JU_ambient_light_illuminance": 74.0, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 703, "VEg_accel_z": -2319}
+{"id": "457cbeac-bef5-41dd-9473-156869d54cb7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:40.23", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 81.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "8c9f7243-26be-4488-838d-60e97bd4b959", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:40.74", "s25JW_ambient_light_illuminance": 148.8, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7468, "VDY_accel_y": -492, "VDY_accel_z": -6280}
+{"id": "f1915e27-efcd-4532-9b63-e8280e7c5390", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:40.76", "s25JU_ambient_light_illuminance": 74.09, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9434, "VEg_accel_y": 752, "VEg_accel_z": -2303}
+{"id": "bb7d8f20-4c65-46a5-90c5-a0143e2b08a1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:40.77", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 77.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.82}
+{"id": "1468c229-01d8-48c7-af4f-71bea3164efe", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:41.28", "s25JW_ambient_light_illuminance": 156.08, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7480, "VDY_accel_y": -504, "VDY_accel_z": -6336}
+{"id": "b9460316-ec79-498d-a314-5b501a2fe454", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:41.29", "s25JU_ambient_light_illuminance": 74.35, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9432, "VEg_accel_y": 774, "VEg_accel_z": -2245}
+{"id": "2827c3e9-5c6e-4129-8db6-6262d89d35dd", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:41.30", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 78.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.82}
+{"id": "1cf542c5-a75a-4f97-8eca-d2c9faaf7c92", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:41.81", "s25JW_ambient_light_illuminance": 165.25, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7478, "VDY_accel_y": -523, "VDY_accel_z": -6408}
+{"id": "cb6158d7-16fc-4048-8724-0cefa74e78be", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:41.82", "s25JU_ambient_light_illuminance": 72.94, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9418, "VEg_accel_y": 705, "VEg_accel_z": -2337}
+{"id": "ec58e85d-b6d7-40ea-8de4-3f4a283d4828", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:41.83", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 80.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.82}
+{"id": "b5c32924-447d-46cd-bcad-543c2d067478", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:42.34", "s25JW_ambient_light_illuminance": 159.13, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7482, "VDY_accel_y": -518, "VDY_accel_z": -6292}
+{"id": "d2a447ea-5d6f-4172-bba5-8dcd0fdd978f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:42.35", "s25JU_ambient_light_illuminance": 73.16, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9408, "VEg_accel_y": 685, "VEg_accel_z": -2332}
+{"id": "2cb9b7e2-ad2d-4827-8ba3-6d3f7124ec78", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:42.36", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 77.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.82}
+{"id": "4c6ed41e-518d-4a96-968e-58236787b10c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:42.87", "s25JW_ambient_light_illuminance": 148.32, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7453, "VDY_accel_y": -505, "VDY_accel_z": -6361}
+{"id": "6953e1ee-a54c-40d3-9184-e33bd0db0007", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:42.88", "s25JU_ambient_light_illuminance": 71.58, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9409, "VEg_accel_y": 754, "VEg_accel_z": -2285}
+{"id": "0751f0e6-60ae-4a38-939c-0e8efd57a7c2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:42.89", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 70.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.82}
+{"id": "85fe1486-3098-48fa-834e-a3b28f992464", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:43.40", "s25JW_ambient_light_illuminance": 143.4, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7499, "VDY_accel_y": -473, "VDY_accel_z": -6265}
+{"id": "6f7398fe-8545-47c0-82d0-0d2e4320b042", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:43.41", "s25JU_ambient_light_illuminance": 64.07, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 729, "VEg_accel_z": -2238}
+{"id": "bec7096a-29e7-4900-bbd3-7f2d58e83010", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:43.42", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 77.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.82}
+{"id": "82e25a83-ab40-4af4-8c50-162ea708e939", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:43.93", "s25JW_ambient_light_illuminance": 136.2, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 10.0, "s23V3_button_state": 0, "VDY_accel_x": 7471, "VDY_accel_y": -504, "VDY_accel_z": -6253}
+{"id": "2d801a8d-ac0a-4fce-9e65-a4561b2513a0", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:43.94", "s25JU_ambient_light_illuminance": 57.15, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9443, "VEg_accel_y": 672, "VEg_accel_z": -2302}
+{"id": "0d668df6-6192-4e46-bf99-22730cd8022a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:43.95", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 76.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "d4d38c1b-9dc5-4c35-9965-e995808b7a5f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:44.46", "s25JW_ambient_light_illuminance": 105.97, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7457, "VDY_accel_y": -472, "VDY_accel_z": -6530}
+{"id": "63a02b89-765d-4ed9-a7ca-a45fd98c55c1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:44.47", "s25JU_ambient_light_illuminance": 53.73, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9517, "VEg_accel_y": 697, "VEg_accel_z": -2507}
+{"id": "9367a0b7-07d0-4b2e-b795-34fb2e846c1c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:44.48", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 79.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "12e4b285-5312-4759-bf6a-20382d95524e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:44.99", "s25JW_ambient_light_illuminance": 100.51, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7471, "VDY_accel_y": -518, "VDY_accel_z": -6301}
+{"id": "07e45ee6-3ce3-43fe-94c4-cd0eb76ddd41", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:45.00", "s25JU_ambient_light_illuminance": 52.16, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9514, "VEg_accel_y": 686, "VEg_accel_z": -2382}
+{"id": "01dc1ec7-dd9a-47e7-9599-27cb17dfa9e9", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:45.01", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 87.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "f5186c63-af10-4d1a-8cdb-b5428be00f79", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:45.52", "s25JW_ambient_light_illuminance": 109.03, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7479, "VDY_accel_y": -490, "VDY_accel_z": -6337}
+{"id": "78fc9576-5b67-4bf6-850f-22f73ae81ca7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:45.53", "s25JU_ambient_light_illuminance": 52.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 684, "VEg_accel_z": -2341}
+{"id": "511649c4-275a-4165-ac67-f84391436a04", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:45.54", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 79.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "f4297ce7-504d-4b9e-9100-3b98a8062950", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:46.06", "s25JW_ambient_light_illuminance": 111.03, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -513, "VDY_accel_z": -6313}
+{"id": "e07a468d-8438-424a-9007-883f5ea1c560", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:46.07", "s25JU_ambient_light_illuminance": 62.08, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9395, "VEg_accel_y": 770, "VEg_accel_z": -2319}
+{"id": "45f3243a-a44d-487d-ade7-03b188e462ff", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:46.08", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 70.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.81}
+{"id": "4267d8f7-9642-40ea-9de4-b26810d1ae37", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:46.59", "s25JW_ambient_light_illuminance": 108.24, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7474, "VDY_accel_y": -506, "VDY_accel_z": -6298}
+{"id": "76e095c6-0e78-47e5-ae56-3ca4904f45ec", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:46.61", "s25JU_ambient_light_illuminance": 63.11, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9434, "VEg_accel_y": 726, "VEg_accel_z": -2280}
+{"id": "f8eac4a0-96b7-4b23-8c4e-c21857605961", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:46.61", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 35.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "788de6c5-13f0-49d0-b670-d08aae3c93e4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:47.13", "s25JW_ambient_light_illuminance": 105.95, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7494, "VDY_accel_y": -504, "VDY_accel_z": -6344}
+{"id": "fe2cb816-ccad-49fe-a538-df86e7ef09d5", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:47.14", "s25JU_ambient_light_illuminance": 58.35, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9409, "VEg_accel_y": 761, "VEg_accel_z": -2293}
+{"id": "b27ff585-b1e5-49e0-9d9b-42e86949788a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:47.16", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 27.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "dfbe293b-7ca9-459f-903d-6f6fa8220b20", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:47.67", "s25JW_ambient_light_illuminance": 99.5, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7492, "VDY_accel_y": -462, "VDY_accel_z": -6272}
+{"id": "ea818ccd-231c-4d47-ac0c-368437f2ae5c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:47.68", "s25JU_ambient_light_illuminance": 52.25, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 622, "VEg_accel_z": -2380}
+{"id": "4d464c70-3974-4695-b3a2-9062e56bd3ba", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:47.68", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 24.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "2c0ec8b8-47fa-4211-bd55-83da7aadb29e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:48.20", "s25JW_ambient_light_illuminance": 103.54, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -521, "VDY_accel_z": -6315}
+{"id": "21e40236-5d0c-4182-81b7-99a3d77df49b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:48.21", "s25JU_ambient_light_illuminance": 52.35, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9383, "VEg_accel_y": 708, "VEg_accel_z": -2319}
+{"id": "6c11a976-c3cb-4671-b2a1-8ac3cc5c5096", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:48.22", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 24.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "e808b4b6-d7be-47ad-90fd-5bbc22ef838e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:48.73", "s25JW_ambient_light_illuminance": 104.5, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7493, "VDY_accel_y": -456, "VDY_accel_z": -6312}
+{"id": "2c94feb1-5570-4865-a98c-5ee25061776e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:48.74", "s25JU_ambient_light_illuminance": 52.47, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9426, "VEg_accel_y": 666, "VEg_accel_z": -2315}
+{"id": "b14d72d3-fbb5-4eea-8e31-96d70eb47b61", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:48.75", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 24.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "2af942dd-5202-4ab9-86a6-7c75da39663e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:49.26", "s25JW_ambient_light_illuminance": 83.81, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.8, "s23V3_button_state": 0, "VDY_accel_x": 7517, "VDY_accel_y": -509, "VDY_accel_z": -6292}
+{"id": "eef24bac-4941-42d6-8807-13e7e6ed6cc1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:49.27", "s25JU_ambient_light_illuminance": 49.43, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9417, "VEg_accel_y": 728, "VEg_accel_z": -2280}
+{"id": "e89db66c-376e-40ce-93c6-26afaf2a76c5", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:49.28", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 22.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "6abf0901-0e10-4626-b1db-0e9d701d52dd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:49.79", "s25JW_ambient_light_illuminance": 64.99, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7470, "VDY_accel_y": -498, "VDY_accel_z": -6354}
+{"id": "aab059f5-ebc1-4f71-bc7b-55bdc4ef2dc0", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:49.83", "s25JU_ambient_light_illuminance": 49.43, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9419, "VEg_accel_y": 725, "VEg_accel_z": -2355}
+{"id": "cc443c72-ac7d-4066-b94f-7449e7974442", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:49.84", "s23xq_load_cell_weight": 25, "SeG_ir_long_distance": 20.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.83}
+{"id": "62341d10-9f81-4f05-9d71-6848db866e29", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:50.35", "s25JW_ambient_light_illuminance": 78.29, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7471, "VDY_accel_y": -498, "VDY_accel_z": -6295}
+{"id": "a9c79123-d137-4783-a4d9-f02d6da047e3", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:50.36", "s25JU_ambient_light_illuminance": 49.65, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9359, "VEg_accel_y": 731, "VEg_accel_z": -2327}
+{"id": "7f87da28-91b6-422f-80c3-2d7a531d73e1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:50.37", "s23xq_load_cell_weight": 855, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.83}
+{"id": "039d2851-0d72-4cf6-8ef6-c5e30bad8135", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:50.88", "s25JW_ambient_light_illuminance": 91.89, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -469, "VDY_accel_z": -6315}
+{"id": "c4adad6b-7367-4a5f-9c77-7718353022b9", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:50.89", "s25JU_ambient_light_illuminance": 49.59, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 823, "VEg_accel_z": -2322}
+{"id": "1c8cc708-d3d8-436c-82fa-9f9e7efddc25", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:50.90", "s23xq_load_cell_weight": 766, "SeG_ir_long_distance": 20.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.83}
+{"id": "f2b5ebb6-6976-423c-aed4-7d36c04e0c43", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:51.41", "s25JW_ambient_light_illuminance": 68.19, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7474, "VDY_accel_y": -491, "VDY_accel_z": -6281}
+{"id": "3f655fe3-8e35-46d2-a9cc-7caec680dd42", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:51.42", "s25JU_ambient_light_illuminance": 49.59, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9442, "VEg_accel_y": 691, "VEg_accel_z": -2249}
+{"id": "70683ae0-8683-40d8-8cf5-566e6af95e6c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:51.43", "s23xq_load_cell_weight": 808, "SeG_ir_long_distance": 21.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.83}
+{"id": "abd3852f-969e-4632-bf91-533721d304fe", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:51.94", "s25JW_ambient_light_illuminance": 85.63, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7487, "VDY_accel_y": -510, "VDY_accel_z": -6292}
+{"id": "b064c10b-61d5-4927-917a-99304445f165", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:51.95", "s25JU_ambient_light_illuminance": 49.49, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9448, "VEg_accel_y": 708, "VEg_accel_z": -2375}
+{"id": "4ff4f11f-c60e-4bcd-a3dd-d002beaee701", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:51.95", "s23xq_load_cell_weight": 622, "SeG_ir_long_distance": 22.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.83}
+{"id": "d6194041-ba02-4ee1-b9af-10ac7c33867d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:52.46", "s25JW_ambient_light_illuminance": 91.0, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7509, "VDY_accel_y": -505, "VDY_accel_z": -6345}
+{"id": "a8a9600c-1c52-4c94-a1c9-f480b6a09d01", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:52.47", "s25JU_ambient_light_illuminance": 52.92, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9434, "VEg_accel_y": 716, "VEg_accel_z": -2354}
+{"id": "5de0ff8c-cc16-4b7c-b49a-6bb378b4d964", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:52.48", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 28.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.81}
+{"id": "6ffaa218-937e-45fa-82af-802b7ade6346", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:52.99", "s25JW_ambient_light_illuminance": 95.82, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7492, "VDY_accel_y": -459, "VDY_accel_z": -6261}
+{"id": "74e3724a-6cd9-4cb5-af5a-fe0f01ecd6a1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:53.00", "s25JU_ambient_light_illuminance": 54.72, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9456, "VEg_accel_y": 739, "VEg_accel_z": -2302}
+{"id": "94cfdf01-4b87-487c-989a-5cac875f5f03", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:53.01", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 31.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.81}
+{"id": "7a8b0ef3-8073-47e4-bff3-b7914cd76972", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:53.52", "s25JW_ambient_light_illuminance": 94.02, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -507, "VDY_accel_z": -6239}
+{"id": "76dc517c-62dc-4dbc-bcc0-f023fcf9fcf7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:53.53", "s25JU_ambient_light_illuminance": 55.05, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9385, "VEg_accel_y": 716, "VEg_accel_z": -2293}
+{"id": "243e3163-7027-4d13-91ce-a14a80554ed6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:53.54", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 24.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.81}
+{"id": "d8a3f69d-5f55-4827-bb4a-86ab2edf75ad", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:54.05", "s25JW_ambient_light_illuminance": 93.72, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7428, "VDY_accel_y": -524, "VDY_accel_z": -6301}
+{"id": "afd94f1a-faf2-4a74-bce1-a287142d7b04", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:54.06", "s25JU_ambient_light_illuminance": 59.32, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9411, "VEg_accel_y": 740, "VEg_accel_z": -2225}
+{"id": "bd00d360-6098-488f-8047-b7fdf58b0b00", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:54.07", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 30.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.81}
+{"id": "e78a0258-a488-464b-a344-a2e8d6187af3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:54.58", "s25JW_ambient_light_illuminance": 93.63, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7493, "VDY_accel_y": -510, "VDY_accel_z": -6232}
+{"id": "191e4cdf-c4c6-4d96-a808-2d7fafb0e644", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:54.59", "s25JU_ambient_light_illuminance": 52.93, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9425, "VEg_accel_y": 743, "VEg_accel_z": -2304}
+{"id": "b84f6199-595e-4349-a29d-b5bbacabaf3e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:54.60", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 27.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.81}
+{"id": "782db3c6-1446-42f1-ba32-1da1d7d71ec3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:55.11", "s25JW_ambient_light_illuminance": 93.88, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7482, "VDY_accel_y": -504, "VDY_accel_z": -6255}
+{"id": "54b0e3a5-8537-41e9-869e-83ede997070a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:55.12", "s25JU_ambient_light_illuminance": 51.99, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9409, "VEg_accel_y": 689, "VEg_accel_z": -2333}
+{"id": "bc7f829e-55a5-4152-a17f-03c40efb9a78", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:55.13", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 33.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.81}
+{"id": "82a87a6d-9c2b-48ef-bd18-dd189e242ad0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:55.64", "s25JW_ambient_light_illuminance": 95.24, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7493, "VDY_accel_y": -518, "VDY_accel_z": -6256}
+{"id": "518f34b5-065c-4f7e-adad-b8e5b34bceba", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:55.65", "s25JU_ambient_light_illuminance": 51.76, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 714, "VEg_accel_z": -2363}
+{"id": "c0807e13-b939-4a3f-8059-d66068233100", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:55.66", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 44.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.8}
+{"id": "605fcbbe-0a6c-49b5-82a9-bd7542eedc5f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:56.17", "s25JW_ambient_light_illuminance": 95.56, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7493, "VDY_accel_y": -512, "VDY_accel_z": -6290}
+{"id": "35a8981a-b0ed-4522-b12c-d2e24be3022a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:56.18", "s25JU_ambient_light_illuminance": 51.95, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9428, "VEg_accel_y": 656, "VEg_accel_z": -2308}
+{"id": "fa3a88a9-77c8-40af-9a68-f516b6730202", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:56.19", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 45.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.8}
+{"id": "38a1ef3a-37ef-44fc-93d9-9b01c074824c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:56.70", "s25JW_ambient_light_illuminance": 95.28, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7465, "VDY_accel_y": -499, "VDY_accel_z": -6358}
+{"id": "a49d516f-7261-482e-9937-9c78eb6366eb", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:56.71", "s25JU_ambient_light_illuminance": 52.11, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9396, "VEg_accel_y": 745, "VEg_accel_z": -2218}
+{"id": "d664bf74-fe35-42a5-af20-5c0f89e6b0af", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:56.72", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 38.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.8}
+{"id": "30132723-5165-4d39-b66d-8be0e00e118c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:57.23", "s25JW_ambient_light_illuminance": 96.98, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7478, "VDY_accel_y": -555, "VDY_accel_z": -6274}
+{"id": "84392b95-1ce7-42eb-8a0f-3101ad164c47", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:57.24", "s25JU_ambient_light_illuminance": 51.7, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9437, "VEg_accel_y": 680, "VEg_accel_z": -2252}
+{"id": "aa3ea7a9-9b35-4cef-b1f6-ad6cc5cc6fb6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:57.25", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 33.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.8}
+{"id": "75b4ff3b-e7e1-4a8f-92dc-50cdb4ab4aae", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:57.76", "s25JW_ambient_light_illuminance": 90.13, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7458, "VDY_accel_y": -482, "VDY_accel_z": -6347}
+{"id": "d48e7b5b-58ee-4406-8e15-181575dd37a5", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:57.77", "s25JU_ambient_light_illuminance": 51.07, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 689, "VEg_accel_z": -2346}
+{"id": "0e6882d1-440d-4367-a806-6278c21b040f", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:57.78", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 25.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.8}
+{"id": "53e77f08-2fd0-42a0-ba70-467776a4eab0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:58.29", "s25JW_ambient_light_illuminance": 90.4, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7473, "VDY_accel_y": -488, "VDY_accel_z": -6318}
+{"id": "151bf4e9-2e51-4de1-8faa-eb17e128ba4b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:58.30", "s25JU_ambient_light_illuminance": 52.85, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9408, "VEg_accel_y": 659, "VEg_accel_z": -2354}
+{"id": "4463adea-8c98-4323-90d9-8e9664074bbe", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:58.31", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 22.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "f6aaf101-09a7-4c0d-899e-532e03179548", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:58.82", "s25JW_ambient_light_illuminance": 89.95, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7497, "VDY_accel_y": -559, "VDY_accel_z": -6343}
+{"id": "8bbd38c9-07ad-4662-bb69-083d093ebd6b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:58.83", "s25JU_ambient_light_illuminance": 52.53, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9388, "VEg_accel_y": 712, "VEg_accel_z": -2299}
+{"id": "1f0547c8-1191-445f-b925-cd89337cf518", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:58.84", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 22.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "b09c376d-6cde-4862-956f-cac196e510db", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:59.35", "s25JW_ambient_light_illuminance": 90.47, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7509, "VDY_accel_y": -485, "VDY_accel_z": -6369}
+{"id": "f776c986-bb1b-46b6-b378-0492d1dda07d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:59.36", "s25JU_ambient_light_illuminance": 52.04, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9389, "VEg_accel_y": 762, "VEg_accel_z": -2249}
+{"id": "f979a9ff-d89e-47b4-9f9a-cc10403b7a20", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:59.37", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 21.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "06d008af-35ea-49d2-8179-5c9156a7f880", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:26:59.88", "s25JW_ambient_light_illuminance": 88.66, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7483, "VDY_accel_y": -535, "VDY_accel_z": -6317}
+{"id": "037962b3-d260-4616-9afd-16ba30d4653c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:26:59.90", "s25JU_ambient_light_illuminance": 51.14, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 657, "VEg_accel_z": -2321}
+{"id": "257a6c40-4897-4a5b-8550-9cc01f647d67", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:26:59.90", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "ca6fe42a-d01a-47f9-a4e0-dfbb3b98241d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:00.41", "s25JW_ambient_light_illuminance": 88.56, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -491, "VDY_accel_z": -6335}
+{"id": "7f6aa149-b3c0-496e-8459-3f5b46f1bafc", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:00.43", "s25JU_ambient_light_illuminance": 51.1, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9407, "VEg_accel_y": 705, "VEg_accel_z": -2238}
+{"id": "3b8d1ac0-772d-4fe8-b593-8125f3d150bb", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:00.43", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "e721a953-ab57-4ebf-9296-e9d2e5ab04df", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:00.94", "s25JW_ambient_light_illuminance": 80.99, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7496, "VDY_accel_y": -510, "VDY_accel_z": -6264}
+{"id": "e188df5b-90fd-456c-8ce9-efb4c551ec24", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:00.96", "s25JU_ambient_light_illuminance": 54.82, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9431, "VEg_accel_y": 635, "VEg_accel_z": -2282}
+{"id": "d05cef74-bcd3-4bf2-9c81-4b50caa705e8", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:00.96", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.31, "X2n_air_quality_air_pressure": 942.8}
+{"id": "4c953578-4e40-43b0-a8ed-5ed8e5b5cce5", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:01.48", "s25JW_ambient_light_illuminance": 85.39, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7499, "VDY_accel_y": -507, "VDY_accel_z": -6280}
+{"id": "ab2fbf62-bed0-410a-bf78-fea7530e11dd", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:01.50", "s25JU_ambient_light_illuminance": 68.75, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9461, "VEg_accel_y": 718, "VEg_accel_z": -2297}
+{"id": "b9768480-bf0b-43af-b17f-0249ef7d13a2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:01.51", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "7fad64c8-db4b-4575-bb33-f3211705d181", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:02.02", "s25JW_ambient_light_illuminance": 86.85, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7482, "VDY_accel_y": -504, "VDY_accel_z": -6285}
+{"id": "9d1745f5-9873-4741-9f01-20c44571d32f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:02.03", "s25JU_ambient_light_illuminance": 71.86, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9396, "VEg_accel_y": 777, "VEg_accel_z": -2344}
+{"id": "3eacbeae-dcfb-43f7-a3c7-06e212e2e435", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:02.05", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "4cba2980-2fc8-4c1b-9f04-c3bbb12f1ccb", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:02.56", "s25JW_ambient_light_illuminance": 86.58, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7484, "VDY_accel_y": -507, "VDY_accel_z": -6279}
+{"id": "cdfed0fe-f34b-419b-a599-71319ec7a8dc", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:02.57", "s25JU_ambient_light_illuminance": 73.9, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9418, "VEg_accel_y": 654, "VEg_accel_z": -2366}
+{"id": "2c8fc294-51fe-41f0-a6b4-47284a508eb5", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:02.58", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "cf51d453-f152-4da0-b029-b24a1e23bade", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:03.09", "s25JW_ambient_light_illuminance": 93.58, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7473, "VDY_accel_y": -526, "VDY_accel_z": -6322}
+{"id": "dd59710b-91ca-4fef-a8d7-6dd86d74663e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:03.10", "s25JU_ambient_light_illuminance": 73.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9394, "VEg_accel_y": 742, "VEg_accel_z": -2340}
+{"id": "94bf2feb-9aa9-471d-96bd-091c4a34ea5f", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:03.12", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "4072e90d-ae36-465e-a938-f4ad74c8e061", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:03.63", "s25JW_ambient_light_illuminance": 96.22, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7496, "VDY_accel_y": -511, "VDY_accel_z": -6292}
+{"id": "2eca7202-f8ac-4e27-a362-1718bcd7d9ac", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:03.64", "s25JU_ambient_light_illuminance": 76.07, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9411, "VEg_accel_y": 714, "VEg_accel_z": -2229}
+{"id": "5c05fbaa-3076-47c5-b9d6-5f13907fac30", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:03.64", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.32, "X2n_air_quality_air_pressure": 942.81}
+{"id": "393c6fc3-4cfa-4c7a-9d27-62036647fb36", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:04.15", "s25JW_ambient_light_illuminance": 93.69, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7504, "VDY_accel_y": -483, "VDY_accel_z": -6318}
+{"id": "c60bbcae-5249-47cc-b194-c30f6f39699b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:04.17", "s25JU_ambient_light_illuminance": 71.5, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9428, "VEg_accel_y": 735, "VEg_accel_z": -2256}
+{"id": "10324289-ffa2-4b67-aa33-eb0186b22826", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:04.17", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.82}
+{"id": "c16705c0-c13f-4dcf-af65-7b2f89dd04b6", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:04.68", "s25JW_ambient_light_illuminance": 95.28, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7465, "VDY_accel_y": -503, "VDY_accel_z": -6281}
+{"id": "97ee5984-09c6-4d96-b4cf-e85867bd28af", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:04.69", "s25JU_ambient_light_illuminance": 69.74, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9388, "VEg_accel_y": 697, "VEg_accel_z": -2308}
+{"id": "be4902ae-2683-43f6-8728-440504dcea64", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:04.70", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.82}
+{"id": "482c3bd0-3b25-45ab-8bbe-f010c2f817ed", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:05.22", "s25JW_ambient_light_illuminance": 95.92, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7474, "VDY_accel_y": -387, "VDY_accel_z": -6275}
+{"id": "ecb4b766-5bbf-431d-a029-a095ade7383c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:05.23", "s25JU_ambient_light_illuminance": 70.77, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9413, "VEg_accel_y": 692, "VEg_accel_z": -2310}
+{"id": "db07aee0-52a1-4ecb-9cf0-ac64fbffef23", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:05.25", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.82}
+{"id": "51f84806-2d02-4bc4-acfe-c4464420c815", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:05.76", "s25JW_ambient_light_illuminance": 91.99, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -493, "VDY_accel_z": -6287}
+{"id": "671f08d2-afd5-4976-a016-58025dbc77ef", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:05.77", "s25JU_ambient_light_illuminance": 70.79, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9431, "VEg_accel_y": 733, "VEg_accel_z": -2290}
+{"id": "c3191688-d9a3-49a2-a00d-3f7a03bfe2a1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:05.78", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.82}
+{"id": "1129451d-4f36-44b7-ac7c-34fb23674d4f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:06.29", "s25JW_ambient_light_illuminance": 91.08, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.2, "s23V3_button_state": 0, "VDY_accel_x": 7515, "VDY_accel_y": -477, "VDY_accel_z": -6313}
+{"id": "35957a84-8990-4792-975a-f0934a9d064a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:06.30", "s25JU_ambient_light_illuminance": 72.32, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9411, "VEg_accel_y": 744, "VEg_accel_z": -2291}
+{"id": "2c4a695e-0caa-48f8-9619-24260330be16", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:06.31", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.82}
+{"id": "62032bb3-35af-4aab-8a9f-ce4be13a26b1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:06.82", "s25JW_ambient_light_illuminance": 108.7, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 9.2, "s23V3_button_state": 0, "VDY_accel_x": 7479, "VDY_accel_y": -488, "VDY_accel_z": -6305}
+{"id": "41f830f2-1882-42a4-a3a4-567ab2a90f6f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:06.83", "s25JU_ambient_light_illuminance": 70.96, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9384, "VEg_accel_y": 747, "VEg_accel_z": -2258}
+{"id": "0daf760f-1894-474c-8024-25209fbc720d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:06.83", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.3, "X2n_air_quality_air_pressure": 942.82}
+{"id": "ec4fc1b3-215a-4d0f-b34e-97fa9cc28de1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:07.34", "s25JW_ambient_light_illuminance": 93.75, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.4, "s23V3_button_state": 0, "VDY_accel_x": 7493, "VDY_accel_y": -482, "VDY_accel_z": -6372}
+{"id": "fe5dead5-569f-43d0-b539-d70a90eb85a2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:07.35", "s25JU_ambient_light_illuminance": 71.77, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9360, "VEg_accel_y": 650, "VEg_accel_z": -2239}
+{"id": "b9cc8b56-b87d-47a8-a4be-b1438c94126f", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:07.36", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "485ca9c4-1814-4f27-be08-688bf471b104", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:07.87", "s25JW_ambient_light_illuminance": 88.79, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.5, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -523, "VDY_accel_z": -6260}
+{"id": "1bd0e02c-8f51-4fbc-95b6-19326c528c2a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:07.89", "s25JU_ambient_light_illuminance": 65.41, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9429, "VEg_accel_y": 737, "VEg_accel_z": -2321}
+{"id": "27e4dfd8-5f00-4338-b427-5e157debb31b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:07.89", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "fe9f9f17-fc13-49e8-9ca1-ec5a5f3f7f94", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:08.40", "s25JW_ambient_light_illuminance": 81.66, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7501, "VDY_accel_y": -484, "VDY_accel_z": -6246}
+{"id": "3fd56242-507e-4d8f-ba58-937838dc3400", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:08.43", "s25JU_ambient_light_illuminance": 52.83, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9437, "VEg_accel_y": 742, "VEg_accel_z": -2286}
+{"id": "0545bcc3-7cd1-4ea6-970e-ebe03d56f081", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:08.43", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 51.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "623a4f84-89db-4845-8bb8-34aadc627985", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:08.95", "s25JW_ambient_light_illuminance": 94.69, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7486, "VDY_accel_y": -493, "VDY_accel_z": -6245}
+{"id": "bc4e75e4-af72-48d1-bb46-511af27a160a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:08.96", "s25JU_ambient_light_illuminance": 53.14, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 1, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9429, "VEg_accel_y": 720, "VEg_accel_z": -2225}
+{"id": "bf390192-82be-475f-9c9a-1713be25dfd0", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:08.97", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 32.1, "s23UU_button_state": 1, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "38151fb4-1927-490c-9075-e24921465ddd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:09.50", "s25JW_ambient_light_illuminance": 99.65, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7470, "VDY_accel_y": -499, "VDY_accel_z": -6284}
+{"id": "df9fc1d5-cdf0-4107-a215-07bf33d5579f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:09.51", "s25JU_ambient_light_illuminance": 57.4, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 1, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9410, "VEg_accel_y": 770, "VEg_accel_z": -2286}
+{"id": "c39ada9e-ca5b-4cc4-9166-3efeb8e80533", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:09.51", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 23.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.29, "X2n_air_quality_air_pressure": 942.82}
+{"id": "1fad5ed4-32b3-4929-b368-98ef63ee1a59", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:10.02", "s25JW_ambient_light_illuminance": 97.52, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7487, "VDY_accel_y": -483, "VDY_accel_z": -6287}
+{"id": "aae7d04f-5d79-4a04-b26f-b2d68295c278", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:10.04", "s25JU_ambient_light_illuminance": 55.3, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 1, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9370, "VEg_accel_y": 781, "VEg_accel_z": -2254}
+{"id": "305f93d9-6f67-4526-beb3-eff221c3ab49", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:10.04", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 1, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "0254492b-124d-427b-a172-cddce391c252", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:10.56", "s25JW_ambient_light_illuminance": 98.72, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7495, "VDY_accel_y": -502, "VDY_accel_z": -6311}
+{"id": "8d03b2c1-ab74-4759-a467-c232952e2766", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:10.57", "s25JU_ambient_light_illuminance": 54.21, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 1, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9443, "VEg_accel_y": 727, "VEg_accel_z": -2280}
+{"id": "136abe71-546a-48a5-922b-3e2f641e40fd", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:10.58", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "57c4f9bf-b3a6-4938-8acc-0460c97ceb1c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:11.09", "s25JW_ambient_light_illuminance": 97.75, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7505, "VDY_accel_y": -516, "VDY_accel_z": -6314}
+{"id": "e56488ed-dfd9-4c8d-a679-b8be7f1286ea", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:11.10", "s25JU_ambient_light_illuminance": 54.79, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 1, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9408, "VEg_accel_y": 722, "VEg_accel_z": -2299}
+{"id": "76642816-c790-4d69-a941-d141de5ecf46", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:11.11", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 29.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "d623001d-5faa-49df-963f-41eeba685698", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:11.62", "s25JW_ambient_light_illuminance": 96.49, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7449, "VDY_accel_y": -544, "VDY_accel_z": -6298}
+{"id": "1bd49351-693a-4fd9-817d-d7b088348155", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:11.63", "s25JU_ambient_light_illuminance": 51.55, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9397, "VEg_accel_y": 665, "VEg_accel_z": -2330}
+{"id": "96447a0f-5f42-4c98-a835-92e04192c4fa", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:11.64", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 29.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "2b82d0b8-6203-4d5b-b0e0-115c3d9046ad", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:12.15", "s25JW_ambient_light_illuminance": 97.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7501, "VDY_accel_y": -497, "VDY_accel_z": -6327}
+{"id": "2a9e442f-f262-4995-bc9c-54c918988cc8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:12.16", "s25JU_ambient_light_illuminance": 51.63, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9447, "VEg_accel_y": 678, "VEg_accel_z": -2377}
+{"id": "bc59c1bf-685b-4c72-abb9-3dc21dda425d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:12.17", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 36.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "d5afe8ee-f42f-4091-9f59-9e2b89fed935", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:12.69", "s25JW_ambient_light_illuminance": 100.01, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7482, "VDY_accel_y": -474, "VDY_accel_z": -6301}
+{"id": "32461930-738a-4d7a-b643-d3b86b57e69b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:12.70", "s25JU_ambient_light_illuminance": 52.18, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9431, "VEg_accel_y": 729, "VEg_accel_z": -2282}
+{"id": "d9d93215-c488-447b-9322-b5eb939780a9", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:12.71", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 70.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.33, "X2n_air_quality_air_pressure": 942.8}
+{"id": "d4cb102a-53cb-4914-aa95-7b1c76b22f22", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:13.24", "s25JW_ambient_light_illuminance": 100.5, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7505, "VDY_accel_y": -490, "VDY_accel_z": -6313}
+{"id": "1eaefe66-55fd-48f8-93ec-fc2098e4a3ec", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:13.25", "s25JU_ambient_light_illuminance": 52.05, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9400, "VEg_accel_y": 687, "VEg_accel_z": -2288}
+{"id": "f6668885-4433-4c19-919f-9ac4789a6914", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:13.26", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 63.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.35, "X2n_air_quality_air_pressure": 942.81}
+{"id": "8de31bad-d14c-4a61-818f-c3c82a369e14", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:13.77", "s25JW_ambient_light_illuminance": 100.31, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7480, "VDY_accel_y": -452, "VDY_accel_z": -6294}
+{"id": "4e33beb7-6ea3-4870-9a22-19c9696021b9", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:13.78", "s25JU_ambient_light_illuminance": 53.51, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9406, "VEg_accel_y": 657, "VEg_accel_z": -2329}
+{"id": "b2ca4358-f714-4437-9484-c5a59367a6f7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:13.79", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 55.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.35, "X2n_air_quality_air_pressure": 942.81}
+{"id": "03f8adf6-aae4-4784-a065-920b058f3644", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:14.30", "s25JW_ambient_light_illuminance": 99.89, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7496, "VDY_accel_y": -512, "VDY_accel_z": -6325}
+{"id": "15e69cb3-9791-409b-a924-b13cb2fb4396", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:14.31", "s25JU_ambient_light_illuminance": 52.89, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9454, "VEg_accel_y": 722, "VEg_accel_z": -2242}
+{"id": "2d97ddbc-e809-414a-bf8f-4d5ed64e6bba", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:14.32", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.35, "X2n_air_quality_air_pressure": 942.81}
+{"id": "ec99ed6b-cfbc-4917-8656-97b512066440", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:14.84", "s25JW_ambient_light_illuminance": 98.72, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7509, "VDY_accel_y": -513, "VDY_accel_z": -6309}
+{"id": "69aacc1f-431e-409a-9d7a-1d66d03aedce", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:14.85", "s25JU_ambient_light_illuminance": 52.89, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9432, "VEg_accel_y": 763, "VEg_accel_z": -2297}
+{"id": "d5b3ce68-3ac3-44af-9685-9ccdfdfeacb3", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:14.86", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.35, "X2n_air_quality_air_pressure": 942.81}
+{"id": "c2a23df0-7e89-41db-9375-e317f3c23418", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:15.37", "s25JW_ambient_light_illuminance": 99.88, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7512, "VDY_accel_y": -531, "VDY_accel_z": -6300}
+{"id": "3bf91454-a276-47e4-ab0d-dbe0a01098e2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:15.38", "s25JU_ambient_light_illuminance": 53.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9392, "VEg_accel_y": 668, "VEg_accel_z": -2364}
+{"id": "984b524c-a311-4048-a300-10c912a891b6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:15.39", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.35, "X2n_air_quality_air_pressure": 942.81}
+{"id": "f33bcf00-7ed1-4c72-a5c0-b659f7dc674f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:15.90", "s25JW_ambient_light_illuminance": 100.62, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7506, "VDY_accel_y": -474, "VDY_accel_z": -6293}
+{"id": "7d53672d-7612-4ae2-aa48-4c83444296f1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:15.91", "s25JU_ambient_light_illuminance": 54.28, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 719, "VEg_accel_z": -2278}
+{"id": "b317da91-c26c-437f-ab0a-2eccdf16e087", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:15.92", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.35, "X2n_air_quality_air_pressure": 942.81}
+{"id": "971edeb8-6ba8-4603-b714-0945f5ff0a3b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:16.43", "s25JW_ambient_light_illuminance": 100.23, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7515, "VDY_accel_y": -541, "VDY_accel_z": -6318}
+{"id": "4267457d-8eb0-4525-b511-4bca0cf965e7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:16.44", "s25JU_ambient_light_illuminance": 53.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9425, "VEg_accel_y": 730, "VEg_accel_z": -2279}
+{"id": "b5600098-fab6-4f43-9af3-01d61c55a7e2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:16.45", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.81}
+{"id": "54682787-2810-4076-b9d2-1e018dd989ff", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:16.96", "s25JW_ambient_light_illuminance": 94.94, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -493, "VDY_accel_z": -6318}
+{"id": "c0599caa-da06-4c21-82ed-5dad843e1d79", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:16.97", "s25JU_ambient_light_illuminance": 51.06, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9384, "VEg_accel_y": 683, "VEg_accel_z": -2276}
+{"id": "838d4c73-6502-4f28-b9ea-6750e814d9e4", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:16.98", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.81}
+{"id": "91f35fd0-2659-4d81-99d6-6c3637783ad9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:17.49", "s25JW_ambient_light_illuminance": 86.35, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7493, "VDY_accel_y": -495, "VDY_accel_z": -6268}
+{"id": "37d5040b-1958-40fe-b44f-b5279c4ea50d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:17.50", "s25JU_ambient_light_illuminance": 54.75, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9403, "VEg_accel_y": 637, "VEg_accel_z": -2308}
+{"id": "30472019-6632-4182-a53c-f274b7422d52", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:17.51", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.81}
+{"id": "23df5f86-84e8-41e9-925f-65fe14fdc16e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:18.02", "s25JW_ambient_light_illuminance": 81.47, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7504, "VDY_accel_y": -515, "VDY_accel_z": -6248}
+{"id": "82811475-1f64-49c0-b762-8273123c21b8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:18.04", "s25JU_ambient_light_illuminance": 54.64, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9454, "VEg_accel_y": 761, "VEg_accel_z": -2313}
+{"id": "9be04f3e-20c0-4489-b005-fa88556cb80c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:18.05", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.81}
+{"id": "14b397a1-3374-4614-888c-6cb6d999cc5d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:18.56", "s25JW_ambient_light_illuminance": 83.51, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7467, "VDY_accel_y": -488, "VDY_accel_z": -6261}
+{"id": "ebbfea76-74a3-4723-abda-c7bbcdcaa60b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:18.57", "s25JU_ambient_light_illuminance": 57.79, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9439, "VEg_accel_y": 729, "VEg_accel_z": -2279}
+{"id": "fd29f859-ad45-4d90-b053-b735f93b8e76", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:18.58", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.81}
+{"id": "098a1aa1-d885-48b9-a66f-049a923d5a94", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:19.09", "s25JW_ambient_light_illuminance": 82.77, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7494, "VDY_accel_y": -513, "VDY_accel_z": -6312}
+{"id": "2da058e5-b6dc-4067-a6cb-e3773bf7f57b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:19.11", "s25JU_ambient_light_illuminance": 59.83, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 696, "VEg_accel_z": -2321}
+{"id": "51428f71-7034-4342-b9e5-b6c01960eb30", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:19.11", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.83}
+{"id": "283c9dc6-708b-45d8-82a8-744eb46ea1ff", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:19.62", "s25JW_ambient_light_illuminance": 81.33, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -487, "VDY_accel_z": -6266}
+{"id": "3ab9d683-1f13-4c44-a085-7ee3a5f2871a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:19.64", "s25JU_ambient_light_illuminance": 60.51, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9429, "VEg_accel_y": 679, "VEg_accel_z": -2275}
+{"id": "386179a1-cc62-4c28-87df-2e0e01232a24", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:19.64", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.83}
+{"id": "9cef2438-b9e7-4f28-9a43-a930697232fb", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:20.15", "s25JW_ambient_light_illuminance": 80.36, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.9, "s23V3_button_state": 0, "VDY_accel_x": 7482, "VDY_accel_y": -522, "VDY_accel_z": -6385}
+{"id": "5e768be1-f3e6-4873-9ff1-519d63a30f22", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:20.17", "s25JU_ambient_light_illuminance": 58.86, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9428, "VEg_accel_y": 729, "VEg_accel_z": -2281}
+{"id": "d3518d41-54a6-474e-ac40-737ca1c69b24", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:20.17", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.83}
+{"id": "3880fe9d-3c2e-492b-879d-c59a83294fae", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:20.68", "s25JW_ambient_light_illuminance": 62.9, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7495, "VDY_accel_y": -540, "VDY_accel_z": -6270}
+{"id": "0ce2014c-6c71-41f4-9787-aee0706a6cf5", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:20.69", "s25JU_ambient_light_illuminance": 58.64, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9412, "VEg_accel_y": 747, "VEg_accel_z": -2248}
+{"id": "c06a8b78-78cb-4295-997b-83895d666f1c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:20.70", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 143.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.83}
+{"id": "e1691430-12b5-4be6-a836-a675f1088c6f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:21.21", "s25JW_ambient_light_illuminance": 59.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.4, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -471, "VDY_accel_z": -6290}
+{"id": "f48a2586-15fc-4e19-a6a2-d53b7224ffe8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:21.22", "s25JU_ambient_light_illuminance": 57.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9386, "VEg_accel_y": 730, "VEg_accel_z": -2355}
+{"id": "257a22a1-ef6c-41b3-bb6e-73061610a966", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:21.24", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.83}
+{"id": "d93c5131-5a73-4923-8403-1e2e5ecbed2a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:21.76", "s25JW_ambient_light_illuminance": 68.44, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.8, "s23V3_button_state": 0, "VDY_accel_x": 7489, "VDY_accel_y": -493, "VDY_accel_z": -6284}
+{"id": "99fc36e4-5484-416f-a750-0f818af65e56", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:21.78", "s25JU_ambient_light_illuminance": 55.77, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9434, "VEg_accel_y": 720, "VEg_accel_z": -2241}
+{"id": "cf923af0-9844-47d5-92ce-d595cd920933", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:21.79", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.83}
+{"id": "4c8f1e62-b3aa-4a39-83ed-e5d19002114f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:22.30", "s25JW_ambient_light_illuminance": 61.0, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.7, "s23V3_button_state": 0, "VDY_accel_x": 7479, "VDY_accel_y": -504, "VDY_accel_z": -6306}
+{"id": "da4feba8-ef02-409f-a810-5606c0d401d4", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:22.31", "s25JU_ambient_light_illuminance": 58.17, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9428, "VEg_accel_y": 736, "VEg_accel_z": -2280}
+{"id": "22c2f5bf-f595-411f-8bf5-0e28ed07b1f0", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:22.32", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.82}
+{"id": "a475a738-9730-4a53-a90c-3ca542437031", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:22.83", "s25JW_ambient_light_illuminance": 54.25, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.4, "s23V3_button_state": 0, "VDY_accel_x": 7463, "VDY_accel_y": -480, "VDY_accel_z": -6257}
+{"id": "47a38989-8219-492a-979d-30be832c4b01", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:22.84", "s25JU_ambient_light_illuminance": 57.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9441, "VEg_accel_y": 754, "VEg_accel_z": -2280}
+{"id": "424ffe4a-f36e-40c9-b04c-0beeecc82dfe", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:22.85", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.82}
+{"id": "dc7e2786-aa77-46a2-8e47-402bc15b693c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:23.36", "s25JW_ambient_light_illuminance": 56.25, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.2, "s23V3_button_state": 0, "VDY_accel_x": 7524, "VDY_accel_y": -527, "VDY_accel_z": -6270}
+{"id": "96287ae3-8342-450b-a0a9-2c1157d720a2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:23.37", "s25JU_ambient_light_illuminance": 57.29, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9417, "VEg_accel_y": 689, "VEg_accel_z": -2322}
+{"id": "61c9df82-61a2-42d5-a812-fcb6f022f2c2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:23.38", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.82}
+{"id": "cfab9eee-31b3-4df3-bc94-d04ca6e325b5", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:23.89", "s25JW_ambient_light_illuminance": 56.99, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.2, "s23V3_button_state": 0, "VDY_accel_x": 7507, "VDY_accel_y": -484, "VDY_accel_z": -6276}
+{"id": "ae49293d-cc9a-42b6-a7b0-685e8ec75f3a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:23.90", "s25JU_ambient_light_illuminance": 57.26, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9442, "VEg_accel_y": 708, "VEg_accel_z": -2313}
+{"id": "e99fc617-c504-4582-a50e-bc6a03c4bfdf", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:23.91", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.82}
+{"id": "5039eaa7-a290-4a50-9747-49bebd32930a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:24.42", "s25JW_ambient_light_illuminance": 55.27, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.2, "s23V3_button_state": 0, "VDY_accel_x": 7496, "VDY_accel_y": -485, "VDY_accel_z": -6296}
+{"id": "cbe11ea3-d579-49be-bd53-7fc72e299799", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:24.43", "s25JU_ambient_light_illuminance": 55.74, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9364, "VEg_accel_y": 753, "VEg_accel_z": -2265}
+{"id": "12b7b9a8-adae-49eb-871b-2fcb723ac4f7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:24.44", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.36, "X2n_air_quality_air_pressure": 942.82}
+{"id": "b4a77124-782f-4144-b602-b37347443941", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:24.95", "s25JW_ambient_light_illuminance": 57.33, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7487, "VDY_accel_y": -483, "VDY_accel_z": -6260}
+{"id": "960a0091-7b3c-4f4d-a121-886d6ae76db9", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:24.96", "s25JU_ambient_light_illuminance": 59.63, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9409, "VEg_accel_y": 681, "VEg_accel_z": -2333}
+{"id": "29ba8468-6e0c-4848-9dfc-ee5145502428", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:24.97", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.82}
+{"id": "7270a1c8-c278-4fa0-b5cf-c7bf9ad329af", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:25.48", "s25JW_ambient_light_illuminance": 53.3, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.5, "s23V3_button_state": 0, "VDY_accel_x": 7514, "VDY_accel_y": -515, "VDY_accel_z": -6262}
+{"id": "3644600c-7c26-473a-9685-af57186cd411", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:25.49", "s25JU_ambient_light_illuminance": 61.71, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9471, "VEg_accel_y": 671, "VEg_accel_z": -2298}
+{"id": "9920f611-253f-4e34-b8d0-e12467860400", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:25.50", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 139.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.82}
+{"id": "f83d3e3a-4849-45f1-a8d7-0e7191ba0f27", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:26.01", "s25JW_ambient_light_illuminance": 48.51, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.2, "s23V3_button_state": 0, "VDY_accel_x": 7466, "VDY_accel_y": -508, "VDY_accel_z": -6285}
+{"id": "4930a78f-0538-4367-9770-a5d6b059b579", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:26.02", "s25JU_ambient_light_illuminance": 59.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9459, "VEg_accel_y": 755, "VEg_accel_z": -2280}
+{"id": "7a4a55de-2ac8-4d09-8c31-6faf15219599", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:26.03", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.82}
+{"id": "624f2d27-e856-4d5f-b0e2-0d840fa91991", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:26.54", "s25JW_ambient_light_illuminance": 59.63, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.5, "s23V3_button_state": 0, "VDY_accel_x": 7478, "VDY_accel_y": -473, "VDY_accel_z": -6323}
+{"id": "b3a9608d-cdb8-485d-b406-b28a67ae91f2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:26.55", "s25JU_ambient_light_illuminance": 60.2, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9413, "VEg_accel_y": 682, "VEg_accel_z": -2299}
+{"id": "21ea04aa-5844-421a-bf3b-82c3ee936647", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:26.56", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.82}
+{"id": "9e654ffa-5d4b-4195-93dd-0ae6cf372184", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:27.07", "s25JW_ambient_light_illuminance": 60.96, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.5, "s23V3_button_state": 0, "VDY_accel_x": 7506, "VDY_accel_y": -502, "VDY_accel_z": -6266}
+{"id": "3719ef38-0dc6-4f24-8164-0a79c036390c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:27.08", "s25JU_ambient_light_illuminance": 60.2, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9444, "VEg_accel_y": 726, "VEg_accel_z": -2314}
+{"id": "c19d7b93-0f17-4e47-b153-e148301105f0", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:27.09", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.82}
+{"id": "b68e9d5c-702c-41d6-9b07-70d2b84ededc", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:27.60", "s25JW_ambient_light_illuminance": 62.18, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7514, "VDY_accel_y": -509, "VDY_accel_z": -6321}
+{"id": "e33ddcb0-3218-4909-8c58-22ed3ed878a4", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:27.61", "s25JU_ambient_light_illuminance": 59.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9459, "VEg_accel_y": 769, "VEg_accel_z": -2245}
+{"id": "cf94634d-4d77-4345-8347-c0287b9255a7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:27.63", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.34, "X2n_air_quality_air_pressure": 942.82}
+{"id": "3b08c22f-38cf-45cf-816b-a8a5aabefbb6", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:28.14", "s25JW_ambient_light_illuminance": 60.71, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7495, "VDY_accel_y": -527, "VDY_accel_z": -6276}
+{"id": "df91b4f1-ef35-4abd-8270-2423900bac90", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:28.15", "s25JU_ambient_light_illuminance": 60.75, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 741, "VEg_accel_z": -2293}
+{"id": "d8d8aff0-f489-4dab-afda-75741829045d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:28.16", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "5f809ae0-8f3b-46de-ad9e-c6ebf18ac4dc", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:28.67", "s25JW_ambient_light_illuminance": 72.98, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.5, "s23V3_button_state": 0, "VDY_accel_x": 7517, "VDY_accel_y": -524, "VDY_accel_z": -6279}
+{"id": "58557080-e882-4749-bcf1-2ee9ae6d817e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:28.68", "s25JU_ambient_light_illuminance": 58.6, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9442, "VEg_accel_y": 717, "VEg_accel_z": -2323}
+{"id": "d6cf5d8e-78ab-4e64-a624-24e7a0326e3c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:28.69", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "c2fa65af-1e41-4958-aaad-d162c909c63b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:29.20", "s25JW_ambient_light_illuminance": 74.62, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7479, "VDY_accel_y": -458, "VDY_accel_z": -6292}
+{"id": "9b59c015-233e-4d08-a95f-1ff60fa19e06", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:29.21", "s25JU_ambient_light_illuminance": 52.99, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9445, "VEg_accel_y": 723, "VEg_accel_z": -2250}
+{"id": "1e1671a6-efa4-4b1c-bff3-775857b84a99", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:29.22", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "bf207a9a-c41c-4fbb-914a-873fcd6e13e7", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:29.73", "s25JW_ambient_light_illuminance": 77.39, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7495, "VDY_accel_y": -463, "VDY_accel_z": -6241}
+{"id": "bb5b5e87-4551-40f3-84ba-beb21d7db34b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:29.74", "s25JU_ambient_light_illuminance": 51.99, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9419, "VEg_accel_y": 762, "VEg_accel_z": -2253}
+{"id": "8e67d7d2-c060-419a-a1b1-51dbe98d8dac", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:29.75", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "791ec5ca-4d33-4a7e-b935-9947de2bf6dd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:30.26", "s25JW_ambient_light_illuminance": 74.2, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -480, "VDY_accel_z": -6317}
+{"id": "d68e0954-8737-4115-8167-f03bd0894c77", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:30.27", "s25JU_ambient_light_illuminance": 59.08, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9385, "VEg_accel_y": 721, "VEg_accel_z": -2271}
+{"id": "65d17248-2349-493c-8070-08cb4a2c0aea", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:30.28", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "720a7930-eed3-4d9c-bb65-9703f525b360", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:30.79", "s25JW_ambient_light_illuminance": 72.37, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7482, "VDY_accel_y": -484, "VDY_accel_z": -6286}
+{"id": "48dc687d-047b-4499-8017-a5ffd04cc239", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:30.80", "s25JU_ambient_light_illuminance": 62.56, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 694, "VEg_accel_z": -2261}
+{"id": "4f767b8b-b673-4ee5-ab5a-8b52d6f2621c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:30.81", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "71c8ca4a-6c55-47e8-b1e8-9c1bd947d027", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:31.32", "s25JW_ambient_light_illuminance": 61.2, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7504, "VDY_accel_y": -476, "VDY_accel_z": -6268}
+{"id": "b99880d8-9250-45ad-921e-46998945b805", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:31.33", "s25JU_ambient_light_illuminance": 65.5, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9434, "VEg_accel_y": 695, "VEg_accel_z": -2299}
+{"id": "7611942b-2735-4180-978e-3fbedc8da5e4", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:31.34", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "1098453e-6243-47a2-8d3a-a4fe74617876", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:31.85", "s25JW_ambient_light_illuminance": 66.62, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7491, "VDY_accel_y": -486, "VDY_accel_z": -6322}
+{"id": "95348a27-98f1-41f4-9306-79c696d3ff65", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:31.86", "s25JU_ambient_light_illuminance": 66.75, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9447, "VEg_accel_y": 720, "VEg_accel_z": -2261}
+{"id": "bf4e9287-470c-446a-beff-723bba2e61db", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:31.87", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "d19975d3-14f3-44ba-bb90-6b7a2cbb80b1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:32.38", "s25JW_ambient_light_illuminance": 66.89, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7518, "VDY_accel_y": -445, "VDY_accel_z": -6284}
+{"id": "298026f3-ba64-4b37-8b74-d46f00918145", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:32.39", "s25JU_ambient_light_illuminance": 64.92, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9412, "VEg_accel_y": 668, "VEg_accel_z": -2388}
+{"id": "52d4b9fb-91e9-48fd-8d28-9c8378ec5c1e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:32.40", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 149.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "d85bf0ed-ed11-4dfa-92f0-ffbdf14340d7", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:32.90", "s25JW_ambient_light_illuminance": 54.65, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.3, "s23V3_button_state": 0, "VDY_accel_x": 7481, "VDY_accel_y": -527, "VDY_accel_z": -6253}
+{"id": "5978070b-d053-4721-9e5e-ae9145dd6775", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:32.91", "s25JU_ambient_light_illuminance": 64.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9413, "VEg_accel_y": 776, "VEg_accel_z": -2267}
+{"id": "b8881539-2a32-4c62-a2d8-48750ae35e96", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:32.92", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "3a9162f9-94b2-47d2-8214-cfd38e5838e4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:33.43", "s25JW_ambient_light_illuminance": 60.44, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.5, "s23V3_button_state": 0, "VDY_accel_x": 7469, "VDY_accel_y": -524, "VDY_accel_z": -6230}
+{"id": "203a3f79-4aa3-462f-b08e-22159391b37e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:33.44", "s25JU_ambient_light_illuminance": 66.53, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9434, "VEg_accel_y": 684, "VEg_accel_z": -2342}
+{"id": "a8d6e61b-56cb-4bb8-9d13-dbe50cee8bcf", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:33.45", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "38655d65-3c90-4ac0-acdd-195287cd5636", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:33.96", "s25JW_ambient_light_illuminance": 43.97, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 10.3, "s23V3_button_state": 0, "VDY_accel_x": 7504, "VDY_accel_y": -484, "VDY_accel_z": -6359}
+{"id": "f097712e-c0ff-4e1c-92ea-9d0b6ae46227", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:33.97", "s25JU_ambient_light_illuminance": 66.23, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9396, "VEg_accel_y": 694, "VEg_accel_z": -2347}
+{"id": "86f381cf-427e-4296-b537-22cfb18d369b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:33.98", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "bbab03f8-1f60-443e-83d2-8b5cefef0b78", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:34.49", "s25JW_ambient_light_illuminance": 40.92, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 10.0, "s23V3_button_state": 0, "VDY_accel_x": 7474, "VDY_accel_y": -515, "VDY_accel_z": -6277}
+{"id": "87bd75e3-c690-47fb-89b2-7eea89dd2f44", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:34.50", "s25JU_ambient_light_illuminance": 65.87, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9390, "VEg_accel_y": 709, "VEg_accel_z": -2330}
+{"id": "5157aa8c-b05e-43aa-86ed-9e7c7c932b6e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:34.51", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "c91f738e-0c69-4df5-88b6-ac87428bdb4a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:35.02", "s25JW_ambient_light_illuminance": 32.83, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7509, "VDY_accel_y": -506, "VDY_accel_z": -6307}
+{"id": "c68e5da9-d623-4a76-8426-aa99c338749c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:35.03", "s25JU_ambient_light_illuminance": 61.24, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9450, "VEg_accel_y": 689, "VEg_accel_z": -2268}
+{"id": "277773e8-86fb-4f78-8c1b-6d1ed7fbfc3e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:35.04", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "3e45d03a-ebfe-42fc-bbb5-271e12130cd5", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:35.55", "s25JW_ambient_light_illuminance": 49.54, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.2, "s23V3_button_state": 0, "VDY_accel_x": 7492, "VDY_accel_y": -515, "VDY_accel_z": -6237}
+{"id": "fd23dcb2-033c-4865-9c67-1f552e22081d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:35.56", "s25JU_ambient_light_illuminance": 52.35, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 698, "VEg_accel_z": -2278}
+{"id": "f27c3fe6-96fb-4082-9588-49f687609fc1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:35.57", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "4540eafd-b315-4a26-b414-b567bfd061a4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:36.08", "s25JW_ambient_light_illuminance": 43.42, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.4, "s23V3_button_state": 0, "VDY_accel_x": 7502, "VDY_accel_y": -474, "VDY_accel_z": -6309}
+{"id": "3a5be86f-bc55-4d89-b0ea-7aab9aaeac29", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:36.09", "s25JU_ambient_light_illuminance": 50.26, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9366, "VEg_accel_y": 740, "VEg_accel_z": -2297}
+{"id": "51384e54-eba7-4637-89f2-ed04b68cd67c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:36.10", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "4d72f110-71f4-4e88-ab37-70d7769c60d8", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:36.61", "s25JW_ambient_light_illuminance": 40.59, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7492, "VDY_accel_y": -507, "VDY_accel_z": -6257}
+{"id": "fde95172-e8bb-482c-a1b6-85a34304c691", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:36.62", "s25JU_ambient_light_illuminance": 52.24, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9413, "VEg_accel_y": 734, "VEg_accel_z": -2268}
+{"id": "f8bb956c-159d-451b-b487-16e468326621", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:36.63", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "5af372ae-78cd-4832-b229-774037583f3b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:37.14", "s25JW_ambient_light_illuminance": 51.57, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7466, "VDY_accel_y": -554, "VDY_accel_z": -6253}
+{"id": "1ca76e4f-15d2-427e-837d-e5b30ae5f7c1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:37.15", "s25JU_ambient_light_illuminance": 52.3, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9453, "VEg_accel_y": 727, "VEg_accel_z": -2299}
+{"id": "f38edbee-636e-461d-839f-95958ecbe418", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:37.16", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 149.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "fdc264ee-9bd6-4d62-bc88-5eb53d54e3dd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:37.67", "s25JW_ambient_light_illuminance": 53.31, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7503, "VDY_accel_y": -513, "VDY_accel_z": -6333}
+{"id": "aa02c7f4-5d39-4d27-bfa9-4b935679dcf5", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:37.68", "s25JU_ambient_light_illuminance": 52.21, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 713, "VEg_accel_z": -2281}
+{"id": "f9c93c9d-0f79-4e40-a677-c0e82e8cf305", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:37.69", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "7ca96c10-adee-44fe-ace6-323fac834e02", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:38.20", "s25JW_ambient_light_illuminance": 54.47, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7500, "VDY_accel_y": -513, "VDY_accel_z": -6281}
+{"id": "fc46a24b-c0ff-4e98-bb97-1f99ff1d9eb3", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:38.21", "s25JU_ambient_light_illuminance": 59.15, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9377, "VEg_accel_y": 684, "VEg_accel_z": -2263}
+{"id": "b3521d31-ac60-4f31-9d60-83a0c71e6330", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:38.22", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "8e7dd8e5-6057-4142-b736-a58770627d1b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:38.73", "s25JW_ambient_light_illuminance": 54.98, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7507, "VDY_accel_y": -493, "VDY_accel_z": -6293}
+{"id": "2f345d77-ab7d-433f-87ba-02430ea44072", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:38.74", "s25JU_ambient_light_illuminance": 59.73, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9432, "VEg_accel_y": 710, "VEg_accel_z": -2296}
+{"id": "b76ddc52-c2ab-4c94-aacc-de8b33d9d054", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:38.75", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "d7a71ba1-df25-4eee-a63d-074d61428e23", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:39.26", "s25JW_ambient_light_illuminance": 53.18, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7512, "VDY_accel_y": -482, "VDY_accel_z": -6312}
+{"id": "e4409b71-c59c-4b3f-b095-7a157c84b048", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:39.27", "s25JU_ambient_light_illuminance": 50.33, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9445, "VEg_accel_y": 735, "VEg_accel_z": -2216}
+{"id": "f6c461fd-f3e7-498d-a914-6b058dde3890", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:39.28", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "cb3600b1-8fb1-4c0c-ae99-a97fef2d2b2e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:39.80", "s25JW_ambient_light_illuminance": 49.95, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7491, "VDY_accel_y": -485, "VDY_accel_z": -6303}
+{"id": "72a47ab5-0947-439c-a267-a7c9055095ed", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:39.81", "s25JU_ambient_light_illuminance": 52.14, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9413, "VEg_accel_y": 733, "VEg_accel_z": -2357}
+{"id": "0484ca7f-ccbc-4dda-abb4-1f8693a63fff", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:39.82", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "fd07836d-feee-4695-ad1d-5b599357a82f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:40.33", "s25JW_ambient_light_illuminance": 47.31, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7528, "VDY_accel_y": -531, "VDY_accel_z": -6311}
+{"id": "c28c3b58-aada-4b19-a847-b93264f39f49", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:40.34", "s25JU_ambient_light_illuminance": 50.66, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9434, "VEg_accel_y": 698, "VEg_accel_z": -2293}
+{"id": "5b4efae0-0c09-4958-b804-134c5d995752", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:40.35", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "8f97dd82-5ca6-40f4-ac0f-03c4ce6be681", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:40.86", "s25JW_ambient_light_illuminance": 47.01, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7509, "VDY_accel_y": -488, "VDY_accel_z": -6292}
+{"id": "a024c0a9-5fb2-4451-942f-2c1168c59479", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:40.87", "s25JU_ambient_light_illuminance": 51.38, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9430, "VEg_accel_y": 708, "VEg_accel_z": -2285}
+{"id": "89c58936-73f5-4a0f-b1c8-eead7584e84e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:40.88", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "8d309db9-f59b-4086-8764-054c54adb413", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:41.39", "s25JW_ambient_light_illuminance": 48.24, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 1, "VDY_accel_x": 7416, "VDY_accel_y": -439, "VDY_accel_z": -6156}
+{"id": "5d801ded-900c-4109-9b2d-aacce4be7f02", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:41.40", "s25JU_ambient_light_illuminance": 51.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9412, "VEg_accel_y": 671, "VEg_accel_z": -2270}
+{"id": "222c0d15-fe23-4ba3-858c-6cdb0fde1f7e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:41.41", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "618d2485-9d83-4044-97ad-c759ce117a4c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:41.92", "s25JW_ambient_light_illuminance": 50.75, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.8, "s23V3_button_state": 1, "VDY_accel_x": 7510, "VDY_accel_y": -521, "VDY_accel_z": -6336}
+{"id": "74865818-ee22-4038-aee0-a977ea7f2391", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:41.93", "s25JU_ambient_light_illuminance": 50.66, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9401, "VEg_accel_y": 698, "VEg_accel_z": -2278}
+{"id": "1f78fdb4-1163-4697-ac69-5181e3d3f13d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:41.94", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.81}
+{"id": "445f27d6-63f8-4cbc-a163-1099ee34c355", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:42.45", "s25JW_ambient_light_illuminance": 49.75, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.8, "s23V3_button_state": 1, "VDY_accel_x": 7502, "VDY_accel_y": -490, "VDY_accel_z": -6237}
+{"id": "fb270214-6a95-4504-8373-91025467922d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:42.46", "s25JU_ambient_light_illuminance": 50.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9450, "VEg_accel_y": 724, "VEg_accel_z": -2256}
+{"id": "a794d723-9b65-4ff6-bbc7-32307fc62dd6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:42.47", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "d2e55eb5-1cdf-4b2d-a726-c3d1d45cf191", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:42.98", "s25JW_ambient_light_illuminance": 50.11, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.8, "s23V3_button_state": 1, "VDY_accel_x": 7482, "VDY_accel_y": -476, "VDY_accel_z": -6304}
+{"id": "06c35b65-124a-4f97-91fb-3321bc042201", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:42.99", "s25JU_ambient_light_illuminance": 50.9, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9418, "VEg_accel_y": 748, "VEg_accel_z": -2296}
+{"id": "1e03e6d3-99dd-4952-8930-08cc3fd71604", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:43.00", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "4c376bdb-8416-44d3-942a-24f1a3e68477", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:43.51", "s25JW_ambient_light_illuminance": 50.5, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.8, "s23V3_button_state": 1, "VDY_accel_x": 7500, "VDY_accel_y": -459, "VDY_accel_z": -6270}
+{"id": "9c7323ee-36fe-423a-9e8b-a14fb72252a2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:43.52", "s25JU_ambient_light_illuminance": 50.7, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9385, "VEg_accel_y": 671, "VEg_accel_z": -2254}
+{"id": "60bb2593-9888-439a-a528-da9097700710", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:43.53", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "a039ce3d-8367-495a-af55-4fe7f46d584e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:44.04", "s25JW_ambient_light_illuminance": 50.94, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.8, "s23V3_button_state": 1, "VDY_accel_x": 7503, "VDY_accel_y": -526, "VDY_accel_z": -6267}
+{"id": "11cdcdb8-c8fc-4845-81f5-3a6ef7b3de6a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:44.05", "s25JU_ambient_light_illuminance": 50.9, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9418, "VEg_accel_y": 753, "VEg_accel_z": -2224}
+{"id": "d950d699-19da-4d6c-8e09-89fe6ea76916", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:44.06", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 149.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "a6138b2a-39a7-43ff-8640-fa9bbe3251b9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:44.57", "s25JW_ambient_light_illuminance": 51.88, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.8, "s23V3_button_state": 1, "VDY_accel_x": 7503, "VDY_accel_y": -521, "VDY_accel_z": -6239}
+{"id": "182f3104-372b-44f1-9ac7-6ed6464668a9", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:44.58", "s25JU_ambient_light_illuminance": 51.8, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9445, "VEg_accel_y": 751, "VEg_accel_z": -2280}
+{"id": "02294cea-96a9-4c4f-8e53-4ca732067216", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:44.59", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "6b063fb3-d489-46e2-a5f2-6605842ba3d3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:45.10", "s25JW_ambient_light_illuminance": 50.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 1, "VDY_accel_x": 7500, "VDY_accel_y": -464, "VDY_accel_z": -6267}
+{"id": "9c17c2da-02c3-4265-a3a8-b21dfe41c92f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:45.11", "s25JU_ambient_light_illuminance": 51.8, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9403, "VEg_accel_y": 709, "VEg_accel_z": -2254}
+{"id": "afd5c988-d1ef-401f-87e3-524939645ffe", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:45.11", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.43, "X2n_air_quality_air_pressure": 942.82}
+{"id": "2bc17dad-7439-4608-8933-1282e3a2f3b6", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:45.63", "s25JW_ambient_light_illuminance": 48.66, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 1, "VDY_accel_x": 7510, "VDY_accel_y": -537, "VDY_accel_z": -6228}
+{"id": "ccd8507f-1fb0-49dd-9cc7-993bb37750fb", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:45.64", "s25JU_ambient_light_illuminance": 51.8, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9400, "VEg_accel_y": 735, "VEg_accel_z": -2308}
+{"id": "059dbe50-448b-4de7-8ce9-31847b2d1562", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:45.64", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.81}
+{"id": "0f6116a6-178d-4005-9df1-941266757a26", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:46.15", "s25JW_ambient_light_illuminance": 46.32, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7500, "VDY_accel_y": -501, "VDY_accel_z": -6315}
+{"id": "f3d6fc32-0ee4-4624-909f-079c2cc58247", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:46.16", "s25JU_ambient_light_illuminance": 51.67, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9396, "VEg_accel_y": 734, "VEg_accel_z": -2216}
+{"id": "0882dc38-7e5a-45be-9fff-c1e2325a2900", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:46.17", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.81}
+{"id": "bd983cf9-7889-403e-8f2a-bca8dd038869", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:46.68", "s25JW_ambient_light_illuminance": 48.41, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.6, "s23V3_button_state": 0, "VDY_accel_x": 7509, "VDY_accel_y": -501, "VDY_accel_z": -6276}
+{"id": "83efd741-30dc-41ca-b105-29ff76f3ba49", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:46.70", "s25JU_ambient_light_illuminance": 52.02, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9410, "VEg_accel_y": 702, "VEg_accel_z": -2280}
+{"id": "9b3a80af-2438-44f0-9336-e2b7150f7aba", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:46.71", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.81}
+{"id": "becb8e6e-5517-4a79-9f72-4bc9df4b54a5", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:47.22", "s25JW_ambient_light_illuminance": 48.87, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.5, "s23V3_button_state": 0, "VDY_accel_x": 7493, "VDY_accel_y": -492, "VDY_accel_z": -6312}
+{"id": "095bd30b-f909-4292-a2f7-281f20d1cf5a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:47.23", "s25JU_ambient_light_illuminance": 49.54, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9423, "VEg_accel_y": 725, "VEg_accel_z": -2290}
+{"id": "428e735f-d768-46e5-98b3-0526380a0d2e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:47.24", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.81}
+{"id": "59fb150c-f939-41c0-a1e7-2b425e6d9dc7", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:47.75", "s25JW_ambient_light_illuminance": 50.71, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.5, "s23V3_button_state": 0, "VDY_accel_x": 7470, "VDY_accel_y": -511, "VDY_accel_z": -6267}
+{"id": "c63a84bf-087e-4b2e-994d-0aa1e1903ad3", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:47.76", "s25JU_ambient_light_illuminance": 53.15, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 670, "VEg_accel_z": -2263}
+{"id": "742baa7c-6e1f-4a8d-a7fd-e319052001eb", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:47.77", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.81}
+{"id": "8b476504-6add-4b83-a0eb-60de72499f64", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:48.29", "s25JW_ambient_light_illuminance": 55.85, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7500, "VDY_accel_y": -500, "VDY_accel_z": -6295}
+{"id": "1219ea27-600b-48aa-a377-0e2635de8990", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:48.30", "s25JU_ambient_light_illuminance": 63.53, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9425, "VEg_accel_y": 695, "VEg_accel_z": -2290}
+{"id": "c94b6fcd-0ee0-44cb-bb43-dadc6fb38e2e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:48.31", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 146.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.81}
+{"id": "19124ec6-12d8-4517-89fd-2ca0f54fd7f1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:48.82", "s25JW_ambient_light_illuminance": 53.01, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7519, "VDY_accel_y": -514, "VDY_accel_z": -6332}
+{"id": "1cdb16c0-a660-4bc6-bb65-c6ac038d758b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:48.83", "s25JU_ambient_light_illuminance": 75.55, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9462, "VEg_accel_y": 704, "VEg_accel_z": -2308}
+{"id": "3bbac542-0c9f-46ff-94b7-a65240b3c134", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:48.84", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 60.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.42, "X2n_air_quality_air_pressure": 942.81}
+{"id": "d882a2e7-3d8d-4c75-a929-e779523407d8", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:49.35", "s25JW_ambient_light_illuminance": 54.79, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.7, "s23V3_button_state": 0, "VDY_accel_x": 7496, "VDY_accel_y": -510, "VDY_accel_z": -6342}
+{"id": "049753cb-f3ed-45d8-b2ee-5c4957ffa89c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:49.36", "s25JU_ambient_light_illuminance": 73.91, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9460, "VEg_accel_y": 674, "VEg_accel_z": -2248}
+{"id": "68a70b51-0a16-4e1d-8e47-d509fe5714d3", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:49.37", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 84.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.42, "X2n_air_quality_air_pressure": 942.81}
+{"id": "fc32e099-2ae4-44c7-8ceb-fb69d90523ca", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:49.88", "s25JW_ambient_light_illuminance": 62.84, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7532, "VDY_accel_y": -494, "VDY_accel_z": -6268}
+{"id": "ddc3f5c9-fd19-4be5-b18b-524977642baf", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:49.89", "s25JU_ambient_light_illuminance": 74.42, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9402, "VEg_accel_y": 696, "VEg_accel_z": -2290}
+{"id": "9345780f-ee71-45b1-a37d-53338b29a1ad", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:49.90", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 90.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.42, "X2n_air_quality_air_pressure": 942.81}
+{"id": "95d8172c-948c-4902-bd18-0aaacc2a028b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:50.41", "s25JW_ambient_light_illuminance": 69.76, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7487, "VDY_accel_y": -492, "VDY_accel_z": -6232}
+{"id": "b5c1060b-f0bd-415b-af13-a0fc02bbed69", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:50.42", "s25JU_ambient_light_illuminance": 75.63, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9442, "VEg_accel_y": 701, "VEg_accel_z": -2288}
+{"id": "90d08c9b-3b05-4e57-9cec-8b6db4fd24fa", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:50.43", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 87.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.42, "X2n_air_quality_air_pressure": 942.81}
+{"id": "1cf61e43-dcc7-4531-98ec-a1bf197f08c6", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:50.94", "s25JW_ambient_light_illuminance": 74.44, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7509, "VDY_accel_y": -477, "VDY_accel_z": -6277}
+{"id": "4baeb6e0-8031-40c0-a13c-2de7776364b8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:50.95", "s25JU_ambient_light_illuminance": 73.51, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9431, "VEg_accel_y": 737, "VEg_accel_z": -2349}
+{"id": "c8c9cb88-c2b0-41cc-bd44-5c5f8c88b52f", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:50.96", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 77.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.42, "X2n_air_quality_air_pressure": 942.81}
+{"id": "59f1f65e-0c19-4f0b-929d-5a809f0e517c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:51.47", "s25JW_ambient_light_illuminance": 75.03, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7506, "VDY_accel_y": -579, "VDY_accel_z": -6269}
+{"id": "d9e59c89-9f89-4210-a03c-2af680e697d9", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:51.48", "s25JU_ambient_light_illuminance": 75.94, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9417, "VEg_accel_y": 679, "VEg_accel_z": -2279}
+{"id": "37af7410-4de8-466c-b0bd-ac528a18ee88", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:51.49", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 63.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "d0e32d14-ac1f-4775-b7d7-2013b5085d1c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:52.00", "s25JW_ambient_light_illuminance": 75.11, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7517, "VDY_accel_y": -499, "VDY_accel_z": -6281}
+{"id": "e28d5ea8-f269-4b3b-8f6b-99e25c704335", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:52.01", "s25JU_ambient_light_illuminance": 53.24, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 671, "VEg_accel_z": -2232}
+{"id": "e48d7078-67a6-42ca-a9c0-650444326be2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:52.02", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "bef61fd9-0b59-46e0-bf79-856e64f36cf3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:52.53", "s25JW_ambient_light_illuminance": 73.83, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7514, "VDY_accel_y": -499, "VDY_accel_z": -6265}
+{"id": "411df364-b076-49b8-ad71-942e09554a55", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:52.53", "s25JU_ambient_light_illuminance": 54.64, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9434, "VEg_accel_y": 704, "VEg_accel_z": -2306}
+{"id": "2c1811dc-a5b4-4d83-a6b3-70f2cc60eeb4", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:52.54", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "773f2497-4ca5-4e38-bfc1-1ae8bd8d9972", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:53.05", "s25JW_ambient_light_illuminance": 68.92, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7495, "VDY_accel_y": -500, "VDY_accel_z": -6259}
+{"id": "89bb7b08-3dbb-4953-90d8-cb2481c066a7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:53.06", "s25JU_ambient_light_illuminance": 54.05, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9399, "VEg_accel_y": 701, "VEg_accel_z": -2281}
+{"id": "af14e466-9c54-42b4-9528-133069bebc6e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:53.07", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "fbbaa63d-6dbf-4128-b092-afce66bb7332", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:53.58", "s25JW_ambient_light_illuminance": 68.26, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7495, "VDY_accel_y": -491, "VDY_accel_z": -6290}
+{"id": "883762e9-a429-4560-a3f9-a5f261416812", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:53.59", "s25JU_ambient_light_illuminance": 51.21, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9437, "VEg_accel_y": 738, "VEg_accel_z": -2287}
+{"id": "a281640b-3672-48c9-8980-0416107d8977", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:53.61", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 40.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "0ad80b9f-6de2-4360-a6aa-c99e8eab7c21", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:54.12", "s25JW_ambient_light_illuminance": 61.69, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7517, "VDY_accel_y": -493, "VDY_accel_z": -6284}
+{"id": "290c2aad-96ba-4abf-baf6-b9ccde698429", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:54.13", "s25JU_ambient_light_illuminance": 51.27, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9447, "VEg_accel_y": 659, "VEg_accel_z": -2272}
+{"id": "a7d9460a-b42f-41bb-9c2f-246b59b017e9", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:54.14", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.81}
+{"id": "c623e3bd-9aee-4728-90bc-11da9f893a71", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:54.65", "s25JW_ambient_light_illuminance": 71.14, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.0, "s23V3_button_state": 0, "VDY_accel_x": 7516, "VDY_accel_y": -498, "VDY_accel_z": -6298}
+{"id": "4f76e773-c651-414d-ac9d-1ccf96887f4c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:54.66", "s25JU_ambient_light_illuminance": 53.22, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9435, "VEg_accel_y": 679, "VEg_accel_z": -2347}
+{"id": "6019dfd0-03fe-4ef1-9e7b-010954a898ee", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:54.66", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.38, "X2n_air_quality_air_pressure": 942.83}
+{"id": "024c2197-cb0d-4b2f-bbd6-7cfd1f0d0fb4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:55.18", "s25JW_ambient_light_illuminance": 71.2, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7507, "VDY_accel_y": -472, "VDY_accel_z": -6284}
+{"id": "b9ec0c0b-ee7f-4748-bea6-cba225a6858c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:55.19", "s25JU_ambient_light_illuminance": 52.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9409, "VEg_accel_y": 715, "VEg_accel_z": -2307}
+{"id": "aceaaec9-b3d6-4e1a-ad1d-114ca650d7a3", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:55.20", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.38, "X2n_air_quality_air_pressure": 942.83}
+{"id": "7cf4230e-0dce-40fd-a5fd-9c192977b18d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:55.71", "s25JW_ambient_light_illuminance": 69.22, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7500, "VDY_accel_y": -513, "VDY_accel_z": -6265}
+{"id": "3c9c05fd-8ac6-4df6-b924-888e545f21a7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:55.74", "s25JU_ambient_light_illuminance": 52.7, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9400, "VEg_accel_y": 692, "VEg_accel_z": -2288}
+{"id": "905ef13e-1c06-4309-9a12-2c955d64cd83", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:55.75", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.38, "X2n_air_quality_air_pressure": 942.83}
+{"id": "2bc79afa-9aa4-44fd-9b12-9f152dd9b62e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:56.26", "s25JW_ambient_light_illuminance": 58.27, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7523, "VDY_accel_y": -452, "VDY_accel_z": -6254}
+{"id": "8d20f3ad-1af7-454a-ad8f-e0afea677272", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:56.27", "s25JU_ambient_light_illuminance": 57.24, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9426, "VEg_accel_y": 702, "VEg_accel_z": -2308}
+{"id": "ee264c44-1c0b-4e40-805c-16dc6befebd8", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:56.28", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.38, "X2n_air_quality_air_pressure": 942.83}
+{"id": "bcf945df-199a-4fb1-8667-cdae63e54fd4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:56.79", "s25JW_ambient_light_illuminance": 74.6, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7504, "VDY_accel_y": -461, "VDY_accel_z": -6325}
+{"id": "9fbf4249-0368-4d3d-a681-10e0be4abc5a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:56.80", "s25JU_ambient_light_illuminance": 53.01, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9457, "VEg_accel_y": 729, "VEg_accel_z": -2271}
+{"id": "8becf688-19db-4fd7-985f-ec236904f13a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:56.81", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.38, "X2n_air_quality_air_pressure": 942.83}
+{"id": "d42fd706-7471-4f51-99c9-369c5413da12", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:57.32", "s25JW_ambient_light_illuminance": 70.34, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -459, "VDY_accel_z": -6250}
+{"id": "ad18ac06-a180-4cfd-ba44-a767b6ac3ca8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:57.33", "s25JU_ambient_light_illuminance": 55.38, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9436, "VEg_accel_y": 778, "VEg_accel_z": -2279}
+{"id": "d398b6a3-c8ec-44b3-a5d9-f5e32b4963ce", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:57.33", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "a889da48-23f7-4bd5-ad6e-40259d1eaaf6", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:57.84", "s25JW_ambient_light_illuminance": 76.04, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7514, "VDY_accel_y": -490, "VDY_accel_z": -6305}
+{"id": "6e00072d-0ff0-47c4-ad9e-9783988c03ba", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:57.85", "s25JU_ambient_light_illuminance": 52.08, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9417, "VEg_accel_y": 765, "VEg_accel_z": -2301}
+{"id": "06335233-82f7-4366-9bd9-5677bc58f8a2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:57.86", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 87.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "b06f591c-bc2b-4eb1-8d15-969e2ae0ff9a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:58.37", "s25JW_ambient_light_illuminance": 74.97, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -482, "VDY_accel_z": -6289}
+{"id": "aea7e479-f42a-4686-be17-cde2f20d3d82", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:58.38", "s25JU_ambient_light_illuminance": 51.89, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9382, "VEg_accel_y": 628, "VEg_accel_z": -2307}
+{"id": "85ea3003-cfc9-46ae-af2f-c5c3e47fb53d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:58.39", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 66.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "2bad662d-c509-4f53-aa3b-5558eb9f73b8", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:58.90", "s25JW_ambient_light_illuminance": 76.2, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7516, "VDY_accel_y": -488, "VDY_accel_z": -6297}
+{"id": "dcb8ba01-5130-45c6-b675-73618a93e38b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:58.91", "s25JU_ambient_light_illuminance": 63.22, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9405, "VEg_accel_y": 728, "VEg_accel_z": -2300}
+{"id": "51ed744e-0702-4133-8237-dd7d91838a92", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:58.92", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "c38a1568-d1c7-4ec1-b950-25a34c6febb7", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:59.43", "s25JW_ambient_light_illuminance": 76.45, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7488, "VDY_accel_y": -500, "VDY_accel_z": -6310}
+{"id": "74b2dcf8-2a49-4093-afd3-467329107e6a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:59.44", "s25JU_ambient_light_illuminance": 77.79, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9428, "VEg_accel_y": 736, "VEg_accel_z": -2208}
+{"id": "b2cd8f6e-e2a9-462d-b8f0-998f0472e332", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:59.45", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 56.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "48278e47-5e83-4be2-85c8-b2eaed0b0039", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:27:59.96", "s25JW_ambient_light_illuminance": 75.47, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7516, "VDY_accel_y": -515, "VDY_accel_z": -6309}
+{"id": "2c4b5753-3657-43bf-8cd4-e11014209629", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:27:59.97", "s25JU_ambient_light_illuminance": 77.28, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9429, "VEg_accel_y": 725, "VEg_accel_z": -2280}
+{"id": "87ce8c28-00ca-4ff4-b668-d679f2172f77", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:27:59.98", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 67.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.81}
+{"id": "8a7cdb09-055c-46a0-b1bd-3d9313e53e08", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:00.49", "s25JW_ambient_light_illuminance": 76.12, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -535, "VDY_accel_z": -6289}
+{"id": "6dba41fb-7c2b-4c43-b47b-d24c05677e1f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:00.50", "s25JU_ambient_light_illuminance": 76.28, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9430, "VEg_accel_y": 770, "VEg_accel_z": -2293}
+{"id": "2d464fd4-609b-4cc5-9330-9e245ce2ff17", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:00.51", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 78.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.82}
+{"id": "f89753ad-90c4-4196-b103-41a90fc4456f", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:01.02", "s25JW_ambient_light_illuminance": 75.19, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7488, "VDY_accel_y": -557, "VDY_accel_z": -6336}
+{"id": "3f61bc59-e303-4403-871b-56b4037865f8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:01.03", "s25JU_ambient_light_illuminance": 77.21, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9460, "VEg_accel_y": 777, "VEg_accel_z": -2299}
+{"id": "fca0abe2-7973-43b9-859d-55c8aa414788", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:01.04", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.82}
+{"id": "fac84208-7615-4a2b-a8b8-6b1ccd057af9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:01.55", "s25JW_ambient_light_illuminance": 75.36, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7474, "VDY_accel_y": -496, "VDY_accel_z": -6328}
+{"id": "7c17ad65-0034-4d94-b8b5-d266e92063a2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:01.56", "s25JU_ambient_light_illuminance": 56.02, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9459, "VEg_accel_y": 766, "VEg_accel_z": -2284}
+{"id": "b4d0fd05-9a1e-40a3-9d29-0215c50bd6b7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:01.57", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.82}
+{"id": "fbfe5f25-2371-4b8b-a378-a1b4adfbc86a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:02.08", "s25JW_ambient_light_illuminance": 70.95, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7507, "VDY_accel_y": -463, "VDY_accel_z": -6249}
+{"id": "1ae576c8-d800-4639-9755-d185382c25e0", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:02.09", "s25JU_ambient_light_illuminance": 49.91, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9411, "VEg_accel_y": 678, "VEg_accel_z": -2310}
+{"id": "83f4f7c3-abc5-4622-800e-1329a2253d8d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:02.11", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.82}
+{"id": "d9eab08c-2ab1-4a28-8ae7-d8bd652be103", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:02.62", "s25JW_ambient_light_illuminance": 63.62, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 1, "VDY_accel_x": 7561, "VDY_accel_y": -456, "VDY_accel_z": -6248}
+{"id": "8bb87fd6-d202-4979-b2ec-6bb874e1a34d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:02.63", "s25JU_ambient_light_illuminance": 51.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9474, "VEg_accel_y": 657, "VEg_accel_z": -2161}
+{"id": "f932277f-7356-442d-a61d-985b199e703c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:02.64", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.82}
+{"id": "5cbd6c6b-0671-4623-b96f-b38767904341", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:03.15", "s25JW_ambient_light_illuminance": 61.9, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 1, "VDY_accel_x": 7502, "VDY_accel_y": -487, "VDY_accel_z": -6282}
+{"id": "a72ea8df-eab7-41d7-826b-bdd579305533", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:03.16", "s25JU_ambient_light_illuminance": 51.15, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9422, "VEg_accel_y": 723, "VEg_accel_z": -2320}
+{"id": "86c04b8a-04cb-49aa-b8d6-612460dfd839", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:03.17", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.81}
+{"id": "bebb3997-d8eb-4f45-9477-d8b5cd15fd08", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:03.68", "s25JW_ambient_light_illuminance": 64.04, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 1, "VDY_accel_x": 7490, "VDY_accel_y": -503, "VDY_accel_z": -6249}
+{"id": "b680b236-8108-4af1-aed3-5ec93df41f72", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:03.69", "s25JU_ambient_light_illuminance": 51.86, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 718, "VEg_accel_z": -2349}
+{"id": "df64d0a0-86ea-4208-8105-1da6f94645ef", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:03.70", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.81}
+{"id": "8ce5cbc0-009e-49c3-b1b4-f7ef3825830e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:04.21", "s25JW_ambient_light_illuminance": 66.3, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 1, "VDY_accel_x": 7520, "VDY_accel_y": -501, "VDY_accel_z": -6248}
+{"id": "fc5c7b83-70f8-4baa-af05-a050dc2edd0d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:04.22", "s25JU_ambient_light_illuminance": 50.66, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9429, "VEg_accel_y": 686, "VEg_accel_z": -2376}
+{"id": "20fcc787-5097-49e6-ab10-5019092dab06", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:04.23", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.81}
+{"id": "512f9475-2b17-4691-8291-7e30930491c2", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:04.75", "s25JW_ambient_light_illuminance": 67.01, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 1, "VDY_accel_x": 7485, "VDY_accel_y": -500, "VDY_accel_z": -6291}
+{"id": "75d138b5-e185-4283-8464-d6114080ccfa", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:04.75", "s25JU_ambient_light_illuminance": 51.02, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9386, "VEg_accel_y": 765, "VEg_accel_z": -2331}
+{"id": "e24f1085-b0a8-4bd0-a693-a4596ab09202", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:04.76", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.81}
+{"id": "fb6c67f3-3e9d-4cff-b8e5-099eae420205", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:05.27", "s25JW_ambient_light_illuminance": 65.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 1, "VDY_accel_x": 7495, "VDY_accel_y": -478, "VDY_accel_z": -6282}
+{"id": "84401172-61f8-4ae3-b8ff-7bc509f57e65", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:05.29", "s25JU_ambient_light_illuminance": 50.66, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9429, "VEg_accel_y": 725, "VEg_accel_z": -2324}
+{"id": "04bbf21f-5f44-4064-bd24-27464bfd5c0c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:05.29", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.81}
+{"id": "e24eb7b4-40e8-4b46-ad64-2a7ad308f8e0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:05.80", "s25JW_ambient_light_illuminance": 66.94, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7523, "VDY_accel_y": -543, "VDY_accel_z": -6240}
+{"id": "61fd18be-53ef-44f4-973b-9829414c75cc", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:05.81", "s25JU_ambient_light_illuminance": 51.14, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9432, "VEg_accel_y": 692, "VEg_accel_z": -2223}
+{"id": "96df5375-640a-4e11-8dee-3f8af3fe58ea", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:05.83", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.81}
+{"id": "ed908ce7-613a-4dff-a64f-58658e6c8bb6", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:06.34", "s25JW_ambient_light_illuminance": 68.94, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7495, "VDY_accel_y": -442, "VDY_accel_z": -6301}
+{"id": "14242fd2-d7d6-4e9e-bf57-49fd2d097644", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:06.35", "s25JU_ambient_light_illuminance": 51.85, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9437, "VEg_accel_y": 692, "VEg_accel_z": -2317}
+{"id": "ddbd8e4d-f45f-4298-97a1-386660bc178f", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:06.36", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "2dd0a79e-111e-4e8b-aaeb-4bc61868be28", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:06.87", "s25JW_ambient_light_illuminance": 70.03, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -473, "VDY_accel_z": -6252}
+{"id": "21f5e27c-e9ef-4521-9f76-6cae39b30b37", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:06.88", "s25JU_ambient_light_illuminance": 51.51, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9370, "VEg_accel_y": 707, "VEg_accel_z": -2307}
+{"id": "32bf6b34-169a-475f-ac8e-95e38a18b443", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:06.89", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "c541ba67-ab51-4fc1-96de-c0971362e34a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:07.40", "s25JW_ambient_light_illuminance": 76.32, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7481, "VDY_accel_y": -495, "VDY_accel_z": -6312}
+{"id": "ccbcc9db-d2b5-4816-b33d-9e36cd418e69", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:07.41", "s25JU_ambient_light_illuminance": 51.99, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9422, "VEg_accel_y": 711, "VEg_accel_z": -2263}
+{"id": "e7b189e5-8f9e-44d7-92e7-06ff46fccb7f", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:07.42", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "6579e809-055b-4f27-962c-54afe3f79115", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:07.93", "s25JW_ambient_light_illuminance": 75.25, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7481, "VDY_accel_y": -494, "VDY_accel_z": -6271}
+{"id": "f632bdf5-23f9-4253-bbe9-34d77faa69be", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:07.94", "s25JU_ambient_light_illuminance": 62.08, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9454, "VEg_accel_y": 635, "VEg_accel_z": -2354}
+{"id": "972ea5c5-333d-4a18-8623-18108c3c346e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:07.95", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 47.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "1114ae6f-9f82-43c7-8c58-d3a4b123f399", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:08.46", "s25JW_ambient_light_illuminance": 75.51, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -498, "VDY_accel_z": -6331}
+{"id": "cb2a37f8-7225-4c7e-89f3-7ed98d84b0f0", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:08.47", "s25JU_ambient_light_illuminance": 57.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9439, "VEg_accel_y": 704, "VEg_accel_z": -2331}
+{"id": "935b3680-c079-4299-9b6f-ec8124a47944", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:08.48", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 33.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "2ec4446f-a3a5-4845-a1e1-b13db90b1b8d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:08.99", "s25JW_ambient_light_illuminance": 76.55, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7523, "VDY_accel_y": -460, "VDY_accel_z": -6298}
+{"id": "5a5e25ee-fbb0-4c1e-9bc7-c5a01e88d65b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:09.00", "s25JU_ambient_light_illuminance": 51.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9440, "VEg_accel_y": 712, "VEg_accel_z": -2273}
+{"id": "3d0a7320-bdfa-4f89-b09b-b0035718c995", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:09.01", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 34.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.37, "X2n_air_quality_air_pressure": 942.81}
+{"id": "a7636da8-ba3b-40ee-8bfc-8f69599c7176", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:09.52", "s25JW_ambient_light_illuminance": 74.81, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7492, "VDY_accel_y": -545, "VDY_accel_z": -6307}
+{"id": "a47e99af-09a3-4655-b3b5-5f828a1297b6", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:09.53", "s25JU_ambient_light_illuminance": 50.4, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9446, "VEg_accel_y": 684, "VEg_accel_z": -2249}
+{"id": "3fe7cfff-5442-4753-993b-ed501da1895d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:09.54", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 22.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.37, "X2n_air_quality_air_pressure": 942.81}
+{"id": "f8b14fc6-020d-4e1d-be57-513dc41e3703", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:10.05", "s25JW_ambient_light_illuminance": 74.75, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7489, "VDY_accel_y": -485, "VDY_accel_z": -6258}
+{"id": "6aefacd5-c42f-460a-9fe0-f240813de9fd", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:10.06", "s25JU_ambient_light_illuminance": 55.4, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9393, "VEg_accel_y": 706, "VEg_accel_z": -2310}
+{"id": "fac76cb3-0fb6-4b06-9854-20daccbdd9cf", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:10.07", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.37, "X2n_air_quality_air_pressure": 942.81}
+{"id": "406ba661-e3e0-4f23-895a-ef2ae82e0762", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:10.58", "s25JW_ambient_light_illuminance": 74.17, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7495, "VDY_accel_y": -498, "VDY_accel_z": -6291}
+{"id": "e7fcffa2-0023-4e54-9454-37e4dc545d2d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:10.59", "s25JU_ambient_light_illuminance": 60.22, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9393, "VEg_accel_y": 725, "VEg_accel_z": -2349}
+{"id": "5cd48dac-e3dd-431c-886f-daa6046351a9", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:10.60", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 31.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.37, "X2n_air_quality_air_pressure": 942.81}
+{"id": "7f1fb9e1-d203-42b0-a679-ed3bd5079a29", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:11.11", "s25JW_ambient_light_illuminance": 74.69, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -510, "VDY_accel_z": -6271}
+{"id": "0dc0d46a-51a9-4c47-8db8-79325269a06d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:11.12", "s25JU_ambient_light_illuminance": 57.4, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9437, "VEg_accel_y": 721, "VEg_accel_z": -2293}
+{"id": "3ee72ef0-b94c-4c4d-bb39-15faf20fdbdd", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:11.13", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 27.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.37, "X2n_air_quality_air_pressure": 942.81}
+{"id": "d21f8b50-ad6f-4314-b70a-b0adea6c789a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:11.64", "s25JW_ambient_light_illuminance": 72.53, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7503, "VDY_accel_y": -493, "VDY_accel_z": -6289}
+{"id": "d647b032-52fa-4202-a34f-796f646c4b8e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:11.65", "s25JU_ambient_light_illuminance": 51.79, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9413, "VEg_accel_y": 692, "VEg_accel_z": -2315}
+{"id": "82050195-e76d-4502-94ab-fad5b4c9c1fe", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:11.66", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.37, "X2n_air_quality_air_pressure": 942.81}
+{"id": "e59c0696-841c-4dcf-84a6-914300ef77ad", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:12.17", "s25JW_ambient_light_illuminance": 59.69, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 7.8, "s23V3_button_state": 0, "VDY_accel_x": 7515, "VDY_accel_y": -496, "VDY_accel_z": -6281}
+{"id": "3d4497fd-9686-459f-a5bf-817d9eeda67b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:12.19", "s25JU_ambient_light_illuminance": 60.79, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9397, "VEg_accel_y": 720, "VEg_accel_z": -2307}
+{"id": "7d3134d7-5f61-4808-a077-1eccbd6bd0d5", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:12.19", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "32db78fd-c5ad-43e4-b117-31a135052926", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:12.70", "s25JW_ambient_light_illuminance": 52.49, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 5.1, "s23V3_button_state": 0, "VDY_accel_x": 7492, "VDY_accel_y": -483, "VDY_accel_z": -6325}
+{"id": "677da9b1-c809-49b9-acbe-e5e745bf099e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:12.71", "s25JU_ambient_light_illuminance": 63.3, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9464, "VEg_accel_y": 643, "VEg_accel_z": -2348}
+{"id": "bdf537a2-fdd2-439a-ba78-6fcfedfc31ce", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:12.72", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "b34c42d6-b950-4c8a-91a9-4d1f95bb82c5", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:13.23", "s25JW_ambient_light_illuminance": 46.23, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 5.6, "s23V3_button_state": 0, "VDY_accel_x": 7540, "VDY_accel_y": -543, "VDY_accel_z": -6505}
+{"id": "345ebe5b-f3e4-47b1-b652-6e55927fc6e7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:13.24", "s25JU_ambient_light_illuminance": 66.39, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9350, "VEg_accel_y": 693, "VEg_accel_z": -2315}
+{"id": "0ec51d3b-a88d-4685-8490-b5e87b35b002", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:13.25", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "d96d8f0f-b0f5-4a38-90b6-056b32f19dca", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:13.76", "s25JW_ambient_light_illuminance": 46.73, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 5.1, "s23V3_button_state": 0, "VDY_accel_x": 7516, "VDY_accel_y": -510, "VDY_accel_z": -6358}
+{"id": "67817100-db89-46b1-9e5e-365f85119f68", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:13.77", "s25JU_ambient_light_illuminance": 64.19, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 753, "VEg_accel_z": -2344}
+{"id": "80faa828-af40-42fb-8250-e60129efbea5", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:13.78", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "df8dc33b-6756-469d-a3e8-d0563241df63", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:14.29", "s25JW_ambient_light_illuminance": 52.42, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.8, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -498, "VDY_accel_z": -6295}
+{"id": "a0eae948-463c-43d5-b244-1cd78242200b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:14.30", "s25JU_ambient_light_illuminance": 66.91, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9411, "VEg_accel_y": 714, "VEg_accel_z": -2270}
+{"id": "22a070ca-fcfc-4665-b337-b312c84d7eeb", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:14.31", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "906f9382-1c61-4477-89e5-b8a6f64c2665", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:14.82", "s25JW_ambient_light_illuminance": 47.97, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.9, "s23V3_button_state": 0, "VDY_accel_x": 7511, "VDY_accel_y": -470, "VDY_accel_z": -6303}
+{"id": "d434fb4f-cc99-48b9-bc75-d360d280b850", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:14.83", "s25JU_ambient_light_illuminance": 59.76, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9411, "VEg_accel_y": 732, "VEg_accel_z": -2365}
+{"id": "40c37568-5fe5-40b3-a440-c265151df3c2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:14.84", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.41, "X2n_air_quality_air_pressure": 942.8}
+{"id": "5d75837b-46fa-4f1d-beb3-6aa445ead672", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:15.35", "s25JW_ambient_light_illuminance": 54.54, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.8, "s23V3_button_state": 0, "VDY_accel_x": 7507, "VDY_accel_y": -490, "VDY_accel_z": -6289}
+{"id": "e6593410-254e-4b51-8915-731f69a4f67b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:15.36", "s25JU_ambient_light_illuminance": 55.22, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 722, "VEg_accel_z": -2284}
+{"id": "4148e920-55d0-4d8f-b9fb-923cfca5fd5c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:15.37", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.82}
+{"id": "0e8e3b42-51be-4081-9910-7ddc55573d69", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:15.88", "s25JW_ambient_light_illuminance": 57.78, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7479, "VDY_accel_y": -488, "VDY_accel_z": -6292}
+{"id": "2307f5c8-b677-443c-8dc4-9b2887d5ebc6", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:15.89", "s25JU_ambient_light_illuminance": 52.49, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9423, "VEg_accel_y": 731, "VEg_accel_z": -2192}
+{"id": "b5698fb4-f943-4b7d-b78c-386cbc0be4d3", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:15.90", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.82}
+{"id": "3060ea4e-0886-4304-bb5c-6db1d717bacf", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:16.41", "s25JW_ambient_light_illuminance": 58.6, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7475, "VDY_accel_y": -484, "VDY_accel_z": -6256}
+{"id": "8e94241d-c215-41cc-bdaf-84dac41131bb", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:16.42", "s25JU_ambient_light_illuminance": 51.52, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9390, "VEg_accel_y": 728, "VEg_accel_z": -2301}
+{"id": "b59c5571-43b0-49ac-8199-5225ae9740af", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:16.43", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.82}
+{"id": "db4afa2f-8add-49c9-9a54-d9083409d923", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:16.94", "s25JW_ambient_light_illuminance": 60.4, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7492, "VDY_accel_y": -488, "VDY_accel_z": -6242}
+{"id": "933f47c0-af00-4de2-9db3-416f56e245eb", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:16.95", "s25JU_ambient_light_illuminance": 50.61, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9423, "VEg_accel_y": 681, "VEg_accel_z": -2296}
+{"id": "20ec726d-a3e8-4f20-b66e-bb66f8765e97", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:16.96", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.82}
+{"id": "405d7969-be98-4b66-b8b7-7ce567a56819", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:17.47", "s25JW_ambient_light_illuminance": 60.53, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7504, "VDY_accel_y": -504, "VDY_accel_z": -6307}
+{"id": "38082a4a-9904-436d-8e39-6e8011daab1d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:17.48", "s25JU_ambient_light_illuminance": 50.97, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9402, "VEg_accel_y": 704, "VEg_accel_z": -2291}
+{"id": "d9cb4f59-05af-491e-ab40-f9beec974ece", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:17.49", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.39, "X2n_air_quality_air_pressure": 942.82}
+{"id": "19ae97a6-6e07-431d-96f3-34801281ce69", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:18.00", "s25JW_ambient_light_illuminance": 60.26, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -475, "VDY_accel_z": -6289}
+{"id": "cafbe09e-65f0-4c28-8568-419491c173e6", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:18.01", "s25JU_ambient_light_illuminance": 51.19, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9425, "VEg_accel_y": 721, "VEg_accel_z": -2272}
+{"id": "22e092de-77b8-41ea-9e8a-5548b46af25a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:18.02", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.8}
+{"id": "e37ae132-d84e-4b6c-9dc0-ca0804b72b71", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:18.53", "s25JW_ambient_light_illuminance": 61.11, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7483, "VDY_accel_y": -496, "VDY_accel_z": -6265}
+{"id": "ae004fe2-67a7-43c9-8d72-d47a70da54d8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:18.54", "s25JU_ambient_light_illuminance": 53.42, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9401, "VEg_accel_y": 714, "VEg_accel_z": -2307}
+{"id": "06efc518-df8f-4c2f-91c0-0b44498b660c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:18.55", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.8}
+{"id": "3e761380-e0b6-45f5-99f8-f3f241e5d5e8", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:19.06", "s25JW_ambient_light_illuminance": 59.11, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7518, "VDY_accel_y": -493, "VDY_accel_z": -6296}
+{"id": "ae9a16fd-ec60-42fe-b528-e506c18a6906", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:19.07", "s25JU_ambient_light_illuminance": 53.37, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9407, "VEg_accel_y": 719, "VEg_accel_z": -2324}
+{"id": "f6263b31-eccc-44f4-8702-817bfa88bcf4", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:19.08", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 150.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.8}
+{"id": "d90747c0-7d20-4b36-81a7-b3fd43628f9c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:19.59", "s25JW_ambient_light_illuminance": 58.84, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7477, "VDY_accel_y": -540, "VDY_accel_z": -6296}
+{"id": "13ff29df-8b76-4011-9482-239bcccfc4c3", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:19.60", "s25JU_ambient_light_illuminance": 52.04, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9414, "VEg_accel_y": 686, "VEg_accel_z": -2304}
+{"id": "f96d75fe-f695-4907-8edc-7ea05e806f41", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:19.61", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 27.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.8}
+{"id": "c9ce72a2-b1cb-4991-8479-240ed9af9bbe", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:20.12", "s25JW_ambient_light_illuminance": 58.55, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7487, "VDY_accel_y": -513, "VDY_accel_z": -6279}
+{"id": "060cf6d3-e90c-4068-8927-981ed0927ac1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:20.13", "s25JU_ambient_light_illuminance": 50.62, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9467, "VEg_accel_y": 792, "VEg_accel_z": -2268}
+{"id": "31ddf03b-e72b-4055-aa6d-c6fd95de511e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:20.14", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 26.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.8}
+{"id": "4d102fdc-90a2-45c1-814a-99d9534c027b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:20.65", "s25JW_ambient_light_illuminance": 61.92, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7493, "VDY_accel_y": -488, "VDY_accel_z": -6346}
+{"id": "a1e96b7f-57a4-49c1-9b51-376c51fea940", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:20.66", "s25JU_ambient_light_illuminance": 51.72, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9414, "VEg_accel_y": 717, "VEg_accel_z": -2367}
+{"id": "6a7acbd2-4aa2-4286-b593-696d73159f7b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:20.67", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 25.2, "s23UU_button_state": 1, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.4, "X2n_air_quality_air_pressure": 942.8}
+{"id": "2f46a9c0-0eec-423c-b180-5b86165cd950", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:21.18", "s25JW_ambient_light_illuminance": 62.99, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7484, "VDY_accel_y": -484, "VDY_accel_z": -6245}
+{"id": "a5183767-1f95-4f33-8634-dca3a10b6cc5", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:21.19", "s25JU_ambient_light_illuminance": 51.72, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 726, "VEg_accel_z": -2330}
+{"id": "5d9a2ae0-549a-4587-a273-62438ad8b06e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:21.20", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 25.7, "s23UU_button_state": 1, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.8}
+{"id": "bcfef5ff-0d17-493b-b213-bcfaab58a1a0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:21.71", "s25JW_ambient_light_illuminance": 62.41, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7506, "VDY_accel_y": -497, "VDY_accel_z": -6253}
+{"id": "d4cb9e08-25fe-4ba8-acbf-c7ca729c2590", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:21.72", "s25JU_ambient_light_illuminance": 51.11, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9453, "VEg_accel_y": 737, "VEg_accel_z": -2262}
+{"id": "241cc02c-837e-47d8-a63a-83f2fba2d417", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:21.73", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 25.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.8}
+{"id": "5e00cb77-5704-4814-82ae-08e59ffdc707", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:22.24", "s25JW_ambient_light_illuminance": 61.41, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7520, "VDY_accel_y": -503, "VDY_accel_z": -6264}
+{"id": "24b635de-8911-47e3-b1f1-c3e74b81a284", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:22.26", "s25JU_ambient_light_illuminance": 51.23, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9442, "VEg_accel_y": 715, "VEg_accel_z": -2275}
+{"id": "6cbc4895-8f1e-4447-83bc-eb0e47f7b5ac", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:22.27", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 25.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.8}
+{"id": "4a8d6d11-821c-46f0-9ede-9d7b111f9cf2", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:22.78", "s25JW_ambient_light_illuminance": 61.86, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7487, "VDY_accel_y": -540, "VDY_accel_z": -6300}
+{"id": "fa6466fd-2f0b-48a4-a09c-dd826a3db99f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:22.79", "s25JU_ambient_light_illuminance": 52.59, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9423, "VEg_accel_y": 759, "VEg_accel_z": -2214}
+{"id": "1e5df058-dae5-4629-8235-7bb3653e0829", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:22.80", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 25.9, "s23UU_button_state": 1, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.8}
+{"id": "63f6fb60-7a15-4e92-9e66-5ab99e881d9e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:23.31", "s25JW_ambient_light_illuminance": 63.25, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7500, "VDY_accel_y": -472, "VDY_accel_z": -6318}
+{"id": "3b0f5296-f305-4acc-81e9-bfdd5c68f27f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:23.32", "s25JU_ambient_light_illuminance": 51.92, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9442, "VEg_accel_y": 713, "VEg_accel_z": -2327}
+{"id": "cbc4dfc4-074a-489e-b6dd-db8657abe6e9", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:23.33", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 27.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.8}
+{"id": "3e6f711a-5b1c-4ffa-9ff4-4cd27abdfe68", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:23.84", "s25JW_ambient_light_illuminance": 65.92, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.8, "s23V3_button_state": 0, "VDY_accel_x": 7492, "VDY_accel_y": -515, "VDY_accel_z": -6288}
+{"id": "aee1968b-f085-466b-97be-af5371e0c08f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:23.85", "s25JU_ambient_light_illuminance": 51.58, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9417, "VEg_accel_y": 680, "VEg_accel_z": -2316}
+{"id": "24db9991-f6c9-414e-9aae-c794c78b3457", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:23.86", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 29.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.54, "X2n_air_quality_air_pressure": 942.81}
+{"id": "2913dae1-d063-4b44-b9c6-53013af41d21", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:24.37", "s25JW_ambient_light_illuminance": 69.03, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.8, "s23V3_button_state": 0, "VDY_accel_x": 7503, "VDY_accel_y": -527, "VDY_accel_z": -6267}
+{"id": "19493c48-c879-49c3-80b3-157291c33525", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:24.38", "s25JU_ambient_light_illuminance": 56.83, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9484, "VEg_accel_y": 682, "VEg_accel_z": -2291}
+{"id": "a70b8f3e-689d-4255-91bb-f5a30652d720", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:24.39", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 40.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.54, "X2n_air_quality_air_pressure": 942.81}
+{"id": "f18a9cfe-c64f-4bae-a83a-5c76bfa2b2d9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:24.90", "s25JW_ambient_light_illuminance": 66.56, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -487, "VDY_accel_z": -6307}
+{"id": "d13f4efe-a286-4d20-ac2d-28109c823f01", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:24.91", "s25JU_ambient_light_illuminance": 58.6, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9461, "VEg_accel_y": 666, "VEg_accel_z": -2255}
+{"id": "6e3115ee-9d89-4593-aede-eb279c10de7d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:24.91", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 47.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.54, "X2n_air_quality_air_pressure": 942.81}
+{"id": "d728a3e1-d8ec-450d-b317-035d0521fdbb", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:25.43", "s25JW_ambient_light_illuminance": 68.31, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7480, "VDY_accel_y": -543, "VDY_accel_z": -6282}
+{"id": "e83ea2b3-cad8-447a-9763-9ce2feba604a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:25.44", "s25JU_ambient_light_illuminance": 58.76, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9449, "VEg_accel_y": 732, "VEg_accel_z": -2271}
+{"id": "f80c7a07-3b39-4123-a00b-48467fe185fe", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:25.44", "s23xq_load_cell_weight": 0, "SeG_ir_long_distance": 48.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.54, "X2n_air_quality_air_pressure": 942.81}
+{"id": "152197ed-fa38-4f31-a7a2-ea182e66bca3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:25.96", "s25JW_ambient_light_illuminance": 70.54, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.9, "s23V3_button_state": 0, "VDY_accel_x": 7493, "VDY_accel_y": -520, "VDY_accel_z": -6300}
+{"id": "eecd2c0a-e207-4c3a-98c5-5430da8bdb7d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:25.96", "s25JU_ambient_light_illuminance": 57.37, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9407, "VEg_accel_y": 725, "VEg_accel_z": -2316}
+{"id": "639d5045-11c7-4638-acb0-9b5a2854a5b2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:25.97", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 42.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.54, "X2n_air_quality_air_pressure": 942.81}
+{"id": "de283430-8d8c-4bcb-9e19-b7aeb7f17664", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:26.49", "s25JW_ambient_light_illuminance": 65.88, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.8, "s23V3_button_state": 0, "VDY_accel_x": 7517, "VDY_accel_y": -475, "VDY_accel_z": -6303}
+{"id": "e7c5956a-abff-4fa7-ba48-5c033df89921", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:26.50", "s25JU_ambient_light_illuminance": 50.38, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9403, "VEg_accel_y": 697, "VEg_accel_z": -2368}
+{"id": "c525f073-ebba-4c48-a56c-f4a632051921", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:26.51", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 24.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.54, "X2n_air_quality_air_pressure": 942.81}
+{"id": "a5c897f5-404e-4928-ae3a-7407f256e681", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:27.02", "s25JW_ambient_light_illuminance": 63.46, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.8, "s23V3_button_state": 0, "VDY_accel_x": 7514, "VDY_accel_y": -480, "VDY_accel_z": -6241}
+{"id": "4ba4bf7e-3722-409c-87d2-911cc349a7cd", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:27.03", "s25JU_ambient_light_illuminance": 51.05, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9383, "VEg_accel_y": 738, "VEg_accel_z": -2280}
+{"id": "ddf0161d-abfc-4c1b-9420-a7699d633003", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:27.04", "s23xq_load_cell_weight": -1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.65, "X2n_air_quality_air_pressure": 942.79}
+{"id": "052f631c-4db7-480f-a478-9fb30f81d31b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:27.55", "s25JW_ambient_light_illuminance": 63.64, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.8, "s23V3_button_state": 0, "VDY_accel_x": 7501, "VDY_accel_y": -526, "VDY_accel_z": -6229}
+{"id": "a90fdb71-eac6-4d6f-830e-59c9e447b305", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:27.56", "s25JU_ambient_light_illuminance": 48.52, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9405, "VEg_accel_y": 697, "VEg_accel_z": -2272}
+{"id": "d24b1dea-10de-4714-a4fd-e2f5bdac0ce3", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:27.57", "s23xq_load_cell_weight": 3, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.65, "X2n_air_quality_air_pressure": 942.79}
+{"id": "397f1c4a-6d0d-4b0d-a835-f69c366e1a9d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:28.08", "s25JW_ambient_light_illuminance": 61.18, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7482, "VDY_accel_y": -473, "VDY_accel_z": -6252}
+{"id": "bd84ce2a-5ebd-445d-b24d-7c3b969c5d9f", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:28.09", "s25JU_ambient_light_illuminance": 49.66, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9431, "VEg_accel_y": 780, "VEg_accel_z": -2294}
+{"id": "f058aa78-16d4-4c65-b3b5-dfd24742aca4", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:28.10", "s23xq_load_cell_weight": 815, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.65, "X2n_air_quality_air_pressure": 942.79}
+{"id": "758b9f79-f783-4ee4-95b4-c8d90bd025d1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:28.61", "s25JW_ambient_light_illuminance": 62.83, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.8, "s23V3_button_state": 0, "VDY_accel_x": 7506, "VDY_accel_y": -469, "VDY_accel_z": -6294}
+{"id": "61e3e36d-0081-49b9-a0b6-c1be897f2d31", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:28.62", "s25JU_ambient_light_illuminance": 49.59, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9395, "VEg_accel_y": 730, "VEg_accel_z": -2305}
+{"id": "111a1fa6-a898-4df7-8b8b-08b328206c32", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:28.63", "s23xq_load_cell_weight": 738, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.65, "X2n_air_quality_air_pressure": 942.79}
+{"id": "9e72ba6c-a872-4356-b609-0fcf997097b4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:29.14", "s25JW_ambient_light_illuminance": 61.04, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.9, "s23V3_button_state": 0, "VDY_accel_x": 7509, "VDY_accel_y": -502, "VDY_accel_z": -6267}
+{"id": "bd1b75ab-1a24-4c83-81d6-ef084113f078", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:29.15", "s25JU_ambient_light_illuminance": 49.91, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 754, "VEg_accel_z": -2274}
+{"id": "ccb87ef0-e18f-43c2-a9b8-633827e03ab2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:29.16", "s23xq_load_cell_weight": 425, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.65, "X2n_air_quality_air_pressure": 942.79}
+{"id": "1c75d24d-54ba-4784-a41f-d124735b70f9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:29.67", "s25JW_ambient_light_illuminance": 63.82, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.9, "s23V3_button_state": 0, "VDY_accel_x": 7482, "VDY_accel_y": -468, "VDY_accel_z": -6282}
+{"id": "2368fa53-de30-4c64-a3dc-433ecc2ec43a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:29.68", "s25JU_ambient_light_illuminance": 49.36, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9439, "VEg_accel_y": 677, "VEg_accel_z": -2296}
+{"id": "a0214518-5e45-4929-ba04-9e6011d7d9e7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:29.69", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.68, "X2n_air_quality_air_pressure": 942.79}
+{"id": "104208e0-c5f8-415f-bdd1-92ebf1662040", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:30.20", "s25JW_ambient_light_illuminance": 66.83, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.9, "s23V3_button_state": 0, "VDY_accel_x": 7515, "VDY_accel_y": -483, "VDY_accel_z": -6272}
+{"id": "76512c25-faf0-438a-bbce-e3f5e142f5d7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:30.21", "s25JU_ambient_light_illuminance": 50.24, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9406, "VEg_accel_y": 752, "VEg_accel_z": -2290}
+{"id": "c4e69efe-497e-4b3c-a8ec-b97ac76d91ec", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:30.22", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 24.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.68, "X2n_air_quality_air_pressure": 942.79}
+{"id": "d25f0b13-4d00-4ace-ac80-e0727565b6df", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:30.73", "s25JW_ambient_light_illuminance": 67.53, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.9, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -494, "VDY_accel_z": -6278}
+{"id": "d31a4161-d8d2-417f-bc51-c5e9b1b4a0b1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:30.75", "s25JU_ambient_light_illuminance": 51.63, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 700, "VEg_accel_z": -2290}
+{"id": "9374471e-e492-4649-92a7-5340aab712d4", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:30.75", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.68, "X2n_air_quality_air_pressure": 942.79}
+{"id": "223c5488-1803-48d4-87cd-bae4f97104fe", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:31.26", "s25JW_ambient_light_illuminance": 60.73, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -513, "VDY_accel_z": -6243}
+{"id": "ac20f0b5-66a8-49ed-85d1-9a58ec385922", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:31.27", "s25JU_ambient_light_illuminance": 50.31, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9412, "VEg_accel_y": 712, "VEg_accel_z": -2285}
+{"id": "541202f7-f0aa-4bf9-ae18-a89f140db1e1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:31.28", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 26.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.68, "X2n_air_quality_air_pressure": 942.79}
+{"id": "2119c194-f602-4be8-8f97-8898be580c73", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:31.80", "s25JW_ambient_light_illuminance": 69.0, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7487, "VDY_accel_y": -482, "VDY_accel_z": -6389}
+{"id": "ab0fa82e-ed0e-4727-add2-194309cd514a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:31.81", "s25JU_ambient_light_illuminance": 48.34, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9478, "VEg_accel_y": 673, "VEg_accel_z": -2301}
+{"id": "3196e9b0-1527-45d2-abe8-2d0eaa267568", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:31.82", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 23.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.68, "X2n_air_quality_air_pressure": 942.79}
+{"id": "92d3200f-4aeb-4ecc-9ed2-0d71dfe9dee1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:32.33", "s25JW_ambient_light_illuminance": 64.84, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7500, "VDY_accel_y": -504, "VDY_accel_z": -6255}
+{"id": "438ac675-6bef-4f55-b7b4-66a6d5753a94", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:32.34", "s25JU_ambient_light_illuminance": 51.31, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9411, "VEg_accel_y": 709, "VEg_accel_z": -2316}
+{"id": "e14f1ed2-f74e-4afe-9484-116de55cf3ef", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:32.35", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 28.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.52, "X2n_air_quality_humidity": 48.68, "X2n_air_quality_air_pressure": 942.79}
+{"id": "c2752667-88f3-429c-9367-b4bbc182b3dd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:32.86", "s25JW_ambient_light_illuminance": 69.47, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7506, "VDY_accel_y": -521, "VDY_accel_z": -6354}
+{"id": "27593e81-cf1b-422d-b171-105069f8c935", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:32.87", "s25JU_ambient_light_illuminance": 53.44, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9381, "VEg_accel_y": 643, "VEg_accel_z": -2272}
+{"id": "98ac0ae2-cb3f-44bc-9b84-c92624561523", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:32.88", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 29.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.81}
+{"id": "4c1fcc21-97b2-4049-b5cf-08d986dff38c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:33.39", "s25JW_ambient_light_illuminance": 66.35, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7477, "VDY_accel_y": -524, "VDY_accel_z": -6264}
+{"id": "4cad690f-aeef-4f8d-9ad4-b245d6629fdc", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:33.40", "s25JU_ambient_light_illuminance": 53.37, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 716, "VEg_accel_z": -2280}
+{"id": "e9503550-1198-4947-b418-5a53852b26e9", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:33.41", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 31.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.81}
+{"id": "b2cab99c-7ddb-448f-a022-de6dc2495525", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:33.92", "s25JW_ambient_light_illuminance": 68.47, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7487, "VDY_accel_y": -486, "VDY_accel_z": -6285}
+{"id": "67ac2a70-c8d0-48ab-b204-22027a255ede", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:33.93", "s25JU_ambient_light_illuminance": 55.21, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9480, "VEg_accel_y": 764, "VEg_accel_z": -2308}
+{"id": "b3d12057-a4f8-4001-840c-21c08b2043b9", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:33.94", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 31.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.81}
+{"id": "8d8dcece-e215-4880-bea8-e8a2a304608e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:34.45", "s25JW_ambient_light_illuminance": 66.91, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 4.7, "s23V3_button_state": 0, "VDY_accel_x": 7494, "VDY_accel_y": -535, "VDY_accel_z": -6316}
+{"id": "0f31cc2b-ebb3-478f-9bb0-1d5fa622e5ec", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:34.46", "s25JU_ambient_light_illuminance": 55.92, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 704, "VEg_accel_z": -2244}
+{"id": "cf029450-15e4-4199-8f66-1fabc84481f1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:34.47", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 31.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.81}
+{"id": "5181c7cc-bce3-4928-8a2b-ca07f51ff067", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:34.99", "s25JW_ambient_light_illuminance": 71.71, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7495, "VDY_accel_y": -499, "VDY_accel_z": -6267}
+{"id": "9c307367-d879-4f69-84cb-c223b95466af", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:35.00", "s25JU_ambient_light_illuminance": 55.05, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9396, "VEg_accel_y": 693, "VEg_accel_z": -2318}
+{"id": "b49d61d7-f293-4b9a-9c7a-497965875d8b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:35.01", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 31.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.81}
+{"id": "13af9eae-2d75-4e3c-bf2e-645ada9cef51", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:35.52", "s25JW_ambient_light_illuminance": 72.91, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 8.1, "s23V3_button_state": 0, "VDY_accel_x": 7515, "VDY_accel_y": -537, "VDY_accel_z": -6294}
+{"id": "b0337e2d-72d1-4468-988b-7b285488e0db", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:35.53", "s25JU_ambient_light_illuminance": 56.67, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9413, "VEg_accel_y": 646, "VEg_accel_z": -2322}
+{"id": "b51576eb-d41f-46b2-a4ff-e6e5f3f04486", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:35.54", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 31.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.8}
+{"id": "5309e3e6-caaf-4b89-98b1-c615ef3bc941", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:36.05", "s25JW_ambient_light_illuminance": 50.72, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 10.9, "s23V3_button_state": 0, "VDY_accel_x": 7507, "VDY_accel_y": -498, "VDY_accel_z": -6183}
+{"id": "0b7c58b4-00f4-4207-b972-310cb13ee4b3", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:36.06", "s25JU_ambient_light_illuminance": 56.86, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9409, "VEg_accel_y": 708, "VEg_accel_z": -2245}
+{"id": "6d45ea1e-d340-44cb-91b5-1d9133b5b302", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:36.07", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 31.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.8}
+{"id": "06b8d27c-7df6-4354-9135-b47d44f9dcb9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:36.58", "s25JW_ambient_light_illuminance": 105.39, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 13.0, "s23V3_button_state": 0, "VDY_accel_x": 7505, "VDY_accel_y": -526, "VDY_accel_z": -6431}
+{"id": "957d625b-7076-4c71-9f46-9f67b85d2bc8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:36.59", "s25JU_ambient_light_illuminance": 57.28, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9468, "VEg_accel_y": 657, "VEg_accel_z": -2357}
+{"id": "96fca8ba-f490-4df4-9c06-0feec6dd871b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:36.60", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 30.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.8}
+{"id": "426424f9-8d56-4761-a052-acf6525a30ef", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:37.11", "s25JW_ambient_light_illuminance": 356.39, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -510, "VDY_accel_z": -6229}
+{"id": "e2607e26-de82-4819-b9cf-6acaad77855c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:37.12", "s25JU_ambient_light_illuminance": 57.89, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9427, "VEg_accel_y": 693, "VEg_accel_z": -2401}
+{"id": "506bf916-69e9-4e6e-ad05-03f03b42a09f", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:37.13", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 30.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.8}
+{"id": "4cef5809-dedb-4614-890e-454edf93604a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:37.65", "s25JW_ambient_light_illuminance": 338.73, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7491, "VDY_accel_y": -456, "VDY_accel_z": -6301}
+{"id": "ee30cbf9-80c1-43cf-ae7a-9d71f957e61b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:37.66", "s25JU_ambient_light_illuminance": 57.41, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9449, "VEg_accel_y": 693, "VEg_accel_z": -2285}
+{"id": "5b5329e0-1797-4d78-9dc6-8c5b92fdbd63", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:37.67", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 30.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.8}
+{"id": "abe8d1c4-8d42-4981-a304-e7fe8c3ba95a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:38.18", "s25JW_ambient_light_illuminance": 380.44, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7501, "VDY_accel_y": -547, "VDY_accel_z": -6240}
+{"id": "1fe3c353-1536-4133-ada4-fe8bb4636d44", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:38.19", "s25JU_ambient_light_illuminance": 57.06, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9438, "VEg_accel_y": 726, "VEg_accel_z": -2265}
+{"id": "79fcaf27-a817-42f1-98d4-75967f4228c6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:38.20", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 30.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.64, "X2n_air_quality_air_pressure": 942.8}
+{"id": "cf835b91-f04a-4770-85e4-0a6b749f347b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:38.71", "s25JW_ambient_light_illuminance": 377.51, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 23.3, "s23V3_button_state": 0, "VDY_accel_x": 7506, "VDY_accel_y": -457, "VDY_accel_z": -6285}
+{"id": "33456901-6fdb-4a1f-b530-6248aee3d226", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:38.72", "s25JU_ambient_light_illuminance": 55.79, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 677, "VEg_accel_z": -2288}
+{"id": "aa57b474-728f-46f4-b5eb-4893674ec78b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:38.73", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 30.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.6, "X2n_air_quality_air_pressure": 942.8}
+{"id": "7374027a-d558-4a7f-bc12-837dcbd76c4b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:39.25", "s25JW_ambient_light_illuminance": 395.43, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 25.5, "s23V3_button_state": 0, "VDY_accel_x": 7486, "VDY_accel_y": -496, "VDY_accel_z": -6298}
+{"id": "7ade2dbe-3e35-4a90-a181-e7c516c71f09", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:39.26", "s25JU_ambient_light_illuminance": 55.18, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9426, "VEg_accel_y": 748, "VEg_accel_z": -2294}
+{"id": "db6e12b5-0ce9-4487-b577-c34effefbe5e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:39.27", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 29.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.6, "X2n_air_quality_air_pressure": 942.8}
+{"id": "97c6933d-6c66-4d75-bfb7-d38407d10aa4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:39.79", "s25JW_ambient_light_illuminance": 344.48, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7483, "VDY_accel_y": -496, "VDY_accel_z": -6209}
+{"id": "22ea015b-f5dd-4d26-aefb-6d4af3e11737", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:39.80", "s25JU_ambient_light_illuminance": 55.06, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9393, "VEg_accel_y": 718, "VEg_accel_z": -2164}
+{"id": "7303c40b-94d2-4785-8b2a-0dd6aaaffcd3", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:39.80", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 29.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.6, "X2n_air_quality_air_pressure": 942.8}
+{"id": "bf2fa746-85b5-42a9-b012-6d93ef139f9e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:40.32", "s25JW_ambient_light_illuminance": 346.97, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7485, "VDY_accel_y": -517, "VDY_accel_z": -6338}
+{"id": "05604e37-f145-4518-b91a-767bff8f9290", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:40.33", "s25JU_ambient_light_illuminance": 54.03, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9387, "VEg_accel_y": 758, "VEg_accel_z": -2229}
+{"id": "2b75edc2-bfe8-49be-89fe-98d16c16fa73", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:40.34", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 29.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.6, "X2n_air_quality_air_pressure": 942.8}
+{"id": "2e883d72-c3ed-436f-992c-7c7b3d2d8a02", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:40.85", "s25JW_ambient_light_illuminance": 366.54, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7502, "VDY_accel_y": -505, "VDY_accel_z": -6401}
+{"id": "0cdf286f-778e-4f66-bc9e-408fa74b8c99", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:40.86", "s25JU_ambient_light_illuminance": 53.87, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9426, "VEg_accel_y": 775, "VEg_accel_z": -2236}
+{"id": "8c9e0fa1-4813-40ad-bc80-11389b368577", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:40.86", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 29.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.6, "X2n_air_quality_air_pressure": 942.8}
+{"id": "2605fbbd-24ba-461c-8dfd-562c8cbdabfb", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:41.38", "s25JW_ambient_light_illuminance": 374.84, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7507, "VDY_accel_y": -485, "VDY_accel_z": -6274}
+{"id": "8f2e513f-d84f-472f-a0d0-08240e13e999", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:41.39", "s25JU_ambient_light_illuminance": 53.28, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 724, "VEg_accel_z": -2281}
+{"id": "3dc77771-eb78-4b37-8930-31be3d5df930", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:41.39", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 29.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.6, "X2n_air_quality_air_pressure": 942.8}
+{"id": "95b3c9af-3a0f-4dce-9de4-9b570036088c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:41.91", "s25JW_ambient_light_illuminance": 373.13, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7503, "VDY_accel_y": -527, "VDY_accel_z": -6251}
+{"id": "eb83ce57-ee33-4834-9d5f-297eac49c74e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:41.92", "s25JU_ambient_light_illuminance": 53.25, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9424, "VEg_accel_y": 700, "VEg_accel_z": -2297}
+{"id": "92731726-5ee0-4716-9455-b2f2235011c8", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:41.92", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 29.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.56, "X2n_air_quality_air_pressure": 942.8}
+{"id": "989540a5-d08e-4ea2-8dc2-8915b874a11a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:42.44", "s25JW_ambient_light_illuminance": 362.12, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7515, "VDY_accel_y": -531, "VDY_accel_z": -6318}
+{"id": "d698be0c-554a-4327-8959-74a9ef28f4c3", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:42.45", "s25JU_ambient_light_illuminance": 53.48, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9385, "VEg_accel_y": 753, "VEg_accel_z": -2268}
+{"id": "8d06d711-f7a3-4b5b-a559-8a1147a48e97", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:42.45", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 29.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.56, "X2n_air_quality_air_pressure": 942.8}
+{"id": "c7936464-8783-42e1-b877-cab0e20ddff7", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:42.96", "s25JW_ambient_light_illuminance": 372.89, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -471, "VDY_accel_z": -6224}
+{"id": "b03470e6-acbc-41f7-a2b7-69a3a5797b63", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:42.97", "s25JU_ambient_light_illuminance": 55.0, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 675, "VEg_accel_z": -2232}
+{"id": "fd6be745-9fe7-43d9-b7ab-6329dd4f928b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:42.98", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 29.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.56, "X2n_air_quality_air_pressure": 942.8}
+{"id": "b36bd6b7-166a-4e43-95b8-1c3ea575d028", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:43.49", "s25JW_ambient_light_illuminance": 317.64, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 1, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7508, "VDY_accel_y": -493, "VDY_accel_z": -6311}
+{"id": "7aaa1fe2-5913-4275-9d3d-eb52e2f1df75", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:43.51", "s25JU_ambient_light_illuminance": 56.88, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9497, "VEg_accel_y": 648, "VEg_accel_z": -2319}
+{"id": "56916c39-f91b-4460-bfa1-953f98d20f1d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:43.51", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 29.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.56, "X2n_air_quality_air_pressure": 942.8}
+{"id": "52b140f9-7d11-49b8-b71d-86d62f9bc855", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:44.02", "s25JW_ambient_light_illuminance": 339.07, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7475, "VDY_accel_y": -484, "VDY_accel_z": -6250}
+{"id": "a41e9cfd-97c0-4165-aef0-d3759d89f8f1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:44.03", "s25JU_ambient_light_illuminance": 55.82, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9412, "VEg_accel_y": 704, "VEg_accel_z": -2260}
+{"id": "b0daf200-e17c-4a43-9c4f-2e3726123ea8", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:44.04", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 29.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.56, "X2n_air_quality_air_pressure": 942.8}
+{"id": "819a4ac2-cf8a-4501-b93a-1d65de9da78d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:44.55", "s25JW_ambient_light_illuminance": 483.06, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -493, "VDY_accel_z": -6315}
+{"id": "04114bc4-1e35-4899-acc0-3359b830a5f1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:44.56", "s25JU_ambient_light_illuminance": 49.51, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9419, "VEg_accel_y": 706, "VEg_accel_z": -2336}
+{"id": "e8b4efe0-24c1-488a-9fe6-204638fe7237", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:44.57", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 30.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.52, "X2n_air_quality_air_pressure": 942.81}
+{"id": "5641a2da-732a-4987-9688-f883bdbe1850", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:45.08", "s25JW_ambient_light_illuminance": 561.41, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -515, "VDY_accel_z": -6202}
+{"id": "8e885d36-c6ac-4650-bc96-ac2addd17565", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:45.09", "s25JU_ambient_light_illuminance": 55.0, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9426, "VEg_accel_y": 729, "VEg_accel_z": -2213}
+{"id": "81bd4c56-6581-4cde-b71c-c1ffee449e26", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:45.10", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 31.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.52, "X2n_air_quality_air_pressure": 942.81}
+{"id": "ed7292fb-d7ce-43d8-ada8-f2a819cd50b3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:45.61", "s25JW_ambient_light_illuminance": 567.32, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7476, "VDY_accel_y": -489, "VDY_accel_z": -6251}
+{"id": "133e5da6-140f-4b62-b43b-7badd2a7c770", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:45.62", "s25JU_ambient_light_illuminance": 52.1, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9456, "VEg_accel_y": 778, "VEg_accel_z": -2291}
+{"id": "4463dc04-4b29-4c07-a379-3c7fae017684", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:45.63", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 28.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.52, "X2n_air_quality_air_pressure": 942.81}
+{"id": "72b5c826-2626-47f6-b6c0-2bd35ed6d9ce", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:46.14", "s25JW_ambient_light_illuminance": 569.85, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7498, "VDY_accel_y": -502, "VDY_accel_z": -6320}
+{"id": "e1ce4292-9953-4734-9987-aaf09ffbf1ef", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:46.15", "s25JU_ambient_light_illuminance": 47.86, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9401, "VEg_accel_y": 726, "VEg_accel_z": -2326}
+{"id": "318ebbc4-d7fb-49a7-96b8-5375f62a442d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:46.16", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 25.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.52, "X2n_air_quality_air_pressure": 942.81}
+{"id": "6cba20f4-b59e-4526-ba9d-705259a59fcb", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:46.67", "s25JW_ambient_light_illuminance": 570.81, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7482, "VDY_accel_y": -552, "VDY_accel_z": -6315}
+{"id": "0dabd734-2346-4a54-a84a-6e52f28b3632", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:46.68", "s25JU_ambient_light_illuminance": 47.71, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9452, "VEg_accel_y": 705, "VEg_accel_z": -2283}
+{"id": "0262c14f-1009-4060-bc26-23d68d112de2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:46.69", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 22.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.52, "X2n_air_quality_air_pressure": 942.81}
+{"id": "25f6e07b-8981-474a-aec6-19e86ac58eca", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:47.20", "s25JW_ambient_light_illuminance": 572.91, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7484, "VDY_accel_y": -501, "VDY_accel_z": -6351}
+{"id": "82380e34-1526-4623-ac02-3a17fc331314", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:47.21", "s25JU_ambient_light_illuminance": 48.29, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9487, "VEg_accel_y": 708, "VEg_accel_z": -2244}
+{"id": "b4cbf451-b3e8-4c7f-a7b6-75cf44818d00", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:47.22", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 21.7, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.52, "X2n_air_quality_air_pressure": 942.81}
+{"id": "3605362e-2966-47d0-b7f1-4eca822772f0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:47.73", "s25JW_ambient_light_illuminance": 573.42, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7511, "VDY_accel_y": -502, "VDY_accel_z": -6272}
+{"id": "2d6d9b1f-2f03-4c60-9bec-c382a1bc7597", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:47.74", "s25JU_ambient_light_illuminance": 48.68, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9456, "VEg_accel_y": 661, "VEg_accel_z": -2276}
+{"id": "9bfbe4a2-e9ad-4b15-b8b6-f0e38658bbea", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:47.75", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 24.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.54, "X2n_air_quality_humidity": 48.49, "X2n_air_quality_air_pressure": 942.79}
+{"id": "87c6691d-9877-461c-a4f3-b733b5c48831", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:48.26", "s25JW_ambient_light_illuminance": 571.8, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7483, "VDY_accel_y": -491, "VDY_accel_z": -6318}
+{"id": "8408f8c8-61c9-47fd-ba23-7d88e6d6ac53", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:48.27", "s25JU_ambient_light_illuminance": 61.32, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 717, "VEg_accel_z": -2352}
+{"id": "31319f77-a87a-4b73-b79e-4a0237aee042", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:48.28", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 28.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.54, "X2n_air_quality_humidity": 48.49, "X2n_air_quality_air_pressure": 942.79}
+{"id": "0e129cff-39c3-4e7b-89b0-ae1492695ce8", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:48.79", "s25JW_ambient_light_illuminance": 572.58, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7504, "VDY_accel_y": -523, "VDY_accel_z": -6266}
+{"id": "f0cce20e-4951-4359-ac6e-a3ef4df8f03c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:48.80", "s25JU_ambient_light_illuminance": 57.99, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9400, "VEg_accel_y": 738, "VEg_accel_z": -2329}
+{"id": "99473918-59e5-4ed4-a2a5-07f41d84334d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:48.81", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 30.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.54, "X2n_air_quality_humidity": 48.49, "X2n_air_quality_air_pressure": 942.79}
+{"id": "20d452d8-40e8-4cfa-9e97-4b47df566449", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:49.32", "s25JW_ambient_light_illuminance": 572.38, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7479, "VDY_accel_y": -563, "VDY_accel_z": -6193}
+{"id": "f12d6f72-f34f-4541-90a8-e60f7692a647", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:49.33", "s25JU_ambient_light_illuminance": 60.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9422, "VEg_accel_y": 692, "VEg_accel_z": -2276}
+{"id": "0fb5abd1-dafb-4b17-a5ee-0185a6228ac1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:49.34", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 28.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.54, "X2n_air_quality_humidity": 48.49, "X2n_air_quality_air_pressure": 942.79}
+{"id": "c4eede51-cf9d-4178-8831-4d832c5f2bff", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:49.85", "s25JW_ambient_light_illuminance": 573.26, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7512, "VDY_accel_y": -539, "VDY_accel_z": -6279}
+{"id": "789579ad-5082-44d2-9173-c86389197dcb", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:49.86", "s25JU_ambient_light_illuminance": 55.65, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9398, "VEg_accel_y": 717, "VEg_accel_z": -2267}
+{"id": "57d81c92-37f7-494e-aa96-788725b43bc4", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:49.87", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 27.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.54, "X2n_air_quality_humidity": 48.49, "X2n_air_quality_air_pressure": 942.79}
+{"id": "ab588d1b-bdef-4b59-b24d-156837632928", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:50.38", "s25JW_ambient_light_illuminance": 571.67, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7507, "VDY_accel_y": -441, "VDY_accel_z": -6261}
+{"id": "74339def-9fd8-4ff9-9622-ecffa9516a2e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:50.39", "s25JU_ambient_light_illuminance": 49.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9405, "VEg_accel_y": 687, "VEg_accel_z": -2302}
+{"id": "11f2545a-f572-4dc8-8ae3-59af3df9d699", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:50.40", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 31.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.51, "X2n_air_quality_air_pressure": 942.77}
+{"id": "7aea9336-2076-4b59-9b1d-306eeb1e0711", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:50.91", "s25JW_ambient_light_illuminance": 569.76, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7474, "VDY_accel_y": -553, "VDY_accel_z": -6269}
+{"id": "056a861c-5a19-495f-8ed9-445f1eb459e2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:50.93", "s25JU_ambient_light_illuminance": 49.81, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9454, "VEg_accel_y": 753, "VEg_accel_z": -2286}
+{"id": "2134e419-df00-4bfc-aa48-75655c6ddd09", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:50.93", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 40.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.51, "X2n_air_quality_air_pressure": 942.77}
+{"id": "032a41fd-e7a7-4870-a229-fb0ff1376892", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:51.45", "s25JW_ambient_light_illuminance": 557.6, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7490, "VDY_accel_y": -507, "VDY_accel_z": -6297}
+{"id": "618086fe-4dad-4048-9ce0-7f0372e5950a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:51.46", "s25JU_ambient_light_illuminance": 47.33, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9417, "VEg_accel_y": 711, "VEg_accel_z": -2268}
+{"id": "a54ef622-56a5-4535-b91e-cfca449d13d6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:51.69", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 74.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.51, "X2n_air_quality_air_pressure": 942.77}
+{"id": "cc80dddc-bf0b-4bf8-9505-db0c58fc2947", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:51.69", "s25JW_ambient_light_illuminance": 540.21, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 3418, "VDY_accel_y": -230, "VDY_accel_z": -10346}
+{"id": "c97e9835-985c-497e-8c87-14a72b72fe81", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:51.99", "s25JU_ambient_light_illuminance": 46.36, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9469, "VEg_accel_y": 702, "VEg_accel_z": -2229}
+{"id": "2c6f00a9-1b7d-4fc8-9dab-115040634a55", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:52.00", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 73.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.51, "X2n_air_quality_air_pressure": 942.77}
+{"id": "c6dcc61a-ce99-4155-aed8-0a2465724186", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:52.51", "s25JW_ambient_light_illuminance": 534.97, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 9644, "VDY_accel_y": 17, "VDY_accel_z": -1057}
+{"id": "ce25cf89-b0b3-4de8-9d5b-8c05a3ac3788", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:52.52", "s25JU_ambient_light_illuminance": 46.33, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9449, "VEg_accel_y": 669, "VEg_accel_z": -2222}
+{"id": "077f97d2-097c-4926-b941-4df479e3aa06", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:52.53", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 73.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.51, "X2n_air_quality_air_pressure": 942.77}
+{"id": "eded147c-3793-4b6a-8135-ee0e670323c0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:53.04", "s25JW_ambient_light_illuminance": 538.6, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 9873, "VDY_accel_y": 67, "VDY_accel_z": 102}
+{"id": "1468185b-ce8b-495e-9c41-990cd84d9c37", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:53.05", "s25JU_ambient_light_illuminance": 45.48, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9459, "VEg_accel_y": 625, "VEg_accel_z": -2366}
+{"id": "c1887868-799e-443e-88c6-2bf682b99e09", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:53.06", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 73.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.51, "X2n_air_quality_air_pressure": 942.77}
+{"id": "fc2d3bd4-adad-4297-a83e-9a3f05a56690", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:53.57", "s25JW_ambient_light_illuminance": 538.85, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 9743, "VDY_accel_y": 132, "VDY_accel_z": -914}
+{"id": "4569c7e4-8544-40a1-821d-2199da4a6f24", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:53.58", "s25JU_ambient_light_illuminance": 45.29, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9435, "VEg_accel_y": 755, "VEg_accel_z": -2200}
+{"id": "e6363e18-c82d-416a-9c87-0978051018b1", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:53.60", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 73.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.48, "X2n_air_quality_air_pressure": 942.79}
+{"id": "6efa3e5a-eaac-489b-acfd-977e540f201c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:54.11", "s25JW_ambient_light_illuminance": 540.73, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 5467, "VDY_accel_y": -1045, "VDY_accel_z": -7607}
+{"id": "ad68a0d7-8e52-46cd-b817-7276fe527637", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:54.12", "s25JU_ambient_light_illuminance": 45.45, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9454, "VEg_accel_y": 737, "VEg_accel_z": -2288}
+{"id": "9dfa3d10-4dad-4d7a-ac3c-2de5dab7b154", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:54.13", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 74.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.48, "X2n_air_quality_air_pressure": 942.79}
+{"id": "1f30744b-8c30-4ad4-a71d-b0796460b87c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:54.64", "s25JW_ambient_light_illuminance": 540.56, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 5471, "VDY_accel_y": 360, "VDY_accel_z": 5023}
+{"id": "b3d96a42-1008-443c-8a59-3ffaac1f5426", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:54.65", "s25JU_ambient_light_illuminance": 45.45, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9431, "VEg_accel_y": 692, "VEg_accel_z": -2255}
+{"id": "b6873292-e74a-4ad3-b652-84d85568a3f6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:54.66", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 74.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.48, "X2n_air_quality_air_pressure": 942.79}
+{"id": "aa647dc0-c64d-43dc-aa31-64f9252fea81", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:55.17", "s25JW_ambient_light_illuminance": 557.27, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7565, "VDY_accel_y": -529, "VDY_accel_z": -6029}
+{"id": "4030fd15-8a1e-4555-8add-8e05dbfa7c01", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:55.18", "s25JU_ambient_light_illuminance": 48.25, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 693, "VEg_accel_z": -2323}
+{"id": "4ec063e4-633a-4f9c-995c-d0fe08b95670", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:55.19", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 72.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.48, "X2n_air_quality_air_pressure": 942.79}
+{"id": "bc5030f7-013e-4262-bcc3-e238ea91ee47", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:55.71", "s25JW_ambient_light_illuminance": 576.45, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7589, "VDY_accel_y": -491, "VDY_accel_z": -6059}
+{"id": "f45a20a3-458c-4a2e-ac35-3b5ee0a373b8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:55.72", "s25JU_ambient_light_illuminance": 75.04, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9464, "VEg_accel_y": 711, "VEg_accel_z": -2308}
+{"id": "d6298273-5b38-4e93-a9dd-e05802f11910", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:55.73", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 59.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.48, "X2n_air_quality_air_pressure": 942.79}
+{"id": "db02dfcf-8684-4470-a279-7595ebb3dd6e", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:56.24", "s25JW_ambient_light_illuminance": 584.32, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7585, "VDY_accel_y": -456, "VDY_accel_z": -6110}
+{"id": "922d1e44-b1c5-45b6-b21e-9a955fe103f2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:56.25", "s25JU_ambient_light_illuminance": 74.0, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9453, "VEg_accel_y": 727, "VEg_accel_z": -2295}
+{"id": "d9f39843-41d3-4784-8dad-be815cc77882", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:56.26", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 76.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.47, "X2n_air_quality_air_pressure": 942.79}
+{"id": "ddd07ee2-7c54-4b4e-82d1-4e66d8835dcd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:56.77", "s25JW_ambient_light_illuminance": 584.93, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7576, "VDY_accel_y": -480, "VDY_accel_z": -6099}
+{"id": "75c8c6ca-126c-4d67-a9c9-aad22c18a5a9", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:56.78", "s25JU_ambient_light_illuminance": 73.95, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9409, "VEg_accel_y": 684, "VEg_accel_z": -2272}
+{"id": "e47faa65-ca36-4815-8399-5d13e00bf064", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:56.79", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 67.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.47, "X2n_air_quality_air_pressure": 942.79}
+{"id": "1f8e9ebb-22f1-4914-8479-8f0f79a08ee1", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:57.30", "s25JW_ambient_light_illuminance": 586.9, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7550, "VDY_accel_y": -477, "VDY_accel_z": -6160}
+{"id": "2d81644a-96db-4a7f-87fb-0a3e207320bf", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:57.31", "s25JU_ambient_light_illuminance": 73.95, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9440, "VEg_accel_y": 684, "VEg_accel_z": -2329}
+{"id": "ecc50a75-f7d3-4ded-b604-d742e339fbe9", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:57.32", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 74.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.47, "X2n_air_quality_air_pressure": 942.79}
+{"id": "ff35e8f1-ee80-4201-a266-beaae4ff53af", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:57.83", "s25JW_ambient_light_illuminance": 587.13, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7576, "VDY_accel_y": -469, "VDY_accel_z": -6125}
+{"id": "3a2b3968-6c3f-4fcd-bd1c-f099ab5b0ec5", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:57.84", "s25JU_ambient_light_illuminance": 74.53, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9436, "VEg_accel_y": 712, "VEg_accel_z": -2294}
+{"id": "6b6169a2-75cc-4c88-b340-c19c05cce3ad", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:57.85", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 72.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.47, "X2n_air_quality_air_pressure": 942.79}
+{"id": "11f8b35f-0b59-476e-a1c6-2cf5bc5389fd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:58.36", "s25JW_ambient_light_illuminance": 587.13, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7579, "VDY_accel_y": -454, "VDY_accel_z": -6095}
+{"id": "04bba024-2c89-4395-97b7-41cf6a1ca796", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:58.37", "s25JU_ambient_light_illuminance": 74.89, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9426, "VEg_accel_y": 759, "VEg_accel_z": -2296}
+{"id": "8e453834-c0dd-4d8e-baa5-e695bdfdf7e7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:58.38", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 73.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.47, "X2n_air_quality_air_pressure": 942.79}
+{"id": "097c319b-15ce-4ac0-aa4e-6d9eef91f0e2", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:58.89", "s25JW_ambient_light_illuminance": 585.84, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7564, "VDY_accel_y": -438, "VDY_accel_z": -6109}
+{"id": "32427908-815e-4d1d-a90f-27e3439f5ea2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:58.90", "s25JU_ambient_light_illuminance": 74.53, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9383, "VEg_accel_y": 717, "VEg_accel_z": -2282}
+{"id": "0bd6b42f-dd9c-40c8-bf8d-80f66b526622", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:58.91", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 75.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.47, "X2n_air_quality_air_pressure": 942.79}
+{"id": "f0afe403-59e1-4fdb-842a-b94c3624770c", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:59.42", "s25JW_ambient_light_illuminance": 586.35, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7598, "VDY_accel_y": -493, "VDY_accel_z": -6114}
+{"id": "a17a8dce-fcab-4b36-b8ed-28458968ce89", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:59.44", "s25JU_ambient_light_illuminance": 75.44, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9370, "VEg_accel_y": 722, "VEg_accel_z": -2293}
+{"id": "0ec7a10a-f1b5-40f2-96ae-1a518da0d83b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:59.45", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 70.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.79}
+{"id": "88fb5033-2576-455e-a2e5-4cf2ec362eb2", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:28:59.96", "s25JW_ambient_light_illuminance": 585.29, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7565, "VDY_accel_y": -473, "VDY_accel_z": -6127}
+{"id": "0c3733d0-fd44-4f8d-a0da-a08ddc8ca583", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:28:59.97", "s25JU_ambient_light_illuminance": 74.28, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9425, "VEg_accel_y": 700, "VEg_accel_z": -2287}
+{"id": "6c64de32-38ad-4a02-a388-579bb6a5c084", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:28:59.97", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 81.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.79}
+{"id": "5a055f53-941a-4fb3-9911-8065c9b31e4a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:00.49", "s25JW_ambient_light_illuminance": 580.91, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7573, "VDY_accel_y": -462, "VDY_accel_z": -6083}
+{"id": "6321d6c9-9ed1-475c-9ebf-d40cfb85e88d", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:00.49", "s25JU_ambient_light_illuminance": 73.51, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9414, "VEg_accel_y": 718, "VEg_accel_z": -2315}
+{"id": "12e466fb-7914-4bc6-9216-4cd7e4c1b466", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:00.50", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 73.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.79}
+{"id": "267a8ed1-cb22-481c-ba91-e57c39f66b4d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:01.02", "s25JW_ambient_light_illuminance": 579.01, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7590, "VDY_accel_y": -476, "VDY_accel_z": -6073}
+{"id": "eb75d57e-82d3-46d9-8a51-520e75f03783", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:01.03", "s25JU_ambient_light_illuminance": 72.12, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9441, "VEg_accel_y": 740, "VEg_accel_z": -2234}
+{"id": "58732636-442f-4625-8d14-58011a45683d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:01.04", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 48.6, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.79}
+{"id": "72c11a5d-10c6-4067-8935-76cc4c229fcd", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:01.55", "s25JW_ambient_light_illuminance": 575.01, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7577, "VDY_accel_y": -468, "VDY_accel_z": -6058}
+{"id": "b63f23cb-031a-4dda-add8-855e5b10ccdf", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:01.56", "s25JU_ambient_light_illuminance": 51.39, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9450, "VEg_accel_y": 721, "VEg_accel_z": -2319}
+{"id": "2252396e-719e-4ce4-9695-80d9c5d052c2", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:01.56", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 22.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.44, "X2n_air_quality_air_pressure": 942.79}
+{"id": "a264d254-d92d-454c-b84a-fd00d5d15f99", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:02.08", "s25JW_ambient_light_illuminance": 573.18, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7583, "VDY_accel_y": -469, "VDY_accel_z": -6096}
+{"id": "727fbe0a-eb64-484f-812d-9330959f613c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:02.09", "s25JU_ambient_light_illuminance": 45.68, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9380, "VEg_accel_y": 739, "VEg_accel_z": -2263}
+{"id": "eec2445a-bb9b-489e-9581-afe3a89b812c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:02.10", "s23xq_load_cell_weight": 777, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "a7753706-0506-4aa8-b66b-221bb34abbb4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:02.61", "s25JW_ambient_light_illuminance": 571.59, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7612, "VDY_accel_y": -459, "VDY_accel_z": -6119}
+{"id": "dc4255cc-ae54-4337-9812-642ea6e010a1", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:02.62", "s25JU_ambient_light_illuminance": 44.82, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 700, "VEg_accel_z": -2263}
+{"id": "35aa71c7-5fcb-490c-9de4-ffbdc1c4755e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:02.63", "s23xq_load_cell_weight": 825, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "99d101de-9bd7-46b7-8c29-ae20679bb9a0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:03.14", "s25JW_ambient_light_illuminance": 570.19, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7545, "VDY_accel_y": -509, "VDY_accel_z": -6129}
+{"id": "1e95f266-7979-48f8-9c4f-e1e5c4fff3f0", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:03.15", "s25JU_ambient_light_illuminance": 45.79, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9475, "VEg_accel_y": 715, "VEg_accel_z": -2277}
+{"id": "73ee2f4d-d356-4025-ba75-e337a92fc8ac", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:03.16", "s23xq_load_cell_weight": 636, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "71f51895-0370-405a-b341-073041dd8da3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:03.67", "s25JW_ambient_light_illuminance": 571.71, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7556, "VDY_accel_y": -508, "VDY_accel_z": -6125}
+{"id": "9f984bf6-7daf-41f3-b9fe-6c005c5239c2", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:03.68", "s25JU_ambient_light_illuminance": 48.22, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 720, "VEg_accel_z": -2268}
+{"id": "444e102c-e763-40f0-b573-626b700c50fc", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:03.69", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "191ea673-0f8e-4101-8b6e-2d64f6cbfbe9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:04.20", "s25JW_ambient_light_illuminance": 573.2, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7609, "VDY_accel_y": -474, "VDY_accel_z": -6097}
+{"id": "0545abad-61d2-4318-bc74-4bb1a8a8071e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:04.21", "s25JU_ambient_light_illuminance": 48.4, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9416, "VEg_accel_y": 718, "VEg_accel_z": -2287}
+{"id": "06e3bcf3-ca78-4aa8-bd2c-75ca13b16c5e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:04.22", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "b5b79018-eb43-405f-95c6-cf7eb52edf1d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:04.73", "s25JW_ambient_light_illuminance": 572.68, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7583, "VDY_accel_y": -457, "VDY_accel_z": -6123}
+{"id": "8d06fbbb-29be-49c7-9103-07d91b1b5750", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:04.74", "s25JU_ambient_light_illuminance": 47.08, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9381, "VEg_accel_y": 689, "VEg_accel_z": -2303}
+{"id": "7ce3312a-06b6-4134-9189-6c2f37579be8", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:04.75", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "17c5434a-4b99-456f-b6dd-8cdda128b9f3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:05.26", "s25JW_ambient_light_illuminance": 572.97, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7571, "VDY_accel_y": -477, "VDY_accel_z": -6125}
+{"id": "700e2308-7c56-4bd8-aabf-d55b237f7d88", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:05.27", "s25JU_ambient_light_illuminance": 48.22, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9414, "VEg_accel_y": 711, "VEg_accel_z": -2267}
+{"id": "ececa887-2f46-4447-ac3d-c14c3cfde00b", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:05.28", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 21.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.79}
+{"id": "ffc4305f-7863-4567-b411-10af59dc0ab7", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:05.79", "s25JW_ambient_light_illuminance": 574.72, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7580, "VDY_accel_y": -461, "VDY_accel_z": -6100}
+{"id": "52214860-27f7-4688-85c3-3c84b2f8e55e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:05.80", "s25JU_ambient_light_illuminance": 48.53, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9447, "VEg_accel_y": 751, "VEg_accel_z": -2244}
+{"id": "34bae135-372c-4c59-a03a-23c91169467e", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:05.81", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.79}
+{"id": "22af887b-1336-46b5-8928-5a1a285d0c01", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:06.32", "s25JW_ambient_light_illuminance": 571.81, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7586, "VDY_accel_y": -529, "VDY_accel_z": -6092}
+{"id": "ad8cd8f5-95c8-4910-b298-af3ff85d3931", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:06.33", "s25JU_ambient_light_illuminance": 46.65, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 692, "VEg_accel_z": -2260}
+{"id": "6b10eb89-05e3-4d7b-adff-18e3d44ab5a6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:06.34", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 21.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.79}
+{"id": "03361228-e172-4094-b859-95bb8c795160", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:06.85", "s25JW_ambient_light_illuminance": 572.59, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7600, "VDY_accel_y": -478, "VDY_accel_z": -6137}
+{"id": "24690b4a-a601-4c20-b55c-a742337eba9e", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:06.86", "s25JU_ambient_light_illuminance": 49.92, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9406, "VEg_accel_y": 679, "VEg_accel_z": -2337}
+{"id": "bb771866-6bee-4774-a6e3-15b8b78255fa", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:06.87", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.79}
+{"id": "f2f20181-39e2-42f9-9f8d-ea3a565af535", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:07.39", "s25JW_ambient_light_illuminance": 568.47, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7561, "VDY_accel_y": -523, "VDY_accel_z": -6156}
+{"id": "c368c75e-07b9-41aa-8d6c-d754496b0410", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:07.40", "s25JU_ambient_light_illuminance": 49.45, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9476, "VEg_accel_y": 712, "VEg_accel_z": -2264}
+{"id": "8b16e3bb-584e-4439-890a-a1ec2db6b8bc", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:07.41", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.79}
+{"id": "dd7fe85c-268a-4896-bf8e-f0ebdb7a792b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:07.92", "s25JW_ambient_light_illuminance": 569.19, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7557, "VDY_accel_y": -492, "VDY_accel_z": -6141}
+{"id": "56a4437d-54f9-4f62-81f0-cf7e9fd551a7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:07.93", "s25JU_ambient_light_illuminance": 48.9, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9420, "VEg_accel_y": 725, "VEg_accel_z": -2305}
+{"id": "73ebbd45-0fb2-495a-99e2-46b987cf5241", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:07.94", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.79}
+{"id": "c0d6460c-576f-4ec3-acb3-39cf5585de1a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:08.45", "s25JW_ambient_light_illuminance": 572.32, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7566, "VDY_accel_y": -485, "VDY_accel_z": -6130}
+{"id": "efe4c5ed-b196-4ad9-bd9b-b29125a4f5dd", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:08.46", "s25JU_ambient_light_illuminance": 48.87, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9406, "VEg_accel_y": 703, "VEg_accel_z": -2280}
+{"id": "b2038633-8247-4849-bcbb-42512745f930", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:08.47", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.1, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "ed173d79-8525-4ecc-b3ca-418e6c33adc4", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:08.98", "s25JW_ambient_light_illuminance": 573.1, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7589, "VDY_accel_y": -481, "VDY_accel_z": -6195}
+{"id": "1a34c2a6-3e15-4160-a693-7c49072a3547", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:08.99", "s25JU_ambient_light_illuminance": 49.39, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9475, "VEg_accel_y": 634, "VEg_accel_z": -2399}
+{"id": "5f490efa-565c-4695-a94f-374d2114f0fd", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:09.00", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "fafa7650-7acf-4933-848a-3b9bd48cbfff", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:09.51", "s25JW_ambient_light_illuminance": 572.16, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7614, "VDY_accel_y": -470, "VDY_accel_z": -6137}
+{"id": "4918c4ae-9503-43bd-9c6a-810b659abb07", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:09.53", "s25JU_ambient_light_illuminance": 49.45, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9414, "VEg_accel_y": 741, "VEg_accel_z": -2241}
+{"id": "9d845b8d-dc77-4d27-8919-1693136e7da7", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:09.53", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "b58e540e-78aa-45bb-a12c-ffecf42fa3b0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:10.05", "s25JW_ambient_light_illuminance": 573.36, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7585, "VDY_accel_y": -485, "VDY_accel_z": -6108}
+{"id": "a1c8a995-68ba-4f12-a468-18d94d48ebd8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:10.06", "s25JU_ambient_light_illuminance": 48.27, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9468, "VEg_accel_y": 692, "VEg_accel_z": -2292}
+{"id": "33b322e1-c5d4-435d-b768-9f6f116ce172", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:10.06", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "276b0c73-6edc-4a06-a830-5eaaa80a96a8", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:10.58", "s25JW_ambient_light_illuminance": 572.75, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7586, "VDY_accel_y": -487, "VDY_accel_z": -6044}
+{"id": "4345f2bc-3aa3-4471-b895-5ba5636c578c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:10.59", "s25JU_ambient_light_illuminance": 48.04, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9443, "VEg_accel_y": 696, "VEg_accel_z": -2299}
+{"id": "d039de48-35d1-404c-ab0e-ab406692251d", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:10.60", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "539435f9-9b4f-4986-8027-c30cf5f3fdd0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:11.11", "s25JW_ambient_light_illuminance": 572.56, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7562, "VDY_accel_y": -494, "VDY_accel_z": -6096}
+{"id": "e013ce8f-5248-43c4-b395-4aa0338952ec", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:11.12", "s25JU_ambient_light_illuminance": 48.18, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9400, "VEg_accel_y": 692, "VEg_accel_z": -2303}
+{"id": "2e483ee9-661d-46e3-8bfe-c00d063bd166", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:11.13", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "b440fd10-0b4e-4ed1-a91c-090eb38f1298", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:11.64", "s25JW_ambient_light_illuminance": 572.36, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7579, "VDY_accel_y": -485, "VDY_accel_z": -6136}
+{"id": "1b6a0fe0-8874-44fc-a1d7-d1df0e1d7a20", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:11.65", "s25JU_ambient_light_illuminance": 49.0, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9421, "VEg_accel_y": 704, "VEg_accel_z": -2276}
+{"id": "6ba59f60-6dc8-4aad-92b2-726195ddd58a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:11.66", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 20.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "07164b6b-4058-4f0a-b706-00ff9d5a8833", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:12.17", "s25JW_ambient_light_illuminance": 573.14, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7578, "VDY_accel_y": -475, "VDY_accel_z": -6126}
+{"id": "4bcbcfa5-8f25-4a13-9ade-ab79dfdd5e2b", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:12.18", "s25JU_ambient_light_illuminance": 48.71, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 776, "VEg_accel_z": -2280}
+{"id": "fbfc5153-c45a-4917-9b5f-3cfefbc8533c", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:12.19", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 24.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "1e4cf721-e185-4612-8fb7-71a17acd3ace", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:12.70", "s25JW_ambient_light_illuminance": 575.07, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7567, "VDY_accel_y": -471, "VDY_accel_z": -6104}
+{"id": "52589327-1fae-4d14-8f4b-1f1c3e14999a", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:12.71", "s25JU_ambient_light_illuminance": 59.39, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 681, "VEg_accel_z": -2258}
+{"id": "8e62cb6f-2c3a-4599-b070-7950bcbe39be", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:12.72", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 43.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 2, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "5fb3be2b-abcc-496d-874f-e0dafa6375b3", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:13.23", "s25JW_ambient_light_illuminance": 577.69, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7593, "VDY_accel_y": -463, "VDY_accel_z": -6091}
+{"id": "40c4a6f5-623e-42b2-a8a9-d96a22544cad", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:13.24", "s25JU_ambient_light_illuminance": 74.07, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9417, "VEg_accel_y": 729, "VEg_accel_z": -2315}
+{"id": "4f4d9a46-21e1-4583-bbdb-cdf44f80c84a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:13.25", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 77.0, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "3497e745-660f-49b3-88fe-bae5a7ec8cc2", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:13.76", "s25JW_ambient_light_illuminance": 581.87, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7589, "VDY_accel_y": -470, "VDY_accel_z": -6102}
+{"id": "da059c13-b153-4b3d-9fcd-f1477ca4b696", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:13.77", "s25JU_ambient_light_illuminance": 74.32, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 708, "VEg_accel_z": -2270}
+{"id": "ff32f08e-49f6-4fce-991d-c78b9dd85764", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:13.78", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 73.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.46, "X2n_air_quality_air_pressure": 942.78}
+{"id": "8c0390ea-6f51-4a17-8e3c-f0fea9c47e8d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:14.29", "s25JW_ambient_light_illuminance": 581.87, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7575, "VDY_accel_y": -484, "VDY_accel_z": -6096}
+{"id": "2e943060-130c-4868-bd76-a08a950d472c", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:14.30", "s25JU_ambient_light_illuminance": 74.05, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9415, "VEg_accel_y": 769, "VEg_accel_z": -2264}
+{"id": "58780484-6cb3-4de4-b7de-6f59636184ec", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:14.31", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 73.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "7334a3e9-1dea-4804-9dd2-085f059dd74a", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:14.82", "s25JW_ambient_light_illuminance": 582.23, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7595, "VDY_accel_y": -471, "VDY_accel_z": -6104}
+{"id": "4c4e50a4-1042-4e80-b9c7-b89c4dfe3273", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:14.83", "s25JU_ambient_light_illuminance": 74.32, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9459, "VEg_accel_y": 735, "VEg_accel_z": -2300}
+{"id": "b73b2301-35ee-4e03-a2ce-c381bf80aea6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:14.84", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 74.8, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "b03e23ec-22b2-4ef8-94e5-66f30e07e5ab", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:15.35", "s25JW_ambient_light_illuminance": 582.45, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7567, "VDY_accel_y": -465, "VDY_accel_z": -6121}
+{"id": "d810c7ff-2c45-4a2a-8044-0b0cc884ff93", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:15.36", "s25JU_ambient_light_illuminance": 73.57, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9404, "VEg_accel_y": 711, "VEg_accel_z": -2333}
+{"id": "f56037e1-3be3-423a-921c-509890d23771", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:15.37", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 74.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "bded7f4d-8f1c-4da4-b727-918b223ccce0", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:15.88", "s25JW_ambient_light_illuminance": 583.27, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7587, "VDY_accel_y": -491, "VDY_accel_z": -6137}
+{"id": "9e0e90a3-60a5-4f78-8abb-c88e3cacd5b4", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:15.89", "s25JU_ambient_light_illuminance": 74.49, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9413, "VEg_accel_y": 716, "VEg_accel_z": -2279}
+{"id": "86f58508-3c27-4107-be08-2b892ce5da45", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:15.90", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 74.4, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "daed5a72-e14c-4316-8072-03b2fb74a86b", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:16.41", "s25JW_ambient_light_illuminance": 579.29, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7570, "VDY_accel_y": -480, "VDY_accel_z": -6122}
+{"id": "a0c28aa9-b863-4d23-9745-d81252de9b45", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:16.42", "s25JU_ambient_light_illuminance": 72.82, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9450, "VEg_accel_y": 743, "VEg_accel_z": -2254}
+{"id": "a7a0722c-3358-4fe2-a104-2ac1c35a379a", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:16.43", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 103.3, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.79}
+{"id": "b45a3561-7552-4cd3-a932-ab073e9697a9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:16.94", "s25JW_ambient_light_illuminance": 576.66, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7580, "VDY_accel_y": -494, "VDY_accel_z": -6100}
+{"id": "2aa1440a-5526-426c-a76c-221b16e11608", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:16.95", "s25JU_ambient_light_illuminance": 67.97, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9383, "VEg_accel_y": 773, "VEg_accel_z": -2315}
+{"id": "5bfb97eb-d56c-46bf-bf83-58df5d74a438", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:16.96", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 68.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.77}
+{"id": "5dd4b0f3-10bc-40c3-a173-06056a2061d9", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:17.47", "s25JW_ambient_light_illuminance": 568.95, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 0, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7594, "VDY_accel_y": -496, "VDY_accel_z": -6109}
+{"id": "e09cf1a7-641b-4608-9d37-a1519a7f86c8", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:17.48", "s25JU_ambient_light_illuminance": 68.01, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9383, "VEg_accel_y": 739, "VEg_accel_z": -2310}
+{"id": "6bade825-6ba2-48c7-b60e-b33e1ab929c6", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:17.49", "s23xq_load_cell_weight": 1, "SeG_ir_long_distance": 86.5, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.77}
+{"id": "526af6e3-1d38-4365-bf32-26ec06d6281d", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:18.01", "s25JW_ambient_light_illuminance": 566.7, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7584, "VDY_accel_y": -435, "VDY_accel_z": -6138}
+{"id": "a47aa63d-0b81-4d4b-bc07-1bb76161ea20", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:18.02", "s25JU_ambient_light_illuminance": 61.7, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 0, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9432, "VEg_accel_y": 715, "VEg_accel_z": -2337}
+{"id": "cb6787e4-1e03-4bdf-9b4f-d62af1bc3f08", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:18.02", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 91.2, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.77}
+{"id": "b05f1531-c712-46d9-a03d-e24864fbca24", "station": "LEFT_DONATION", "timestamp": "2024-07-30 11:29:18.54", "s25JW_ambient_light_illuminance": 556.67, "s22P4_nfc_status": 0, "s22P4_nfc_tag": 0, "Sj7_motion_status": 1, "VMM_button_l_pressed": 0, "VMM_button_r_pressed": 0, "TGJ_ir_short_distance": 30.0, "s23V3_button_state": 0, "VDY_accel_x": 7553, "VDY_accel_y": -522, "VDY_accel_z": -6115}
+{"id": "1dfe2fb2-d7be-481d-ab84-0ffa2ece87c7", "station": "RIGHT_DONATION", "timestamp": "2024-07-30 11:29:18.55", "s25JU_ambient_light_illuminance": 42.08, "s22P8_nfc_status": 0, "s22P8_nfc_tag": 1, "SjH_motion_status": 1, "VMK_button_l_pressed": 0, "VMK_button_r_pressed": 0, "TFf_ir_short_distance": 5.5, "s23V6_button_state": 0, "VEg_accel_x": 9405, "VEg_accel_y": 736, "VEg_accel_z": -2288}
+{"id": "bd2ae527-ef34-4c8a-8390-c6a3321b4c84", "station": "HYGIENE_STATION", "timestamp": "2024-07-30 11:29:18.55", "s23xq_load_cell_weight": 2, "SeG_ir_long_distance": 82.9, "s23UU_button_state": 0, "s22Pa_nfc_status": 0, "s22Pa_nfc_tag": 1, "air_quality_iaq": 0, "X2n_air_quality_temp": 26.53, "X2n_air_quality_humidity": 48.45, "X2n_air_quality_air_pressure": 942.77}
diff --git a/tests/output_producer_test/__init__.py b/tests/output_producer_test/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/output_producer_test/output_producer_e2e_test.py b/tests/output_producer_test/output_producer_e2e_test.py
new file mode 100644
index 0000000..f3b4263
--- /dev/null
+++ b/tests/output_producer_test/output_producer_e2e_test.py
@@ -0,0 +1,106 @@
+import json
+import os
+from typing import Set
+
+import pandas as pd
+import pytest
+from cepact import (DetServiceGenerator, DAGConfig, SiddhiConfig,
+ LocalDiscretizationFetcher, LocalAnnotationParamFetcher,
+ LocalSignatureFetcher, LocalIgnoreSensorFetcher,
+ AllHighLevelPatternQuery,
+ First50HighLevelPatternQuery, FirstLastLowLevelPatternQuery,
+ Any25LowLevelPatternQuery, Any50LowLevelPatternQuery,
+ Any75LowLevelPatternQuery)
+
+test_path = os.path.join("tests", "local_input_mocks")
+test_cases = [f for f in os.listdir(test_path) if os.path.isdir(os.path.join(test_path, f))]
+# Define the format
+format_str = '%Y-%m-%d %H:%M:%S.%f'
+
+
+# Convert to datetime object
+
+@pytest.mark.parametrize("testcase_dir", test_cases)
+def test_file_generation_overall(testcase_dir, tmp_path):
+ """ Test basic functioning. """
+ local_in_dir = os.path.join(test_path, testcase_dir, "in")
+ mock_siddhi_conf = SiddhiConfig(mqtt_url="mockurl",
+ mqtt_user="mockuser",
+ mqtt_pwd="mockpw",
+ topic_prefix="mockpref",
+ map_sensor_name_data_to_mqtt={})
+
+ mock_dag_conf = DAGConfig(det_methods=[AllHighLevelPatternQuery(),
+ First50HighLevelPatternQuery(),
+ FirstLastLowLevelPatternQuery(),
+ Any25LowLevelPatternQuery(),
+ Any50LowLevelPatternQuery(),
+ Any75LowLevelPatternQuery()],
+ siddhi_config=mock_siddhi_conf,
+ out_dir=tmp_path,
+ sampling_freq=2,
+ signature_fetcher=LocalSignatureFetcher(local_in_dir),
+ annotation_param_fetcher=LocalAnnotationParamFetcher(local_in_dir),
+ ignore_sensor_fetcher=LocalIgnoreSensorFetcher(local_in_dir),
+ discretization_fetcher=LocalDiscretizationFetcher(local_in_dir))
+ # run the input processor
+ dag = DetServiceGenerator(mock_dag_conf)
+ dag.run()
+ activity_names: Set[str] = set(
+ pd.read_csv(os.path.join(test_path, testcase_dir, "in", "anno_params.csv"))[
+ "activity_name"].tolist())
+ for activity_name in activity_names:
+ # check if all files are generated
+ act_wo_spaces = activity_name.replace(" ", "")
+ changes_out = tmp_path / "changes" / f"{act_wo_spaces}_changes.jsonl"
+ assert changes_out.exists()
+ # make sure that changes content is correct
+ with open(changes_out, "r", encoding="utf-8") as f:
+ with open(
+ os.path.join(test_path, testcase_dir, "assert", activity_name, "changes.jsonl"),
+ "r", encoding="utf-8") as f_assert:
+ for line in f:
+ file_dict = json.loads(line.replace("\n", ""))
+ relevant_assert = json.loads(f_assert.readline().replace("\n", ""))
+ assert file_dict == relevant_assert
+ # make sure that f_assert is empty
+ assert f_assert.readline() == ""
+ app_out = tmp_path / "apps" / f"Detect{act_wo_spaces}App.siddhi"
+ assert app_out.exists()
+ # make sure that app content is correct
+ # first check if app.siddhi assertion file exists
+ if os.path.exists(
+ os.path.join(test_path, testcase_dir, "assert", activity_name, "app.siddhi")):
+ with open(app_out, "r", encoding="utf-8") as f:
+ app_content = f.read()
+ with open(os.path.join(test_path, testcase_dir, "assert", activity_name,
+ "app.siddhi"), "r", encoding="utf-8") as f_assert:
+ assert app_content == f_assert.read()
+ # get tuples of unique activity_name annotation_id combinations in csv
+ anno_params = pd.read_csv(os.path.join(test_path, testcase_dir, "in", "anno_params.csv"))
+ unique_activity_annotation_ids = set(
+ anno_params.apply(lambda x: (x["activity_name"], x["annotation_id"]), axis=1))
+ for activity_name, annotation_id in unique_activity_annotation_ids:
+ # check if all files are generated
+ act_wo_spaces = activity_name.replace(" ", "")
+ annotation_id_wo_spaces = annotation_id.replace(" ", "")
+ sig_out = tmp_path / "signatures" / f"{act_wo_spaces}_{annotation_id_wo_spaces}_signature.jsonl"
+ assert sig_out.exists()
+ # make sure that signature content is correct
+ with open(sig_out, "r", encoding="utf-8") as f:
+ with open(os.path.join(test_path, testcase_dir, "assert", activity_name, annotation_id,
+ "signature.jsonl"), "r", encoding="utf-8") as f_assert:
+ for line in f:
+ file_dict = json.loads(line.replace("\n", ""))
+ relevant_assert = json.loads(f_assert.readline().replace("\n", ""))
+ for key, value in file_dict.items():
+ if isinstance(value, list):
+ # order by name of station
+ value.sort(key=lambda x: x["station"])
+ relevant_assert[key].sort(key=lambda x: x["station"])
+ assert value == relevant_assert[key]
+ # make sure that f_assert is empty
+ assert f_assert.readline() == ""
+ # make sure that a log file is generated
+ log_out = tmp_path / "log.txt"
+ assert log_out.exists()
diff --git a/tests/output_producer_test/output_producer_test.py b/tests/output_producer_test/output_producer_test.py
new file mode 100644
index 0000000..56dac2c
--- /dev/null
+++ b/tests/output_producer_test/output_producer_test.py
@@ -0,0 +1,290 @@
+""" Test output producer. """
+import json
+from datetime import datetime
+
+import pytest
+from cepact import DAGConfig, SiddhiConfig, GrafanaFetcher, \
+ InfluxFetcher, LocalDiscretizationFetcher
+from cepact.output_producer import (OutputProducer, AllHighLevelPatternQuery,
+ First50HighLevelPatternQuery,
+ FirstLastLowLevelPatternQuery,
+ Any25LowLevelPatternQuery, Any50LowLevelPatternQuery,
+ Any75LowLevelPatternQuery)
+from cepact.representations import Activity, SignatureBuilder, \
+ AnnotationParams, DiscretizationBuilder, SignatureItem
+
+siddhi_app_assert = """@App:name('DetectpaperactApp')
+
+@source(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act', topic = 'mockpref/station1', username = 'mockuser', password = 'mockpw',
+@map(type = 'json', @attributes(timestamp = '$.timestamp', i1_pos_switch = '$.i1_pos_switch', i2_pos_switch = '$.i2_pos_switch', i5_light_barrier = '$.i5_light_barrier', m1_speed = '$.m1_speed', o7valve = '$.o7_valve', o8_compressor = '$.o8_compressor')))
+define stream station1Stream(timestamp string, i1_pos_switch int, i2_pos_switch int, i5_light_barrier int, m1_speed int, o7valve int, o8_compressor int);
+
+define stream station1StreamDisc(timestamp string, i1_pos_switch string, i2_pos_switch int, i5_light_barrier int, m1_speed int, o7valve int, o8_compressor int);
+
+@sink(type = 'log', prefix = 'LowLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act.ll', topic = 'ActivityEvents/LowLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedLowLevelActivityEvents(event string, activity string, ts_first string, ts_second string, ll_pattern_num int);
+
+@sink(type = 'log', prefix = 'HighLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act.hl', topic = 'ActivityEvents/HighLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedHighLevelActivityEvents(event string, next_pattern string, activity string, ts_first string, ts_second string);
+
+@sink(type = 'log', prefix = 'InstanceLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act.il.start', topic = 'DefaultBase/DefaultSource/DefaultCase/paper act', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload(""\"{"lifecycle:transition":"start","time:timestamp":"{{ts_start}}", "detection:type": "{{detection_type}}"}""\")))
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act.il.complete', topic = 'DefaultBase/DefaultSource/DefaultCase/paper act', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload(""\"{"lifecycle:transition":"complete","time:timestamp":"{{ts_end}}", "detection:type": "{{detection_type}}"}""\")))
+define Stream DetectedInstanceLevelActivities(activity string, detection_type string, ts_start string, ts_start_unix long, ts_end string, ts_end_unix long);
+
+@info(name = 'station1DiscSourceMapper')
+from station1Stream
+select timestamp as timestamp, ifThenElse(i1_pos_switch <= 0, 'off', ifThenElse(i1_pos_switch > 0, 'on', 'ERROR')) as i1_pos_switch, i2_pos_switch as i2_pos_switch, i5_light_barrier as i5_light_barrier, m1_speed as m1_speed, o7valve as o7valve, o8_compressor as o8_compressor
+insert into station1StreamDisc;
+
+@info(name="HighToLow-Helper")
+from every e1 = DetectedLowLevelActivityEvents, e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= e2.ll_pattern_num]
+select "HighToLow" as event
+insert into HelperStream;
+
+@info(name="Detect-LowLevel-Pattern-1")
+from every e1 = station1StreamDisc, e2 = station1StreamDisc[(e1.m1_speed==0 and e2.m1_speed==-512) and (e1.o7valve==0 and e2.o7valve==512)]
+select "LowLevel-Pattern-1" as event, "paper act" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 1 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-1")
+from DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"]
+select "HighLevel-Pattern-1" as event, "LowLevel-Pattern-2" as next_pattern, "paper act" as activity, ts_first, ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-2")
+from every e1 = station1StreamDisc, e2 = station1StreamDisc[(e1.i1_pos_switch=='off' and e2.i1_pos_switch=='on') and (e1.m1_speed==-512 and e2.m1_speed==0)]
+select "LowLevel-Pattern-2" as event, "paper act" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 2 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-2")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-2" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-2" as event, "LowLevel-Pattern-3" as next_pattern, "paper act" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-3")
+from every e1 = station1StreamDisc, e2 = station1StreamDisc[(e1.o7valve==512 and e2.o7valve==0)]
+select "LowLevel-Pattern-3" as event, "paper act" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 3 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-3")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-2"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-3" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-3" as event, "LowLevel-Pattern-4" as next_pattern, "paper act" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-AllHighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-3"]
+select "paper act" as activity, "AllHighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;
+"""
+
+signature_assert = """{"timestamp": "2021-01-01 00:00:00.00", "measurements": [{"station": "station1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+{"timestamp": "2021-01-01 00:00:01.00", "measurements": [{"station": "station1", "i1_pos_switch": 0, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": -512, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2021-01-01 00:00:02.00", "measurements": [{"station": "station1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2021-01-01 00:00:03.00", "measurements": [{"station": "station1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 512, "o8_compressor": 0}]}
+{"timestamp": "2021-01-01 00:00:04.00", "measurements": [{"station": "station1", "i1_pos_switch": 1, "i2_pos_switch": 0, "i5_light_barrier": 1, "m1_speed": 0, "o7_valve": 0, "o8_compressor": 0}]}
+"""
+
+changes_assert = """{"timestamp":"2021-01-01 00:00:01.00","changes":[{"station":"station1","sensor":"m1_speed","prev_value":0,"value":-512},{"station":"station1","sensor":"o7_valve","prev_value":0,"value":512}]}
+{"timestamp":"2021-01-01 00:00:02.00","changes":[{"station":"station1","sensor":"i1_pos_switch","prev_value":"off","value":"on"},{"station":"station1","sensor":"m1_speed","prev_value":-512,"value":0}]}
+{"timestamp":"2021-01-01 00:00:04.00","changes":[{"station":"station1","sensor":"o7_valve","prev_value":512,"value":0}]}
+"""
+
+mock_siddhi_conf = SiddhiConfig(mqtt_url="mockurl",
+ mqtt_user="mockuser",
+ mqtt_pwd="mockpw",
+ topic_prefix="mockpref",
+ map_sensor_name_data_to_mqtt={"o7_valve": "o7valve"})
+
+
+def add_many(signature_builder, sensor: str, times: list, values: list):
+ """ Add many signature items to the signature builder """
+ assert len(times) == len(values)
+ for time, value in zip(times, values):
+ signature_builder.add_signature_item(SignatureItem(
+ station="station1",
+ timestamp=time,
+ sensor=sensor,
+ value=value)
+ )
+
+
+signature_builder = SignatureBuilder(activity_name="paperact",
+ annotation_id="ann1",
+ sampling_freq=2)
+dt0 = datetime.fromisoformat("2021-01-01T00:00:00")
+dt1 = datetime.fromisoformat("2021-01-01T00:00:01")
+dt2 = datetime.fromisoformat("2021-01-01T00:00:02")
+dt3 = datetime.fromisoformat("2021-01-01T00:00:03")
+dt4 = datetime.fromisoformat("2021-01-01T00:00:04")
+add_many(signature_builder, "i1_pos_switch", [dt0, dt1, dt2, dt3, dt4], [0, 0, 1, 1, 1])
+add_many(signature_builder, "i2_pos_switch", [dt0, dt1, dt2, dt3, dt4], [0, 0, 0, 0, 0])
+add_many(signature_builder, "i5_light_barrier", [dt0, dt1, dt2, dt3, dt4], [1, 1, 1, 1, 1])
+add_many(signature_builder, "m1_speed", [dt0, dt1, dt2, dt3, dt4], [0, -512, 0, 0, 0])
+add_many(signature_builder, "o7_valve", [dt0, dt1, dt2, dt3, dt4], [0, 512, 512, 512, 0])
+add_many(signature_builder, "o8_compressor", [dt0, dt1, dt2, dt3, dt4], [0, 0, 0, 0, 0])
+signature = signature_builder.build()
+annotation_params = AnnotationParams(annotation_id="ann1",
+ activity_name="paper act",
+ stations=["station1"],
+ start=datetime.fromisoformat("2021-01-01T00:00:00"),
+ end=datetime.fromisoformat("2021-01-01T00:05:00"))
+activity = Activity(annotation_params, [signature], [])
+db = DiscretizationBuilder()
+db.add_discretization_item("i1_pos_switch", float("-inf"), 0, True, True, "off")
+db.add_discretization_item("i1_pos_switch", 0, float("inf"), False, True, "on")
+discr = db.build()
+
+
+@pytest.fixture(scope='module', autouse=True)
+def before_all():
+ """ Preparations
+ """
+ # ^ Will be executed before the first test
+ yield
+ # v Will be executed after the last test
+
+
+def test_paper(tmp_path):
+ """ Test if output producer works generally. """
+ mock_dag_conf = DAGConfig(det_methods=[AllHighLevelPatternQuery()],
+ siddhi_config=mock_siddhi_conf,
+ out_dir=tmp_path,
+ sampling_freq=2,
+ signature_fetcher=InfluxFetcher(
+ url="http://localhost:8086",
+ auth="mock",
+ org="mock",
+ station_bucket_map={"mock":
+ "mock"}, ),
+ annotation_param_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ ignore_sensor_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ discretization_fetcher=LocalDiscretizationFetcher("mock"))
+ output_producer = OutputProducer(discr, mock_dag_conf)
+ output_producer.write_app(activity)
+ # check that app exists in subfolder apps
+ output_siddhi_file = tmp_path / "apps" / "DetectpaperactApp.siddhi"
+ assert output_siddhi_file.exists()
+ # check that app content is correct
+ with open(output_siddhi_file, "r", encoding="utf-8") as file:
+ siddhi_app = file.read()
+ assert siddhi_app == siddhi_app_assert
+ output_producer.write_signature(activity)
+ output_signature_file = tmp_path / "signatures" / "paperact_ann1_signature.jsonl"
+ assert output_signature_file.exists()
+ with open(output_signature_file, "r", encoding="utf-8") as file:
+ signature = file.read()
+ assert signature == signature_assert
+ output_producer.write_changes(activity)
+ output_changes_file = tmp_path / "changes" / "paperact_changes.jsonl"
+ assert output_changes_file.exists()
+ with open(output_changes_file, "r", encoding="utf-8") as file:
+ # assert for each line that the jsons are equal
+ for i in range(3):
+ file_dict = json.loads(file.readline().replace("\n", ""))
+ relevant_assert = json.loads(changes_assert.split("\n")[i])
+ assert file_dict == relevant_assert
+
+
+def test_all_il_queries_active(tmp_path) -> None:
+ """ Test whether activation of all active il queries works. """
+ mock_dag_conf = DAGConfig(det_methods=[AllHighLevelPatternQuery(),
+ First50HighLevelPatternQuery(),
+ FirstLastLowLevelPatternQuery(),
+ Any25LowLevelPatternQuery(),
+ Any50LowLevelPatternQuery(),
+ Any75LowLevelPatternQuery()],
+ siddhi_config=mock_siddhi_conf,
+ out_dir=tmp_path,
+ sampling_freq=2,
+ signature_fetcher=InfluxFetcher(
+ url="http://localhost:8086",
+ auth="mock",
+ org="mock",
+ station_bucket_map={"mock":
+ "mock"}, ),
+ annotation_param_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ ignore_sensor_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ discretization_fetcher=LocalDiscretizationFetcher("mock"))
+ output_producer = OutputProducer(discr, mock_dag_conf)
+ output_producer.write_app(activity)
+ # check that app exists in subfolder apps
+ output_siddhi_file = tmp_path / "apps" / "DetectpaperactApp.siddhi"
+ assert output_siddhi_file.exists()
+ # check that app content is correct
+ with open(output_siddhi_file, "r", encoding="utf-8") as file:
+ siddhi_app = file.read()
+ assert "Detect-AllHighLevelPattern-InstanceLevelActivity" in siddhi_app
+ assert "Detect-First50HighLevelPattern-InstanceLevelActivity" in siddhi_app
+ assert "Detect-FirstLastLowLevelPattern-InstanceLevelActivity" in siddhi_app
+ assert "Detect-Any25LowLevelPattern-InstanceLevelActivity" in siddhi_app
+ assert "Detect-Any50LowLevelPattern-InstanceLevelActivity" in siddhi_app
+ assert "Detect-Any75LowLevelPattern-InstanceLevelActivity" in siddhi_app
+
+
+def test_some_il_queries_active(tmp_path) -> None:
+ """ Test whether activation of some active il queries works. """
+ mock_dag_conf = DAGConfig(det_methods=[AllHighLevelPatternQuery(),
+ First50HighLevelPatternQuery(),
+ Any75LowLevelPatternQuery()],
+ siddhi_config=mock_siddhi_conf,
+ out_dir=tmp_path,
+ sampling_freq=2,
+ signature_fetcher=InfluxFetcher(
+ url="http://localhost:8086",
+ auth="mock",
+ org="mock",
+ station_bucket_map={"mock":
+ "mock"}, ),
+ annotation_param_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ ignore_sensor_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ discretization_fetcher=LocalDiscretizationFetcher("mock"))
+ output_producer = OutputProducer(discr, mock_dag_conf)
+ output_producer.write_app(activity)
+ # check that app exists in subfolder apps
+ output_siddhi_file = tmp_path / "apps" / "DetectpaperactApp.siddhi"
+ assert output_siddhi_file.exists()
+ # check that app content is correct
+ with open(output_siddhi_file, "r", encoding="utf-8") as file:
+ siddhi_app = file.read()
+ assert "Detect-AllHighLevelPattern-InstanceLevelActivity" in siddhi_app
+ assert "Detect-First50HighLevelPattern-InstanceLevelActivity" in siddhi_app
+ assert "Detect-FirstLastLowLevelPattern-InstanceLevelActivity" not in siddhi_app
+ assert "Detect-Any25LowLevelPattern-InstanceLevelActivity" not in siddhi_app
+ assert "Detect-Any50LowLevelPattern-InstanceLevelActivity" not in siddhi_app
+ assert "Detect-Any75LowLevelPattern-InstanceLevelActivity" in siddhi_app
+
+
+def test_no_il_queries_active(tmp_path) -> None:
+ with pytest.raises(ValueError):
+ DAGConfig(det_methods=[],
+ siddhi_config=mock_siddhi_conf,
+ out_dir=tmp_path,
+ sampling_freq=2,
+ signature_fetcher=InfluxFetcher(
+ url="http://localhost:8086",
+ auth="mock",
+ org="mock",
+ station_bucket_map={"mock":
+ "mock"}, ),
+ annotation_param_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ ignore_sensor_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ discretization_fetcher=LocalDiscretizationFetcher("mock"))
diff --git a/tests/output_producer_test/siddhi_producer_test.py b/tests/output_producer_test/siddhi_producer_test.py
new file mode 100644
index 0000000..5f2274f
--- /dev/null
+++ b/tests/output_producer_test/siddhi_producer_test.py
@@ -0,0 +1,142 @@
+""" Test siddhi producer. """
+from datetime import datetime
+
+import pytest
+from cepact import (DAGConfig, SiddhiConfig, LocalSignatureFetcher,
+ GrafanaFetcher, LocalDiscretizationFetcher)
+from cepact.output_producer import AllHighLevelPatternQuery
+from cepact.output_producer.siddhi_producer import SiddhiProducer
+from cepact.representations import Activity, SignatureBuilder, AnnotationParams, \
+ DiscretizationBuilder, SignatureItem
+
+mock_siddhi_conf = SiddhiConfig(mqtt_url="mockurl",
+ mqtt_user="mockuser",
+ mqtt_pwd="mockpw",
+ topic_prefix="mockpref",
+ map_sensor_name_data_to_mqtt={"o7_valve": "o7valve"})
+
+mock_dag_conf = DAGConfig(det_methods=[AllHighLevelPatternQuery()],
+ siddhi_config=mock_siddhi_conf,
+ out_dir="mock",
+ sampling_freq=2,
+ signature_fetcher=LocalSignatureFetcher(local_in_dir="mock"),
+ annotation_param_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ ignore_sensor_fetcher=GrafanaFetcher(
+ url="http://localhost:3000",
+ auth="mock"),
+ discretization_fetcher=LocalDiscretizationFetcher("mock"))
+
+
+def add_many(signature_builder, sensor: str, times: list, values: list):
+ """ Add many signature items to the signature builder """
+ assert len(times) == len(values)
+ for time, value in zip(times, values):
+ signature_builder.add_signature_item(SignatureItem(
+ station="station1",
+ timestamp=time,
+ sensor=sensor,
+ value=value)
+ )
+
+
+@pytest.fixture(scope='module', autouse=True)
+def before_all():
+ """ Preparations
+ """
+ # ^ Will be executed before the first test
+ yield
+ # v Will be executed after the last test
+
+
+def test_paper():
+ """ Test if siddhi producer works generally. """
+ signature_builder = SignatureBuilder(activity_name="paperact",
+ annotation_id="ann1",
+ sampling_freq=2)
+ dt0 = datetime.fromisoformat("2021-01-01T00:00:00")
+ dt1 = datetime.fromisoformat("2021-01-01T00:01:00")
+ dt2 = datetime.fromisoformat("2021-01-01T00:02:00")
+ dt3 = datetime.fromisoformat("2021-01-01T00:03:00")
+ dt4 = datetime.fromisoformat("2021-01-01T00:04:00")
+ add_many(signature_builder, "i1_pos_switch", [dt0, dt1, dt2, dt3, dt4], [0, 0, 1, 1, 1])
+ add_many(signature_builder, "i2_pos_switch", [dt0, dt1, dt2, dt3, dt4], [0, 0, 0, 0, 0])
+ add_many(signature_builder, "i5_light_barrier", [dt0, dt1, dt2, dt3, dt4], [1, 1, 1, 1, 1])
+ add_many(signature_builder, "m1_speed", [dt0, dt1, dt2, dt3, dt4], [0, -512, 0, 0, 0])
+ add_many(signature_builder, "o7_valve", [dt0, dt1, dt2, dt3, dt4], [0, 512, 512, 512, 0])
+ add_many(signature_builder, "o8_compressor", [dt0, dt1, dt2, dt3, dt4], [0, 0, 0, 0, 0])
+ signature = signature_builder.build()
+ annotation_params = AnnotationParams(annotation_id="ann1",
+ activity_name="paper act",
+ stations=["station1"],
+ start=datetime.fromisoformat("2021-01-01T00:00:00"),
+ end=datetime.fromisoformat("2021-01-01T00:05:00"))
+ activity = Activity(annotation_params, [signature], [])
+ db = DiscretizationBuilder()
+ db.add_discretization_item("i1_pos_switch", float("-inf"), 0, True, True, "off")
+ db.add_discretization_item("i1_pos_switch", 0, float("inf"), False, True, "on")
+ sp = SiddhiProducer([AllHighLevelPatternQuery()],
+ activity,
+ db.build(),
+ mock_dag_conf)
+ assert sp._get_header() == f'@App:name(\'DetectpaperactApp\')'
+ assert sp._get_sources() == (
+ "@source(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act', topic = 'mockpref/station1', username = 'mockuser', password = 'mockpw',\n"
+ "@map(type = 'json', @attributes(timestamp = '$.timestamp', i1_pos_switch = '$.i1_pos_switch', i2_pos_switch = '$.i2_pos_switch', i5_light_barrier = '$.i5_light_barrier', m1_speed = '$.m1_speed', o7valve = '$.o7_valve', o8_compressor = '$.o8_compressor')))\n"
+ "define stream station1Stream(timestamp string, i1_pos_switch int, i2_pos_switch int, i5_light_barrier int, m1_speed int, o7valve int, o8_compressor int);\n\n"
+ "define stream station1StreamDisc(timestamp string, i1_pos_switch string, i2_pos_switch int, i5_light_barrier int, m1_speed int, o7valve int, o8_compressor int);")
+ assert sp._get_sinks() == """@sink(type = 'log', prefix = 'LowLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act.ll', topic = 'ActivityEvents/LowLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedLowLevelActivityEvents(event string, activity string, ts_first string, ts_second string, ll_pattern_num int);
+
+@sink(type = 'log', prefix = 'HighLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act.hl', topic = 'ActivityEvents/HighLevel', username = 'mockuser', password = 'mockpw', @map(type = 'json'))
+define Stream DetectedHighLevelActivityEvents(event string, next_pattern string, activity string, ts_first string, ts_second string);
+
+@sink(type = 'log', prefix = 'InstanceLevel Log', priority = 'INFO')
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act.il.start', topic = 'DefaultBase/DefaultSource/DefaultCase/paper act', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload(""\"{"lifecycle:transition":"start","time:timestamp":"{{ts_start}}", "detection:type": "{{detection_type}}"}""\")))
+@sink(type = 'mqtt', url = 'mockurl', client.id = 'mqtt.station1.paper act.il.complete', topic = 'DefaultBase/DefaultSource/DefaultCase/paper act', username = 'mockuser', password = 'mockpw', @map(type = 'json', enclosing.element = '$.event', validate.json = 'true', @payload(""\"{"lifecycle:transition":"complete","time:timestamp":"{{ts_end}}", "detection:type": "{{detection_type}}"}""\")))
+define Stream DetectedInstanceLevelActivities(activity string, detection_type string, ts_start string, ts_start_unix long, ts_end string, ts_end_unix long);"""
+ assert sp._get_discretization_helpers() == """@info(name = 'station1DiscSourceMapper')
+from station1Stream
+select timestamp as timestamp, ifThenElse(i1_pos_switch <= 0, 'off', ifThenElse(i1_pos_switch > 0, 'on', 'ERROR')) as i1_pos_switch, i2_pos_switch as i2_pos_switch, i5_light_barrier as i5_light_barrier, m1_speed as m1_speed, o7valve as o7valve, o8_compressor as o8_compressor
+insert into station1StreamDisc;"""
+ assert sp._get_change_queries() == """@info(name="HighToLow-Helper")
+from every e1 = DetectedLowLevelActivityEvents, e2 = DetectedLowLevelActivityEvents[e1.ll_pattern_num >= e2.ll_pattern_num]
+select "HighToLow" as event
+insert into HelperStream;
+
+@info(name="Detect-LowLevel-Pattern-1")
+from every e1 = station1StreamDisc, e2 = station1StreamDisc[(e1.m1_speed==0 and e2.m1_speed==-512) and (e1.o7valve==0 and e2.o7valve==512)]
+select "LowLevel-Pattern-1" as event, "paper act" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 1 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-1")
+from DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-1"]
+select "HighLevel-Pattern-1" as event, "LowLevel-Pattern-2" as next_pattern, "paper act" as activity, ts_first, ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-2")
+from every e1 = station1StreamDisc, e2 = station1StreamDisc[(e1.i1_pos_switch=='off' and e2.i1_pos_switch=='on') and (e1.m1_speed==-512 and e2.m1_speed==0)]
+select "LowLevel-Pattern-2" as event, "paper act" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 2 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-2")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-2" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-2" as event, "LowLevel-Pattern-3" as next_pattern, "paper act" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;
+
+@info(name="Detect-LowLevel-Pattern-3")
+from every e1 = station1StreamDisc, e2 = station1StreamDisc[(e1.o7valve==512 and e2.o7valve==0)]
+select "LowLevel-Pattern-3" as event, "paper act" as activity, e1.timestamp as ts_first, e2.timestamp as ts_second, 3 as ll_pattern_num
+insert into DetectedLowLevelActivityEvents;
+
+@info(name="Detect-HighLevel-Pattern-3")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-2"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedLowLevelActivityEvents[event == "LowLevel-Pattern-3" and time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') <= time:timestampInMilliseconds(ts_second, 'yyyy-MM-dd HH:mm:ss.SS')]
+select "HighLevel-Pattern-3" as event, "LowLevel-Pattern-4" as next_pattern, "paper act" as activity, e2.ts_first as ts_first, e2.ts_second as ts_second
+insert into DetectedHighLevelActivityEvents;"""
+ assert sp._get_instance_level_detection_queries() == """@info(name="Detect-AllHighLevelPattern-InstanceLevelActivity")
+from every e1 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-1"] -> not HelperStream[event == "HighToLow"] and e2 = DetectedHighLevelActivityEvents[event == "HighLevel-Pattern-3"]
+select "paper act" as activity, "AllHighLevelPattern" as detection_type, e1.ts_second as ts_start, time:timestampInMilliseconds(e1.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_start_unix, e2.ts_second as ts_end, time:timestampInMilliseconds(e2.ts_second, 'yyyy-MM-dd HH:mm:ss.SS') as ts_end_unix
+insert into DetectedInstanceLevelActivities;"""
diff --git a/tests/representations_test/__init__.py b/tests/representations_test/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/representations_test/changes_test.py b/tests/representations_test/changes_test.py
new file mode 100644
index 0000000..eb9547c
--- /dev/null
+++ b/tests/representations_test/changes_test.py
@@ -0,0 +1,120 @@
+""" Test changes feature """
+from datetime import datetime
+
+import pytest
+from cepact.representations import (SignatureItem, SignatureBuilder,
+ DiscretizationBuilder, Changes)
+
+
+def add_many(signature_builder, sensor: str, times: list, values: list):
+ """ Add many signature items to the signature builder """
+ assert len(times) == len(values)
+ for time, value in zip(times, values):
+ signature_builder.add_signature_item(SignatureItem(
+ station="station1",
+ timestamp=time,
+ sensor=sensor,
+ value=value)
+ )
+
+
+mock_signature_builder = SignatureBuilder(activity_name="paperact",
+ annotation_id="ann1",
+ sampling_freq=2)
+dt0 = datetime.fromisoformat("2021-01-01T00:00:00")
+dt1 = datetime.fromisoformat("2021-01-01T00:01:00")
+dt2 = datetime.fromisoformat("2021-01-01T00:02:00")
+dt3 = datetime.fromisoformat("2021-01-01T00:03:00")
+dt4 = datetime.fromisoformat("2021-01-01T00:04:00")
+add_many(mock_signature_builder, "i1_pos_switch", [dt0, dt1, dt2, dt3, dt4], [0, 0, 1, 1, 1])
+add_many(mock_signature_builder, "i2_pos_switch", [dt0, dt1, dt2, dt3, dt4], [0, 0, 0, 0, 0])
+add_many(mock_signature_builder, "i5_light_barrier", [dt0, dt1, dt2, dt3, dt4], [1, 1, 1, 1, 1])
+add_many(mock_signature_builder, "m1_speed", [dt0, dt1, dt2, dt3, dt4], [0, -512, 0, 0, 0])
+add_many(mock_signature_builder, "o7_valve", [dt0, dt1, dt2, dt3, dt4], [0, 512, 512, 512, 0])
+add_many(mock_signature_builder, "o8_compressor", [dt0, dt1, dt2, dt3, dt4], [0, 0, 0, 0, 0])
+mock_signature = mock_signature_builder.build()
+add_many(mock_signature_builder, "temp_sens",
+ [dt0, dt1, dt2, dt3, dt4], [1.4, 1.2, 7.9, 10.2, 20.1])
+mock_signature2 = mock_signature_builder.build()
+mock_discretization_builder = DiscretizationBuilder()
+mock_discretization_builder.add_discretization_item("temp_sens", float("-inf"), 9,
+ True, True, "low")
+mock_discretization_builder.add_discretization_item("temp_sens", 9, float("inf"),
+ False, True, "high")
+mock_discretization = mock_discretization_builder.build()
+
+
+@pytest.fixture(scope='module', autouse=True)
+def before_all():
+ """ Preparations
+ """
+ # ^ Will be executed before the first test
+ yield
+ # v Will be executed after the last test
+
+
+def test_basic():
+ """ Test if changes works generally. """
+ changes = Changes([mock_signature], mock_discretization)
+ assert len(changes) == 5
+ assert changes.timestamps == [dt1, dt2, dt4]
+ for change in changes.changes:
+ assert change.station == "station1"
+ changes_dt1 = changes.get_changes_at_ts_station(dt1, "station1")
+ assert len(changes_dt1) == 2
+ change_dt1_o7_valve = [change for change in changes_dt1 if change.sensor == "o7_valve"]
+ assert len(change_dt1_o7_valve) == 1
+ assert change_dt1_o7_valve[0].prev_value == 0
+ assert change_dt1_o7_valve[0].value == 512
+ assert change_dt1_o7_valve[0].station == "station1"
+ assert change_dt1_o7_valve[0].sensor == "o7_valve"
+ assert change_dt1_o7_valve[0].timestamp == dt1
+ change_dt1_m1_speed = [change for change in changes_dt1 if change.sensor == "m1_speed"]
+ assert len(change_dt1_m1_speed) == 1
+ assert change_dt1_m1_speed[0].prev_value == 0
+ assert change_dt1_m1_speed[0].value == -512
+ assert change_dt1_m1_speed[0].timestamp == dt1
+ assert change_dt1_m1_speed[0].station == "station1"
+ assert change_dt1_m1_speed[0].sensor == "m1_speed"
+ changes_dt2 = changes.get_changes_at_ts_station(dt2, "station1")
+ assert len(changes_dt2) == 2
+ change_dt2_i1_pos_switch = [change for change in changes_dt2 if
+ change.sensor == "i1_pos_switch"]
+ assert len(change_dt2_i1_pos_switch) == 1
+ assert change_dt2_i1_pos_switch[0].prev_value == 0
+ assert change_dt2_i1_pos_switch[0].value == 1
+ assert change_dt2_i1_pos_switch[0].timestamp == dt2
+ assert change_dt2_i1_pos_switch[0].station == "station1"
+ assert change_dt2_i1_pos_switch[0].sensor == "i1_pos_switch"
+ change_dt2_m1_speed = [change for change in changes_dt2 if change.sensor == "m1_speed"]
+ assert len(change_dt2_m1_speed) == 1
+ assert change_dt2_m1_speed[0].prev_value == -512
+ assert change_dt2_m1_speed[0].value == 0
+ assert change_dt2_m1_speed[0].timestamp == dt2
+ assert change_dt2_m1_speed[0].station == "station1"
+ assert change_dt2_m1_speed[0].sensor == "m1_speed"
+ changes_dt4 = changes.get_changes_at_ts_station(dt4, "station1")
+ assert len(changes_dt4) == 1
+ change_dt4_o7_valve = [change for change in changes_dt4 if change.sensor == "o7_valve"]
+ assert len(change_dt4_o7_valve) == 1
+ assert change_dt4_o7_valve[0].prev_value == 512
+ assert change_dt4_o7_valve[0].value == 0
+ assert change_dt4_o7_valve[0].timestamp == dt4
+ assert change_dt4_o7_valve[0].station == "station1"
+ assert change_dt4_o7_valve[0].sensor == "o7_valve"
+
+
+def test_with_discr():
+ """ Test if changes works with discretization. """
+ changes = Changes([mock_signature2], mock_discretization)
+ assert len(changes) == 6
+ assert changes.timestamps == [dt1, dt2, dt3, dt4]
+ changes_dt3 = changes.get_changes_at_ts_station(dt3, "station1")
+ assert len(changes_dt3) == 1
+ change_dt3_temp_sens = [change for change in changes_dt3 if change.sensor == "temp_sens"]
+ assert len(change_dt3_temp_sens) == 1
+ assert change_dt3_temp_sens[0].prev_value == "low"
+ assert change_dt3_temp_sens[0].value == "high"
+ assert change_dt3_temp_sens[0].timestamp == dt3
+ assert change_dt3_temp_sens[0].station == "station1"
+ assert change_dt3_temp_sens[0].sensor == "temp_sens"
diff --git a/tests/representations_test/discretizations_test.py b/tests/representations_test/discretizations_test.py
new file mode 100644
index 0000000..7bdbc9c
--- /dev/null
+++ b/tests/representations_test/discretizations_test.py
@@ -0,0 +1,44 @@
+""" Test discretization feature """
+import pytest
+from cepact.representations import DiscretizationBuilder
+
+
+@pytest.fixture(scope='module', autouse=True)
+def before_all():
+ """ Preparations
+ """
+ # ^ Will be executed before the first test
+ yield
+ # v Will be executed after the last test
+
+
+def test_basic():
+ """ Test adding general discretization item. """
+ discr_builder = DiscretizationBuilder()
+ discr_builder.add_discretization_item("sensor1", 0, float("inf"), True, True, 1)
+ with pytest.raises(ValueError):
+ discr_builder.build()
+ discr_builder.add_discretization_item("sensor1", float("-inf"), 0, True, False, 2)
+ discr1 = discr_builder.build()
+ assert discr1.discretize("sensor1", 0) == 1
+ assert discr1.discretize("sensor1", 1) == 1
+ assert discr1.discretize("sensor1", -1) == 2
+ discr_builder.add_discretization_item("sensor2", 0, float("inf"), True, True, "goat")
+ discr_builder.add_discretization_item("sensor2", float("-inf"), 0, True, False, "sheep")
+ discr2 = discr_builder.build()
+ assert discr2.discretize("sensor2", 0) == "goat"
+ assert discr2.discretize("sensor2", 1) == "goat"
+ assert discr2.discretize("sensor2", -1) == "sheep"
+ assert discr2.discretized_type("sensor1") == int
+ assert discr2.discretized_type("sensor2") == str
+ discr_builder.add_discretization_item("sensor3", float("-inf"), 0, True, True, "goat")
+ discr_builder.add_discretization_item("sensor3", 0, 5, False, True, "sheep")
+ discr_builder.add_discretization_item("sensor3", 5, float("inf"), False, True, "cow")
+ discr3 = discr_builder.build()
+ assert discr3.discretize("sensor3", 0) == "goat"
+ assert discr3.discretize("sensor3", 5) == "sheep"
+ assert discr3.discretize("sensor3", 6) == "cow"
+ with pytest.raises(ValueError):
+ discr_builder.add_discretization_item("sensor3", 0.5, 1, False, True, "newAnimal")
+ with pytest.raises(AttributeError):
+ discr3.add_discretization_item("sensor4", 0, float("inf"), True, True, "newAnimal2")
diff --git a/tests/representations_test/signature_test.py b/tests/representations_test/signature_test.py
new file mode 100644
index 0000000..a4e2581
--- /dev/null
+++ b/tests/representations_test/signature_test.py
@@ -0,0 +1,117 @@
+""" Test signature feature """
+from datetime import datetime
+
+import pytest
+from cepact.representations import SignatureItem, SignatureBuilder
+
+
+@pytest.fixture(scope='module', autouse=True)
+def before_all():
+ """ Preparations
+ """
+ # ^ Will be executed before the first test
+ yield
+ # v Will be executed after the last test
+
+
+def test_basic():
+ """ Test adding general signature items. """
+ dt_1 = datetime.fromisoformat("2021-01-01T00:00:00")
+ dt_2 = datetime.fromisoformat("2021-01-01T00:01:00")
+ signature_builder = SignatureBuilder(activity_name="act1",
+ annotation_id="ann1",
+ sampling_freq=2)
+ assert len(signature_builder) == 0
+ signature_builder.add_signature_item(SignatureItem(
+ station="station1",
+ timestamp=dt_1,
+ sensor="sensor1",
+ value=1)
+ )
+ assert len(signature_builder) == 1
+ signature_builder.add_signature_item(SignatureItem(
+ station="station1",
+ timestamp=dt_1,
+ sensor="sensor2",
+ value=1)
+ )
+ signature_builder.add_signature_item(SignatureItem(
+ station="station1",
+ timestamp=dt_2,
+ sensor="sensor1",
+ value=1)
+ )
+ signature_builder.add_signature_item(SignatureItem(
+ station="station2",
+ timestamp=dt_1,
+ sensor="sensor1",
+ value=1)
+ )
+ # make sure an exception is raised if the signature is not complete/consistent
+ with pytest.raises(ValueError):
+ signature_builder.build()
+ signature_builder.add_signature_item(SignatureItem(
+ station="station1",
+ timestamp=dt_2,
+ sensor="sensor2",
+ value=1)
+ )
+ assert len(signature_builder) == 5
+ signature = signature_builder.build()
+ assert signature.get_sigs_by_ts_station() == {
+ dt_1: {
+ "station1": [
+ SignatureItem(
+ station="station1",
+ timestamp=dt_1,
+ sensor="sensor1",
+ value=1),
+ SignatureItem(
+ station="station1",
+ timestamp=dt_1,
+ sensor="sensor2",
+ value=1)
+ ],
+ "station2": [
+ SignatureItem(
+ station="station2",
+ timestamp=dt_1,
+ sensor="sensor1",
+ value=1)
+ ]
+ },
+ dt_2: {
+ "station1": [
+ SignatureItem(
+ station="station1",
+ timestamp=dt_2,
+ sensor="sensor1",
+ value=1),
+ SignatureItem(
+ station="station1",
+ timestamp=dt_2,
+ sensor="sensor2",
+ value=1)
+ ]
+ }
+ }
+ assert signature.get_exemplary_datapoints_per_resource() == {
+ "station1": {
+ "timestamp": dt_1,
+ "station": "station1",
+ "sensor1": 1,
+ "sensor2": 1
+ },
+ "station2": {
+ "timestamp": dt_1,
+ "station": "station2",
+ "sensor1": 1
+ }
+ }
+ with pytest.raises(AttributeError):
+ signature.add_signature_item(SignatureItem(
+ station="station1",
+ timestamp=dt_1,
+ sensor="sensor1",
+ value=1)
+ )