diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 7ac04481..711ea14f 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -41,11 +41,14 @@ jobs:
- run: |
pip install mkdocs-material
pip install mkdocs-minify-plugin
- pip install mkdocs-redirects
pip install mkdocs-monorepo-plugin
pip install mkdocs-rss-plugin
pip install mkdocs-git-revision-date-localized-plugin
pip install "mkdocs-material[imaging]"
pip install mkdocs-glightbox
+ pip install mkdocs-callouts
+
+ - name: Pre-build documentation
+ run: python3 build_docs.py
- run: mkdocs gh-deploy --force
diff --git a/.gitignore b/.gitignore
index 66479553..16bab422 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,8 +2,20 @@
node_modules/
*swp
.cache
+.DS_Store
-# jekyll
-_site/
+# Jekyll
vendor/
.jekyll-cache/
+
+# MkDocs
+_site/
+_build/
+
+# Auto-generated category index pages
+docs/plugins/connectivity/
+docs/plugins/devices/
+docs/plugins/monitoring/
+docs/plugins/development/
+docs/plugins/infrastructure/
+docs/plugins/templates/
diff --git a/Dockerfile b/Dockerfile
index 384cd19a..aa62202e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -5,4 +5,6 @@ RUN pip install \
mkdocs-monorepo-plugin \
mkdocs-rss-plugin \
mkdocs-glightbox \
+ mkdocs-minify-plugin \
+ mkdocs-callouts \
"mkdocs-material[imaging]"
diff --git a/sigfox/LICENSE b/LICENSE
similarity index 97%
rename from sigfox/LICENSE
rename to LICENSE
index 3ac71b5d..2144e7a3 100644
--- a/sigfox/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2019 Thinger.io
+Copyright (c) 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
diff --git a/Makefile b/Makefile
index fd00eab6..918e5406 100644
--- a/Makefile
+++ b/Makefile
@@ -2,4 +2,4 @@ build:
docker build -t thinger/plugins .
serve:
- docker run --rm -it -p 8000:8000 -v ${PWD}:/docs --name thinger_plugins thinger/plugins
+ docker run --rm -p 9000:9000 -v ${PWD}:/docs --entrypoint sh thinger/plugins -c "python3 build_docs.py && mkdocs serve -a 0.0.0.0:9000"
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..3da21531
--- /dev/null
+++ b/README.md
@@ -0,0 +1,41 @@
+# Thinger.io Marketplace
+
+Official plugin repository for [Thinger.io](https://thinger.io) IoT platform. Plugins extend the platform with integrations for third-party services, device protocols, and data visualization tools.
+
+Browse the marketplace at [marketplace.thinger.io](https://marketplace.thinger.io).
+
+## Repository Structure
+
+```
+plugin-name/
+├── plugin.json # Plugin metadata and configuration
+├── README.md # Documentation (rendered in marketplace)
+├── CHANGELOG.md # Version history
+├── assets/ # Images and resources
+└── task/ # Container definition (if applicable)
+ └── Dockerfile
+```
+
+## Development
+
+Requires Docker installed.
+
+```bash
+make build # Build Docker image (first time only)
+make serve # Start dev server at http://localhost:9000
+```
+
+Changes to `docs/` are hot-reloaded. For plugin changes, restart the server.
+
+## Contributing
+
+See the [contributing guide](https://marketplace.thinger.io/contributing/) for detailed documentation on:
+
+- Plugin structure and required files
+- Writing integration plugins
+- Developing custom plugins
+- Documentation guidelines
+
+## License
+
+MIT License - see [LICENSE](LICENSE) for details.
diff --git a/alertmanager/README.md b/alertmanager/README.md
index af4f475d..4d39fcc8 100644
--- a/alertmanager/README.md
+++ b/alertmanager/README.md
@@ -2,7 +2,7 @@
# Alertmanager
-
+
The Alertmanager handles alerts sent by clients applications such as Prometheus server. More information in their [official documentation](https://prometheus.io/docs/alerting/latest/alertmanager/).
@@ -13,13 +13,9 @@ This plugins requires the existence of the [Prometheus plugin](https://marketpla
In order for the connection to take place, edit the `prometheus.yml` file by introducing your details and selecting your desired configuration.
-
-
-
+
-
-
-
+
## Official Documentation
@@ -29,12 +25,7 @@ You can find how to configure Alermanager at [this link](https://prometheus.io/d
More details regarding the configuration of Prometheus at [this link](https://prometheus.io/docs/prometheus/latest/configuration/configuration/).
-!!! note
-
- Any configuration change in `prometheus.yml` or `rules.yml` requires a
- restart of the Prometheus plugin, and any change to `alertmanager.yml`
- requires a restart of the Alertmanager plugin.
-
-## License
-
-Alertmanager, as well as Prometheus are distributed under the [Apache 2.0 License](https://prometheus.io/docs/introduction/faq/#what-license-is-prometheus-released-under).
+> [!NOTE]
+> Any configuration change in `prometheus.yml` or `rules.yml` requires a
+> restart of the Prometheus plugin, and any change to `alertmanager.yml`
+> requires a restart of the Alertmanager plugin.
diff --git a/alertmanager/assets/alertmanager.png b/alertmanager/assets/alertmanager.png
new file mode 100644
index 00000000..473db248
Binary files /dev/null and b/alertmanager/assets/alertmanager.png differ
diff --git a/alertmanager/assets/prometheus-alerts.png b/alertmanager/assets/prometheus-alerts.png
new file mode 100644
index 00000000..73289f61
Binary files /dev/null and b/alertmanager/assets/prometheus-alerts.png differ
diff --git a/alertmanager/assets/prometheus-logo.svg b/alertmanager/assets/prometheus-logo.svg
new file mode 100644
index 00000000..48a53b6b
--- /dev/null
+++ b/alertmanager/assets/prometheus-logo.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/alertmanager/docs/changelog.md b/alertmanager/docs/changelog.md
deleted file mode 100644
index ee2de089..00000000
--- a/alertmanager/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "alertmanager/CHANGELOG.md"
diff --git a/alertmanager/docs/index.md b/alertmanager/docs/index.md
deleted file mode 100644
index b24967c2..00000000
--- a/alertmanager/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "alertmanager/README.md"
diff --git a/alertmanager/docs/plugin_file.md b/alertmanager/docs/plugin_file.md
deleted file mode 100644
index 7c7b425e..00000000
--- a/alertmanager/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-``` json title="Plugin configuration file"
---8<-- "alertmanager/plugin.json"
-```
diff --git a/alertmanager/mkdocs.yml b/alertmanager/mkdocs.yml
deleted file mode 100644
index a7765f85..00000000
--- a/alertmanager/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/alertmanager
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/alertmanager/plugin.json b/alertmanager/plugin.json
index f8219168..665f4194 100644
--- a/alertmanager/plugin.json
+++ b/alertmanager/plugin.json
@@ -2,7 +2,7 @@
"name" : "alertmanager",
"version" : "0.26.0-1",
"description" : "Alertmanager alarm handler system",
- "author" : "Jaime Bautista",
+ "author": "Thinger.io",
"license" : "MIT",
"repository" : {
"type" : "git",
@@ -12,8 +12,9 @@
"metadata" : {
"name" : "Alertmanager",
"description" : "Integration of Alertmanager with Thinger.io",
- "image" : "docs/assets/prometheus-logo.svg",
- "icon" : "docs/assets/prometheus-logo.svg"
+ "category" : "monitoring",
+ "image" : "assets/prometheus-logo.svg",
+ "icon" : "assets/prometheus-logo.svg"
},
"tokens" : {
"alertmanager_plugin_callback" : {
diff --git a/build_docs.py b/build_docs.py
new file mode 100644
index 00000000..c7544d0d
--- /dev/null
+++ b/build_docs.py
@@ -0,0 +1,385 @@
+#!/usr/bin/env python3
+"""
+Pre-build script for MkDocs documentation.
+Generates the docs structure automatically from plugin README.md, CHANGELOG.md and plugin.json files.
+
+This script generates all documentation in _build/plugins/ directory, keeping the
+source plugin directories clean. The generated structure is:
+
+_build/plugins/
+└── plugin-name/
+ ├── index.md (from README.md)
+ ├── changelog.md (from CHANGELOG.md)
+ ├── plugin_file.md (from plugin.json)
+ ├── assets/ (copied from plugin/assets/)
+ ├── *.md (extra pages from plugin/pages/)
+ └── mkdocs.yml (with docs_dir: . for flat structure)
+
+Run this script before `mkdocs build` or `mkdocs gh-deploy`.
+"""
+
+import json
+import re
+import shutil
+from pathlib import Path
+
+REPO_ROOT = Path(__file__).parent
+MAIN_MKDOCS = REPO_ROOT / "mkdocs.yml"
+BUILD_DIR = REPO_ROOT / "_build" / "plugins"
+
+# Directories/files to ignore when scanning for plugins
+IGNORE_DIRS = {".github", "docs", "_build", ".cache", "site", "__pycache__"}
+
+# Files that are auto-generated
+GENERATED_FILES = {"index.md", "changelog.md", "plugin_file.md"}
+
+# Category display names and order
+CATEGORY_ORDER = ["devices", "connectivity", "monitoring", "development", "infrastructure", "templates"]
+CATEGORY_NAMES = {
+ "connectivity": "Connectivity",
+ "devices": "Devices",
+ "monitoring": "Monitoring",
+ "development": "Development",
+ "infrastructure": "Infrastructure",
+ "templates": "Templates",
+}
+
+
+def find_plugins() -> list[Path]:
+ """Find all plugin directories (those containing a plugin.json file)."""
+ plugins = []
+ for item in REPO_ROOT.iterdir():
+ if item.is_dir() and item.name not in IGNORE_DIRS and not item.name.startswith("."):
+ plugin_json = item / "plugin.json"
+ if plugin_json.exists():
+ plugins.append(item)
+ return sorted(plugins, key=lambda p: p.name)
+
+
+def load_plugin_metadata(plugin_dir: Path) -> dict:
+ """Load plugin.json metadata."""
+ plugin_json = plugin_dir / "plugin.json"
+ with open(plugin_json, "r", encoding="utf-8") as f:
+ return json.load(f)
+
+
+def get_display_name(plugin_data: dict, fallback: str) -> str:
+ """Get the display name from plugin.json, preferring metadata.name."""
+ # Try metadata.name first (the pretty display name)
+ if "metadata" in plugin_data and "name" in plugin_data["metadata"]:
+ return plugin_data["metadata"]["name"]
+ # Fallback to top-level name or directory name
+ return plugin_data.get("name", fallback)
+
+
+def get_category(plugin_data: dict) -> str:
+ """Get the category from plugin.json metadata."""
+ if "metadata" in plugin_data and "category" in plugin_data["metadata"]:
+ return plugin_data["metadata"]["category"].strip().lower()
+ return "other"
+
+
+def generate_deprecation_warning(plugin_data: dict) -> str:
+ """Generate a GitHub-style deprecation warning if plugin is deprecated."""
+ deprecated = plugin_data.get("deprecated")
+ if not deprecated:
+ return ""
+
+ message = deprecated.get("message", "This plugin is no longer maintained")
+ replacement = deprecated.get("replacement", "")
+
+ if replacement:
+ message = f"{message}. Use [{replacement}](../{replacement}/) instead."
+
+ return f"\n> [!WARNING]\n> {message}\n"
+
+
+def generate_plugin_docs(plugin_dir: Path, category: str) -> list[str]:
+ """
+ Generate documentation structure for a single plugin in _build/plugins//.
+ Returns list of extra page names found.
+ """
+ plugin_name = plugin_dir.name
+ plugin_data = load_plugin_metadata(plugin_dir)
+
+ # Output directory in _build/plugins///
+ output_dir = BUILD_DIR / category / plugin_name
+
+ # Clean and create output directory
+ if output_dir.exists():
+ shutil.rmtree(output_dir)
+ output_dir.mkdir(parents=True)
+
+ # Check for extra pages in source plugin's pages/ folder (if exists)
+ extra_pages = []
+ source_pages = plugin_dir / "pages"
+ if source_pages.exists():
+ for md_file in source_pages.glob("*.md"):
+ # Copy extra page to build dir
+ shutil.copy(md_file, output_dir / md_file.name)
+ extra_pages.append(md_file.stem)
+
+ # 1. Generate index.md from README.md
+ readme = plugin_dir / "README.md"
+ index_file = output_dir / "index.md"
+ if readme.exists():
+ content = readme.read_text(encoding="utf-8")
+ # Inject deprecation warning after first heading if deprecated
+ deprecation_warning = generate_deprecation_warning(plugin_data)
+ if deprecation_warning:
+ # Insert after the first line (title)
+ lines = content.split("\n", 1)
+ if len(lines) == 2:
+ content = lines[0] + "\n" + deprecation_warning + lines[1]
+ else:
+ content = lines[0] + "\n" + deprecation_warning
+ index_file.write_text(content, encoding="utf-8")
+ else:
+ print(f" WARNING: {plugin_name} has no README.md")
+ index_file.write_text(f"# {plugin_name}\n\nNo documentation available.\n")
+
+ # 2. Generate changelog.md from CHANGELOG.md
+ changelog = plugin_dir / "CHANGELOG.md"
+ changelog_file = output_dir / "changelog.md"
+ if changelog.exists():
+ content = changelog.read_text(encoding="utf-8")
+ changelog_file.write_text(content, encoding="utf-8")
+ else:
+ changelog_file.write_text("# Changelog\n\nNo changelog available.\n")
+
+ # 3. Generate plugin_file.md from plugin.json
+ plugin_json = plugin_dir / "plugin.json"
+ plugin_json_content = plugin_json.read_text(encoding="utf-8")
+ plugin_file_content = f'''---
+search:
+ exclude: true
+---
+
+# Plugin file
+
+```` json title="Plugin configuration file"
+{plugin_json_content}
+````
+'''
+ (output_dir / "plugin_file.md").write_text(plugin_file_content, encoding="utf-8")
+
+ # 4. Copy assets from plugin root to build
+ assets_src = plugin_dir / "assets"
+ assets_dst = output_dir / "assets"
+ if assets_src.exists():
+ shutil.copytree(assets_src, assets_dst)
+
+ # 5. Generate mkdocs.yml for this plugin (with docs_dir: . for flat structure)
+ nav_items = ['"index.md"']
+
+ # Add extra pages to navigation (sorted alphabetically)
+ for page in sorted(extra_pages):
+ # Convert filename to title (get_started -> Get Started)
+ title = page.replace("_", " ").replace("-", " ").title()
+ nav_items.append(f'{title}: "{page}.md"')
+
+ nav_items.append('Changelog: "changelog.md"')
+ nav_items.append('Plugin file: "plugin_file.md"')
+
+ mkdocs_content = f"""site_name: plugins/{category}/{plugin_name}
+docs_dir: .
+
+nav:
+ - {(chr(10) + " - ").join(nav_items)}
+"""
+ (output_dir / "mkdocs.yml").write_text(mkdocs_content, encoding="utf-8")
+
+ return extra_pages
+
+
+def generate_category_index(category: str, plugins_info: list[tuple[str, str, str, str, bool]]) -> None:
+ """
+ Generate an index.md for a category with a grid of plugin cards.
+ plugins_info is a list of (display_name, plugin_name, description, icon_path, is_deprecated)
+ Outputs to docs/plugins//index.md so MkDocs can find it.
+ """
+ # Put category index in docs/plugins// so MkDocs can find it
+ category_dir = REPO_ROOT / "docs" / "plugins" / category
+ category_dir.mkdir(parents=True, exist_ok=True)
+
+ category_display = CATEGORY_NAMES.get(category, category.title())
+
+ # Build the cards as custom HTML grid (not using Material cards)
+ cards = []
+ for display_name, plugin_name, description, icon_path, is_deprecated in plugins_info:
+ # Icon path relative to the category index page
+ icon_url = f"{plugin_name}/{icon_path}" if icon_path else ""
+
+ if icon_url:
+ icon_html = f''
+ else:
+ icon_html = ''
+
+ card = f'''
+ {icon_html}
+
+
+
+"""
+ (category_dir / "index.md").write_text(content, encoding="utf-8")
+
+
+def generate_main_nav_section(categories_data: dict) -> str:
+ """Generate the Integrations section for the main mkdocs.yml nav, with category index pages."""
+ lines = []
+
+ # Generate nav with category index + plugins (flatter structure)
+ for category in CATEGORY_ORDER:
+ if category in categories_data:
+ category_display = CATEGORY_NAMES.get(category, category.title())
+ lines.append(f" - {category_display}:")
+ lines.append(f" - Overview: 'plugins/{category}/index.md'")
+ for display_name, plugin_name, _, _, _ in categories_data[category]:
+ lines.append(f" - {display_name}: '!include ./_build/plugins/{category}/{plugin_name}/mkdocs.yml'")
+
+ # Handle any categories not in CATEGORY_ORDER
+ for category in sorted(categories_data.keys()):
+ if category not in CATEGORY_ORDER:
+ category_display = CATEGORY_NAMES.get(category, category.title())
+ lines.append(f" - {category_display}:")
+ lines.append(f" - Overview: 'plugins/{category}/index.md'")
+ for display_name, plugin_name, _, _, _ in categories_data[category]:
+ lines.append(f" - {display_name}: '!include ./_build/plugins/{category}/{plugin_name}/mkdocs.yml'")
+
+ return "\n".join(lines)
+
+
+def update_main_mkdocs_nav(categories_data: dict):
+ """
+ Update the main mkdocs.yml with the auto-generated plugin list.
+ Replaces content between markers.
+ """
+ mkdocs_content = MAIN_MKDOCS.read_text(encoding="utf-8")
+
+ # Define markers for the auto-generated section
+ start_marker = " # AUTO-GENERATED-PLUGINS-START"
+ end_marker = " # AUTO-GENERATED-PLUGINS-END"
+
+ nav_content = generate_main_nav_section(categories_data)
+ new_section = f"{start_marker}\n - Integrations:\n{nav_content}\n{end_marker}"
+
+ if start_marker in mkdocs_content and end_marker in mkdocs_content:
+ # Replace existing section
+ pattern = re.compile(
+ re.escape(start_marker) + r".*?" + re.escape(end_marker),
+ re.DOTALL
+ )
+ mkdocs_content = pattern.sub(new_section, mkdocs_content)
+ MAIN_MKDOCS.write_text(mkdocs_content, encoding="utf-8")
+ print(" Updated main mkdocs.yml with plugin list")
+ else:
+ # Print instructions for manual integration
+ print("\n" + "=" * 60)
+ print("Add these markers to mkdocs.yml to enable auto-updates:")
+ print("=" * 60)
+ print(f"""
+ - Plugins:
+ - 'plugins/index.md'
+ - Managing Plugins: 'plugins/managing.md'
+{new_section}
+""")
+ print("=" * 60 + "\n")
+
+
+def main():
+ from collections import defaultdict
+
+ print("Pre-building documentation structure...")
+ print(f" Repository root: {REPO_ROOT}")
+
+ # Find all plugins
+ plugins = find_plugins()
+ print(f"\n Found {len(plugins)} plugins:\n")
+
+ # Group plugins by category and generate docs
+ categories_data = defaultdict(list)
+
+ for plugin_dir in plugins:
+ plugin_name = plugin_dir.name
+ plugin_data = load_plugin_metadata(plugin_dir)
+ display_name = get_display_name(plugin_data, plugin_name)
+ category = get_category(plugin_data)
+ description = plugin_data.get("metadata", {}).get("description", plugin_data.get("description", ""))
+ is_deprecated = "deprecated" in plugin_data
+
+ # Generate plugin docs in category subfolder
+ extra_pages = generate_plugin_docs(plugin_dir, category)
+ extras = f" (+{len(extra_pages)} extra)" if extra_pages else ""
+ print(f" - [{category}] {plugin_name}{extras}")
+
+ # Get icon from metadata.icon with fallback to metadata.image
+ metadata = plugin_data.get("metadata", {})
+ icon_path = metadata.get("icon", "") or metadata.get("image", "")
+
+ # Store for category index and nav
+ categories_data[category].append((display_name, plugin_name, description, icon_path, is_deprecated))
+
+ # Sort plugins within each category by display name
+ for category in categories_data:
+ categories_data[category].sort(key=lambda x: x[0].lower())
+
+ # Generate category index pages
+ print("\n Generating category index pages...")
+ for category, plugins_info in categories_data.items():
+ generate_category_index(category, plugins_info)
+ print(f" - {category}/ ({len(plugins_info)} plugins)")
+
+ # Update main mkdocs.yml
+ print("")
+ update_main_mkdocs_nav(categories_data)
+
+ print("\n Documentation pre-build complete!")
+
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/chirpstack/CHANGELOG.md b/chirpstack/CHANGELOG.md
index 05cbbeb1..e18b5774 100644
--- a/chirpstack/CHANGELOG.md
+++ b/chirpstack/CHANGELOG.md
@@ -1,5 +1,18 @@
# Changelog
+## [1.1.1] - 2025-12-03
+
+### Add
+
+- Added support for enabling/disabling individual applications in the backend
+- Improved Inspector messages
+- Auto completion for application edition in the plugin configuration page
+
+#### Fix
+
+- Fixed multiple application selection bug in the plugin configuration page
+- Fixed edition of existing plugin applications
+
## [1.1.0] - 2025-11-15
### Added
diff --git a/chirpstack/LICENSE b/chirpstack/LICENSE
deleted file mode 100644
index 0631ba07..00000000
--- a/chirpstack/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-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
index b89e5389..27262a9a 100644
--- a/chirpstack/README.md
+++ b/chirpstack/README.md
@@ -1,7 +1,7 @@
# 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.
@@ -35,10 +35,7 @@ Open the plugin settings page. In the **Applications** table click **Add +** an
| **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.
@@ -50,7 +47,6 @@ In most cases, you will need to either:
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.
@@ -59,14 +55,13 @@ Navigate to Integrations → Add Integration and choose the generic HTTP integra
Complete the form with the values provided by the Thinger.io plugin:
-
In an effort to provide different development environments within Thinger.io for Time Series Data Analysis, we are pleased to announce the release of the [RStudio Plugin](https://marketplace.thinger.io/plugins/rstudio/) for Thinger.io.
diff --git a/docs/announcements/posts/2024-06-20-rstudio-v4.4.0-1/RStudio_logo_flat.svg b/docs/announcements/posts/2024-06-20-rstudio-v4.4.0-1/rstudio-logo.svg
similarity index 100%
rename from docs/announcements/posts/2024-06-20-rstudio-v4.4.0-1/RStudio_logo_flat.svg
rename to docs/announcements/posts/2024-06-20-rstudio-v4.4.0-1/rstudio-logo.svg
diff --git a/docs/assets/OSI_Standard_Logo_0.svg b/docs/assets/osi-standard-logo.svg
similarity index 100%
rename from docs/assets/OSI_Standard_Logo_0.svg
rename to docs/assets/osi-standard-logo.svg
diff --git a/docs/how_it_works/hardware_manufacturers.md b/docs/how_it_works/hardware_manufacturers.md
index ac195e85..426c56de 100644
--- a/docs/how_it_works/hardware_manufacturers.md
+++ b/docs/how_it_works/hardware_manufacturers.md
@@ -13,13 +13,12 @@ Are you a hardware manufacturer with groundbreaking devices waiting to be introd
We provide a platform to showcase and introduce their innovative devices to a global audience. By joining our marketplace, hardware manufacturers can increase the visibility of their products, leading to enhanced device sales and market reach.
-!!! note "Benefits"
-
- Reduce time-to-market & developments costs
-
- Increase hardware product visibility & sales
-
- Creates an ecosystem of compatible devices in which they must be
+> [!NOTE] Benefits
+> Reduce time-to-market & developments costs
+>
+> Increase hardware product visibility & sales
+>
+> Creates an ecosystem of compatible devices in which they must be
In just four easy steps a simple hardware can be integrated in the platform for thousand of users:
diff --git a/docs/how_it_works/iot_consultants.md b/docs/how_it_works/iot_consultants.md
index 71e93c84..9f06dc9b 100644
--- a/docs/how_it_works/iot_consultants.md
+++ b/docs/how_it_works/iot_consultants.md
@@ -10,13 +10,12 @@ Thinger.io Marketplace presents an unparalleled opportunity for consultancies to
Thinger.io Marketplace offers a unique opportunity for consultancies to develop last-mile integrations and facilitate seamless device deployment for their clients. By leveraging our platform, consultancies can efficiently connect with potential customers and identify the best-suited devices for their specific solutions, resulting in improved customer satisfaction and project success.
-!!! note "Benefits"
-
- Fast and simpler development processes
-
- Reduce long-term technologic debt
-
- Win-win relationship: They find customers growing our SAAS sales
+> [!NOTE] Benefits
+> Fast and simpler development processes
+>
+> Reduce long-term technologic debt
+>
+> Win-win relationship: They find customers growing our SAAS sales
Incorporating Thinger.io Marketplace into your consultancy toolkit offers a multitude of benefits, which include:
diff --git a/docs/plugins/index.md b/docs/plugins/index.md
index bf31d3f2..884b3b23 100644
--- a/docs/plugins/index.md
+++ b/docs/plugins/index.md
@@ -7,18 +7,16 @@ The core of Thinger.io IoT Platform is designed to be lean and lightweight, to m
For instructions and information about installing, upgrading, troubleshooting, and managing Thinger.io plugins, see [Managing Plugins](managing) section. For learning how to use any existent plugin, just find on the left a list of each one.
-!!! note
-
- Plugins are only available for premium Thinger.io servers. Check out the pricing
- page to create your own instance within minutes.
-
- [To the pricing](https://thinger.io/pricing/){ .md-button .md-button--primary }
-
-!!! tip
-
- Thinger.io plugins source code is now available in our Github repository,so
- if you want to contribute do not hesitate on forking to project and send your pull-requests.
- Link is in the top right corner of the page.
+> [!NOTE]
+> Plugins are only available for premium Thinger.io servers. Check out the pricing
+> page to create your own instance within minutes.
+>
+> [To the pricing](https://thinger.io/pricing/){ .md-button .md-button--primary }
+
+> [!TIP]
+> Thinger.io plugins source code is now available in our Github repository, so
+> if you want to contribute do not hesitate on forking to project and send your pull-requests.
+> Link is in the top right corner of the page.
## Custom Plugins Development
diff --git a/dragino-lt22222l/LICENSE.md b/dragino-lt22222l/LICENSE.md
deleted file mode 100644
index f1bacd61..00000000
--- a/dragino-lt22222l/LICENSE.md
+++ /dev/null
@@ -1,7 +0,0 @@
-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 efcf540e..553da86f 100644
--- a/dragino-lt22222l/README.md
+++ b/dragino-lt22222l/README.md
@@ -1,7 +1,7 @@
# LT-22222-L LoRa I/O Controller
-
+
The Dragino LT series I/O Modules are Long Range LoRa I/O Controller. It contains different I/O Interfaces such as: analog current Input, analog voltage input, relay output, digital input and digital output etc. The LT I/O Modules are designed to simplify the installation of I/O monitoring.
diff --git a/dragino-lt22222l/assets/LT-22222-L.png b/dragino-lt22222l/assets/dragino-lt22222l.png
similarity index 100%
rename from dragino-lt22222l/assets/LT-22222-L.png
rename to dragino-lt22222l/assets/dragino-lt22222l.png
diff --git a/dragino-lt22222l/docs/changelog.md b/dragino-lt22222l/docs/changelog.md
deleted file mode 100644
index cbc10421..00000000
--- a/dragino-lt22222l/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "dragino-lt22222l/CHANGELOG.md"
diff --git a/dragino-lt22222l/docs/index.md b/dragino-lt22222l/docs/index.md
deleted file mode 100644
index 0603d57c..00000000
--- a/dragino-lt22222l/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "dragino-lt22222l/README.md"
diff --git a/dragino-lt22222l/docs/plugin_file.md b/dragino-lt22222l/docs/plugin_file.md
deleted file mode 100644
index 288b7537..00000000
--- a/dragino-lt22222l/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "dragino-lt22222l/plugin.json"
-````
diff --git a/dragino-lt22222l/mkdocs.yml b/dragino-lt22222l/mkdocs.yml
deleted file mode 100644
index 5c8ef9b7..00000000
--- a/dragino-lt22222l/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/dragino-lt22222l
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/dragino-lt22222l/plugin.json b/dragino-lt22222l/plugin.json
index d0f4014c..edd15094 100644
--- a/dragino-lt22222l/plugin.json
+++ b/dragino-lt22222l/plugin.json
@@ -10,9 +10,10 @@
"directory": "dragino-lt22222l"
},
"metadata": {
- "name": "Dragino LT-22222-L LoRa I/O Controller",
+ "name": "Dragino LT-22222-L",
"description": "Dragino LT-22222-L integration with Thinger.io",
- "image": "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/dragino-lt22222l/img/LT-22222-L.png"
+ "category": "devices",
+ "image": "assets/dragino-lt22222l.png"
},
"resources": {
"products": [
diff --git a/grafana/README.md b/grafana/README.md
index 9ad05268..9696704b 100644
--- a/grafana/README.md
+++ b/grafana/README.md
@@ -1,15 +1,12 @@
-
# Grafana
-
+
Grafana is a powerful and versatile open-source platform designed to streamline the monitoring and observability of your metrics, regardless of their storage location. With Grafana, you can effortlessly query, visualize, set up alerts, and gain deep insights into your data, fostering a data-driven culture within your team.
-
-
-
+
## Key Features
@@ -39,9 +36,7 @@ With Grafana, you can effortlessly mix different data sources within the same gr
## About thinger.io and Grafana Integration
-
-
-
+
The integration of thinger.io with Grafana introduces an immensely valuable toolset for thinger.io users, enabling them to elevate their dashboards to a professional level, conduct intricate analytics in a scalable manner, and embark on collaborative visualization projects with fellow developers on their team. This seamless integration leverages the strengths of each component to create a powerful infrastructure, where thinger.io serves as a centralized hub for device administration and management.
@@ -58,7 +53,3 @@ Unsure if Grafana is for you? Watch Grafana in action on [play.grafana.org](http
## Official Documentation
The Grafana documentation is available at [grafana.com/docs](https://grafana.com/docs/grafana/latest/getting-started/).
-
-## License
-
-Grafana is distributed under the [Apache 2.0 License](https://github.com/grafana/grafana/blob/master/LICENSE).
diff --git a/grafana/assets/dashboard.png b/grafana/assets/dashboard.png
new file mode 100644
index 00000000..14378246
Binary files /dev/null and b/grafana/assets/dashboard.png differ
diff --git a/grafana/assets/data_configuration_flux.png b/grafana/assets/data_configuration_flux.png
new file mode 100644
index 00000000..eb6f9454
Binary files /dev/null and b/grafana/assets/data_configuration_flux.png differ
diff --git a/grafana/assets/data_configuration_influxql.png b/grafana/assets/data_configuration_influxql.png
new file mode 100644
index 00000000..a03d7851
Binary files /dev/null and b/grafana/assets/data_configuration_influxql.png differ
diff --git a/grafana/assets/grafana-icon.svg b/grafana/assets/grafana-icon.svg
new file mode 100644
index 00000000..6b468ca2
--- /dev/null
+++ b/grafana/assets/grafana-icon.svg
@@ -0,0 +1,14 @@
+
+
+
\ No newline at end of file
diff --git a/grafana/assets/grafana-logo.svg b/grafana/assets/grafana-logo.svg
new file mode 100644
index 00000000..02e25eec
--- /dev/null
+++ b/grafana/assets/grafana-logo.svg
@@ -0,0 +1,22 @@
+
+
+
\ No newline at end of file
diff --git a/grafana/assets/influxdb-datasource.png b/grafana/assets/influxdb-datasource.png
new file mode 100644
index 00000000..5a309a00
Binary files /dev/null and b/grafana/assets/influxdb-datasource.png differ
diff --git a/grafana/assets/integration.png b/grafana/assets/integration.png
new file mode 100644
index 00000000..e16e90e4
Binary files /dev/null and b/grafana/assets/integration.png differ
diff --git a/grafana/assets/login.png b/grafana/assets/login.png
new file mode 100644
index 00000000..0644ed83
Binary files /dev/null and b/grafana/assets/login.png differ
diff --git a/grafana/assets/panel_configuration.png b/grafana/assets/panel_configuration.png
new file mode 100644
index 00000000..e6693c9c
Binary files /dev/null and b/grafana/assets/panel_configuration.png differ
diff --git a/grafana/assets/permissions.png b/grafana/assets/permissions.png
new file mode 100644
index 00000000..0533dff0
Binary files /dev/null and b/grafana/assets/permissions.png differ
diff --git a/grafana/docs/changelog.md b/grafana/docs/changelog.md
deleted file mode 100644
index 0e3cf550..00000000
--- a/grafana/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "grafana/CHANGELOG.md"
diff --git a/grafana/docs/index.md b/grafana/docs/index.md
deleted file mode 100644
index 301212f2..00000000
--- a/grafana/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "grafana/README.md"
diff --git a/grafana/docs/plugin_file.md b/grafana/docs/plugin_file.md
deleted file mode 100644
index 5f3741fb..00000000
--- a/grafana/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "grafana/plugin.json"
-````
diff --git a/grafana/mkdocs.yml b/grafana/mkdocs.yml
deleted file mode 100644
index 744258bb..00000000
--- a/grafana/mkdocs.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-site_name: plugins/grafana
-
-nav:
- - "index.md"
- - Get Started: "get_started.md"
- - Working with Grafana: "working_with_grafana.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/grafana/docs/get_started.md b/grafana/pages/get_started.md
similarity index 62%
rename from grafana/docs/get_started.md
rename to grafana/pages/get_started.md
index f1a08024..783b0a01 100644
--- a/grafana/docs/get_started.md
+++ b/grafana/pages/get_started.md
@@ -6,26 +6,20 @@ First Login
## First Login
-!!! info
-
- Perform initial login using your thinger.io account username and password 'admin'
+> [!NOTE]
+> Perform initial login using your thinger.io account username and password 'admin'
Upon installing the plugin, perform the initial login using your thinger.io account username and the password `admin`. After the first login, the system will prompt you to change the password to a custom one. Once done, you'll gain access to the Grafana workspace, offering a variety of options.
-
-
-
+
## Adding a Datasource
The connection between Thinger.io data and the Grafana plugin is established by adding the buckets database as a `new data source` for Grafana. By default, the configuration for the database is set up with names InfluxDB2-Flux and InfluxDB2-InfluxQL, requiring no further action.
-!!! note
-
- For better performance, it is recommended to use the InfluxQL backend unless you require specific features available only with Flux.
+> [!NOTE]
+> For better performance, it is recommended to use the InfluxQL backend unless you require specific features available only with Flux.
-
-
-
+
However, if needed, you can configure additional data sources. For more information, check [this link](https://grafana.com/docs/grafana/latest/datasources/).
diff --git a/grafana/docs/working_with_grafana.md b/grafana/pages/working_with_grafana.md
similarity index 100%
rename from grafana/docs/working_with_grafana.md
rename to grafana/pages/working_with_grafana.md
diff --git a/grafana/plugin.json b/grafana/plugin.json
index f9057e3b..07567bb0 100644
--- a/grafana/plugin.json
+++ b/grafana/plugin.json
@@ -2,8 +2,11 @@
"name" : "grafana",
"version" : "11.3.0-1",
"description" : "Plugin for running Grafana inside Thinger.io",
- "author" : "Alvaro Luis Bustamante",
+ "author": "Thinger.io",
"license" : "MIT",
+ "deprecated": {
+ "message": "This plugin requires InfluxDB as backend which is no longer available in new instances"
+ },
"repository" : {
"type" : "git",
"url" : "https://github.com/thinger-io/plugins.git",
@@ -12,8 +15,9 @@
"metadata" : {
"name" : "Grafana",
"description" : "Grafana integration for Thinger.io",
- "image" : "docs/assets/grafana-logo.svg",
- "icon" : "https://raw.githubusercontent.com/thinger-io/plugins/main/grafana/docs/assets/grafana-icon.svg"
+ "category" : "monitoring",
+ "image" : "assets/grafana-logo.svg",
+ "icon" : "assets/grafana-icon.svg"
},
"tokens" : {
},
diff --git a/http-device/LICENSE b/http-device/LICENSE
deleted file mode 100644
index fc2c8e0a..00000000
--- a/http-device/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-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/http-device/README.md b/http-device/README.md
index 78287d4d..d426e64e 100644
--- a/http-device/README.md
+++ b/http-device/README.md
@@ -1,7 +1,7 @@
# HTTP Devices
InfluxDB is an open source time series platform. This includes APIs for storing and querying data, processing it in the background for ETL or monitoring and alerting purposes, user dashboards, and visualizing and exploring the data and more.
InfluxDB is the default database backend for Thinger.io. This plugin allows direct access to the underlying installation and the user buckets for custom queries, dashboards, or alerts.
-
-
-
+
## Requirements
@@ -29,7 +27,3 @@ This plugin initializes the following resources
After the plugin is installed, click on the InfluxDB2 plugin and access the interface with you regular Thinger.io username and password.
Note: If the username and password does not work, please, change your Thinger.io password account.
-
-## License
-
-InfluxDB is distributed under the [MIT License](https://github.com/influxdata/influxdb/blob/master/LICENSE).
diff --git a/influxdb2/assets/influxdb.svg b/influxdb2/assets/influxdb.svg
new file mode 100644
index 00000000..c38fd251
--- /dev/null
+++ b/influxdb2/assets/influxdb.svg
@@ -0,0 +1,23 @@
+
+
+
diff --git a/influxdb2/assets/login_page.jpeg b/influxdb2/assets/login_page.jpeg
new file mode 100644
index 00000000..44912f51
Binary files /dev/null and b/influxdb2/assets/login_page.jpeg differ
diff --git a/influxdb2/docs/changelog.md b/influxdb2/docs/changelog.md
deleted file mode 100644
index 4b7ec581..00000000
--- a/influxdb2/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "influxdb2/CHANGELOG.md"
diff --git a/influxdb2/docs/index.md b/influxdb2/docs/index.md
deleted file mode 100644
index 5cb68e38..00000000
--- a/influxdb2/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "influxdb2/README.md"
diff --git a/influxdb2/docs/plugin_file.md b/influxdb2/docs/plugin_file.md
deleted file mode 100644
index 0a6cf48c..00000000
--- a/influxdb2/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "influxdb2/plugin.json"
-````
diff --git a/influxdb2/mkdocs.yml b/influxdb2/mkdocs.yml
deleted file mode 100644
index 5cec0ee8..00000000
--- a/influxdb2/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/influxdb2
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/influxdb2/plugin.json b/influxdb2/plugin.json
index 434cc5b9..95d1eab8 100644
--- a/influxdb2/plugin.json
+++ b/influxdb2/plugin.json
@@ -2,8 +2,11 @@
"name" : "influxdb2",
"version" : "1.0.0",
"description" : "Plugin for InfluxBD2 access",
- "author" : "Alvaro Luis Bustamante",
+ "author": "Thinger.io",
"license" : "MIT",
+ "deprecated": {
+ "message": "InfluxDB is no longer the default time series database. This plugin may not work with your instance"
+ },
"repository" : {
"type" : "git",
"url" : "https://github.com/thinger-io/plugins.git",
@@ -12,8 +15,9 @@
"metadata" : {
"name" : "InfluxDB2",
"description" : "InfluxDB2 Plugin",
- "image" : "docs/assets/influxdb.svg",
- "icon" : "docs/assets/influxdb.svg"
+ "category" : "monitoring",
+ "image" : "assets/influxdb.svg",
+ "icon" : "assets/influxdb.svg"
},
"resources" : {
"proxies" : [
diff --git a/jupyter-minimal/README.md b/jupyter-minimal/README.md
index 1fd20287..e1ecaaa2 100644
--- a/jupyter-minimal/README.md
+++ b/jupyter-minimal/README.md
@@ -2,7 +2,7 @@
# Jupyter Minimal
-
+
Thinger.io plugin for running Jupyter Minimal version on the Cloud, integrating with Thinger.io file storages.
@@ -25,6 +25,4 @@ More details in what this plugins includes can be found [here](https://jupyter-d
## Screenshots
-
Thinger.io plugin for running Jupyter R version on the Cloud, integrating with Thinger.io file storages.
@@ -26,6 +26,4 @@ More details in what this plugins includes can be found [here](https://jupyter-d
## Screenshots
-
Thinger.io plugin for running Jupyter TensorFlow version on the Cloud, integrating with Thinger.io file storages.
@@ -27,6 +27,4 @@ More details in what this plugins includes can be found [here](https://jupyter-d
## Screenshots
-
-
-
+
diff --git a/jupyter-tensorflow/assets/jupyter-thinger.png b/jupyter-tensorflow/assets/jupyter-thinger.png
new file mode 100644
index 00000000..ec4b73f0
Binary files /dev/null and b/jupyter-tensorflow/assets/jupyter-thinger.png differ
diff --git a/jupyter-tensorflow/assets/jupyter_icon.svg b/jupyter-tensorflow/assets/jupyter_icon.svg
new file mode 100644
index 00000000..2cd40ad2
--- /dev/null
+++ b/jupyter-tensorflow/assets/jupyter_icon.svg
@@ -0,0 +1,182 @@
+
+
+
+
diff --git a/jupyter-tensorflow/assets/jupyter_image.svg b/jupyter-tensorflow/assets/jupyter_image.svg
new file mode 100644
index 00000000..94cb1e5f
--- /dev/null
+++ b/jupyter-tensorflow/assets/jupyter_image.svg
@@ -0,0 +1,199 @@
+
+
+
+
diff --git a/jupyter-tensorflow/docs/changelog.md b/jupyter-tensorflow/docs/changelog.md
deleted file mode 100644
index d793058d..00000000
--- a/jupyter-tensorflow/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "jupyter-tensorflow/CHANGELOG.md"
diff --git a/jupyter-tensorflow/docs/index.md b/jupyter-tensorflow/docs/index.md
deleted file mode 100644
index a0e486c3..00000000
--- a/jupyter-tensorflow/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "jupyter-tensorflow/README.md"
diff --git a/jupyter-tensorflow/docs/plugin_file.md b/jupyter-tensorflow/docs/plugin_file.md
deleted file mode 100644
index 57e4d925..00000000
--- a/jupyter-tensorflow/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "jupyter-tensorflow/plugin.json"
-````
diff --git a/jupyter-tensorflow/mkdocs.yml b/jupyter-tensorflow/mkdocs.yml
deleted file mode 100644
index f3d86fe7..00000000
--- a/jupyter-tensorflow/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/jupyter-tensorflow
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/jupyter-tensorflow/plugin.json b/jupyter-tensorflow/plugin.json
index 82798723..c0eed5f5 100644
--- a/jupyter-tensorflow/plugin.json
+++ b/jupyter-tensorflow/plugin.json
@@ -2,7 +2,7 @@
"name" : "jupyter-tensorflow",
"version" : "2.11.0-5",
"description" : "Jupyter Tensorflow Plugin for Thinger.io",
- "author" : "Alvaro Luis Bustamante",
+ "author": "Thinger.io",
"license" : "MIT",
"repository" : {
"type" : "git",
@@ -12,8 +12,9 @@
"metadata" : {
"name" : "Jupyter TensorFlow",
"description" : "Jupyter Plugin for Thinger.io",
- "image" : "docs/assets/jupyter_image.svg",
- "icon" : "docs/assets/jupyter_icon.svg"
+ "category" : "development",
+ "image" : "assets/jupyter_image.svg",
+ "icon" : "assets/jupyter_icon.svg"
},
"task": {
"type": "docker",
diff --git a/lorawan-product-template/LICENSE.md b/lorawan-product-template/LICENSE.md
deleted file mode 100644
index f1bacd61..00000000
--- a/lorawan-product-template/LICENSE.md
+++ /dev/null
@@ -1,7 +0,0 @@
-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/lorawan-product-template/README.md b/lorawan-product-template/README.md
index 09e0b346..77eb1ad6 100644
--- a/lorawan-product-template/README.md
+++ b/lorawan-product-template/README.md
@@ -1,7 +1,7 @@
# LoRaWAN Thinger.io Product Template
-
+
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.
diff --git a/lorawan-product-template/docs/changelog.md b/lorawan-product-template/docs/changelog.md
deleted file mode 100644
index d3c5b0bd..00000000
--- a/lorawan-product-template/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "lorawan-product-template/CHANGELOG.md"
diff --git a/lorawan-product-template/docs/index.md b/lorawan-product-template/docs/index.md
deleted file mode 100644
index 6db5b08f..00000000
--- a/lorawan-product-template/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "lorawan-product-template/README.md"
diff --git a/lorawan-product-template/docs/plugin_file.md b/lorawan-product-template/docs/plugin_file.md
deleted file mode 100644
index 9260e69a..00000000
--- a/lorawan-product-template/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-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
deleted file mode 100644
index 6f569d04..00000000
--- a/lorawan-product-template/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-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
index 096233f5..f6317cca 100644
--- a/lorawan-product-template/plugin.json
+++ b/lorawan-product-template/plugin.json
@@ -12,7 +12,8 @@
"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"
+ "category": "templates",
+ "image": "assets/lorawan.png"
},
"resources": {
"products": [
diff --git a/loriot/LICENSE b/loriot/LICENSE
deleted file mode 100644
index 0631ba07..00000000
--- a/loriot/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-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/loriot/README.md b/loriot/README.md
index d4759443..7a7b599c 100644
--- a/loriot/README.md
+++ b/loriot/README.md
@@ -2,7 +2,7 @@
# LORIOT
-
+
LORIOT 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.
@@ -17,9 +17,7 @@ This plugin requires that devices in LORIOT applications to be of homogeneous ty
The first step is to install the plugin in your Thinger.io account ([How to install a plugin](https://marketplace.thinger.io/plugins/managing/#install-and-deploy-an-existent-plugin)).
-
-
-
+
### Plugin Configuration
@@ -29,15 +27,11 @@ After installing this plugin, access the plugin configuration page and on the Ap
- **Device Id Prefix**: A prefix to be used for the device identifiers. The plugin will automatically append the device EUI to this prefix to create the device identifier. This prefix is necessary for the device autoprovision features.
- **LORIOT Access Token**: The LORIOT Application Access Token. Please refer to the [LORIOT Access Token documentation](https://docs.loriot.io/space/NMS/6031583/Access+Tokens) to learn how to obtain this token.
-
-
-
+
Don't close the plugin configuration page yet, you will need to configure the LORIOT Webhook to send the device data to Thinger.io.
-
-
-
+
### LORIOT Webhook Configuration
@@ -48,9 +42,7 @@ To integrate LORIOT with Thinger.io, you need to configure a Webhook in LORIOT t
2. In the application configuration, go to `Output` and click on `Add new output`.
3. Select `HTTP Push` as the output type and fill out the configuration with the seetings found in the plugin configuration page:
-
-
-
+
If you [check the logs](https://marketplace.thinger.io/plugins/managing/#analyzing-the-logs) in the LORIOT Thinger.io Plugin, you should see the messages being received from LORIOT. However, the devices are not yet provisioned in Thinger.io, so the messages are being discarded.
@@ -66,15 +58,11 @@ Device templates define the device data structure and the processing functions f
In Thinger.io device templates are also plugins, checkout the Plugins Marketplace to find the device template that fits your device. In case you cannot find a device template for your device, you can create your own device template, please refer to section [Create Your Own Device Template](#create-your-own-device-template).
-
-
-
+
Once installed, in Products you'll see your new installed device templates. By default the device templates have a predefined prefix, make sure to change it to match the prefix you used when creating the LORIOT application in the plugin.
-
+
## Thinger.io and Node-RED integration
@@ -44,19 +42,19 @@ The "Nodes" are the basic building blocks for creating flows. Each node contains
#### **Inject Nodes**
-
+
This node allows to automatically start a flow when an event is triggered, at regular intervals defined in the properties form or manually over the web editor. The message sent by these nodes has the payload and topic properties set.
**Function, Change, Switch Nodes**
-
+
Node-RED counts with some nodes that allows working with the flow's payload using pre-configured tools or coding their behavior in JavaScript functions that can be created within the editor using a rich text editor. With this proposal, these nodes are provided with both input and output connectors.
**Output and Debug Nodes**
-
+
These nodes only have an input connector that allows extracting data from the flow to third parties, files, or debugs console in the web editor.
@@ -70,9 +68,7 @@ A flow is represented as a tab within the editor workspace and is the main way t
The flow editor makes it easy to wire together flows using the wide range of nodes in the palette. Flows can be then deployed to the runtime just clicking into "debloy" button:
-
-
-
+
### Debug Console
@@ -80,9 +76,8 @@ Is a section of the right slide bar that provides a structured view of the messa
Alongside each message, the debug sidebar includes information about the time the message was received and which Debug node sent it. Clicking on the source node id will reveal that node within the workspace.
-!!! note "Node-RED documentation"
-
- You can find additional documentation about the use of this tool in Node-RED's official website: [https://nodered.org/docs/user-guide/editor/workspace/](https://nodered.org/docs/user-guide/editor/workspace/)
+> [!NOTE] Node-RED documentation
+> You can find additional documentation about the use of this tool in Node-RED's official website: [https://nodered.org/docs/user-guide/editor/workspace/](https://nodered.org/docs/user-guide/editor/workspace/)
## Starting with Thinger.io Nodes
@@ -90,21 +85,16 @@ In this section, it is described **how to configure Node-RED** "Thinger.io Nodes
To make this configuration, just drag any Thinger.io Node to the canvas and open its properties form, then go to the last input, called "Server " and click into the edition button, which will open the Thinger-Server configuration menu.
-
-
-
+
This form allows you to introduce the credentials of the specific Thinger.io instance address and authorization that is going to receive your Node-RED requests. However, it is important to take care of the next considerations in order to make a proper configuration:
-!!! tip
-
- * If you are using Node-RED in a Thinger.io Plugin and you want to work with the same Thinger.io server that is hosting the plugin, it is only necessary to include `$(THINGER_HOST)` into "Host" box and `$(THINGER_TOKEN_NODE_RED_PLUGIN)` in the "Token" box, then you can disable SSL communication, as all messages are going to run into the same computer.
+> [!TIP]
+> * If you are using Node-RED in a Thinger.io Plugin and you want to work with the same Thinger.io server that is hosting the plugin, it is only necessary to include `$(THINGER_HOST)` into "Host" box and `$(THINGER_TOKEN_NODE_RED_PLUGIN)` in the "Token" box, then you can disable SSL communication, as all messages are going to run into the same computer.
* if you want to use a different Thinger.io Server or you aren't running Node-RED from a plugin, it will be necessary to **include its URL or IP Address** in the "Host" box and also a Thinger.io **Access Token with Admin-Access** privileges in the "Token" box, finally, SSL would be preferable in this case.
-
-
-
+
## Thinger.io Nodes
@@ -112,7 +102,7 @@ As it was explained in the beginning, this plugin has two purposes: Host a Node-
### Asset Iterator
-
+
It is a **Function** Node that iterates over all the desired assets avaible on Thinger.io Platform given a filter. It is able to receive a JSON from Node-RED flow and automatically query the backend. This node is useful to execute operations over multiple assets at the same time.
@@ -122,7 +112,7 @@ There will be as many output messages as assets retrieved, each containing the i
### Bucket Create
-
+
It is a **Function** Node that creates a Data Bucket into a Thinger.io Platform. It is able to receive a JSON from Node-RED flow and automatically create the Bucket, so results quite useful to implement scalable and on demand data storage to any project.
@@ -132,7 +122,7 @@ The output message will contain the result and details of the operation.
### Bucket Export
-
+
It is a **Function** Node that executes a Thinger.io Data Bucket export operation and waits until the data is ready to be downloaded, returning the download file URL or the contents as desired. It is useful to extract data from Thinger.io for further analysis, storage or forwarding to other services.
@@ -140,7 +130,7 @@ The configuration of this Node requires introducing of at least the `Bucket ID`,
### Bucket Read
-
+
It is a **Function** Node that retrieves data from a specific Thinger.io Data Bucket when an injection Node requires it. It is useful to get data from buckets with a Node-RED programmed sampling interval.
@@ -148,7 +138,7 @@ To configure this node just include the `Bucket ID`, `Filter` and `Sorting` into
### Bucket Write
-
+
It is an **Output** Node that allows to store data into the Thinger.io Data Bucket. It is able to receive a JSON from Node-RED flow and automatically create an entry into the Bucket, so results quite useful to implement scalable data storage to any project.
@@ -156,7 +146,7 @@ The configuration of this Node just requires introducing the `Bucket ID`, howeve
### Device Callback
-
+
It is a **Function** Node that calls an HTTP device callback in order to send a message or retrieve what the device has configured in its callback. If the device does not exist it will manage the auto provisioning of a new device and data bucket. It is useful to get auto provision new devices based of different events save its data from the beginning.
@@ -164,7 +154,7 @@ To configure this node just include the `Device ID` into the node parameters for
### Device Create
-
+
It is a **Function** Node that creates a Device into the Thinger.io Platform. It is able to receive a JSON from Node-RED flow and automatically create the Device, so results quite useful to implement scalable and on demand device creation to any project.
@@ -174,7 +164,7 @@ The output message will contain the result and details of the operation.
### Device Read
-
+
It is a **Function** Node that retrieves data from a specific Thinger.io device resource when an injection Node requires it. It is useful to get data from devices with a Node-RED programmed sampling interval.
@@ -182,7 +172,7 @@ To configure this node just include the `Device ID`and the `Resource Name` into
### Device Stream
-
+
It is an **Injection** Node that retrieves data from a specific Thinger.io Device Resource on regular defined interval expressed in seconds into the properties form.
@@ -190,7 +180,7 @@ To configure this node just include the `Device ID`and the `Resource Name` into
### Device Write
-
+
It is a **Function** Node that allows sending data to a Thinger.io connected Device. It is able to receive a JSON from Node-RED flow and automatically send it to other devices in real-time. So results quite useful to implement scalable device communication for any project.
@@ -198,7 +188,7 @@ The configuration of this Node just requires introducing the `Device ID` and the
### Endpoint Call
-
+
It is a **Function** Node that allows calling the execution of a Thinger.io endpoint profile. It is able to receive a JSON that can be introduced in the endpoint in order to use that data in an e-mail or send it to third parties, so it is quite useful to create notifications or to integrating an IoT project with other systems.
@@ -206,7 +196,7 @@ The configuration of this Node just requires introducing the `Endpoint ID`, howe
### Property Read
-
+
It is a **Function** Node that retrieves data from a specific Thinger.io device, type or group property when an injection Node requires it. It is useful to get data from assets with a Node-RED programmed sampling interval.
@@ -214,7 +204,7 @@ To configure this node just include the `Asset Type`, `Asset ID`and `Property Na
### Property Write
-
+
It is a **Function** Node that writes data into a specific Thinger.io device, type or group property when an injection Node requires it. It is useful to save data into assets in order to manage different configurations and act accordingly.
@@ -222,7 +212,7 @@ To configure this node just include the `Asset Type`, `Asset ID`and `Property Na
### Storage Read
-
+
It is a **Function** Node that reads any file saved in a Thinger.io storage and returns it to Node-RED. It is able to read any file, returning the string representation for text files (plain, csv, json, ...) or a Buffer otherwise. Useful for retrieving and treating information or being able to pass the info to third party nodes.
@@ -230,7 +220,7 @@ The configuration of the node requires only the `Storage ID`, as it is able to r
### Storage Write
-
+
It is an **Output** Node that allows to store data into the Thinger.io File Storage. It is able to receive a payload from Node-RED flow and automatically save or append into a file in the Storage, so results quite useful to implement scalable file storage to any project.
@@ -238,7 +228,7 @@ The configuration of this Node just requires introducing the `Storage ID`, howev
### Server Events
-
+
It is an **Inject** Node that allows triggering in real-time any event that takes places in Thinger.io IoT Server over all existing assets, like device, types, groups or buckets. Some events contain also additional filter fields to filter from.
@@ -246,9 +236,8 @@ The configuration of each type requires to include the ID of the element that wa
When any of these events is triggered, this Node is able to inject a JSON in the flow with the identifier of the Bucket, Device, or Endpoint that has produced the event along with the relevant data.
-!!! tip
-
- If you need further technical information, you can find all the details for each node in Node-RED help dialog.
+> [!TIP]
+> If you need further technical information, you can find all the details for each node in Node-RED help dialog.
## Useful Example Flows
@@ -258,15 +247,12 @@ In this section, you can find our own cookbook with some useful flows that you c
Using the "Device Status Change" property of the Server Event Node, it is possible to detect the disconnection of any device of your IoT network and execute a flow in Node-RED to notify the incidence using an endpoint sending an email for example.
- !!! warning
-
- [Learn how to create an email endpoint here. ](https://docs.thinger.io/features/endpoints-1#email-endpoint)
+ > [!WARNING]
+ > [Learn how to create an email endpoint here. ](https://docs.thinger.io/features/endpoints-1#email-endpoint)
The next flow uses two Thinger.io Nodes, the first one is triggering the Device Disconnection Server Event that will throw a JSON formatted message with the device ID, the status and the timestamp of the change. The second Node allows calling the Endpoint profile to send the alert with the device information JSON attached so it is possible to custom the message to easily identify the problem.
-
-
-
+ 
This flow can be easily imported into your Node-RED workspace using the next JSON:
@@ -280,12 +266,10 @@ In this section, you can find our own cookbook with some useful flows that you c
MQTT is an extended communication protocol in IoT that works on top of the TCP/IP protocol suite. It is designed for connections with remote locations where a "small code footprint" is required or the network bandwidth is limited. The next flow allows sending data from a device hosted by NodeRED MQTT Server to the REST API Callback of a Thinger.io HTTP device, in order to store, analyze an show that information with Thinger.io features.
- !!! info
- [Learn how to work with Thinger.io HTTP device callback here](https://docs.thinger.io/http-devices)
+ > [!NOTE]
+ > [Learn how to work with Thinger.io HTTP device callback here](https://docs.thinger.io/http-devices)
-
-
-
+ 
This flow can be easily imported into your Node-RED workspace using the next JSON:
@@ -299,15 +283,12 @@ In this section, you can find our own cookbook with some useful flows that you c
Geofencing is an interesting IoT use case, with many applications in asset management, fleets or package tracking. The next flow shows how to monitor the location of any device to create an alert when it leaves an area specified with a Geofence Node.
-
-
-
+ 
Creating this integration with the "device\_location" property, it is possible to integrate any kind of device including Thinger.io Software Clients, Sigfox, TTN or even HTTP devices in a very simple way.
- !!! info
-
- [Learn how to create an email endpoint here. ](https://docs.thinger.io/console#email-endpoint)
+ > [!NOTE]
+ > [Learn how to create an email endpoint here. ](https://docs.thinger.io/console#email-endpoint)
This flow can be easily imported into your Node-RED workspace using the next JSON:
@@ -315,14 +296,11 @@ In this section, you can find our own cookbook with some useful flows that you c
[{"id":"5f747490.ef8edc","type":"tab","label":"GPS Geofences","disabled":false,"info":""},{"id":"207937f8.10dc48","type":"server-events","z":"5f747490.ef8edc","name":"","asset":"","event":"device_callback_call","filter":"","filters":{},"bucket":"","device":"","endpoint":"","state":"","server":"ec0dd4b1ef5aa9a8","x":158.60000228881836,"y":264.00000381469727,"wires":[["8f3dd8cd.71e4e8","56adf62.4aa1108"]]},{"id":"553ff10.2e60c1","type":"geofence","z":"5f747490.ef8edc","name":"","mode":"polyline","inside":"false","rad":0,"points":[{"latitude":39.89203705190782,"longitude":-3.8814695924520493},{"latitude":40.06041580712444,"longitude":-3.507934436202049},{"latitude":40.09404176311921,"longitude":-3.0025633424520493},{"latitude":41.14474248673421,"longitude":-3.5299070924520493},{"latitude":40.253538217286675,"longitude":-4.628539904952049},{"latitude":40.102445657515226,"longitude":-3.771606311202049}],"centre":{},"floor":"","ceiling":"","worldmap":false,"outputs":1,"x":573.0000076293945,"y":265.0000276565552,"wires":[["be251c21.6d6e3","233f843b.94472c"]]},{"id":"be251c21.6d6e3","type":"endpoint-call","z":"5f747490.ef8edc","name":"","endpoint":"alert","server":"ec0dd4b1ef5aa9a8","x":771.6000595092773,"y":266.0000286102295,"wires":[[]]},{"id":"8f3dd8cd.71e4e8","type":"debug","z":"5f747490.ef8edc","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":399.6000061035156,"y":346.00000762939453,"wires":[]},{"id":"233f843b.94472c","type":"debug","z":"5f747490.ef8edc","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":790.6000366210938,"y":347.0000057220459,"wires":[]},{"id":"56adf62.4aa1108","type":"change","z":"5f747490.ef8edc","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":389.6000061035156,"y":265.00000381469727,"wires":[["553ff10.2e60c1"]]},{"id":"ec0dd4b1ef5aa9a8","type":"thinger-server","host":"$(THINGER_HOST)","name":"local","ssl":false}]
```
-
=== "Modify Incoming data"
In some situations it is required to change the unit or metric of any variable, it is now possible to make this transformations before store data in a data bucket by use this Node-RED flow:
-
-
-
+ 
The configuration is quite simple, fist node retrieves the measurement of any device to be modified by the "function" node, that contains the codification that has been included below, and finally the "bucket write" node allows storing the transformed data.
@@ -344,9 +322,7 @@ In this section, you can find our own cookbook with some useful flows that you c
With the "Device create" and "Bucket create" nodes it is possible to create multiple devices, with the same or different credentials, types or groups; and create buckets associated to the recently created devices.
-
-
-
+ 
This flow can be easily imported into your Node-RED workspace using the next JSON:
@@ -354,6 +330,5 @@ In this section, you can find our own cookbook with some useful flows that you c
[{"id":"a4b9f2e08c15ad79","type":"tab","label":"Device creation","disabled":false,"info":"","env":[]},{"id":"507f1a24287e53e2","type":"function","z":"a4b9f2e08c15ad79","name":"loop - 10 devices","func":"let device = msg.device;\n\nfor (let i= 0; i < 10; i++) {\n msg.device = `${device}_${i}`;\n msg.name = `${device} ${i}`;\n msg.description = \"Device auto generated from Node-RED flow\";\n node.send(msg);\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":490,"y":220,"wires":[["752ee26eb02bed51"]]},{"id":"415e0ad528c64866","type":"inject","z":"a4b9f2e08c15ad79","name":"inject device name","props":[{"p":"device","v":"climastick","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":270,"y":220,"wires":[["507f1a24287e53e2"]]},{"id":"752ee26eb02bed51","type":"device-create","z":"a4b9f2e08c15ad79","name":"","deviceType":"Generic","deviceId":"","deviceCredentials":"&Xzi3LlG&lyaoyO2","deviceName":"","description":"","assetType":"temperature","assetGroup":"house","server":"ec0dd4b1ef5aa9a8","x":690,"y":220,"wires":[["e1da854b042efd77"]]},{"id":"69d16e383e46acd9","type":"debug","z":"a4b9f2e08c15ad79","name":"debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":715,"y":300,"wires":[],"l":false},{"id":"3be83c6bcc65f1cb","type":"comment","z":"a4b9f2e08c15ad79","name":"Create 10 device and assign a bucket to all of them","info":"This node creates 10 devices in Thinger.io Platform, in this case climasticks, from 0 to 9; all of them with the same credentials, type and group. Also, 10 buckets are created with the date source being the devices created.\n\n### Device create node\nThe device id, name and description are passed as input to the device create node, while the credentials, type and group is configured through the device create node dialog.\n\n### Bucket create node\nThe id, bucket name and description are passed as input to the bucket create node, as well as the extra source (the device in this case) for the data source.\nThe source (device), resource, update interval and asset type and group are configured through the bucket create node dialog.","x":350,"y":160,"wires":[]},{"id":"05af9a7c2958e6c6","type":"bucket-create","z":"a4b9f2e08c15ad79","name":"","bucketId":"","bucket":"","description":"","enabled":true,"source":"device","extraSource":"","resource":"temperature","update":"interval","interval":"1m","assetType":"temperature","assetGroup":"house","server":"ec0dd4b1ef5aa9a8","x":570,"y":300,"wires":[["69d16e383e46acd9"]]},{"id":"e1da854b042efd77","type":"change","z":"a4b9f2e08c15ad79","name":"Reorder message to create bucket","rules":[{"t":"delete","p":"payload","pt":"msg"},{"t":"set","p":"id","pt":"msg","to":"device","tot":"msg"},{"t":"move","p":"name","pt":"msg","to":"bucket","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":320,"y":300,"wires":[["05af9a7c2958e6c6"]]},{"id":"ec0dd4b1ef5aa9a8","type":"thinger-server","host":"$(THINGER_HOST)","name":"local","ssl":false}]
```
- !!! info
-
- Learn how to create devices [here](https://docs.thinger.io/features/devices-administration), and data buckets [here](https://docs.thinger.io/features/buckets)
+ > [!NOTE]
+ > Learn how to create devices [here](https://docs.thinger.io/features/devices-administration), and data buckets [here](https://docs.thinger.io/features/buckets)
diff --git a/node-red/assets/button-deploy.png b/node-red/assets/button-deploy.png
new file mode 100644
index 00000000..12bd6b1e
Binary files /dev/null and b/node-red/assets/button-deploy.png differ
diff --git a/node-red/assets/flow-device-creation.png b/node-red/assets/flow-device-creation.png
new file mode 100644
index 00000000..10bb9c82
Binary files /dev/null and b/node-red/assets/flow-device-creation.png differ
diff --git a/node-red/assets/flow-device-disconnection-alert.png b/node-red/assets/flow-device-disconnection-alert.png
new file mode 100644
index 00000000..d3c62923
Binary files /dev/null and b/node-red/assets/flow-device-disconnection-alert.png differ
diff --git a/node-red/assets/flow-gps-geofences.png b/node-red/assets/flow-gps-geofences.png
new file mode 100644
index 00000000..05c2e40d
Binary files /dev/null and b/node-red/assets/flow-gps-geofences.png differ
diff --git a/node-red/assets/flow-modify-incoming-data.png b/node-red/assets/flow-modify-incoming-data.png
new file mode 100644
index 00000000..9693a0d7
Binary files /dev/null and b/node-red/assets/flow-modify-incoming-data.png differ
diff --git a/node-red/assets/flow-mqtt-to-thinger.png b/node-red/assets/flow-mqtt-to-thinger.png
new file mode 100644
index 00000000..6f3dd153
Binary files /dev/null and b/node-red/assets/flow-mqtt-to-thinger.png differ
diff --git a/node-red/assets/laptop.png b/node-red/assets/laptop.png
new file mode 100644
index 00000000..fa4c0bbe
Binary files /dev/null and b/node-red/assets/laptop.png differ
diff --git a/node-red/assets/node-asset-iterator.png b/node-red/assets/node-asset-iterator.png
new file mode 100644
index 00000000..8d60095a
Binary files /dev/null and b/node-red/assets/node-asset-iterator.png differ
diff --git a/node-red/assets/node-bucket-create.png b/node-red/assets/node-bucket-create.png
new file mode 100644
index 00000000..269cff01
Binary files /dev/null and b/node-red/assets/node-bucket-create.png differ
diff --git a/node-red/assets/node-bucket-export.png b/node-red/assets/node-bucket-export.png
new file mode 100644
index 00000000..8af2fdb1
Binary files /dev/null and b/node-red/assets/node-bucket-export.png differ
diff --git a/node-red/assets/node-bucket-read.png b/node-red/assets/node-bucket-read.png
new file mode 100644
index 00000000..fd28ce24
Binary files /dev/null and b/node-red/assets/node-bucket-read.png differ
diff --git a/node-red/assets/node-bucket-write.png b/node-red/assets/node-bucket-write.png
new file mode 100644
index 00000000..c4c2345a
Binary files /dev/null and b/node-red/assets/node-bucket-write.png differ
diff --git a/node-red/assets/node-debug.png b/node-red/assets/node-debug.png
new file mode 100644
index 00000000..1e6e7b0e
Binary files /dev/null and b/node-red/assets/node-debug.png differ
diff --git a/node-red/assets/node-device-callback.png b/node-red/assets/node-device-callback.png
new file mode 100644
index 00000000..f91cf776
Binary files /dev/null and b/node-red/assets/node-device-callback.png differ
diff --git a/node-red/assets/node-device-create.png b/node-red/assets/node-device-create.png
new file mode 100644
index 00000000..d11a1a92
Binary files /dev/null and b/node-red/assets/node-device-create.png differ
diff --git a/node-red/assets/node-device-read.png b/node-red/assets/node-device-read.png
new file mode 100644
index 00000000..cfc819d7
Binary files /dev/null and b/node-red/assets/node-device-read.png differ
diff --git a/node-red/assets/node-device-stream.png b/node-red/assets/node-device-stream.png
new file mode 100644
index 00000000..1232d257
Binary files /dev/null and b/node-red/assets/node-device-stream.png differ
diff --git a/node-red/assets/node-device-write.png b/node-red/assets/node-device-write.png
new file mode 100644
index 00000000..022ad580
Binary files /dev/null and b/node-red/assets/node-device-write.png differ
diff --git a/node-red/assets/node-endpoint-call.png b/node-red/assets/node-endpoint-call.png
new file mode 100644
index 00000000..7248497b
Binary files /dev/null and b/node-red/assets/node-endpoint-call.png differ
diff --git a/node-red/assets/node-form.png b/node-red/assets/node-form.png
new file mode 100644
index 00000000..aa984490
Binary files /dev/null and b/node-red/assets/node-form.png differ
diff --git a/node-red/assets/node-function.png b/node-red/assets/node-function.png
new file mode 100644
index 00000000..8d0b1af2
Binary files /dev/null and b/node-red/assets/node-function.png differ
diff --git a/node-red/assets/node-inject.png b/node-red/assets/node-inject.png
new file mode 100644
index 00000000..943cc84e
Binary files /dev/null and b/node-red/assets/node-inject.png differ
diff --git a/node-red/assets/node-property-read.png b/node-red/assets/node-property-read.png
new file mode 100644
index 00000000..72ead530
Binary files /dev/null and b/node-red/assets/node-property-read.png differ
diff --git a/node-red/assets/node-property-write.png b/node-red/assets/node-property-write.png
new file mode 100644
index 00000000..7242db75
Binary files /dev/null and b/node-red/assets/node-property-write.png differ
diff --git a/node-red/assets/node-red-icon.svg b/node-red/assets/node-red-icon.svg
new file mode 100644
index 00000000..e412dce6
--- /dev/null
+++ b/node-red/assets/node-red-icon.svg
@@ -0,0 +1,33 @@
+
+
+
\ No newline at end of file
diff --git a/node-red/assets/node-red-logo.svg b/node-red/assets/node-red-logo.svg
new file mode 100644
index 00000000..45b8108d
--- /dev/null
+++ b/node-red/assets/node-red-logo.svg
@@ -0,0 +1,30 @@
+
+
+
\ No newline at end of file
diff --git a/node-red/assets/node-server-configuration.png b/node-red/assets/node-server-configuration.png
new file mode 100644
index 00000000..f1c90f3a
Binary files /dev/null and b/node-red/assets/node-server-configuration.png differ
diff --git a/node-red/assets/node-server-events.png b/node-red/assets/node-server-events.png
new file mode 100644
index 00000000..9f6c2611
Binary files /dev/null and b/node-red/assets/node-server-events.png differ
diff --git a/node-red/assets/node-storage-read.png b/node-red/assets/node-storage-read.png
new file mode 100644
index 00000000..ae61a00d
Binary files /dev/null and b/node-red/assets/node-storage-read.png differ
diff --git a/node-red/assets/node-storage-write.png b/node-red/assets/node-storage-write.png
new file mode 100644
index 00000000..52c054ee
Binary files /dev/null and b/node-red/assets/node-storage-write.png differ
diff --git a/node-red/docs/changelog.md b/node-red/docs/changelog.md
deleted file mode 100644
index 09aa1962..00000000
--- a/node-red/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "node-red/CHANGELOG.md"
diff --git a/node-red/docs/index.md b/node-red/docs/index.md
deleted file mode 100644
index 4885d4c5..00000000
--- a/node-red/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "node-red/README.md"
diff --git a/node-red/docs/plugin_file.md b/node-red/docs/plugin_file.md
deleted file mode 100644
index 4356a47b..00000000
--- a/node-red/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "node-red/plugin.json"
-````
diff --git a/node-red/mkdocs.yml b/node-red/mkdocs.yml
deleted file mode 100644
index 5c1a29c8..00000000
--- a/node-red/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/node-red
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/node-red/plugin.json b/node-red/plugin.json
index 72bfb345..d3566a1e 100644
--- a/node-red/plugin.json
+++ b/node-red/plugin.json
@@ -2,7 +2,7 @@
"name" : "node-red",
"version" : "1.9.2-1",
"description" : "Plugin for Node-RED integration",
- "author" : "Alvaro Luis Bustamante",
+ "author": "Thinger.io",
"license" : "MIT",
"repository" : {
"type" : "git",
@@ -12,8 +12,9 @@
"metadata" : {
"name" : "Node-RED",
"description" : "Node-RED integration for Thinger.io",
- "image" : "docs/assets/node-red-logo.svg",
- "icon" : "https://raw.githubusercontent.com/thinger-io/plugins/main/node-red/docs/assets/node-red-icon.svg"
+ "category" : "development",
+ "image" : "assets/node-red-logo.svg",
+ "icon" : "assets/node-red-icon.svg"
},
"tokens" : {
"node_red_plugin" : {
diff --git a/prometheus-exporter/LICENSE b/prometheus-exporter/LICENSE
deleted file mode 100644
index 7bb3be2e..00000000
--- a/prometheus-exporter/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2024-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/prometheus-exporter/README.md b/prometheus-exporter/README.md
index 9f7b0224..81028b9d 100644
--- a/prometheus-exporter/README.md
+++ b/prometheus-exporter/README.md
@@ -2,7 +2,7 @@
# Prometheus Exporter
Prometheus is an open-source monitoring system and time series database that allows you to collect and store metrics about your infrastructure and applications, and provides a powerful query language called PromQL that you can use to analyze and graph these metrics.
@@ -21,21 +21,17 @@ In order for the connection to take place, edit the file by introducing your det
This file can also be used to configure external systems scraping.
-!!! note
+> [!NOTE]
+> Check out also the [Alertmanager plugin](https://marketplace.thinger.io/plugins/alertmanager)
- Check out also the [Alertmanager plugin](https://marketplace.thinger.io/plugins/alertmanager)
-
-
-
-
+
## Integration with Grafana
Grafana provides native support for Prometheus, therefore, we can configure a connection between the two plugins.
-!!! note
-
- Refer to the [Grafana plugin page](https://marketplace.thinger.io/plugins/grafana) if you need more details on how to get started
+> [!NOTE]
+> Refer to the [Grafana plugin page](https://marketplace.thinger.io/plugins/grafana) if you need more details on how to get started
Once grafana in installed and logged in, you may go to 'Settings'->'Data sources'. Click on `Add data source` and click on 'Prometheus'.
The data to configure the Prometheus as data source you'll need:
@@ -43,9 +39,7 @@ The data to configure the Prometheus as data source you'll need:
And thats it, you may start now creating dashboard in grafana with prometheus as the backend.
-
-
-
+
## Official Documentation
@@ -53,10 +47,5 @@ The Prometheus documentation is available at [prometheus.io/docs](https://promet
More details regarding the configuration of Prometheus at [this link](https://prometheus.io/docs/prometheus/latest/configuration/configuration/).
-!!! note
-
- Any configuration change in `prometheus.yml` requires a restart of the Prometheus plugin.
-
-## License
-
-Prometheus is distributed under the [Apache 2.0 License](https://prometheus.io/docs/introduction/faq/#what-license-is-prometheus-released-under).
+> [!NOTE]
+> Any configuration change in `prometheus.yml` requires a restart of the Prometheus plugin.
diff --git a/prometheus/assets/grafana-dashboard.png b/prometheus/assets/grafana-dashboard.png
new file mode 100644
index 00000000..6a414996
Binary files /dev/null and b/prometheus/assets/grafana-dashboard.png differ
diff --git a/prometheus/assets/prometheus-logo.svg b/prometheus/assets/prometheus-logo.svg
new file mode 100644
index 00000000..48a53b6b
--- /dev/null
+++ b/prometheus/assets/prometheus-logo.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/prometheus/assets/query.png b/prometheus/assets/query.png
new file mode 100644
index 00000000..7af150cf
Binary files /dev/null and b/prometheus/assets/query.png differ
diff --git a/prometheus/docs/changelog.md b/prometheus/docs/changelog.md
deleted file mode 100644
index f80fa094..00000000
--- a/prometheus/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "prometheus/CHANGELOG.md"
diff --git a/prometheus/docs/index.md b/prometheus/docs/index.md
deleted file mode 100644
index 5a31f3ce..00000000
--- a/prometheus/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "prometheus/README.md"
diff --git a/prometheus/docs/plugin_file.md b/prometheus/docs/plugin_file.md
deleted file mode 100644
index 2fc4d557..00000000
--- a/prometheus/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "prometheus/plugin.json"
-````
diff --git a/prometheus/mkdocs.yml b/prometheus/mkdocs.yml
deleted file mode 100644
index 87b18d72..00000000
--- a/prometheus/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/prometheus
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/prometheus/plugin.json b/prometheus/plugin.json
index a47b7b06..d0946daf 100644
--- a/prometheus/plugin.json
+++ b/prometheus/plugin.json
@@ -2,7 +2,7 @@
"name" : "prometheus",
"version" : "2.46.0-1",
"description" : "Prometheus monitoring system",
- "author" : "Jaime Bautista",
+ "author": "Thinger.io",
"license" : "MIT",
"repository" : {
"type" : "git",
@@ -12,8 +12,9 @@
"metadata" : {
"name" : "Prometheus",
"description" : "Integration of Prometheus with Thinger.io",
- "image" : "docs/assets/prometheus-logo.svg",
- "icon" : "docs/assets/prometheus-logo.svg"
+ "category" : "monitoring",
+ "image" : "assets/prometheus-logo.svg",
+ "icon" : "assets/prometheus-logo.svg"
},
"tokens" : {
"prometheus_plugin_callback" : {
diff --git a/rstudio/README.md b/rstudio/README.md
index 71326f20..e4394eb4 100644
--- a/rstudio/README.md
+++ b/rstudio/README.md
@@ -2,16 +2,14 @@
# RStudio Web IDE
-
+
RStudio® is an integrated development environment (IDE) for R, a programming language for statistical computing and graphics. The RStudio Web IDE plugin provides a web-based RStudio Server instance that can be accessed from the Thinger.io console.
Integrating RStudio with Thinger.io can greatly benefit data scientists, IoT developers, and researchers who need to analyze and visualize IoT data effectively. This integration empowers professionals across various domains to make data-driven decisions and optimize their IoT solutions.
-
-
-
+
## Thinger.io and RStudio integration
@@ -52,9 +50,3 @@ resp
## Additional Resources
You may refer to the official website of R for additional resources and documentation: [R](https://www.r-project.org/), as well as the official website of RStudio for more information on RStudio IDE: [RStudio](https://www.rstudio.com/).
-
-## License
-
-R is distributed under the GNU GPL v2 license. RStudio is distributed under the AGPL v3 license. For more information, please refer to the official websites of [R](https://www.r-project.org/), the Rocker Dockerfiles used by the plugin are licensed under the GPL 2 or later. [RStudio](https://www.rstudio.com/). RStudio® is a registered trademark of RStudio, Inc.
-
-No affiliation with R, Rocker or RStudio is implied or intended by this plugin.
\ No newline at end of file
diff --git a/rstudio/assets/rstudio-icon.png b/rstudio/assets/rstudio-icon.png
new file mode 100644
index 00000000..fe7e9070
Binary files /dev/null and b/rstudio/assets/rstudio-icon.png differ
diff --git a/rstudio/assets/rstudio-image.png b/rstudio/assets/rstudio-image.png
new file mode 100644
index 00000000..9f0754e8
Binary files /dev/null and b/rstudio/assets/rstudio-image.png differ
diff --git a/rstudio/assets/rstudio-logo.svg b/rstudio/assets/rstudio-logo.svg
new file mode 100644
index 00000000..15a1d2a3
--- /dev/null
+++ b/rstudio/assets/rstudio-logo.svg
@@ -0,0 +1,50 @@
+
+
+
\ No newline at end of file
diff --git a/rstudio/assets/screen-front.png b/rstudio/assets/screen-front.png
new file mode 100644
index 00000000..a4a282ab
Binary files /dev/null and b/rstudio/assets/screen-front.png differ
diff --git a/rstudio/docs/changelog.md b/rstudio/docs/changelog.md
deleted file mode 100644
index 15a91a45..00000000
--- a/rstudio/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "rstudio/CHANGELOG.md"
diff --git a/rstudio/docs/index.md b/rstudio/docs/index.md
deleted file mode 100644
index 35a32af0..00000000
--- a/rstudio/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "rstudio/README.md"
diff --git a/rstudio/docs/plugin_file.md b/rstudio/docs/plugin_file.md
deleted file mode 100644
index dbdbeef8..00000000
--- a/rstudio/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "rstudio/plugin.json"
-````
diff --git a/rstudio/mkdocs.yml b/rstudio/mkdocs.yml
deleted file mode 100644
index c2a7d0b2..00000000
--- a/rstudio/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/rstudio
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/rstudio/plugin.json b/rstudio/plugin.json
index 0b88595e..a18a9b35 100644
--- a/rstudio/plugin.json
+++ b/rstudio/plugin.json
@@ -2,7 +2,7 @@
"name" : "rstudio",
"version" : "4.4.0-1",
"description" : "rstudio",
- "author" : "Jaime Bautista",
+ "author": "Thinger.io",
"license" : "MIT",
"repository" : {
"type" : "git",
@@ -12,8 +12,9 @@
"metadata" : {
"name" : "RStudio",
"description" : "RStudio Plugin for Thinger.io",
- "image" : "https://www.rstudio.com/apple-touch-icon.png",
- "icon" : "https://www.rstudio.com/favicon-32x32.png"
+ "category" : "development",
+ "image" : "assets/rstudio-image.png",
+ "icon" : "assets/rstudio-icon.png"
},
"tokens" : {
"rstudio_plugin" : {
diff --git a/sftpgo/LICENSE b/sftpgo/LICENSE
deleted file mode 100644
index f1e54eac..00000000
--- a/sftpgo/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2021-Current Thinger.io (INTERNET OF THINGER SL)
-
-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/sftpgo/README.md b/sftpgo/README.md
index a4a920a5..c9d9312b 100644
--- a/sftpgo/README.md
+++ b/sftpgo/README.md
@@ -2,7 +2,7 @@
# SFTPGo
-
+
[SFTPGo](https://sftpgo.com/) extends capabilities of File Storages, adding support for SFTP, FTP and FTPS with individual user management. With this plugin you can leverage Thinger.io file storage backends for exchanging and storing files on the platform.
@@ -13,19 +13,14 @@ SFTPGo has two different Web UIs, separated by admin and client users. To access
When loaded, the WebClient will appear, but before being able to login with a user, we should login with the admin.
-
-
-
+
Click on the WebAdmin link and enter as username and password your Thinger.io username.
-
-
-
+
-!!! important
-
- It is highly recommended to change the admin password to the same of the Thinger.io account or to one of your choice.
+> [!IMPORTANT]
+> It is highly recommended to change the admin password to the same of the Thinger.io account or to one of your choice.
## Creating Users
@@ -37,9 +32,7 @@ When installing this plugin, a new file storage was created in Thinger.io with t
We can then upload an example file and if we go to said file storage we will see the file structure.
-
-
-
+
### User an already created file storage
@@ -47,9 +40,7 @@ When creating a user to share the files of an already existing file storage, the
All storages will be mounted in `/srv/sftpgo/`, and to that path we would need to append the id of our storage. Example in the below screen.
-
-
-
+
## Establish a Connection
@@ -65,15 +56,13 @@ In order to connect with this protocol, the connection parameters are:
### FTP and FTPS
-!!! warning
-
- It is recommended to always use SFTP protocol due to the design challenges of FTP/S
+> [!WARNING]
+> It is recommended to always use SFTP protocol due to the design challenges of FTP/S
For FTP and FTP over TLS (FTPS) the supported connection is in Passive Mode. The upgrade to TLS of the control and data ports may be handled automatically by the FTP client using explicit FTP.
-!!! tip
-
- Currently, only one data connection may be opened simultaneously
+> [!TIP]
+> Currently, only one data connection may be opened simultaneously
The connection parameters are:
@@ -85,14 +74,9 @@ On connection with an explicit FTP over TLS, the secure connection will be upgra
This plugin only supports the TLS connection over the base domain name of the instance.
-!!! warning
-
- If the TLS connection is not longer able to be established, restart the plugin manually in order for the certificates to reload
+> [!WARNING]
+> If the TLS connection is not longer able to be established, restart the plugin manually in order for the certificates to reload
## Official Documentation
This plugin is based on the software SFTPGo. It's official documentation can be found under the [docs folder](https://github.com/drakkan/sftpgo/tree/main/docs) in its [official repository](https://github.com/drakkan/sftpgo).
-
-## License
-
-SFTPGo is distributed under the [AGPL-3.0 License](https://github.com/drakkan/sftpgo/blob/main/LICENSE)
diff --git a/sftpgo/assets/sftpgo-common-storage.png b/sftpgo/assets/sftpgo-common-storage.png
new file mode 100644
index 00000000..6c83401b
Binary files /dev/null and b/sftpgo/assets/sftpgo-common-storage.png differ
diff --git a/sftpgo/assets/sftpgo-dedicated-storage.png b/sftpgo/assets/sftpgo-dedicated-storage.png
new file mode 100644
index 00000000..497d7a12
Binary files /dev/null and b/sftpgo/assets/sftpgo-dedicated-storage.png differ
diff --git a/sftpgo/assets/sftpgo-icon.png b/sftpgo/assets/sftpgo-icon.png
new file mode 100644
index 00000000..84a7bbc7
Binary files /dev/null and b/sftpgo/assets/sftpgo-icon.png differ
diff --git a/sftpgo/assets/sftpgo-logo.png b/sftpgo/assets/sftpgo-logo.png
new file mode 100644
index 00000000..2ada2e6b
Binary files /dev/null and b/sftpgo/assets/sftpgo-logo.png differ
diff --git a/sftpgo/assets/webadmin-login.png b/sftpgo/assets/webadmin-login.png
new file mode 100644
index 00000000..6d8640de
Binary files /dev/null and b/sftpgo/assets/webadmin-login.png differ
diff --git a/sftpgo/assets/webclient-login.png b/sftpgo/assets/webclient-login.png
new file mode 100644
index 00000000..5929c8ca
Binary files /dev/null and b/sftpgo/assets/webclient-login.png differ
diff --git a/sftpgo/docs/changelog.md b/sftpgo/docs/changelog.md
deleted file mode 100644
index 81344fda..00000000
--- a/sftpgo/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "sftpgo/CHANGELOG.md"
diff --git a/sftpgo/docs/index.md b/sftpgo/docs/index.md
deleted file mode 100644
index f06a2f16..00000000
--- a/sftpgo/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "sftpgo/README.md"
diff --git a/sftpgo/docs/plugin_file.md b/sftpgo/docs/plugin_file.md
deleted file mode 100644
index 669240bf..00000000
--- a/sftpgo/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "sftpgo/plugin.json"
-````
diff --git a/sftpgo/mkdocs.yml b/sftpgo/mkdocs.yml
deleted file mode 100644
index bdb0fcef..00000000
--- a/sftpgo/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/sftpgo
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/sftpgo/plugin.json b/sftpgo/plugin.json
index 228e7436..d52f48d1 100644
--- a/sftpgo/plugin.json
+++ b/sftpgo/plugin.json
@@ -2,7 +2,7 @@
"name" : "sftpgo",
"version" : "2.5.4-1",
"description" : "Plugin for SFTP access to file storages",
- "author" : "Jaime Bautista",
+ "author": "Thinger.io",
"repository" : {
"type" : "git",
"url" : "https://github.com/thinger-io/plugins.git",
@@ -12,8 +12,9 @@
"metadata" : {
"name" : "SFTPGo",
"description" : "SFTPGo Plugin",
- "image" : "docs/assets/sftpgo-logo.png",
- "icon" : "https://raw.githubusercontent.com/thinger-io/plugins/main/sftpgo/docs/assets/sftpgo-icon.png"
+ "category" : "infrastructure",
+ "image" : "assets/sftpgo-logo.png",
+ "icon" : "assets/sftpgo-icon.png"
},
"resources" : {
"storages": [
diff --git a/shelly-1l/README.md b/shelly-1l/README.md
index dfd21aac..2d45e345 100644
--- a/shelly-1l/README.md
+++ b/shelly-1l/README.md
@@ -22,5 +22,5 @@ The Shelly 1L is a small and compact Wi-Fi smart switch that enables you to cont
- Certification: CE, RoHS
Siemens LOGO! is a highly versatile logic module known for its simplicity, flexibility, and reliability. Widely used in industrial automation, building control, and various other applications, Siemens LOGO! allows for easy implementation of control tasks without requiring extensive programming knowledge.
@@ -11,10 +11,9 @@ Siemens LOGO! is a highly versatile logic module known for its simplicity, flexi
Integrating Siemens LOGO! with Thinger.io can significantly enhance its capabilities by enabling remote monitoring, control, and automation of LOGO!-based systems. This integration empowers users to access, visualize, and manage LOGO! data remotely through Thinger.io platform, enabling real-time monitoring, data analysis, and automation of LOGO!-based applications.
-!!! note "Siemens LOGO! minimum requirements"
-
- Siemens LOGO! 8.4 or later is required to use this plugin, as it supports open MQTT communication. [More info](https://support.industry.siemens.com/cs/document/109826554/sales-release-for-logo!-8-4-basic-devices-and-logo!-soft-comfort-v8-4-?dti=0)
- Siemens LOGO! Soft Comfort V8.4 or later is required to configure the MQTT communication. [More info](https://support.industry.siemens.com/cs/document/109826553/download-and-installation-instructions-for-logo!-soft-comfort-upgrade-v8-4?dti=0)
+> [!NOTE] Siemens LOGO! minimum requirements
+> Siemens LOGO! 8.4 or later is required to use this plugin, as it supports open MQTT communication. [More info](https://support.industry.siemens.com/cs/document/109826554/sales-release-for-logo!-8-4-basic-devices-and-logo!-soft-comfort-v8-4-?dti=0)
+> Siemens LOGO! Soft Comfort V8.4 or later is required to configure the MQTT communication. [More info](https://support.industry.siemens.com/cs/document/109826553/download-and-installation-instructions-for-logo!-soft-comfort-upgrade-v8-4?dti=0)
The plugin provides a first step to be able to integrate a fleet of Siemens LOGO! controllers, while allowing the ad-hoc configuration that best suits the user's needs.
@@ -28,10 +27,8 @@ It provides the following settings:
- Basic **product functions** to parse the shadow of the device and handling sending commands to the Siemens LOGO! controller.
- A preconfigured **dashboard** to visualize relevant data of each Siemens LOGO! controller.
-
-
-
-
+
+
## Get Started
@@ -45,23 +42,17 @@ Ensure that your Siemens LOGO! device is connected to the Internet, either throu
Set the time and date on the Siemens LOGO! through the menu `Tools -> Transfer -> Set Time...`.
-
-
-
+
#### Configure MQTT Communication
Configure the Siemens LOGO! device to communicate with Thinger.io platform using MQTT protocol. You will need to provide the MQTT broker address, port, username, and password. Go to the menu option `Tools -> Transfer -> Cloud settings -> Cloud connection settings` and configure the settings as shown below:
1. In the new dialog that appears on screen, check the `Active Cloud Access`. Then, click on `Register object`.
-
-
-
+ 
2. Select the `Type of cloud` as `MQTT` and click on `Next`.
-
-
-
+ 
3. Now set the broker URL, port, device id, username, and device password.
* Broker URL: domain name of the instance of Thinger.io. If you use the Community Console, the URL should be `backend.thinger.io`. If you use a private instance use your own URL.
@@ -69,28 +60,20 @@ Configure the Siemens LOGO! device to communicate with Thinger.io platform using
* Device ID: Identifier that we will give to the device in the Thinger.io platform and which must be unique. The current autoprovision rule is to start with 'logo-', which can be followed by the serial number of the device for example.
* Username: Username of the Thinger.io platform that will own the device resource in the system.
* Device Password: Password of the device the Thinger.io platform will use to authenticate the device. It will be configured on the platform on autoprovision.
-
-
-
+ 
4. In this next step, we will select for `Authenticacion Type` the option `Unilateral TLS`. The certificate CA de broker uses can be download from this [link](https://letsencrypt.org/certificates/), specifically the pem certificate `ISRG Root X1`, valid until 2023-06-04.
-
-
-
-
+ 
+ 
5. In the next dialog screen we will configure the MQTT topics in which the Siemens LOGO! publishes and is subscribed.
* Publish topic: topic where the LOGO! will send data to be read form the Thinger.io Cloud platform. We suggest the following structure: `logo//tx`
* Subscribe to topic: topic where the LOGO! will receive data sent by the Thinger.io Cloud platform. We suggest the following structure: `logo//rx`
-
-
-
+ 
6. After a few seconds, the device will autoprovision itself on Thinger.io Platform. You can check the device status on the Thinger.io Console.
-
-
-
-
+ 
+ 
### Configure Data Exchange
@@ -99,9 +82,7 @@ Configure the data registers in the Siemens LOGO! device that you want to exchan
* In the following image, the two registers will be sent to the publish topic (`logo//tx`) configured in the previous step, when their value changes.
* To send data from the platform to the controller, the register must be set with `write permissions`. In this case the register M1.
-
+
This plugin is an interface for using Sigfox HTTP Callback feature in an optimized way, providing features to easily integrate these devices with Thinger.io Platform, such as automatic device and storage provisioning and both uplink and downlink cloud processing.
@@ -29,9 +27,8 @@ For a better understanding of the following sections, here is described some bas
* Downlink: It is a data flow which represents messages sent from the Sigfox cloud to a device.
* Device Type: 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).
-!!! info
-
- Learn how to configure Sigfox Callback to send data to Thinger.io platform [**here**](https://docs.thinger.io/lpwan/sigfox#creating-sigfox-callback)
+> [!NOTE]
+> Learn how to configure Sigfox Callback to send data to Thinger.io platform [**here**](https://docs.thinger.io/lpwan/sigfox#creating-sigfox-callback)
## Plugin Configuration
@@ -41,23 +38,18 @@ In this section it is described the different interfaces that can be used to con
Every Sigfox "Device Type" that is integrated over this plugin, should define a new profile in Thinger.io plugin, with the same identifier as defined in Sigfox Platform. Note that each Sigfox Device Type defined in this way will allow to customize the plugin behaviour for that kind of devices.
-
-
-
+
It is possible to create as many Device Types profiles as required. To configure a new profile, just select the id from the Device Types dropdown, and then navigate to the other plugin sections.
-!!! warning
-
- Always create the Device Type with the same identifier as defined in Sigfox cloud.
+> [!WARNING]
+> Always create the Device Type with the same identifier as defined in Sigfox cloud.
### Callback Config
The uplink behaviour allows to configure how the plugin will react on new information received from Sigfox.
-
-
-
+
The configurable parameters are the following:
@@ -74,9 +66,7 @@ In this section it is possible to configure the payload processors that will tra
The interface provides a code editor for NodeJS, where it is possible to define the `uplink` and `downlink`processors. It is also possible to test the code by providing a sample input data both for `uplink` and `downlink`.
-
-
-
+
In the following, there is information about the uplink and downlink methods.
@@ -98,9 +88,8 @@ In the following, there is information about the uplink and downlink methods.
};
```
- !!! info
-
- The uplink method must always return a JSON object.
+ > [!NOTE]
+ > The uplink method must always return a JSON object.
=== "Downlink"
@@ -113,9 +102,8 @@ In the following, there is information about the uplink and downlink methods.
The output of this method will be a **Base64 String** with the binary information that is going to be sent to Sigfox network.
- !!! warning
-
- When working with Downlink processes the`Initialize Downlink Data`parameter must be initialized with any data otherwise the processing of the downlink payload will fail
+ > [!WARNING]
+ > When working with Downlink processes the`Initialize Downlink Data`parameter must be initialized with any data otherwise the processing of the downlink payload will fail
Example of a downlink method converting a JSON device configuration into base64 as required by Sigfox:
@@ -134,17 +122,14 @@ In the following, there is information about the uplink and downlink methods.
};
```
-!!! info
-
- Use the interface tester to see if your code is correctly procesing the payloads.
+> [!NOTE]
+> Use the interface tester to see if your code is correctly procesing the payloads.
## Sigfox Cloud Configuration
After getting Thinger.io Plugin ready for receiving data, the next step is to configure the Sigfox Backend for pushing messages on it. This process has been simplified by the "Sigfox Integration" section of the plugin settings menu, that automatically builds the **HTTP query** and the **Authorization token** that needs to be included into Sigfox Callbacks Manager:
-
-
-
+
Note that Sigfox Cloud provides three different API, depending on the kind of interaction that it's going to be created, Thinger.io Platform allows integrating with all of them: Uplink, Advanced Data and Downlink callback type. Each callback configuration can be created to work with a single device or over all the devices that belongs to the same Device Type.
@@ -161,35 +146,26 @@ These are all the parameters that needs to be configured when creating a new cal
This callback configuration is the most common one, it just send devices data to Thinger.io in an unidirectional way to be stored, aggregate and show.
-
-
-
+
### Uplink with computed location (Data Advanced)
This callback configuration allows to retrieve additional information, such as geolocation, and infrastructure metadata like the computed over the different base stations which received the messages. However, working with this callback requires a delay of approximately 30s.
-
-
-
+
### Uplink & Downlink
Finally, selecting DATA/BIDIR Callback, it is possible to send uplink messages to configure Sigfox Cloud to send data to Thinger.io and waits for a downlink message that can be sent to the device in order to make any configuration or remote controlling processes. downlink payload processing
-
-
-
+
The configuration of the Downlink message payload can be made in Thinger.io Platform, using the Callback Config section of Sigfox Plugin or modifying each individual Downlink device property in the device dashboard:
-
-
-
+
-!!! tip
-
- It is mandatory to send the device in the callback payload. Other optional values are signal or location information extracted from Sigfox.
+> [!TIP]
+> It is mandatory to send the device in the callback payload. Other optional values are signal or location information extracted from Sigfox.
```json
{
@@ -212,9 +188,7 @@ congratulations now you can retrieve data from all your Sigfox devices into Thin
As these devices are not real-time connected to the platform, it is hard to know if everything is running well in the long term, specially in large devices networks. But thanks to the timeout feature that is configurable using the "device connection timeout" of the plugin callback configuration menu, it is possible to know if a device is sending data in proper time frame or if otherwise it has stopped working due to any problem by checking the "device status" that is available at its dashboard.
-
-
-
+
It is also possible to check the status of a large amount of devices from the device list, but note that this page is not showing real-time data so it is necessary to refresh it to know the current status.
@@ -222,15 +196,11 @@ It is also possible to check the status of a large amount of devices from the de
One of the most used features of Thigner.io is the data buckets, which allows storing thousands of data in a scalable and easy way. The integration with sigfox through this new plugin allows to store data after the payload has been processed instead of storing it in raw or constraint format.
-
-
-
+
Once stored in a data bucket, it is possible to work with these data points by downloading them in CSV and creating widgets to show data in customizable dashboards that can be easily shared with colleagues or customers.
-
-
-
+
### Sending Data to Third Parties with Endpoints
@@ -240,9 +210,7 @@ Thinger.io is part of a large ecosystem of technologies and platforms that enabl
at thinger.io we continue to work to extend the platform's integration capabilities with technologies that can help create more advanced IoT projects in the easiest way. We have other plugins such as NodeRED that allow working with IoT data in almost unlimited ways, such as creating alerts on the data, geofencing, reporting, etc.
-
-
-
+
## Plugin Development Details
@@ -250,9 +218,7 @@ at thinger.io we continue to work to extend the platform's integration capabilit
In this section it is described how the uplink data flow works, from its source in the Sigfox network, to its final destination in Thinger.io.
-
-
-
+
In the following subsections are described the elements shown in the figure.
@@ -293,9 +259,7 @@ The last step of this plugin is to call the device callback in Thinger.io. This
In this case, the plugin interacts with the platform over such REST interface, pushing data received from Sigfox, and processed by the custom uplink method. By default, the plugin initializes an HTTP device to write to a data bucket that is also automatically created. So, every message sent by a Sigfox device, will write finally write to a specific data bucket. As shown in the following picture:
-
-
-
+
After the device callback is done, it will appear as a connected device, showing also its location if it was configured in the plugin options.
diff --git a/sigfox/assets/application-settings.png b/sigfox/assets/application-settings.png
new file mode 100644
index 00000000..c79a968b
Binary files /dev/null and b/sigfox/assets/application-settings.png differ
diff --git a/sigfox/assets/callback-configuration-downlink.png b/sigfox/assets/callback-configuration-downlink.png
new file mode 100644
index 00000000..0c044b8c
Binary files /dev/null and b/sigfox/assets/callback-configuration-downlink.png differ
diff --git a/sigfox/assets/callback-configuration.png b/sigfox/assets/callback-configuration.png
new file mode 100644
index 00000000..cb3f5819
Binary files /dev/null and b/sigfox/assets/callback-configuration.png differ
diff --git a/sigfox/assets/device-callback-settings.png b/sigfox/assets/device-callback-settings.png
new file mode 100644
index 00000000..9ccc7efc
Binary files /dev/null and b/sigfox/assets/device-callback-settings.png differ
diff --git a/sigfox/assets/device-callback.png b/sigfox/assets/device-callback.png
new file mode 100644
index 00000000..5ca79ff1
Binary files /dev/null and b/sigfox/assets/device-callback.png differ
diff --git a/sigfox/assets/device-dashboard.png b/sigfox/assets/device-dashboard.png
new file mode 100644
index 00000000..7cc4c91e
Binary files /dev/null and b/sigfox/assets/device-dashboard.png differ
diff --git a/sigfox/assets/payload-processing.png b/sigfox/assets/payload-processing.png
new file mode 100644
index 00000000..d7d6508f
Binary files /dev/null and b/sigfox/assets/payload-processing.png differ
diff --git a/sigfox/assets/sigfox-bucket.png b/sigfox/assets/sigfox-bucket.png
new file mode 100644
index 00000000..86b47f4e
Binary files /dev/null and b/sigfox/assets/sigfox-bucket.png differ
diff --git a/sigfox/assets/sigfox-cloud-callbacks.png b/sigfox/assets/sigfox-cloud-callbacks.png
new file mode 100644
index 00000000..91bc95b3
Binary files /dev/null and b/sigfox/assets/sigfox-cloud-callbacks.png differ
diff --git a/sigfox/assets/sigfox-cloud-callbacks_2.png b/sigfox/assets/sigfox-cloud-callbacks_2.png
new file mode 100644
index 00000000..1fe394ed
Binary files /dev/null and b/sigfox/assets/sigfox-cloud-callbacks_2.png differ
diff --git a/sigfox/assets/sigfox-cloud-callbacks_3.png b/sigfox/assets/sigfox-cloud-callbacks_3.png
new file mode 100644
index 00000000..772ce1c9
Binary files /dev/null and b/sigfox/assets/sigfox-cloud-callbacks_3.png differ
diff --git a/sigfox/assets/sigfox-diagram.png b/sigfox/assets/sigfox-diagram.png
new file mode 100644
index 00000000..67ee81a5
Binary files /dev/null and b/sigfox/assets/sigfox-diagram.png differ
diff --git a/sigfox/assets/sigfox-icon.png b/sigfox/assets/sigfox-icon.png
new file mode 100644
index 00000000..fe97840a
Binary files /dev/null and b/sigfox/assets/sigfox-icon.png differ
diff --git a/sigfox/assets/sigfox-image.jpg b/sigfox/assets/sigfox-image.jpg
new file mode 100644
index 00000000..d719747f
Binary files /dev/null and b/sigfox/assets/sigfox-image.jpg differ
diff --git a/sigfox/assets/sigfox-logo.png b/sigfox/assets/sigfox-logo.png
new file mode 100644
index 00000000..1835c22b
Binary files /dev/null and b/sigfox/assets/sigfox-logo.png differ
diff --git a/sigfox/assets/thinger-dashboard.png b/sigfox/assets/thinger-dashboard.png
new file mode 100644
index 00000000..17418efa
Binary files /dev/null and b/sigfox/assets/thinger-dashboard.png differ
diff --git a/sigfox/assets/uplink-dataflow.png b/sigfox/assets/uplink-dataflow.png
new file mode 100644
index 00000000..199cf98f
Binary files /dev/null and b/sigfox/assets/uplink-dataflow.png differ
diff --git a/sigfox/assets/webhook-settings.png b/sigfox/assets/webhook-settings.png
new file mode 100644
index 00000000..46442579
Binary files /dev/null and b/sigfox/assets/webhook-settings.png differ
diff --git a/sigfox/docs/changelog.md b/sigfox/docs/changelog.md
deleted file mode 100644
index f9c3d615..00000000
--- a/sigfox/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "sigfox/CHANGELOG.md"
diff --git a/sigfox/docs/index.md b/sigfox/docs/index.md
deleted file mode 100644
index 2b561074..00000000
--- a/sigfox/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "sigfox/README.md"
diff --git a/sigfox/docs/plugin_file.md b/sigfox/docs/plugin_file.md
deleted file mode 100644
index 884d19ce..00000000
--- a/sigfox/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "sigfox/plugin.json"
-````
diff --git a/sigfox/mkdocs.yml b/sigfox/mkdocs.yml
deleted file mode 100644
index 40f1b0d4..00000000
--- a/sigfox/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/sigfox
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/sigfox/plugin.json b/sigfox/plugin.json
index 635aa54c..e38b72e8 100644
--- a/sigfox/plugin.json
+++ b/sigfox/plugin.json
@@ -2,7 +2,7 @@
"name" : "sigfox",
"version" : "1.4.1",
"description" : "Plugin for handling Sigfox integration",
- "author" : "Alvaro Luis Bustamante",
+ "author": "Thinger.io",
"license" : "MIT",
"repository" : {
"type" : "git",
@@ -12,8 +12,9 @@
"metadata" : {
"name" : "Sigfox",
"description" : "Sigfox Integration",
- "image" : "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/sigfox/sigfox-image.jpg",
- "icon" : "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/sigfox/sigfox-icon.png"
+ "category" : "connectivity",
+ "image" : "assets/sigfox-image.jpg",
+ "icon" : "assets/sigfox-icon.png"
},
"tokens" : {
"sigfox_plugin" : {
diff --git a/teltonika-eye/LICENSE.md b/teltonika-eye/LICENSE.md
deleted file mode 100644
index f1bacd61..00000000
--- a/teltonika-eye/LICENSE.md
+++ /dev/null
@@ -1,7 +0,0 @@
-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
index 517cb402..5f782c2b 100644
--- a/teltonika-eye/README.md
+++ b/teltonika-eye/README.md
@@ -40,7 +40,6 @@ Provide any additional resources, documents, or links to external sites that can
- [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
+Include a section for frequently asked questions to address common issues or queries.
diff --git a/teltonika-eye/docs/changelog.md b/teltonika-eye/docs/changelog.md
deleted file mode 100644
index a0b978d7..00000000
--- a/teltonika-eye/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "teltonika-eye/CHANGELOG.md"
diff --git a/teltonika-eye/docs/index.md b/teltonika-eye/docs/index.md
deleted file mode 100644
index 191d5b55..00000000
--- a/teltonika-eye/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "teltonika-eye/README.md"
diff --git a/teltonika-eye/docs/plugin_file.md b/teltonika-eye/docs/plugin_file.md
deleted file mode 100644
index 63424e9e..00000000
--- a/teltonika-eye/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-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
deleted file mode 100644
index 746b884f..00000000
--- a/teltonika-eye/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-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
index 46f570c8..1cc05624 100644
--- a/teltonika-eye/plugin.json
+++ b/teltonika-eye/plugin.json
@@ -12,6 +12,7 @@
"metadata": {
"name": "Teltonika Eye",
"description": "Decoder and preconfiguration for Teltonika Eye devices",
+ "category": "devices",
"image": "assets/teltonika-eye.png"
},
"resources": {
diff --git a/teltonika-telematics/LICENSE.md b/teltonika-telematics/LICENSE.md
deleted file mode 100644
index f1bacd61..00000000
--- a/teltonika-telematics/LICENSE.md
+++ /dev/null
@@ -1,7 +0,0 @@
-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
index c5cdb486..bb84ad90 100644
--- a/teltonika-telematics/README.md
+++ b/teltonika-telematics/README.md
@@ -1,6 +1,8 @@
# 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.
@@ -32,7 +34,7 @@ Afterwards create some generic certificates with the following commands, configu
openssl req -x509 -newkey rsa:4096 -keyout private.pem.key -out cert.pem.crt -sha256 -days 9125 -nodes
```
-
+
### Configuration
@@ -46,15 +48,15 @@ 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.
@@ -62,7 +64,7 @@ After the configuration is done, make sure to reboot the device.
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
diff --git a/teltonika-telematics/assets/certificate_creation.png b/teltonika-telematics/assets/certificate_creation.png
new file mode 100644
index 00000000..6441bf47
Binary files /dev/null and b/teltonika-telematics/assets/certificate_creation.png differ
diff --git a/teltonika-telematics/assets/teltonika_configurator_gprs.png b/teltonika-telematics/assets/teltonika_configurator_gprs.png
new file mode 100644
index 00000000..c16c26ae
Binary files /dev/null and b/teltonika-telematics/assets/teltonika_configurator_gprs.png differ
diff --git a/teltonika-telematics/assets/teltonika_configurator_security.png b/teltonika-telematics/assets/teltonika_configurator_security.png
new file mode 100644
index 00000000..74ae6a50
Binary files /dev/null and b/teltonika-telematics/assets/teltonika_configurator_security.png differ
diff --git a/teltonika-telematics/assets/teltonika_configurator_status.png b/teltonika-telematics/assets/teltonika_configurator_status.png
new file mode 100644
index 00000000..2228ed04
Binary files /dev/null and b/teltonika-telematics/assets/teltonika_configurator_status.png differ
diff --git a/teltonika-telematics/assets/teltonika_mqtt_device.png b/teltonika-telematics/assets/teltonika_mqtt_device.png
new file mode 100644
index 00000000..f545402d
Binary files /dev/null and b/teltonika-telematics/assets/teltonika_mqtt_device.png differ
diff --git a/teltonika-telematics/assets/teltonika_telematics.png b/teltonika-telematics/assets/teltonika_telematics.png
new file mode 100644
index 00000000..8caa5470
Binary files /dev/null and b/teltonika-telematics/assets/teltonika_telematics.png differ
diff --git a/teltonika-telematics/docs/changelog.md b/teltonika-telematics/docs/changelog.md
deleted file mode 100644
index b69e13bf..00000000
--- a/teltonika-telematics/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "teltonika-telematics/CHANGELOG.md"
diff --git a/teltonika-telematics/docs/index.md b/teltonika-telematics/docs/index.md
deleted file mode 100644
index e64359c8..00000000
--- a/teltonika-telematics/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "teltonika-telematics/README.md"
diff --git a/teltonika-telematics/docs/plugin_file.md b/teltonika-telematics/docs/plugin_file.md
deleted file mode 100644
index ee26d5c8..00000000
--- a/teltonika-telematics/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-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
deleted file mode 100644
index cffd2d6e..00000000
--- a/teltonika-telematics/mkdocs.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-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
index b6dd9daf..c0d40121 100644
--- a/teltonika-telematics/plugin.json
+++ b/teltonika-telematics/plugin.json
@@ -12,6 +12,7 @@
"metadata": {
"name": "Teltonika Telematics",
"description": "Decoder and preconfiguration for Teltonika GPS Telematics devices",
+ "category": "devices",
"image": "assets/teltonika-telematics.png"
},
"resources": {
diff --git a/ttn-stack/LICENSE b/ttn-stack/LICENSE
deleted file mode 100644
index fc2c8e0a..00000000
--- a/ttn-stack/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-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
index 478d3fe4..ef45533f 100644
--- a/ttn-stack/README.md
+++ b/ttn-stack/README.md
@@ -1,9 +1,7 @@
# 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:
@@ -38,21 +36,16 @@ This section describes the different interfaces that can be used to configure Th
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.
+> [!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:
@@ -69,9 +62,7 @@ As shown in the image above, the parameters can be used to configure the plugin'
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.
@@ -83,9 +74,7 @@ This tab is used to configure the payload data treatment in order to transform f
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.
@@ -93,7 +82,6 @@ The following sections provide additional information about how to configure the
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.
@@ -112,9 +100,8 @@ The following sections provide additional information about how to configure the
};
```
- !!! info
-
- The uplink method must always return a JSON object.
+ > [!NOTE]
+ > The uplink method must always return a JSON object.
=== "Downlink"
@@ -144,9 +131,8 @@ The following sections provide additional information about how to configure the
};
```
- !!! info
-
- The downlink method should return a base64 string if The Things Stack application does not define a converter.
+ > [!NOTE]
+ > The downlink method should return a base64 string if The Things Stack application does not define a converter.
## The Things Stack Console Configuration
@@ -154,31 +140,23 @@ The following sections provide additional information about how to configure the
The last tab of the plugin configuration interface is called "Webhook settings", it has been created to help the developers to complete the integration in The Things Stack Console, by providing all the information required to set up the webhook profile.
-
-
-
+
-!!! 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.
+> [!NOTE]
+> 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
+> [!NOTE]
+> Note that the Authorization header must be set up using the access token including the "Bearer" command
### Downlink Configuration
@@ -202,13 +180,8 @@ There are multiple ways to view the data sent by the device in [Thinger.io](http
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/assets/application-configuration.png b/ttn-stack/assets/application-configuration.png
new file mode 100644
index 00000000..67757aa1
Binary files /dev/null and b/ttn-stack/assets/application-configuration.png differ
diff --git a/ttn-stack/assets/data-dashboard.png b/ttn-stack/assets/data-dashboard.png
new file mode 100644
index 00000000..8dfdc821
Binary files /dev/null and b/ttn-stack/assets/data-dashboard.png differ
diff --git a/ttn-stack/assets/data_bucket.png b/ttn-stack/assets/data_bucket.png
new file mode 100644
index 00000000..143363cb
Binary files /dev/null and b/ttn-stack/assets/data_bucket.png differ
diff --git a/ttn-stack/assets/downlink-settings.png b/ttn-stack/assets/downlink-settings.png
new file mode 100644
index 00000000..2a9e9d4f
Binary files /dev/null and b/ttn-stack/assets/downlink-settings.png differ
diff --git a/ttn-stack/assets/payload-processing.png b/ttn-stack/assets/payload-processing.png
new file mode 100644
index 00000000..8c110d5b
Binary files /dev/null and b/ttn-stack/assets/payload-processing.png differ
diff --git a/ttn-stack/assets/ttn-stack-icon.png b/ttn-stack/assets/ttn-stack-icon.png
new file mode 100644
index 00000000..3e9323cb
Binary files /dev/null and b/ttn-stack/assets/ttn-stack-icon.png differ
diff --git a/ttn-stack/assets/ttn-stack-logo.png b/ttn-stack/assets/ttn-stack-logo.png
new file mode 100644
index 00000000..561dbe2a
Binary files /dev/null and b/ttn-stack/assets/ttn-stack-logo.png differ
diff --git a/ttn-stack/assets/tts-diagram.png b/ttn-stack/assets/tts-diagram.png
new file mode 100644
index 00000000..fb33279a
Binary files /dev/null and b/ttn-stack/assets/tts-diagram.png differ
diff --git a/ttn-stack/assets/uplink-settings.png b/ttn-stack/assets/uplink-settings.png
new file mode 100644
index 00000000..f5fcaa30
Binary files /dev/null and b/ttn-stack/assets/uplink-settings.png differ
diff --git a/ttn-stack/assets/webhook-integration-settings.png b/ttn-stack/assets/webhook-integration-settings.png
new file mode 100644
index 00000000..985c6853
Binary files /dev/null and b/ttn-stack/assets/webhook-integration-settings.png differ
diff --git a/ttn-stack/assets/webhook-integration.png b/ttn-stack/assets/webhook-integration.png
new file mode 100644
index 00000000..a684963f
Binary files /dev/null and b/ttn-stack/assets/webhook-integration.png differ
diff --git a/ttn-stack/assets/webhook-settings.png b/ttn-stack/assets/webhook-settings.png
new file mode 100644
index 00000000..1e6ded79
Binary files /dev/null and b/ttn-stack/assets/webhook-settings.png differ
diff --git a/ttn-stack/docs/changelog.md b/ttn-stack/docs/changelog.md
deleted file mode 100644
index 87a1e9c8..00000000
--- a/ttn-stack/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "ttn-stack/CHANGELOG.md"
diff --git a/ttn-stack/docs/index.md b/ttn-stack/docs/index.md
deleted file mode 100644
index 276e4d56..00000000
--- a/ttn-stack/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "ttn-stack/README.md"
diff --git a/ttn-stack/docs/plugin_file.md b/ttn-stack/docs/plugin_file.md
deleted file mode 100644
index 5c16dc99..00000000
--- a/ttn-stack/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "ttn-stack/plugin.json"
-````
diff --git a/ttn-stack/mkdocs.yml b/ttn-stack/mkdocs.yml
deleted file mode 100644
index 54805199..00000000
--- a/ttn-stack/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/ttn-stack
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/ttn-stack/plugin.json b/ttn-stack/plugin.json
index e62b4f63..4c18da4b 100644
--- a/ttn-stack/plugin.json
+++ b/ttn-stack/plugin.json
@@ -2,8 +2,12 @@
"name" : "ttn-stack",
"version" : "1.2.1",
"description" : "Plugin for handling The Things Stack integration",
- "author" : "Alvaro Luis Bustamante",
+ "author": "Thinger.io",
"license" : "MIT",
+ "deprecated": {
+ "message": "This plugin is no longer maintained",
+ "replacement": "ttn"
+ },
"repository" : {
"type" : "git",
"url": "https://github.com/thinger-io/plugins.git",
@@ -12,8 +16,9 @@
"metadata" : {
"name" : "The Things Stack",
"description" : "The Things Stack Integration",
- "image" : "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/ttn-stack/img/ttn-stack-logo.png",
- "icon" : "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/ttn-stack/img/ttn-stack-icon.png"
+ "category" : "connectivity",
+ "image" : "assets/ttn-stack-logo.png",
+ "icon" : "assets/ttn-stack-icon.png"
},
"tokens" : {
"ttn_stack_plugin" : {
diff --git a/ttn/CHANGELOG.md b/ttn/CHANGELOG.md
index 62be7f90..7ddc08fe 100644
--- a/ttn/CHANGELOG.md
+++ b/ttn/CHANGELOG.md
@@ -1,5 +1,18 @@
# Changelog
+## [2.1.2] - 2025-11-27
+
+### Add
+
+- Added support for enabling/disabling individual applications in the backend
+- Improved Inspector messages
+- Auto completion for application edition in the plugin configuration page
+
+### Fix
+
+- Fixed multiple application selection bug in the plugin configuration page
+- Fixed edition of existing plugin applications
+
## [2.1.1] - 2025-11-13
### Add
diff --git a/ttn/LICENSE b/ttn/LICENSE
deleted file mode 100644
index 0631ba07..00000000
--- a/ttn/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-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/ttn/README.md b/ttn/README.md
index d701715d..54a8e65b 100644
--- a/ttn/README.md
+++ b/ttn/README.md
@@ -1,7 +1,7 @@
# TTN Stack
-
+
The Things Network (TTN) is an open, community‑driven LoRaWAN® network that simplifies the deployment of large‑scale IoT solutions across the globe.
@@ -32,9 +32,7 @@ Open the plugin settings page. In the **Applications** table click **Add +** an
| **Application Name** | Must match **exactly** the Application ID defined in the TTN Console. The plugin uses this value to route outgoing requests to the correct TTN application. |
| **Device ID Prefix** | Prefix used when generating the device identifier; the Device EUI is appended automatically. Required for autoprovision. |
-
-
-
+
Keep this page open—you will need the **Webhook URL** and the **TTN TOKEN** generated by the plugin in the next step.
@@ -46,9 +44,7 @@ Keep this page open—you will need the **Webhook URL** and the **TTN TOKEN** ge
2. Navigate to **Integrations → Webhooks** and click **Add Webhooks**.
3. Choose **Thinger.io Template** and complete the form with the values shown in your plugin:
-
-
-
+
| Template Field | Value |
|-----------|-----------------|
@@ -62,9 +58,7 @@ Keep this page open—you will need the **Webhook URL** and the **TTN TOKEN** ge
> You can find your **TTN API TOKEN** in the plugin settings page, under the **TTN API TOKEN** field,
> just click the "copy" button and paste it into the **Authoritation Header** field in the TTN Console.
-
}
-
+
+
-
-
-
+
+
+ Applications
-
+
+
@if (checkedApplications.size > 0) {
}
@if (checkedApplications.size === 0) {
-
-
+
-
+
+
diff --git a/ttn/task/frontend/src/app/features/applications/applications.component.ts b/ttn/task/frontend/src/app/features/applications/applications.component.ts
index 09c97bbc..185288ab 100644
--- a/ttn/task/frontend/src/app/features/applications/applications.component.ts
+++ b/ttn/task/frontend/src/app/features/applications/applications.component.ts
@@ -11,7 +11,6 @@ import { NzButtonComponent } from "ng-zorro-antd/button";
import { NzCardModule } from 'ng-zorro-antd/card';
import { NzIconModule } from "ng-zorro-antd/icon";
import { NzModalModule } from 'ng-zorro-antd/modal';
-import { NzSkeletonComponent } from "ng-zorro-antd/skeleton";
import { NzSwitchModule } from 'ng-zorro-antd/switch';
import { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';
@@ -27,33 +26,30 @@ export interface Application {
}
@Component({
- selector: 'app-applications',
- imports: [
- NzTableModule,
- NzTooltipDirective,
- NzButtonComponent,
- NzGridModule,
- NzCardModule,
- NzIconModule,
- FontAwesomeModule,
- NzModalModule,
- ApplicationComponent,
- NzSkeletonComponent,
- NzSwitchModule,
- NzPopconfirmModule,
- FormsModule,
- CommonModule
- ],
- templateUrl: './applications.component.html',
+ selector: 'app-applications',
+ imports: [
+ NzTableModule,
+ NzTooltipDirective,
+ NzButtonComponent,
+ NzGridModule,
+ NzCardModule,
+ NzIconModule,
+ FontAwesomeModule,
+ NzModalModule,
+ ApplicationComponent,
+ NzSwitchModule,
+ NzPopconfirmModule,
+ FormsModule,
+ CommonModule
+ ],
+ templateUrl: './applications.component.html',
})
export class ApplicationsComponent {
@ViewChild('applicationForm') applicationFormComponent!: ApplicationComponent;
protected modalVisible = false;
-
protected applications: Application[] = [];
- protected selectedApplication: Application | undefined;// = {};
-
+ protected selectedApplication: Application | undefined;
protected tokenVisible: {[key: string]: boolean} = {};
public disabled: boolean = false;
@@ -65,18 +61,23 @@ export class ApplicationsComponent {
protected faLayerGroup = faLayerGroup;
protected faQuestionCircle = faQuestionCircle;
- constructor( private settingsService: SettingsService ) {
- this.settingsService.loadSettings().then( () => {
-
+ constructor(private settingsService: SettingsService) {
+ this.settingsService.loadSettings().then(() => {
this.applications = settingsService.getApplications();
-
});
+ }
+ // Helper to get unique identifier for an application
+ private getApplicationKey(app: Application): string {
+ return app.applicationName || app.applicationId || '';
}
- showModal(id: string = "") {
- if ( id.length > 0 )
- this.selectedApplication = this.applications.find(app => app.applicationId === id );// || null;
+ showModal(name: string = "") {
+ if (name.length > 0) {
+ this.selectedApplication = this.applications.find(
+ app => this.getApplicationKey(app) === name
+ );
+ }
this.modalVisible = true;
}
@@ -90,90 +91,115 @@ export class ApplicationsComponent {
}
removeItems() {
+ this.applications = this.applications.filter(
+ application => !this.checkedApplications.has(this.getApplicationKey(application))
+ );
- // remove the applications from the list
- this.applications = this.applications.filter(application => !this.checkedApplications.has(application.applicationId));
-
- // remove the application Id from this.tokenVisible
- this.checkedApplications.forEach(applicationId => {
- delete this.tokenVisible[applicationId];
- })
+ this.checkedApplications.forEach(appName => {
+ delete this.tokenVisible[appName];
+ });
this.checkedApplications.clear();
+ this.allChecked = false;
this.settingsService.saveApplications(this.applications).then(() => {
+ console.log('Applications removed successfully');
+ }).catch(error => {
+ console.error('Failed to save applications', error);
});
}
- updateCheckedSet(applicationId: string, checked: boolean) {
- if(checked){
- this.checkedApplications.add(applicationId);
- }else{
- this.checkedApplications.delete(applicationId);
+ updateCheckedSet(applicationName: string, checked: boolean) {
+ if (checked) {
+ this.checkedApplications.add(applicationName);
+ } else {
+ this.checkedApplications.delete(applicationName);
}
+
+ // Update allChecked status
+ this.allChecked = this.applications.length > 0 &&
+ this.checkedApplications.size === this.applications.length;
}
onAllChecked(checked: boolean) {
- if(checked){
- for (let index = 0; index < this.applications.length; index++) {
- this.checkedApplications.add(this.applications[index].applicationId);
- }
- }else{
+ this.allChecked = checked;
+ if (checked) {
+ this.applications.forEach(app => {
+ this.checkedApplications.add(this.getApplicationKey(app));
+ });
+ } else {
this.checkedApplications.clear();
}
}
- onItemChecked(applicationId: string, checked: boolean) {
- this.updateCheckedSet(applicationId, checked);
+ onItemChecked(applicationName: string, checked: boolean) {
+ this.updateCheckedSet(applicationName, checked);
}
- // Change the enable status of the application processing based on the switch in the applications table
- onSwitchChange(appId: string, checked: any) {
+ onSwitchChange(appName: string, checked: boolean) {
+ console.log('onSwitchChange called with:', { appName, checked });
+
+ const index = this.applications.findIndex(
+ app => this.getApplicationKey(app) === appName
+ );
+
+ console.log('Found index:', index);
- // set the application to enabled or disabled
- const index = this.applications.findIndex(app => app.applicationId === appId);
if (index === -1) {
- console.error("Application not found");
+ console.error("Application not found:", appName);
+ return;
}
- this.applications[index].enabled = checked;
-
- this.settingsService.saveApplications(this.applications).catch(() => {
- console.error("Failed to save applications");
- });
+ console.log('Application before update:', this.applications[index]);
+
+ // Update the specific application
+ this.applications[index] = {
+ ...this.applications[index],
+ enabled: checked
+ };
+
+ console.log('Application after update:', this.applications[index]);
+
+ // Save changes
+ this.settingsService.saveApplications(this.applications)
+ .then(() => {
+ console.log(`Application ${appName} enabled status updated to ${checked}`);
+ })
+ .catch(error => {
+ console.error("Failed to save applications:", error);
+ // Revert the change if save fails
+ this.applications[index].enabled = !checked;
+ });
}
onFormSubmit(application?: Application) {
+ if (typeof application === 'undefined') return;
- // return if application is undefined
- if ( typeof application === 'undefined' ) return;
-
- // Validity has already been checked in form
- const index = this.applications.findIndex(app => app.applicationId === this.selectedApplication?.applicationId);
-
- if ( typeof this.selectedApplication !== 'undefined' ) {
+ if (typeof this.selectedApplication !== 'undefined') {
// Update existing application
- const index = this.applications.findIndex(app => app.applicationId === this.selectedApplication?.applicationId);
+ const index = this.applications.findIndex(
+ app => this.getApplicationKey(app) === this.getApplicationKey(this.selectedApplication!)
+ );
+
if (index === -1) {
console.error("Application not found");
+ return;
}
- this.applications[index] = application;
- this.applications = [
- ...this.applications,
- ]
+ this.applications[index] = application;
+ // Force change detection
+ this.applications = [...this.applications];
} else {
- this.applications = [
- ...this.applications,
- application
- ]
+ // Add new application
+ this.applications = [...this.applications, application];
}
this.settingsService.saveApplications(this.applications).then(() => {
this.modalVisible = false;
this.selectedApplication = undefined;
+ }).catch(error => {
+ console.error("Failed to save application:", error);
});
-
}
protected readonly faEye = faEye;
diff --git a/vscode/LICENSE b/vscode/LICENSE
deleted file mode 100644
index f1e54eac..00000000
--- a/vscode/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2021-Current Thinger.io (INTERNET OF THINGER SL)
-
-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/vscode/README.md b/vscode/README.md
index f93615f0..0beb9afb 100644
--- a/vscode/README.md
+++ b/vscode/README.md
@@ -1,9 +1,7 @@
# VS Code
-
-
-
+
The Thinger.io VS Code Plugin enables users to edit software files on the cloud using a fully-featured Integrated Development Environment (IDE) powered by Visual Studio Code (VS Code). This plugin also facilitates the coding of complete software and allows Over-The-Air (OTA) updates for microcontrollers directly from the cloud.
@@ -13,21 +11,16 @@ Thinger.io cloud platform offers a VS Code plugin based on Code-Server. This int
The plugin comes pre-installed with the complete setup of PlatformIO and the [Thinger.io extension](https://marketplace.visualstudio.com/items?itemName=thinger-io.thinger-io), making it effortless to get started with your projects.
-
-
-
+
Furthermore, when accessing the [File Storages](https://docs.thinger.io/file-system) in Thinger.io's web console, the platform detects the presence of VS Code and adds a convenient shortcut to open the storage inside the VS Code Plugin.
-
-
-
+
-!!! note
-
- Please note that the Thinger.io VS Code Plugin is available only for premium
- Thinger.io servers, from Medium subscription and upwards. You can check
- [**this link**](https://thinger.io/pricing) to create your own instance within minutes.
+> [!NOTE]
+> Please note that the Thinger.io VS Code Plugin is available only for premium
+> Thinger.io servers, from Medium subscription and upwards. You can check
+> [**this link**](https://thinger.io/pricing) to create your own instance within minutes.
## OTA Support
diff --git a/vscode/assets/iot-ota.gif b/vscode/assets/iot-ota.gif
new file mode 100644
index 00000000..e81b39c2
Binary files /dev/null and b/vscode/assets/iot-ota.gif differ
diff --git a/vscode/assets/laptop-mockup.png b/vscode/assets/laptop-mockup.png
new file mode 100644
index 00000000..81e41922
Binary files /dev/null and b/vscode/assets/laptop-mockup.png differ
diff --git a/vscode/assets/storage-shortcut.png b/vscode/assets/storage-shortcut.png
new file mode 100644
index 00000000..dc1cae73
Binary files /dev/null and b/vscode/assets/storage-shortcut.png differ
diff --git a/vscode/assets/vscode-icon.png b/vscode/assets/vscode-icon.png
new file mode 100644
index 00000000..37a08476
Binary files /dev/null and b/vscode/assets/vscode-icon.png differ
diff --git a/vscode/docs/changelog.md b/vscode/docs/changelog.md
deleted file mode 100644
index 9651cb1a..00000000
--- a/vscode/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "vscode/CHANGELOG.md"
diff --git a/vscode/docs/index.md b/vscode/docs/index.md
deleted file mode 100644
index 42c74f7e..00000000
--- a/vscode/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "vscode/README.md"
diff --git a/vscode/docs/plugin_file.md b/vscode/docs/plugin_file.md
deleted file mode 100644
index 3985471f..00000000
--- a/vscode/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "vscode/plugin.json"
-````
diff --git a/vscode/mkdocs.yml b/vscode/mkdocs.yml
deleted file mode 100644
index 363c2757..00000000
--- a/vscode/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/vscode
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/vscode/plugin.json b/vscode/plugin.json
index 345c3c50..d968c0b2 100644
--- a/vscode/plugin.json
+++ b/vscode/plugin.json
@@ -2,7 +2,7 @@
"name" : "vscode",
"version" : "4.89.1-1",
"description" : "VS Code Plugin for Thinger.io",
- "author" : "Alvaro Luis Bustamante",
+ "author": "Thinger.io",
"license" : "MIT",
"repository" : {
"type" : "git",
@@ -12,8 +12,9 @@
"metadata" : {
"name" : "VS Code",
"description" : "VS Code Plugin for Thinger.io",
- "image" : "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/vscode/img/vscode-icon.png",
- "icon" : "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/vscode/img/vscode-icon.png"
+ "category" : "development",
+ "image" : "assets/vscode-icon.png",
+ "icon" : "assets/vscode-icon.png"
},
"tokens" : {
"vscode_plugin" : {
diff --git a/wika-pew1000/LICENSE.md b/wika-pew1000/LICENSE.md
deleted file mode 100644
index f1bacd61..00000000
--- a/wika-pew1000/LICENSE.md
+++ /dev/null
@@ -1,7 +0,0 @@
-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/wika-pew1000/docs/changelog.md b/wika-pew1000/docs/changelog.md
deleted file mode 100644
index c6bde86c..00000000
--- a/wika-pew1000/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "wika-pew1000/CHANGELOG.md"
diff --git a/wika-pew1000/docs/index.md b/wika-pew1000/docs/index.md
deleted file mode 100644
index 1fe478f0..00000000
--- a/wika-pew1000/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "wika-pew1000/README.md"
diff --git a/wika-pew1000/docs/plugin_file.md b/wika-pew1000/docs/plugin_file.md
deleted file mode 100644
index 082107f0..00000000
--- a/wika-pew1000/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "wika-pew1000/plugin.json"
-````
diff --git a/wika-pew1000/mkdocs.yml b/wika-pew1000/mkdocs.yml
deleted file mode 100644
index 8a942acf..00000000
--- a/wika-pew1000/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/wika-pew1000
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/wika-pew1000/plugin.json b/wika-pew1000/plugin.json
index 21d8dc95..728c0e5c 100644
--- a/wika-pew1000/plugin.json
+++ b/wika-pew1000/plugin.json
@@ -12,7 +12,8 @@
"metadata": {
"name": "WIKA PEW-1000",
"description": "Wireless pressure sensor",
- "image": "https://s3.eu-west-1.amazonaws.com/thinger.io.files/plugins/wika-pew1000/img/wikapew1000.png"
+ "category": "devices",
+ "image": "assets/wikapew1000.png"
},
"resources": {
"products": [
diff --git a/wika-pgw23-100/LICENSE.md b/wika-pgw23-100/LICENSE.md
deleted file mode 100644
index f1bacd61..00000000
--- a/wika-pgw23-100/LICENSE.md
+++ /dev/null
@@ -1,7 +0,0 @@
-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/wika-pgw23-100/README.md b/wika-pgw23-100/README.md
index 3f9dcb8a..9d5973da 100644
--- a/wika-pgw23-100/README.md
+++ b/wika-pgw23-100/README.md
@@ -1,8 +1,7 @@
# WIKA PGW-23-100
-
-
+
The WIKA PGW23-100 is a hybrid IIoT pressure gauge: it combines a mechanical on-site Bourdon tube display with wireless LoRaWAN® communication for remote monitoring. It is designed for process-industry applications where you want both local indication and centralized data collection.
diff --git a/wika-pgw23-100/assets/wika-pgw23-100.jpg b/wika-pgw23-100/assets/wika-pgw23-100.jpg
index 67591c06..8a3cc95c 100644
Binary files a/wika-pgw23-100/assets/wika-pgw23-100.jpg and b/wika-pgw23-100/assets/wika-pgw23-100.jpg differ
diff --git a/wika-pgw23-100/docs/changelog.md b/wika-pgw23-100/docs/changelog.md
deleted file mode 100644
index 047b1124..00000000
--- a/wika-pgw23-100/docs/changelog.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "wika-pgw23-100/CHANGELOG.md"
diff --git a/wika-pgw23-100/docs/index.md b/wika-pgw23-100/docs/index.md
deleted file mode 100644
index a4480567..00000000
--- a/wika-pgw23-100/docs/index.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
---8<-- "wika-pgw23-100/README.md"
diff --git a/wika-pgw23-100/docs/plugin_file.md b/wika-pgw23-100/docs/plugin_file.md
deleted file mode 100644
index ea2db388..00000000
--- a/wika-pgw23-100/docs/plugin_file.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-search:
- exclude: true
----
-
-# Plugin file
-
-```` json title="Plugin configuration file"
---8<-- "wika-pgw23-100/plugin.json"
-````
diff --git a/wika-pgw23-100/mkdocs.yml b/wika-pgw23-100/mkdocs.yml
deleted file mode 100644
index 1314c163..00000000
--- a/wika-pgw23-100/mkdocs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-site_name: plugins/wika-pgw23-100
-
-nav:
- - "index.md"
- - Changelog: "changelog.md"
- - Plugin file: "plugin_file.md"
diff --git a/wika-pgw23-100/plugin.json b/wika-pgw23-100/plugin.json
index b343b797..9e75f5ad 100644
--- a/wika-pgw23-100/plugin.json
+++ b/wika-pgw23-100/plugin.json
@@ -12,7 +12,8 @@
"metadata": {
"name": "Wika PGW23-100 Pressure Sensor",
"description": "Bourdon tube pressure gauge with wireless transmission",
- "image": "https://www.wika.com/media/Images/Product_700x700/Pressure/pgw23.100_en_co_rs_w410_h410_image.jpg"
+ "category": "devices",
+ "image": "assets/wika-pgw23-100.jpg"
},
"resources": {
"products": [