diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index f2585d7b..eccecfc7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -131,8 +131,9 @@ jobs:
thinger/${{ matrix.plugin }}-plugin:${{ env.docker_version }}
- name: Update README in DockerHub
+ continue-on-error: true
if: ${{ steps.check_dockerfile.outputs.files_exists == 'true' && env.branch == 'main' }}
- uses: peter-evans/dockerhub-description@v4
+ uses: peter-evans/dockerhub-description@v5
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
diff --git a/.github/workflows/secrets_scan.yml b/.github/workflows/secrets_scan.yml
new file mode 100644
index 00000000..a3f67da4
--- /dev/null
+++ b/.github/workflows/secrets_scan.yml
@@ -0,0 +1,24 @@
+name: Secrets Scan
+on:
+ push:
+ branches: [ "**" ]
+ pull_request:
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ security-events: write
+ pull-requests: write # opcional (comentarios en PR)
+
+jobs:
+ scan:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with: { fetch-depth: 0 }
+
+ - name: Run Gitleaks (official)
+ uses: gitleaks/gitleaks-action@v2
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
diff --git a/chirpstack/CHANGELOG.md b/chirpstack/CHANGELOG.md
new file mode 100644
index 00000000..05cbbeb1
--- /dev/null
+++ b/chirpstack/CHANGELOG.md
@@ -0,0 +1,21 @@
+# Changelog
+
+## [1.1.0] - 2025-11-15
+
+### Added
+
+- Added User events Queue in Chirpstack Backend
+- Significantly improved error handling and reporting
+- Cleaner visualization with tabs for different plugin configuration sections
+
+### Fix
+
+- Fixed issue with HTTP code 200 response handling
+
+## [1.0.0] - 2025-06-30
+
+### Added
+
+- Created a new version of chirpstack integration plugin
+
+[1.0.0]: https://github.com/thinger-io/plugins/
diff --git a/chirpstack/LICENSE b/chirpstack/LICENSE
new file mode 100644
index 00000000..0631ba07
--- /dev/null
+++ b/chirpstack/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025-Current Thinger.io (INTERNET OF THINGER S.L.)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/chirpstack/README.md b/chirpstack/README.md
new file mode 100644
index 00000000..b89e5389
--- /dev/null
+++ b/chirpstack/README.md
@@ -0,0 +1,123 @@
+# ChirpStack
+
+
+
+
+
+ChirpStack is a flexible, open-source LoRaWAN® Network Server that allows organisations to deploy and operate their own private or public IoT networks with full control over infrastructure and data. It is widely used by companies, research institutions, and communities looking for reliable large-scale LoRaWAN deployments without vendor lock-in.
+
+With Thinger.io, ChirpStack users can easily extend their networks by adding powerful tools for storing, analysing, and visualising device data in real time. This integration helps transform raw LoRaWAN traffic into actionable insights, dashboards, and long-term records.
+
+The plugin bridges ChirpStack with Thinger.io through the **Products** feature, enabling automatic device and bucket provisioning, as well as flexible uplink and downlink processing pipelines that can be fully customised to the needs of each project.
+
+---
+
+## Getting Started
+
+> **Prerequisite**
+> Devices within the selected ChirpStack Application must be **homogeneous**—same type and model—so that autoprovision can assign the correct product template.
+
+1. **Install the plugin** inside your Thinger.io account.
+ See the guide [**“How to install a plugin”**](https://marketplace.thinger.io/plugins/managing/) on the Marketplace if you are not familiar with the process.
+
+---
+
+## Plugin Configuration
+
+Open the plugin settings page. In the **Applications** table click **Add +** and fill in:
+
+| Field | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Application Name** | Must match **exactly** the Application ID defined in ChirpStack. The plugin uses this value to correctly associate uplinks and downlinks with the right application. |
+| **Device ID Prefix** | Prefix used when generating the device identifier; the Device EUI is appended automatically. Required for autoprovision of devices in Thinger.io. |
+| **Access Token** | API token generated in ChirpStack to allow secure communication with the Network Server. This is required to authenticate all requests. |
+| **Server URL** | The base URL of your ChirpStack instance. Since ChirpStack is self-hosted, you must provide the public or private endpoint where your server is running. |
+| **Port** | The gRPC service port exposed by ChirpStack (default is `8080`). If you are running ChirpStack behind a reverse proxy, make sure this port is accessible or properly forwarded. |
+| **Enabled** | Toggles the application integration on or off. |
+
+
+
+
+
+
+Unlike TTN or LORIOT, ChirpStack must be deployed and managed by the user. The plugin backend communicates with ChirpStack using gRPC (HTTP/2), which provides efficient and real-time interaction but also requires that the gRPC service port is reachable by Thinger.io.
+
+In most cases, you will need to either:
+
+- Expose the correct gRPC port on your ChirpStack instance, or
+
+- Configure your reverse proxy (e.g., Nginx, Traefik, etc.) to support HTTP/2 + grpc_pass.
+
+Since ChirpStack is self-hosted, network accessibility is critical. In our tests we verified connectivity by forwarding the gRPC port from the router directly to the ChirpStack server, ensuring uplinks and downlinks were processed correctly.
+
+
+## ChirpStack Webhook Configuration
+
+Log in to the ChirpStack Application Server and select the target Application.
+
+Navigate to Integrations → Add Integration and choose the generic HTTP integration (since there is no specific Thinger.io template available yet).
+
+Complete the form with the values provided by the Thinger.io plugin:
+
+
+ The plugin backend uses gRPC (HTTP/2) to communicate with ChirpStack.
+ Depending on your setup you may need to:
+
+
Expose the correct gRPC port
+
Or configure your reverse proxy (e.g. Nginx, Traefik, etc) with HTTP/2 + grpc_pass support.
+
+ If the proxy is not properly configured, you may encounter errors like “no application protocol” or HTTP 400 and no Downlink message will be sent to the devices.
+
+ To send downlink messages, your device must first have sent an uplink message.
+ This allows the application to store the ChirpStack token and the URLs required to push or replace the device's downlink
+ queue in the application metadata.
+
"
+ },
+ "sources": [
+ {
+ "bucket": {
+ "backend": "mongodb",
+ "id": "comet_tx5xx_tx6xx_data",
+ "mapping": [
+ "co2Alarm",
+ "dewAlarm",
+ "humAlarm",
+ "tempAlarm"
+ ],
+ "tags": {
+ "device": [],
+ "group": []
+ }
+ },
+ "color": "#1abc9c",
+ "device_property": {
+ "device": "comet_4179_20961986",
+ "property": "timer"
+ },
+ "name": "Source 1",
+ "source": "bucket",
+ "timespan": {
+ "mode": "latest"
+ }
+ }
+ ],
+ "type": "html"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/chirpstack-dashboard.png b/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/chirpstack-dashboard.png
new file mode 100644
index 00000000..3287d048
Binary files /dev/null and b/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/chirpstack-dashboard.png differ
diff --git a/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/chirpstack-logo.png b/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/chirpstack-logo.png
new file mode 100644
index 00000000..ee6369a1
Binary files /dev/null and b/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/chirpstack-logo.png differ
diff --git a/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/chirpstack-marketplace.png b/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/chirpstack-marketplace.png
new file mode 100644
index 00000000..a73a3edc
Binary files /dev/null and b/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/chirpstack-marketplace.png differ
diff --git a/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/index.md b/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/index.md
new file mode 100644
index 00000000..97452844
--- /dev/null
+++ b/docs/announcements/posts/2025-09-03-chirpstack-v1.0.0/index.md
@@ -0,0 +1,39 @@
+---
+title: ChirpStack Plugin Version 1.0.0
+image: "/announcements/2025-09-03-chirpstack-v1.0.0/chirpstack-logo.png"
+date: 2025-09-03
+authors: [thinger.io]
+categories:
+ - ChirpStack
+ - LoRaWAN
+ - LNS
+ - Integrations
+ - Plugins
+comments: true
+---
+
+# ChirpStack Plugin Version 1.0.0
+
+We are pleased to announce the official **ChirpStack Plugin for Thinger.io** 🎉
+
+With this new integration, any **ChirpStack-based LoRaWAN® deployment** can now be seamlessly connected to **Thinger.io**, enabling you to:
+
+- Automatically provision devices and data buckets.
+- Store, analyse, and visualise sensor data in real time.
+- Configure **uplink** and **downlink** processing pipelines that adapt to your project’s needs.
+- Extend the power of ChirpStack with Thinger.io’s dashboards, alerts, and integrations.
+
+
+
+
+
+As ChirpStack is a **self-hosted network server**, this plugin is designed to give you full control over how your devices interact with the Thinger.io platform, while keeping your LoRaWAN infrastructure under your own management.
+
+
+
+
+
+📖 **Documentation**:
+You can find the full setup guide and configuration details in the official [ChirpStack Plugin Documentation](/plugins/chirpstack).
+
+
diff --git a/docs/announcements/posts/2025-10-08-wika-v1.0.0/WIKA-Logo.png b/docs/announcements/posts/2025-10-08-wika-v1.0.0/WIKA-Logo.png
new file mode 100644
index 00000000..c93d2b3a
Binary files /dev/null and b/docs/announcements/posts/2025-10-08-wika-v1.0.0/WIKA-Logo.png differ
diff --git a/docs/announcements/posts/2025-10-08-wika-v1.0.0/index.md b/docs/announcements/posts/2025-10-08-wika-v1.0.0/index.md
new file mode 100644
index 00000000..db2a5be6
--- /dev/null
+++ b/docs/announcements/posts/2025-10-08-wika-v1.0.0/index.md
@@ -0,0 +1,40 @@
+---
+title: WIKA Integrations Version 1.0.0 Released
+image: "/announcements/posts/2025-10-08-wika-v1.0.0/WIKA-Logo.png"
+date: 2025-10-08
+authors: [thinger.io]
+categories:
+ - Sensors
+ - LoRaWAN
+ - WIKA
+ - Integrations
+ - Data
+comments: true
+---
+
+# WIKA Sensors Integration – Version 1.0.0
+
+We are excited to introduce the official WIKA Sensors Integration for Thinger.io 🎉
+
+
+
+
+
+This new family of integrations brings the precision and reliability of WIKA industrial sensors to the Thinger.io IoT platform, enabling engineers and developers to connect, monitor, and analyse their WIKA devices in real time.
+
+With this release, the following products are officially supported:
+ - WIKA PEW-1000 — High-precision electronic pressure transmitter.
+ - WIKA PGW23-100 — Wireless LoRaWAN® pressure sensor for industrial monitoring.
+
+These integrations make it possible to:
+ - Automatically decode uplinks and store data in Thinger.io buckets.
+ - Auto-provision devices directly from LoRaWAN network servers such as ChirpStack, LORIOT, or TTN.
+ - Visualise real-time pressure, temperature, and diagnostic data on custom dashboards.
+ - Send downlinks to reconfigure transmission intervals or operating modes remotely.
+
+The WIKA integrations have been designed to ensure full compatibility with existing Thinger.io infrastructure, providing a plug-and-play experience for industrial IoT projects that rely on accurate pressure and environmental measurements.
+
+**Documentation**:
+You can find complete setup instructions and data specifications in the official [WIKA Sensors Integration Documentation](https://www.wika.com/es-es/pagina_inicial.WIKA)
+
+
diff --git a/docs/announcements/posts/2025-10-08-wika-v1.0.0/wika-pgw23-100.jpg b/docs/announcements/posts/2025-10-08-wika-v1.0.0/wika-pgw23-100.jpg
new file mode 100644
index 00000000..67591c06
Binary files /dev/null and b/docs/announcements/posts/2025-10-08-wika-v1.0.0/wika-pgw23-100.jpg differ
diff --git a/docs/announcements/posts/2025-10-08-wika-v1.0.0/wikapew1000.png b/docs/announcements/posts/2025-10-08-wika-v1.0.0/wikapew1000.png
new file mode 100644
index 00000000..079ddaee
Binary files /dev/null and b/docs/announcements/posts/2025-10-08-wika-v1.0.0/wikapew1000.png differ
diff --git a/dragino-lt22222l/CHANGELOG.md b/dragino-lt22222l/CHANGELOG.md
new file mode 100644
index 00000000..42ede14d
--- /dev/null
+++ b/dragino-lt22222l/CHANGELOG.md
@@ -0,0 +1,24 @@
+# Changelog
+
+## [1.1.2] - 2025-08-27
+
+### Fix
+
+- Fixed issue with downlink endpoint.
+
+## [1.1.1] - 2025-08-27
+
+### Add
+
+- Added marketplace integration and updated documentation
+
+## [1.1.0] - 2025-08-20
+
+### Fix
+
+- Fixed integration with the new LNS Thinger plugin uplink standard format
+
+
+## [1.0.0] - 2025-07-02
+
+- Initial version
\ No newline at end of file
diff --git a/dragino-lt22222l/LICENSE.md b/dragino-lt22222l/LICENSE.md
new file mode 100644
index 00000000..f1bacd61
--- /dev/null
+++ b/dragino-lt22222l/LICENSE.md
@@ -0,0 +1,7 @@
+Copyright 2025 Thinger.io
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/dragino-lt22222l/README.md b/dragino-lt22222l/README.md
index 484bc842..efcf540e 100644
--- a/dragino-lt22222l/README.md
+++ b/dragino-lt22222l/README.md
@@ -1,5 +1,9 @@
# LT-22222-L LoRa I/O Controller
+
+
+The LoRaWAN Product Template is a foundational framework designed to accelerate the development of LoRaWAN-based IoT products within the Thinger.io ecosystem. It provides a standardized approach to configuring LoRaWAN devices, ensuring seamless integration with any of the supported LoRaWAN Network Servers (LNS) while maintaining complete LNS-agnostic product logic.
+
+## Key Features
+
+### Multi-LNS Support
+
+ - LORIOT: Full integration with LORIOT network server
+ - The Things Stack: Compatible with TTN/TTS implementations
+ - Chirpstack: Native support for Chirpstack deployments
+
+### LNS-Agnostic Design
+The template ensures that your product logic remains completely independent of the underlying LNS. This means:
+
+ - Write your product code once
+ - Deploy across different network servers without modification
+ - Switch LNS providers without code changes
+ - Focus on device behavior, not network integration
+
+### Pre-configured Components
+ - Standard uplink/downlink message handling
+ - Automatic payload decoding pipeline
+ - Device property management
+
+## Documentation and Resources
+
+For detailed documentation on how to utilize the LoRaWAN Product Template, please refer to the following resources:
+
+ - [Thinger.io LoRaWAN Documentation](https://docs.thinger.io/lpwan/the-things-stack)
diff --git a/lorawan-product-template/assets/lorawan.png b/lorawan-product-template/assets/lorawan.png
new file mode 100644
index 00000000..855cbba6
Binary files /dev/null and b/lorawan-product-template/assets/lorawan.png differ
diff --git a/lorawan-product-template/docs/assets/lorawan.png b/lorawan-product-template/docs/assets/lorawan.png
new file mode 100644
index 00000000..855cbba6
Binary files /dev/null and b/lorawan-product-template/docs/assets/lorawan.png differ
diff --git a/lorawan-product-template/docs/changelog.md b/lorawan-product-template/docs/changelog.md
new file mode 100644
index 00000000..d3c5b0bd
--- /dev/null
+++ b/lorawan-product-template/docs/changelog.md
@@ -0,0 +1,2 @@
+
+--8<-- "lorawan-product-template/CHANGELOG.md"
diff --git a/lorawan-product-template/docs/index.md b/lorawan-product-template/docs/index.md
new file mode 100644
index 00000000..6db5b08f
--- /dev/null
+++ b/lorawan-product-template/docs/index.md
@@ -0,0 +1,2 @@
+
+--8<-- "lorawan-product-template/README.md"
diff --git a/lorawan-product-template/docs/plugin_file.md b/lorawan-product-template/docs/plugin_file.md
new file mode 100644
index 00000000..9260e69a
--- /dev/null
+++ b/lorawan-product-template/docs/plugin_file.md
@@ -0,0 +1,10 @@
+---
+search:
+ exclude: true
+---
+
+# Plugin file
+
+```` json title="Plugin configuration file"
+--8<-- "lorawan-product-template/plugin.json"
+````
diff --git a/lorawan-product-template/mkdocs.yml b/lorawan-product-template/mkdocs.yml
new file mode 100644
index 00000000..6f569d04
--- /dev/null
+++ b/lorawan-product-template/mkdocs.yml
@@ -0,0 +1,6 @@
+site_name: plugins/lorawan-product-template
+
+nav:
+ - "index.md"
+ - Changelog: "changelog.md"
+ - Plugin file: "plugin_file.md"
diff --git a/lorawan-product-template/plugin.json b/lorawan-product-template/plugin.json
new file mode 100644
index 00000000..096233f5
--- /dev/null
+++ b/lorawan-product-template/plugin.json
@@ -0,0 +1,123 @@
+{
+ "name": "lorawan-product-template",
+ "version": "1.0.1",
+ "description": "Product template for LoRaWAN-driven devices. Preconfigured to work with any LNS Thinger plugin.",
+ "author": "Thinger.io",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/thinger-io/plugins.git",
+ "directory": "lorawan-product-template"
+ },
+ "metadata": {
+ "name": "LoRaWAN Device Template",
+ "description": "Product template for LoRaWAN-driven devices. Preconfigured to work with any LNS Thinger plugin.",
+ "image": "https://www.weble.ch/wp-content/uploads/2019/12/lw.png"
+ },
+ "resources": {
+ "products": [
+ {
+ "description": "Product template for LoRaWAN-driven devices. Preconfigured to work with any LNS Thinger plugin.",
+ "enabled": true,
+ "name": "LoRaWAN Device Template",
+ "product": "lorawan_device_template",
+ "profile": {
+ "api": {
+ "downlink": {
+ "description": "Downlink data exit point to LNS Thinger Plugin",
+ "enabled": true,
+ "handle_connectivity": false,
+ "request": {
+ "data": {
+ "path": "/downlink",
+ "payload": "{\n \"data\" : \"{{payload.data=\"\"}}\",\n \"port\" : {{payload.port=85}},\n \"priority\": {{payload.priority=3}},\n \"confirmed\" : {{payload.confirmed=false}},\n \"uplink\" : {{property.uplink}} \n}",
+ "payload_function": "",
+ "payload_type": "",
+ "plugin": "{{property.uplink.source}}",
+ "target": "plugin_endpoint"
+ }
+ },
+ "response": {
+ "data": {}
+ }
+ },
+ "uplink": {
+ "description": "Uplink data entry point from LNS Thinger Plugin",
+ "device_id_resolver": "getId",
+ "enabled": true,
+ "handle_connectivity": true,
+ "request": {
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "",
+ "payload_type": "source_payload",
+ "target": "resource_stream"
+ }
+ },
+ "response": {
+ "data": {}
+ }
+ }
+ },
+ "autoprovisions": {
+ "device_autoprovisioning": {
+ "config": {
+ "mode": "pattern",
+ "pattern": "my_device_[0-9A-F]{16}"
+ },
+ "description": "Device Pattern ID. Make sure to change this in LNS Thinger Plugin Configuration",
+ "enabled": true,
+ "name": "Device Pattern ID"
+ }
+ },
+ "buckets": {
+ "device_data": {
+ "backend": "mongodb",
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "parseOrDecodeIncomingData",
+ "payload_type": "source_payload",
+ "resource": "uplink",
+ "source": "resource",
+ "update": "events"
+ },
+ "description": "LoRaWAN device template data bucket",
+ "enabled": true,
+ "retention": {
+ "period": 3,
+ "unit": "months"
+ },
+ "tags": []
+ }
+ },
+ "code": {
+ "code": "// Device Identifier Resolver configured in \"uplink\" API resource.\nfunction getId(payload) {\n return payload.deviceId;\n}\n\n// Custom payload processing function configured in \"device_data\" bucket.\nfunction parseOrDecodeIncomingData(payload) {\n // Custom decoder here\n return payload;\n}",
+ "environment": "javascript",
+ "storage": "",
+ "version": "1.0"
+ },
+ "properties": {
+ "uplink": {
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "",
+ "payload_type": "source_payload",
+ "resource": "uplink",
+ "source": "resource",
+ "update": "events"
+ },
+ "default": {
+ "source": "value"
+ },
+ "description": "Last uplink recieved",
+ "enabled": true
+ }
+ }
+ },
+ "_resources": {
+ "properties": []
+ }
+ }
+ ]
+ }
+}
diff --git a/loriot/CHANGELOG.md b/loriot/CHANGELOG.md
index a1c90d37..a99ab4ce 100644
--- a/loriot/CHANGELOG.md
+++ b/loriot/CHANGELOG.md
@@ -1,6 +1,6 @@
# Changelog
-## [1.1.0] - 2025-08-11
+## [2.0.0] - 2025-08-11
### Fix
diff --git a/loriot/plugin.json b/loriot/plugin.json
index 47df612d..2f0d6fab 100644
--- a/loriot/plugin.json
+++ b/loriot/plugin.json
@@ -1,6 +1,6 @@
{
"name" : "loriot",
- "version" : "1.2.0",
+ "version" : "2.0.0",
"description" : "Plugin for integrating Thinger.io with LORIOT",
"author" : "Thinger.io",
"license" : "MIT",
diff --git a/loriot/task/backend/.env.development b/loriot/task/backend/.env.development
index e6f85df0..e1bc8caf 100644
--- a/loriot/task/backend/.env.development
+++ b/loriot/task/backend/.env.development
@@ -1 +1,6 @@
FRONTEND_FILES_PATH=/../../../frontend/dist/frontend/browser
+THINGER_USER=
+THINGER_PLUGIN=loriot
+THINGER_HOST=
+THINGER_TOKEN_LORIOT_PLUGIN=
+THINGER_TOKEN_LORIOT_CALLBACK=
\ No newline at end of file
diff --git a/loriot/task/frontend/angular.json b/loriot/task/frontend/angular.json
index 10678a52..d42b0c7a 100644
--- a/loriot/task/frontend/angular.json
+++ b/loriot/task/frontend/angular.json
@@ -94,5 +94,8 @@
}
}
}
+ },
+ "cli": {
+ "analytics": false
}
}
diff --git a/loriot/task/frontend/package-lock.json b/loriot/task/frontend/package-lock.json
index 5dd677c5..ad551c09 100644
--- a/loriot/task/frontend/package-lock.json
+++ b/loriot/task/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "frontend",
- "version": "0.0.0",
+ "version": "1.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "frontend",
- "version": "0.0.0",
+ "version": "1.1.0",
"dependencies": {
"@angular/animations": "^19.1.1",
"@angular/common": "^19.1.1",
@@ -39,7 +39,7 @@
"karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0",
- "tailwindcss": "^3.3.2",
+ "tailwindcss": "^3.4.17",
"typescript": "~5.5.2"
}
},
diff --git a/mkdocs.yml b/mkdocs.yml
index 84c265e7..1b4ad867 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -165,13 +165,17 @@ nav:
#- Plugins: '*include ./*/mkdocs.yml'
- Integrations:
- Alertmanager: '!include ./alertmanager/mkdocs.yml'
+ - Comet-Tx5xx-Tx6xx: '!include ./comet-tx5xx-tx6xx/mkdocs.yml'
+ - ChirpStack: '!include ./chirpstack/mkdocs.yml'
- Docker Registry: '!include ./docker-registry/mkdocs.yml'
+ - Dragino LT22222L: '!include ./dragino-lt22222l/mkdocs.yml'
- Grafana: '!include ./grafana/mkdocs.yml'
- HTTP Devices: '!include ./http-device/mkdocs.yml'
- InfluxDB2: '!include ./influxdb2/mkdocs.yml'
- Jupyter Minimal: '!include ./jupyter-minimal/mkdocs.yml'
- Jupyter R: '!include ./jupyter-r/mkdocs.yml'
- Jupyter TensorFlow: '!include ./jupyter-tensorflow/mkdocs.yml'
+ - LoRaWAN Product Template: '!include ./lorawan-product-template/mkdocs.yml'
- LORIOT: '!include ./loriot/mkdocs.yml'
- Milesight AM103: '!include ./milesight-am103/mkdocs.yml'
- RStudio: '!include ./rstudio/mkdocs.yml'
@@ -184,9 +188,13 @@ nav:
- Shelly Plug S: '!include ./shelly-plug-s/mkdocs.yml'
- Shelly Plus 1PM: '!include ./shelly-plus-1pm/mkdocs.yml'
- Sigfox: '!include ./sigfox/mkdocs.yml'
+ - Teltonika Eye: '!include ./teltonika-eye/mkdocs.yml'
+ - Teltonika Telematics: '!include ./teltonika-telematics/mkdocs.yml'
- TTN: '!include ./ttn/mkdocs.yml'
- Siemens LOGO!: '!include ./siemens-logo/mkdocs.yml'
- VS Code: '!include ./vscode/mkdocs.yml'
+ - Wika PGW23-100: '!include ./wika-pgw23-100/mkdocs.yml'
+ - Wika PEW1000: '!include ./wika-pew1000/mkdocs.yml'
- Contributing:
- 'contributing/index.md'
- Plugin System Infrastructure: 'contributing/plugin-system-infrastructure.md'
diff --git a/teltonika-eye/CHANGELOG.md b/teltonika-eye/CHANGELOG.md
new file mode 100644
index 00000000..79107586
--- /dev/null
+++ b/teltonika-eye/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Changelog
+
+## 1.0.0 - 2025-02-20
+
+- Initial version
\ No newline at end of file
diff --git a/teltonika-eye/LICENSE.md b/teltonika-eye/LICENSE.md
new file mode 100644
index 00000000..f1bacd61
--- /dev/null
+++ b/teltonika-eye/LICENSE.md
@@ -0,0 +1,7 @@
+Copyright 2025 Thinger.io
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/teltonika-eye/README.md b/teltonika-eye/README.md
new file mode 100644
index 00000000..517cb402
--- /dev/null
+++ b/teltonika-eye/README.md
@@ -0,0 +1,46 @@
+# Teltonika Eye
+
+The Teltonika Eye Plugin for Thinger.io enables the integration of Teltonika's Eye devices, Beacon and Sensor, with the Thinger.io Platform.
+
+## Thinger.io and Teltonika Eye Integration
+
+Monitor and track your fleet within Thinger.io
+
+## Requirements
+
+The Teltonika Telematics Plugin needs to be installed in the Platform, as the telematics devices will send the data of the Teltonika Eye to the Thinger.io Platform.
+
+The Teltonika Eye may be configured to send beacons in Eddystone or iBeacon protocols.
+
+## Get Started
+
+### Installation
+
+First install this plugin through the Plugin Management Interface. More information [here](https://marketplace.thinger.io/plugins/managing/#install-and-deploy-an-existent-plugin).
+
+### Configuration
+
+It is required to enable the Teltonika Eye endpoint within Thinger.io so as the Telematics devices can send the received Eye data. Go into the Teltonika Telematics product and enable the `teltonika_eye` endpoint.
+
+The Teltonika Eye Product, has an autoprovision feature, disabled by default, that will autoprovision in the platform the received BLE beacons, however the Telematics device may receive beacons from non Teltonika devices, and autoprovision other kind of devices.
+The devices can be manually provisioned by the Eddystone or iBeacon ids.
+
+### Usage
+
+Detail how to use the plugin after configuration. Include examples, best practices, and troubleshooting tips.
+
+## Additional Resources
+
+Provide any additional resources, documents, or links to external sites that can help users understand or utilize the plugin better.
+
+- [Teltonika Eye Beacon Documentation](https://wiki.teltonika-gps.com/view/EYE_BEACON_/_BTSID1)
+- [Teltonika Eye Beacon Configuration](https://wiki.teltonika-gps.com/view/Configuring_EYE_beacons)
+- [Teltonika Eye Beacon Get Started](https://wiki.teltonika-gps.com/view/How_to_start_with_FMB_devices_and_Beacons%3F)
+- [Start with FMB devices and Beacons](https://wiki.teltonika-gps.com/view/How_to_start_with_FMB_devices_and_Beacons%3F)
+- [Teltonika Support Forum](https://community.teltonika.lt/)
+- [Thinger.io Community](https://community.thinger.io/)
+
+
+## FAQ
+
+Include a section for frequently asked questions to address common issues or queries.
\ No newline at end of file
diff --git a/teltonika-eye/assets/teltonika-eye.png b/teltonika-eye/assets/teltonika-eye.png
new file mode 100644
index 00000000..a8d2d8d4
Binary files /dev/null and b/teltonika-eye/assets/teltonika-eye.png differ
diff --git a/teltonika-eye/docs/assets/teltonika-eye.png b/teltonika-eye/docs/assets/teltonika-eye.png
new file mode 100644
index 00000000..a8d2d8d4
Binary files /dev/null and b/teltonika-eye/docs/assets/teltonika-eye.png differ
diff --git a/teltonika-eye/docs/changelog.md b/teltonika-eye/docs/changelog.md
new file mode 100644
index 00000000..a0b978d7
--- /dev/null
+++ b/teltonika-eye/docs/changelog.md
@@ -0,0 +1,2 @@
+
+--8<-- "teltonika-eye/CHANGELOG.md"
diff --git a/teltonika-eye/docs/index.md b/teltonika-eye/docs/index.md
new file mode 100644
index 00000000..191d5b55
--- /dev/null
+++ b/teltonika-eye/docs/index.md
@@ -0,0 +1,2 @@
+
+--8<-- "teltonika-eye/README.md"
diff --git a/teltonika-eye/docs/plugin_file.md b/teltonika-eye/docs/plugin_file.md
new file mode 100644
index 00000000..63424e9e
--- /dev/null
+++ b/teltonika-eye/docs/plugin_file.md
@@ -0,0 +1,10 @@
+---
+search:
+ exclude: true
+---
+
+# Plugin file
+
+```` json title="Plugin configuration file"
+--8<-- "teltonika-eye/plugin.json"
+````
diff --git a/teltonika-eye/mkdocs.yml b/teltonika-eye/mkdocs.yml
new file mode 100644
index 00000000..746b884f
--- /dev/null
+++ b/teltonika-eye/mkdocs.yml
@@ -0,0 +1,6 @@
+site_name: plugins/teltonika-eye
+
+nav:
+ - "index.md"
+ - Changelog: "changelog.md"
+ - Plugin file: "plugin_file.md"
diff --git a/teltonika-eye/plugin.json b/teltonika-eye/plugin.json
new file mode 100644
index 00000000..46f570c8
--- /dev/null
+++ b/teltonika-eye/plugin.json
@@ -0,0 +1,308 @@
+{
+ "name": "teltonika-eye",
+ "version": "1.0.0",
+ "description": "Decoder and preconfiguration for Teltonika Eye devices",
+ "author": "Thinger.io",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/thinger-io/plugins.git",
+ "directory": "teltonika-eye"
+ },
+ "metadata": {
+ "name": "Teltonika Eye",
+ "description": "Decoder and preconfiguration for Teltonika Eye devices",
+ "image": "assets/teltonika-eye.png"
+ },
+ "resources": {
+ "products": [
+ {
+ "config": {
+ "fields": [
+ {
+ "icon": {
+ "source": "far fa-text",
+ "type": "fa"
+ },
+ "name": "Name",
+ "primary": true,
+ "type": "string",
+ "value": "{{name}}"
+ }
+ ],
+ "icons": [
+ {
+ "conditions": [],
+ "icon": {
+ "background": "#001a77",
+ "color": "#ffffff",
+ "source": "far fa-tag",
+ "type": "fa"
+ }
+ }
+ ]
+ },
+ "description": "Decoder and preconfiguration for Teltonika Eye devices",
+ "enabled": true,
+ "name": "Teltonika Eye",
+ "product": "teltonika_eye",
+ "profile": {
+ "api": {
+ "data": {
+ "enabled": true,
+ "request": {
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "",
+ "payload_type": "source_payload",
+ "resource_stream": "data",
+ "target": "resource_stream"
+ }
+ },
+ "response": {
+ "data": {}
+ }
+ }
+ },
+ "autoprovisions": {
+ "All": {
+ "config": {
+ "mode": "pattern",
+ "pattern": ".*"
+ },
+ "enabled": false
+ }
+ },
+ "buckets": {
+ "teltonika_eye_data": {
+ "backend": "mongodb",
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "",
+ "payload_type": "source_payload",
+ "resource": "data",
+ "source": "resource",
+ "update": "events"
+ },
+ "description": "Data events received by teltonika devices for Eye Beacon and Sensor",
+ "enabled": true,
+ "name": "Teltonika Eye Data",
+ "retention": {
+ "period": 3,
+ "unit": "months"
+ },
+ "tags": [
+ "source "
+ ]
+ }
+ },
+ "code": {
+ "code": "function getLocation(payload) {\n return { \n \"latitude\": payload.latitude,\n \"longitude\": payload.longitude,\n \"altitude\": payload.altitude,\n \"angle\": payload.angle\n }\n}",
+ "environment": "javascript",
+ "storage": "",
+ "version": "1.0"
+ },
+ "properties": {
+ "location": {
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "getLocation",
+ "payload_type": "source_payload",
+ "resource": "data",
+ "source": "resource",
+ "update": "events"
+ },
+ "default": {
+ "source": "value"
+ },
+ "enabled": true
+ }
+ }
+ },
+ "_resources": {
+ "properties": [
+ {
+ "property": "dashboard",
+ "value": {
+ "properties": {
+ "template": true
+ },
+ "tabs": [
+ {
+ "icon": "fas fa-tachometer-alt",
+ "widgets": [
+ {
+ "layout": {
+ "col": 0,
+ "row": 0,
+ "sizeX": 1,
+ "sizeY": 8
+ },
+ "panel": {
+ "color": "#ffffff",
+ "currentColor": "#ffffff",
+ "showOffline": {
+ "type": "none"
+ }
+ },
+ "properties": {
+ "refresh_interval": 0
+ },
+ "sources": [
+ {
+ "color": "#1abc9c",
+ "image_url": "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/teltonika-eye-beacon/img/eye_beacon_front.png",
+ "name": "Source 1",
+ "source": "image_url"
+ }
+ ],
+ "type": "image"
+ },
+ {
+ "layout": {
+ "col": 1,
+ "row": 0,
+ "sizeX": 2,
+ "sizeY": 13
+ },
+ "panel": {
+ "color": "#ffffff",
+ "currentColor": "#ffffff",
+ "showOffline": {
+ "timespan": {
+ "magnitude": "hour",
+ "value": 5
+ },
+ "type": "none"
+ },
+ "showTs": true
+ },
+ "properties": {
+ "mapType": "roadmap",
+ "showClustering": true,
+ "showConnected": true,
+ "showDisconnected": true,
+ "showOptions": false,
+ "showSearch": true
+ },
+ "sources": [
+ {
+ "color": "#1abc9c",
+ "id": "teltonika_eye_beacon",
+ "name": "Source 1",
+ "type": "product"
+ }
+ ],
+ "type": "assets_map"
+ },
+ {
+ "layout": {
+ "col": 0,
+ "row": 8,
+ "sizeX": 1,
+ "sizeY": 2
+ },
+ "panel": {
+ "color": "#ffffff",
+ "currentColor": "#ffffff",
+ "showOffline": {
+ "timespan": {
+ "magnitude": "minute",
+ "value": 5
+ },
+ "type": "timespan"
+ },
+ "showTs": true,
+ "title": "Signal Strength"
+ },
+ "properties": {
+ "icon": "",
+ "iconSize": "",
+ "max": -80,
+ "min": 0,
+ "unit": "dBm"
+ },
+ "sources": [
+ {
+ "bucket": {
+ "backend": "mongodb",
+ "id": "teltonika_eye_beacon_data",
+ "mapping": "rssi",
+ "tags": {
+ "device": [
+ "1ea81f49f8e055aac952caf3a38b0055"
+ ],
+ "group": [],
+ "source ": []
+ }
+ },
+ "color": "#1abc9c",
+ "device": {},
+ "name": "Source 1",
+ "source": "bucket",
+ "timespan": {
+ "mode": "latest"
+ }
+ }
+ ],
+ "type": "progressbar"
+ },
+ {
+ "layout": {
+ "col": 0,
+ "row": 10,
+ "sizeX": 1,
+ "sizeY": 3
+ },
+ "panel": {
+ "color": "#ffffff",
+ "currentColor": "#ffffff",
+ "showOffline": {
+ "type": "none"
+ },
+ "showTs": true,
+ "title": "Last seen by"
+ },
+ "properties": {
+ "color": "#1E313E",
+ "decimal_places": 2,
+ "icon": "fal fa-car",
+ "size": "35px",
+ "unit_size": "20px",
+ "weight": "font-thin"
+ },
+ "sources": [
+ {
+ "bucket": {
+ "backend": "mongodb",
+ "id": "teltonika_eye_beacon_data",
+ "mapping": "source",
+ "tags": {
+ "device": [
+ "1ea81f49f8e055aac952caf3a38b0055"
+ ],
+ "group": [],
+ "source ": []
+ }
+ },
+ "color": "#1abc9c",
+ "name": "Source 1",
+ "source": "bucket",
+ "timespan": {
+ "mode": "latest"
+ }
+ }
+ ],
+ "type": "text"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/teltonika-telematics/CHANGELOG.md b/teltonika-telematics/CHANGELOG.md
new file mode 100644
index 00000000..a51ec8f8
--- /dev/null
+++ b/teltonika-telematics/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Changelog
+
+## 1.0.0 - 2025-02-18
+
+- Initial version
\ No newline at end of file
diff --git a/teltonika-telematics/LICENSE.md b/teltonika-telematics/LICENSE.md
new file mode 100644
index 00000000..f1bacd61
--- /dev/null
+++ b/teltonika-telematics/LICENSE.md
@@ -0,0 +1,7 @@
+Copyright 2025 Thinger.io
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/teltonika-telematics/README.md b/teltonika-telematics/README.md
new file mode 100644
index 00000000..c5cdb486
--- /dev/null
+++ b/teltonika-telematics/README.md
@@ -0,0 +1,85 @@
+# Teltonika Telematics
+
+
+
+The Teltonika Telematics Plugin for Thinger.io enables the integration of Teltonika's GPS tracking devices with the Thinger.io Platform. This plugin facilitates real-time monitoring, data visualization, and management of your Teltonika devices within the Thinger.io ecosystem.
+
+## Thinger.io and Teltonika Telematics Integration
+
+Integrating Teltonika Telematics devices with Thinger.io offers a robust solution for fleet management, asset tracking, and remote monitoring. Key features include:
+
+- **Real-Time Data Monitoring**: Access live data from your Teltonika devices, including location, speed, and sensor information.
+- **Custom Dashboards**: Visualize device data through customizable dashboards, enabling quick insights and informed decision-making.
+- **Geofencing Capabilities**: Set up geofences to receive alerts when devices enter or exit predefined areas.
+- **Historical Data Analysis**: Store and analyze historical data to identify patterns and optimize operations.
+- **Automated Alerts**: Configure notifications for specific events, such as excessive speed or unauthorized movement.
+
+Potential use cases encompass:
+
+- **Fleet Management**: Monitor vehicle locations, routes, and statuses to enhance efficiency and reduce operational costs.
+- **Asset Tracking**: Keep track of valuable assets in transit to prevent loss and ensure timely deliveries.
+- **Remote Equipment Monitoring**: Oversee machinery and equipment in remote locations to detect issues promptly and schedule maintenance.
+
+## Get Started
+
+### Installation
+
+First install this plugin through the Plugin Management Interface. More information [here](https://marketplace.thinger.io/plugins/managing/#install-and-deploy-an-existent-plugin).
+
+Afterwards create some generic certificates with the following commands, configuring it with your own details and setting your thinger user in the Common Name field (see image for example):
+
+```
+openssl req -x509 -newkey rsa:4096 -keyout private.pem.key -out cert.pem.crt -sha256 -days 9125 -nodes
+```
+
+
+
+### Configuration
+
+The configuration of this devices require both creation of resources in the Thinger.io Platform and configuring the Teltonika Device.
+
+#### Teltonika Configurator
+
+The teltonika device needs to be configured with its own [Teltonika Configurator Software Management Tool](https://wiki.teltonika-gps.com/view/Teltonika_Configurator).
+
+Once the device is connected, the following changes need to be done:
+
+- In the `Security Tab`, upload the device certificates.
+
+
+
+- In the `GPRS Tab`, set the Server Settings box with your Thinger.io instance domain, the Port `8883`, Protocol `MQTT` and TLS Encryption `TLS/DTLS`. Then in the MQTT Settings box, select `AWS IoT Custom` and leave the default settings as shown in the image.
+
+
+
+After that, copy the device IMEI from the status page, as it will be the device Id in Thinger.io.
+
+
+
+After the configuration is done, make sure to reboot the device.
+
+#### Thinger.io Platform
+
+Create a new device through the `Devices` menu, of type HTTP, the Id the IMEI of the device and assign it to the product `Teltonika Telematics`. At this point assign it random credentials, they will not be used in favor of the certificates.
+
+
+
+### Usage
+
+This plugin will autoprovision its required buckets and save the data in `Teltonika Telematics Data` and in case it receives beacon data in `Teltonika Telematics Beacon`.
+
+When a bluetooth beacon of a Teltonika Eye Beacon is uploaded from the device, and endpoint in Thinger.io will be called. If the product corresponding to this Teltonika Eye Beacon is installed, this Eye Beacon will autoprovision itself in the platform.
+This endpoint will be disabled by default, and will need to be enabled if the Teltonika Eye Plugin is installed.
+
+The decoder is found in a File Storage in Thinger.io of name `Teltonika Decoder`. Any differences in the preconfigured AVL list can be changed or added in the file `devices/fmbxxx.js` installed Teltonika Decoder storage.
+
+## Additional Resources
+
+Checkout these resources to further understand how the data is decoded, as well as any other required configuration.
+
+- [Teltonika Data Sending Protocols](https://wiki.teltonika-gps.com/view/Teltonika_Data_Sending_Protocols)
+- [Teltonika AVL Data Sending Parameters](https://wiki.teltonika-gps.com/view/Template:Teltonika_Data_Sending_Parameters_ID)
+- [Configuring Eye Beacons](https://wiki.teltonika-gps.com/view/Configuring_EYE_beacons)
+- [Start with FMB devices and Beacons](https://wiki.teltonika-gps.com/view/How_to_start_with_FMB_devices_and_Beacons%3F)
+- [Teltonika Support Forum](https://community.teltonika.lt/)
+- [Thinger.io Community](https://community.thinger.io/)
diff --git a/teltonika-telematics/assets/teltonika-telematics.png b/teltonika-telematics/assets/teltonika-telematics.png
new file mode 100644
index 00000000..267d56b5
Binary files /dev/null and b/teltonika-telematics/assets/teltonika-telematics.png differ
diff --git a/teltonika-telematics/docs/assets/certificate_creation.png b/teltonika-telematics/docs/assets/certificate_creation.png
new file mode 100644
index 00000000..6441bf47
Binary files /dev/null and b/teltonika-telematics/docs/assets/certificate_creation.png differ
diff --git a/teltonika-telematics/docs/assets/teltonika_configurator_gprs.png b/teltonika-telematics/docs/assets/teltonika_configurator_gprs.png
new file mode 100644
index 00000000..c16c26ae
Binary files /dev/null and b/teltonika-telematics/docs/assets/teltonika_configurator_gprs.png differ
diff --git a/teltonika-telematics/docs/assets/teltonika_configurator_security.png b/teltonika-telematics/docs/assets/teltonika_configurator_security.png
new file mode 100644
index 00000000..74ae6a50
Binary files /dev/null and b/teltonika-telematics/docs/assets/teltonika_configurator_security.png differ
diff --git a/teltonika-telematics/docs/assets/teltonika_configurator_status.png b/teltonika-telematics/docs/assets/teltonika_configurator_status.png
new file mode 100644
index 00000000..2228ed04
Binary files /dev/null and b/teltonika-telematics/docs/assets/teltonika_configurator_status.png differ
diff --git a/teltonika-telematics/docs/assets/teltonika_mqtt_device.png b/teltonika-telematics/docs/assets/teltonika_mqtt_device.png
new file mode 100644
index 00000000..f545402d
Binary files /dev/null and b/teltonika-telematics/docs/assets/teltonika_mqtt_device.png differ
diff --git a/teltonika-telematics/docs/assets/teltonika_telematics.png b/teltonika-telematics/docs/assets/teltonika_telematics.png
new file mode 100644
index 00000000..8caa5470
Binary files /dev/null and b/teltonika-telematics/docs/assets/teltonika_telematics.png differ
diff --git a/teltonika-telematics/docs/changelog.md b/teltonika-telematics/docs/changelog.md
new file mode 100644
index 00000000..b69e13bf
--- /dev/null
+++ b/teltonika-telematics/docs/changelog.md
@@ -0,0 +1,2 @@
+
+--8<-- "teltonika-telematics/CHANGELOG.md"
diff --git a/teltonika-telematics/docs/index.md b/teltonika-telematics/docs/index.md
new file mode 100644
index 00000000..e64359c8
--- /dev/null
+++ b/teltonika-telematics/docs/index.md
@@ -0,0 +1,2 @@
+
+--8<-- "teltonika-telematics/README.md"
diff --git a/teltonika-telematics/docs/plugin_file.md b/teltonika-telematics/docs/plugin_file.md
new file mode 100644
index 00000000..ee26d5c8
--- /dev/null
+++ b/teltonika-telematics/docs/plugin_file.md
@@ -0,0 +1,10 @@
+---
+search:
+ exclude: true
+---
+
+# Plugin file
+
+```` json title="Plugin configuration file"
+--8<-- "teltonika-telematics/plugin.json"
+````
diff --git a/teltonika-telematics/mkdocs.yml b/teltonika-telematics/mkdocs.yml
new file mode 100644
index 00000000..cffd2d6e
--- /dev/null
+++ b/teltonika-telematics/mkdocs.yml
@@ -0,0 +1,7 @@
+
+site_name: plugins/teltonika-telematics
+
+nav:
+ - "index.md"
+ - Changelog: "changelog.md"
+ - Plugin file: "plugin_file.md"
diff --git a/teltonika-telematics/plugin.json b/teltonika-telematics/plugin.json
new file mode 100644
index 00000000..b6dd9daf
--- /dev/null
+++ b/teltonika-telematics/plugin.json
@@ -0,0 +1,330 @@
+{
+ "name": "teltonika-telematics",
+ "version": "1.0.0",
+ "description": "Decoder and preconfiguration for Teltonika GPS Telematics devices",
+ "author": "Thinger.io",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/thinger-io/plugins.git",
+ "directory": "teltonika-telematics"
+ },
+ "metadata": {
+ "name": "Teltonika Telematics",
+ "description": "Decoder and preconfiguration for Teltonika GPS Telematics devices",
+ "image": "assets/teltonika-telematics.png"
+ },
+ "resources": {
+ "products": [
+ {
+ "config": {
+ "fields": [
+ {
+ "icon": {
+ "source": "far fa-text",
+ "type": "fa"
+ },
+ "name": "Name",
+ "type": "string",
+ "value": "{{name}}"
+ }
+ ],
+ "icons": [
+ {
+ "conditions": [],
+ "icon": {
+ "background": "#001a77",
+ "color": "#ffffff",
+ "source": "fal fa-car",
+ "type": "fa"
+ }
+ }
+ ]
+ },
+ "description": "Decoder and preconfiguration for Teltonika GPS Telematics devices",
+ "enabled": true,
+ "name": "Teltonika Telematics",
+ "product": "teltonika_telematics",
+ "profile": {
+ "api": {
+ "location": {
+ "enabled": true,
+ "request": {
+ "data": {}
+ },
+ "response": {
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "getLocation",
+ "payload_type": "source_payload",
+ "property": "received",
+ "source": "property"
+ }
+ }
+ }
+ },
+ "autoprovisions": {},
+ "buckets": {
+ "teltonika_beacon": {
+ "backend": "mongodb",
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "parseMsgBeacon",
+ "payload_type": "source_event",
+ "source": "topic",
+ "topic": "{{imei}}/data"
+ },
+ "description": "Beacon events received by the teltonika GPS telematics devices",
+ "enabled": true,
+ "name": "Teltonika Telematics Beacon",
+ "retention": {
+ "period": 3,
+ "unit": "months"
+ },
+ "tags": []
+ },
+ "teltonika_data": {
+ "backend": "mongodb",
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "parseMsgData",
+ "payload_type": "source_event",
+ "source": "topic",
+ "topic": "{{imei}}/data"
+ },
+ "description": "Data events received by the teltonika GPS telematics devices",
+ "enabled": true,
+ "name": "Teltonika Telematics Data",
+ "retention": {
+ "period": 3,
+ "unit": "months"
+ },
+ "tags": []
+ }
+ },
+ "code": {
+ "code": "",
+ "environment": "javascript",
+ "storage": "teltonika_decoder",
+ "version": "1.0"
+ },
+ "endpoints": {
+ "teltonika_eye_beacon": {
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "parseMsgBeacon",
+ "payload_type": "source_payload",
+ "source": "topic",
+ "topic": "{{imei}}/data"
+ },
+ "enabled": false,
+ "split_data": true
+ }
+ },
+ "properties": {
+ "location": {
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "",
+ "payload_type": "source_payload",
+ "resource": "location",
+ "source": "resource",
+ "update": "events"
+ },
+ "default": {
+ "source": "value"
+ },
+ "enabled": true
+ },
+ "received": {
+ "data": {
+ "payload": "{{payload}}",
+ "payload_function": "parseMsg",
+ "payload_type": "source_event",
+ "source": "topic",
+ "topic": "{{imei}}/data"
+ },
+ "default": {
+ "source": "value"
+ },
+ "enabled": true
+ }
+ }
+ },
+ "_resources": {
+ "properties": [
+ {
+ "property": "dashboard",
+ "value": {
+ "properties": {
+ "template": true
+ },
+ "tabs": [
+ {
+ "icon": "fas fa-tachometer-alt",
+ "widgets": [
+ {
+ "layout": {
+ "col": 0,
+ "row": 0,
+ "sizeX": 1,
+ "sizeY": 10
+ },
+ "panel": {
+ "color": "#ffffff",
+ "currentColor": "#ffffff",
+ "showOffline": {
+ "type": "none"
+ }
+ },
+ "properties": {
+ "refresh_interval": 0
+ },
+ "sources": [
+ {
+ "color": "#1abc9c",
+ "image_url": "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/teltonika-gps/img/teltonika-trackers.webp",
+ "name": "Source 1",
+ "source": "image_url"
+ }
+ ],
+ "type": "image"
+ },
+ {
+ "layout": {
+ "col": 0,
+ "row": 10,
+ "sizeX": 1,
+ "sizeY": 3
+ },
+ "panel": {
+ "color": "#ffffff",
+ "currentColor": "#ffffff",
+ "showOffline": {
+ "type": "none"
+ },
+ "title": "IMEI"
+ },
+ "properties": {
+ "color": "#1E313E",
+ "decimal_places": 0,
+ "icon": "far fa-fingerprint",
+ "size": "35px",
+ "unit_size": "20px",
+ "weight": "font-thin"
+ },
+ "sources": [
+ {
+ "bucket": {
+ "backend": "mongodb",
+ "id": "teltonika_fmc920_data",
+ "mapping": "imei",
+ "tags": {
+ "device": [
+ "fmc920"
+ ],
+ "group": [],
+ "imei": []
+ }
+ },
+ "color": "#1abc9c",
+ "name": "Source 1",
+ "source": "bucket",
+ "timespan": {
+ "mode": "latest"
+ }
+ }
+ ],
+ "type": "text"
+ },
+ {
+ "layout": {
+ "col": 1,
+ "row": 0,
+ "sizeX": 2,
+ "sizeY": 13
+ },
+ "panel": {
+ "color": "#ffffff",
+ "currentColor": "#ffffff",
+ "showOffline": {
+ "type": "none"
+ }
+ },
+ "properties": {
+ "mapType": "roadmap",
+ "showClustering": true,
+ "showConnected": true,
+ "showDisconnected": true,
+ "showOptions": false,
+ "showSearch": true
+ },
+ "sources": [
+ {
+ "color": "#1abc9c",
+ "id": "teltonika_fmc920",
+ "name": "Source 1",
+ "type": "product"
+ }
+ ],
+ "type": "assets_map"
+ },
+ {
+ "layout": {
+ "col": 3,
+ "row": 0,
+ "sizeX": 1,
+ "sizeY": 5
+ },
+ "panel": {
+ "color": "#ffffff",
+ "currentColor": "#ffffff",
+ "showOffline": {
+ "type": "none"
+ },
+ "title": "Total traveled"
+ },
+ "properties": {
+ "color": "#1E313E",
+ "decimal_places": 0,
+ "icon": "fal fa-road",
+ "size": "35px",
+ "unit": "Km",
+ "unit_size": "20px",
+ "weight": "font-thin"
+ },
+ "sources": [
+ {
+ "bucket": {
+ "backend": "mongodb",
+ "id": "teltonika_fmc920_data",
+ "mapping": "odometer_total",
+ "tags": {
+ "device": [
+ "fmc920"
+ ],
+ "group": [],
+ "imei": []
+ }
+ },
+ "color": "#1abc9c",
+ "name": "Source 1",
+ "source": "bucket",
+ "timespan": {
+ "mode": "latest"
+ }
+ }
+ ],
+ "type": "text"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/ttn-stack/CHANGELOG.md b/ttn-stack/CHANGELOG.md
new file mode 100644
index 00000000..eb233ea5
--- /dev/null
+++ b/ttn-stack/CHANGELOG.md
@@ -0,0 +1,46 @@
+# Changelog
+
+## [1.2.1] - 2024-03-22
+
+### Fixed
+
+- Auto provision bucket is set true as default
+- Assign project to provisioned failing device provisioning
+
+## [1.2.0] - 2024-03-08
+
+### Added
+
+- Support for autoprovision device and bucket separately
+- Support for configuring a preexisting bucket for device write callback
+
+### Security
+
+- Updated axios to version 1.6.7
+- Updated express to version 4.18.2
+- Updated vm2 to version 3.9.19
+
+## [1.1.0] - 2024-02-06
+
+### Added
+
+- Support for setting Project and Product on auto-provisioned devices & buckets
+- f\_port of downlink may be configured by sending it in the downlink body
+
+## [1.0.4] - 2023-02-21
+
+### Fixed
+
+- Ensure provided device type is available instead of using default settings
+
+## [1.0.3] - 2023-02-20
+
+### Fixed
+
+- Make sure Thinger server is running before starting service
+
+[1.2.1]: `https://github.com/thinger-io/plugins/compare/ttn-stack/v1.2.0...ttn-stack/v1.2.1`
+[1.2.0]: `https://github.com/thinger-io/plugins/compare/ttn-stack/v1.1.0...ttn-stack/v1.2.0`
+[1.1.0]: https://github.com/thinger-io/plugins/compare/ttn-stack/v1.0.4...ttn-stack/v1.1.0
+[1.0.4]: https://github.com/thinger-io/plugins/compare/ttn-stack/v1.0.3...ttn-stack/v1.0.4
+[1.0.3]: https://github.com/thinger-io/plugins/tree/ttn-stack/v1.0.3
diff --git a/ttn-stack/LICENSE b/ttn-stack/LICENSE
new file mode 100644
index 00000000..fc2c8e0a
--- /dev/null
+++ b/ttn-stack/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021-Current Thinger.io (INTERNET OF THINGER S.L.)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/ttn-stack/README.md b/ttn-stack/README.md
new file mode 100644
index 00000000..478d3fe4
--- /dev/null
+++ b/ttn-stack/README.md
@@ -0,0 +1,214 @@
+
+# The Things Stack
+
+
+
+
+
+The Things Network is a LoRaWAN Network solution that simplifies the deployment of large IoT applications over a collaborative Internet of Things network that spans many countries around the world. From thinger.io we wanted to offer an improved integration to The Things Stack users by providing easy-to-configure tools for storing, analyzing, and showing device data in a simple way. This plugin allows retrieving The Things Stack webhook messages to enhance the integration with some interesting features such as:
+
+* Uplink data payload processing
+* Downlink data payload processing
+* Automatic device and data buckets provisioning
+
+## Plugin Features
+
+- [x] Automatic device and bucket provisioning for new devices is included in The Things Stack application. It is no required additional configuration to start working with The Things Stack data inside Thinger.io.
+- [x] Store device metadata based on The Things Stack information, like device location, signal quality, hardware serial, etc.
+- [x] Store device data automatically in data buckets so it can be easily used from the console.
+- [x] Provide support for defining custom uplink callbacks on Node.js to process `payload_raw` or `payload_fields` provided by The Things Stack Integration.
+- [x] Provide support for defining custom downlink callbacks on Node.js, so it is possible to configure downlink data in a user-friendly format (JSON), and then convert it to `payload_raw` or `payload_fields`, as required by The Things Stack network.
+
+## The Things Stack Concepts
+
+For a better understanding of the following sections, here is described some basic The Things Stack concepts:
+
+* **Device**: It is a hardware device with a LoRa interface.
+* **Gateway**: It is a hardware device with both LoRa and Internet connectivity. It basically receives LoRa messages from multiple devices and pushes them to The Things Stack network over the Internet.
+* **Uplink**: It is a data flow that represents messages sent from a device to The Things Stack network
+* **Downlink**: It is a data flow that represents messages sent from The Things Stack network to a device.
+* **Application**: It is a concept that defines a group of devices of the same type, normally sending the same kind of data both in uplink and downlink).
+* **Integration**: It is a way of pushing device data outside The Things Stack network, i.e., sending messages to other platforms like Thinger.io.
+
+## Plugin Configuration
+
+This section describes the different interfaces that can be used to configure The Things Stack plugin.
+
+### Integrating The Things Stack Applications
+
+The first step to perform the integration is to create a new plugin configuration. It is possible to create multiple configuration profiles with custom behavior for each application deployed in The Things Stack. To create a new application profile, just type the application ID and press the green Add Application button. Note that the ID must be exactly the same identifier defined in The Things Stack application.
+
+
+
+
+
+The `Application Id` dropdown allows to select and configure a particular application profile, but if the "default" profile is selected, the configuration will be applied to all the applications integrated with the plugin.
+
+!!! warning
+
+ Always create applications with the same application identifier as defined in The Things Stack.
+
+### Uplink Settings
+
+
+
+
+
+As shown in the image above, the parameters can be used to configure the plugin's behavior:
+
+* **Auto provision resources:** Enable or disable automatic resource provisioning while receiving messages for non-created devices.
+* **Device Connection Timeout:** When creating a new device, establish the device connection timeout in minutes, so the platform can consider the device as disconnected after a fixed time without receiving a message.
+* **Device Identifier Prefix:** When creating a new device, create it with a custom prefix + the original device id.
+* **Bucket Identifier Prefix:** When creating a new data bucket associated to the device, create it with a custom prefix + the original device id.
+* **Assign Asset Type:** Associate the auto-provisioned device and bucket with a given Asset Type.
+* **Assign Asset Group:** Associate the auto-provisioned device and bucket with a given Asset Group.
+* **Update device location:** Use the location provided in the gateways information to update de current device location.
+* **Initialize Downlink Data:** When creating a new device, initialize a custom downlink data, that can be modified and processed in further downlink requests.
+
+### Downlink Settings
+
+The Things Stack Downlink processes can be configured from Thinger.io in order to select the behavior in some parameters as shown below:
+
+
+
+
+
+* **Confirmed Downlink:** Set to enabled if downlink messages must be confirmed by the device.
+* **Push To Downlink Queue:** Enable to push downlink messages instead of replace previous ones.
+* **Downlink Priority:** Specify the downlink priority.
+
+### Payload Processing
+
+This tab is used to configure the payload data treatment in order to transform from binary payload received from The Things Stack webhook into user-friendly variables and the Downlink JSON into a binary buffer that will be transmitted to The Things Stack.
+
+The interface provides a code editor for Node.js scripts, where it is possible to define the codification / decodification processes and also provides a testing tool that allows to verify the behavior of both `uplink` and `downlink` processes.
+
+
+
+
+
+The following sections provide additional information about how to configure the uplink and downlink methods.
+
+=== "Uplink"
+
+ The uplink method will be called after a gateway sends a new message over The Things Stack network. Depending on the configuration done in The Things Stackapplication, this function will receive different inputs:
+
+
+ * **Base64 String**: If The Things Stack application defines `Custom Javascript Formatter` for the payload but does not provide a decoder function, this method will receive the raw payload encoded in base64. In this case, it will be necessary to write a function to transform this base64 data to a JSON object.
+ * **JSON Object from Cayene LPP**: If The Things Stack application defines a `Cayene LPP` payload formatter, The Things Stack will automatically convert the binary data to a JSON object that can be used directly by the platform. In this case, it is not necessary to define a custom uplink method unless you want to do some extra processing like incorporating calculated fields.
+ * **JSON Object from Custom Decoder:** If The Things Stack application defines `Custom Javascript Formatter`for the payload and provides a decoder function, this function will receive the output from The Things Stack function. In this case, creating a custom uplink method will be redundant, so create the function in The Things Stack, or in the plugin.
+
+ The output of this method must be always a JSON object containing the information that is necessary to be used by the platform. In the following, there is an uplink method that converts base64 data into a JSON object with `temperature` and `humidity` parsed from the binary data.
+
+ ```javascript
+ /* convert a base64 payload to a JSON object that can be used
+ by Thinger.io */
+ module.exports.uplink = function(payload){
+ const buffer = Buffer.from(payload, 'base64');
+ let processed = {};
+ processed.temperature = buffer.readInt16LE(0)/100.0;
+ processed.humidity = buffer.readInt16LE(2)/100.0;
+ return processed;
+ };
+ ```
+
+ !!! info
+
+ The uplink method must always return a JSON object.
+
+=== "Downlink"
+
+ The downlink method will be called before the plugin issues a downlink request to The Things Stack. To issue a downlink request to The Things Stack, this plugin must receive an HTTP POST call, indicating the Thinger.io device identifier, and it will automatically issue the request to the required The Things Stack endpoint and its specific protocol. Check out the next sections for more details.
+
+ This function will receive different inputs depending on how the plugin is called over its REST API.
+
+ * **JSON Object**: If the downlink call is done for a Thinger.io device that defines a `downlink` property (that is automatically initialized if `Initialize Downlink Data` is configured in the plugin), this method will receive the JSON content of this property. It usually consists on a user-friendly device configuration that should be later encoded to binary in base64.
+ * **JSON Object**: If the plugin downlink request contains a JSON payload in the POST call, this function will receive this payload instead of the one configured in the device `downlink` property.
+
+ The output of this method should be one of the following:
+
+ * **Base64 String**: With binary information that can be sent directly to The Things Stack network. It is required if your The Things Stack application is not defining a converter.
+ * **JSON Object**: Either if The Things Stack application provides a converter for your payloads, this method can return a JSON object that will be accesible in the converter method. In this case, creating a custom downlink method will be redundant, so create the funtion in The Things Stack, or in the plugin. Or, if the f_port needs to be customized, the dedicated `f_port` to use for the downlink may be specified by having the input message be `{ "f_port": 1, "payload": "
+
+
+
+!!! info
+
+ Note that the REST API does not define the application ID, this parameter will be checked by the plugin software to manage the payload according to the configuration.
+
+To create a new webhook integration follow the next steps in The Things Stack web console:
+1. Select the Application to be integrated.
+2. In the main menu open the "Integrations" section and click the "Webhooks" option. The webhooks list will be shown.
+
+
+
+
+
+3\. Clicking the `+Add webhook` blue button in the right top corner of the interface allows choosing between different webhooks integration templates. Select Thinger.io template. Then, configure the webhook only requires filling the form with the information provided by Thinger.io "webhook settings" tab and selecting JSON webhook format.
+
+
+
+
+
+!!! info
+
+ Note that the Authorization header must be set up using the access token including the "Bearer" command
+
+### Downlink Configuration
+
+As part of the webhook template, the Download API key is automatically created, so no further configuration is required.
+
+## Executing Downlink Processes
+
+Thinger.io's The Things Stack plugin has been prepared to automatically manage to send downlink messages to The Things Stack server, this system takes the data from the device downlink property, autogenerated during device provisioning, and inserts it as a response to the next HTTP request from the system. In this way, we can create device configuration and control processes just by modifying the value of this property by means of a Dashboard widget, Node-RED, or direct API integration.
+
+To create a new downlink process make sure to follow the next steps:
+
+1. [Configure the plugin's downlink settings at Thinger.io](#downlink-settings)
+2. Write a codification script if required using the plugin's "downlink payload processing"
+3. Modify the value of the property to launch the execution of the downlink process
+
+After this, the plugin will execute the payload processing and send it in response of the next The Things Stack API request to your server. It is possible to follow the trace of this communication by accessing the plugin's log and going to `Plugins>Plugin profile>Logs`.
+
+## Monitor Your Data
+
+There are multiple ways to view the data sent by the device in [Thinger.io](https://thinger.io/).
+
+As long as the uplink messages are being sent by The Things Stack, the raw data will be available in the [Thinger.io](https://thinger.io/) **Data Bucket** configured or auto-provisioned by the [The Things Stack Plugin](/plugins/ttn-stack), without any further configuration.
+
+
+
+
+
+Nevertheless, it is recommended to create a [Dashboard](https://docs.thinger.io/features/dashboards) in [Thinger.io](https://thinger.io/) to be able to view the data in a more comprehensive way.
+
+
+
+
+
diff --git a/ttn-stack/docs/assets/application-configuration.png b/ttn-stack/docs/assets/application-configuration.png
new file mode 100644
index 00000000..67757aa1
Binary files /dev/null and b/ttn-stack/docs/assets/application-configuration.png differ
diff --git a/ttn-stack/docs/assets/data-dashboard.png b/ttn-stack/docs/assets/data-dashboard.png
new file mode 100644
index 00000000..8dfdc821
Binary files /dev/null and b/ttn-stack/docs/assets/data-dashboard.png differ
diff --git a/ttn-stack/docs/assets/data_bucket.png b/ttn-stack/docs/assets/data_bucket.png
new file mode 100644
index 00000000..143363cb
Binary files /dev/null and b/ttn-stack/docs/assets/data_bucket.png differ
diff --git a/ttn-stack/docs/assets/downlink-settings.png b/ttn-stack/docs/assets/downlink-settings.png
new file mode 100644
index 00000000..2a9e9d4f
Binary files /dev/null and b/ttn-stack/docs/assets/downlink-settings.png differ
diff --git a/ttn-stack/docs/assets/payload-processing.png b/ttn-stack/docs/assets/payload-processing.png
new file mode 100644
index 00000000..8c110d5b
Binary files /dev/null and b/ttn-stack/docs/assets/payload-processing.png differ
diff --git a/ttn-stack/docs/assets/ttn-stack-icon.png b/ttn-stack/docs/assets/ttn-stack-icon.png
new file mode 100644
index 00000000..3e9323cb
Binary files /dev/null and b/ttn-stack/docs/assets/ttn-stack-icon.png differ
diff --git a/ttn-stack/docs/assets/ttn-stack-logo.png b/ttn-stack/docs/assets/ttn-stack-logo.png
new file mode 100644
index 00000000..561dbe2a
Binary files /dev/null and b/ttn-stack/docs/assets/ttn-stack-logo.png differ
diff --git a/ttn-stack/docs/assets/tts-diagram.png b/ttn-stack/docs/assets/tts-diagram.png
new file mode 100644
index 00000000..fb33279a
Binary files /dev/null and b/ttn-stack/docs/assets/tts-diagram.png differ
diff --git a/ttn-stack/docs/assets/uplink-settings.png b/ttn-stack/docs/assets/uplink-settings.png
new file mode 100644
index 00000000..f5fcaa30
Binary files /dev/null and b/ttn-stack/docs/assets/uplink-settings.png differ
diff --git a/ttn-stack/docs/assets/webhook-integration-settings.png b/ttn-stack/docs/assets/webhook-integration-settings.png
new file mode 100644
index 00000000..985c6853
Binary files /dev/null and b/ttn-stack/docs/assets/webhook-integration-settings.png differ
diff --git a/ttn-stack/docs/assets/webhook-integration.png b/ttn-stack/docs/assets/webhook-integration.png
new file mode 100644
index 00000000..a684963f
Binary files /dev/null and b/ttn-stack/docs/assets/webhook-integration.png differ
diff --git a/ttn-stack/docs/assets/webhook-settings.png b/ttn-stack/docs/assets/webhook-settings.png
new file mode 100644
index 00000000..1e6ded79
Binary files /dev/null and b/ttn-stack/docs/assets/webhook-settings.png differ
diff --git a/ttn-stack/docs/changelog.md b/ttn-stack/docs/changelog.md
new file mode 100644
index 00000000..87a1e9c8
--- /dev/null
+++ b/ttn-stack/docs/changelog.md
@@ -0,0 +1,2 @@
+
+--8<-- "ttn-stack/CHANGELOG.md"
diff --git a/ttn-stack/docs/index.md b/ttn-stack/docs/index.md
new file mode 100644
index 00000000..276e4d56
--- /dev/null
+++ b/ttn-stack/docs/index.md
@@ -0,0 +1,2 @@
+
+--8<-- "ttn-stack/README.md"
diff --git a/ttn-stack/docs/plugin_file.md b/ttn-stack/docs/plugin_file.md
new file mode 100644
index 00000000..5c16dc99
--- /dev/null
+++ b/ttn-stack/docs/plugin_file.md
@@ -0,0 +1,10 @@
+---
+search:
+ exclude: true
+---
+
+# Plugin file
+
+```` json title="Plugin configuration file"
+--8<-- "ttn-stack/plugin.json"
+````
diff --git a/ttn-stack/gui/ttn-stack-settings.html b/ttn-stack/gui/ttn-stack-settings.html
new file mode 100644
index 00000000..317d4d26
--- /dev/null
+++ b/ttn-stack/gui/ttn-stack-settings.html
@@ -0,0 +1,293 @@
+
+
+
The Things Stack
+
+
+
+
+
+ {{ui.selectedDeviceType}} Settings
+
+
+
+
+
Ooops! Cannot process your request. Error {{error_code}} ({{error_message}})