This is a ctrlX AUTOMATION snap app that packages thin-edge.io — the open-source, cloud-agnostic IoT edge framework. It enables ctrlX CORE and ctrlX COREvirtual devices to securely connect to major IoT cloud platforms and provides a built-in web UI for configuration and monitoring.
- Multi-Cloud Connectivity — Cumulocity IoT, AWS IoT Core, Azure IoT Hub
- Web-Based Configuration UI — Browser-accessible dashboard served directly from the device
- Device Management — Remote monitoring, configuration management
- Log Management — Centralized log collection with live viewer in the web UI
- MQTT Bridge — Efficient local and cloud messaging via Mosquitto
- ctrlX Data Layer Bridge — Bridge service reads ctrlX Data Layer nodes and publishes them to MQTT/cloud
- ctrlX License Enforcement — Acquires and periodically re-checks ctrlX OS license via Unix socket; shows warning banner when license is missing
- Health Monitoring — Integrated watchdog service with automatic service recovery
- Strict Snap Confinement — Process isolation, no root privileges required
tedge-ctrlx-os/
├── snap/
│ ├── snapcraft.yaml # Snap build definition
│ └── hooks/ # install, configure, post-refresh, remove hooks
├── web-server-rust/ # Actix-web backend (Rust)
│ └── src/main.rs # REST API server + license enforcement loop
├── bridge-service-rust/ # ctrlX Data Layer bridge (Rust)
├── web/www/ # Frontend source (HTML, JS, CSS, styles.less)
├── scripts/ # Build and runtime helper scripts
├── configs/ # App metadata (caddyfile, package-manifest.json)
├── package-assets/ # ctrlX Store assets (icons, i18n, proxy config)
└── docs/ # Documentation
| Service | Description |
|---|---|
tedge |
CLI tool for configuration and management |
tedge-agent |
Main agent service for device operations |
tedge-mapper-c8y |
Protocol mapper for Cumulocity IoT |
tedge-mapper-aws |
Protocol mapper for AWS IoT Core |
tedge-mapper-az |
Protocol mapper for Azure IoT Hub |
tedge-watchdog |
Health monitoring and automatic recovery |
mosquitto |
Local MQTT broker |
| Plugin | Description |
|---|---|
tedge-file-config-plugin |
Configuration file management |
tedge-snap-plugin |
Lists installed snaps in Cumulocity software inventory (read-only, install/remove not supported) |
| Service | Description |
|---|---|
webserver |
Rust/Actix-web configuration UI (accessible via ctrlX sidebar); acquires ctrlX license on startup, shows warning banner if missing |
tedge-datalayer-bridge |
ctrlX Data Layer ↔ thin-edge.io bridge; polls Data Layer nodes and publishes measurements/events/alarms to MQTT |
tedge-log-upload-manager |
Coordinates log file uploads to cloud platforms (replaces standard tedge-file-log-plugin) |
After installation, the configuration UI is accessible via the ctrlX CORE sidebar under thin-edge.io, or directly at:
https://<device-ip>/thin-edge-io/
Each section is a collapsible card in the sidebar UI. All sections are always visible simultaneously (no navigation required).
Three-column live status dashboard, auto-refreshing every 30 seconds (also on demand via Refresh Status button):
| Column | Items |
|---|---|
| Services | MQTT Broker, Tedge Agent, Datalayer Bridge, Watchdog, Log Manager — each label is clickable to restart the service |
| Mappers | Cumulocity IoT, AWS IoT, Azure IoT — shows whether the mapper process is running |
| Cloud Connections | Cumulocity IoT, AWS IoT, Azure IoT — shows MQTT bridge state ($SYS/broker/connection/*/state) |
Status indicators:
- 🟢 Running — process active
- 🔴 Stopped — process not running
- ⚫ Inactive — disabled/not configured
- ⚪ Unknown — not yet checked
Three tabs — Cumulocity IoT, AWS IoT, Azure IoT:
| Tab | Fields |
|---|---|
| Cumulocity IoT | C8Y URL (e.g. https://your-tenant.cumulocity.com), Tenant ID, Enable Cumulocity Mapper toggle |
| AWS IoT | AWS IoT Endpoint URL (e.g. xxxxxxxxxx.iot.us-east-1.amazonaws.com), Enable AWS Mapper toggle |
| Azure IoT | Azure IoT Hub URL (e.g. your-hub.azure-devices.net), Enable Azure Mapper toggle |
Each tab has a Save Configuration button that writes values via POST /api/config/{cloud}. The Enable Mapper toggle immediately starts (snapctl start thin-edge-io.tedge-mapper-<cloud>) or stops (snapctl stop) the corresponding mapper service — no manual restart required.
Left panel — device identity:
| Element | Description |
|---|---|
| Device ID | Read-only; the unique device identifier derived from the serial number |
| Device Name | Editable CN used when creating / renewing the X.509 certificate |
| Certificate Status | Indicates whether a valid device certificate exists |
| Upload Status | Shows whether the certificate has been uploaded to Cumulocity (persisted in tedge-web-config.json) |
| Save | Saves device name changes |
| Renew Certificate | Recreates the certificate with the current Device Name as CN |
| Upload Certificate | Expands a credential form (Cumulocity username + password) and uploads the certificate via POST /api/cert/upload/c8y |
Right panel (shown when a certificate exists): Certificate Details — displays subject, issuer, validity dates, and fingerprint.
Three tabs — Cumulocity IoT, AWS IoT, Azure IoT — each with:
- Connect — runs
tedge connect <cloud> - Reconnect — runs
tedge reconnect <cloud> - Disconnect — runs
tedge disconnect <cloud> - Setup ↗ — opens the thin-edge.io documentation for the respective cloud
For Cumulocity IoT only, an additional MQTT Port toggle selects between:
Core MQTT (8883)— standard TLS MQTTMQTT Service (9883)— Cumulocity MQTT Service (connection only; SmartREST operations not supported)
Test Messages section (bottom, shared across all tabs):
| Button | MQTT Topic |
|---|---|
| Test Measurement | publishes a sample measurement payload |
| Test Event | publishes a sample event payload |
| Test Alarm | publishes a sample alarm payload |
Output of connect/disconnect/test operations appears in the Logs & Diagnostics viewer.
Live log viewer with controls:
| Control | Options |
|---|---|
| Service | tedge-agent, tedge-mapper-c8y, tedge-mapper-aws, tedge-mapper-az, tedge-bridge, log-upload, mosquitto, webserver |
| Log Level | error, warn, info (default), debug, trace |
| Apply Level | Writes the selected level via RUST_LOG to $SNAP_DATA/log-levels/<service> and restarts the service |
| Load Logs | Fetches recent log lines via GET /api/logs?service=<name> |
| Copy | Copies viewer content to clipboard |
The viewer is a 320 px high monospace scrollable area.
Read-only view of the complete tedge config list output (equivalent to running thin-edge-io.tedge config list on the device):
- Load — fetches via
GET /api/tedge-config-list - Copy — copies all lines to clipboard
The viewer is a 400 px high monospace scrollable area.
Direct file editor for the snap's configuration files stored in $SNAP_DATA. Useful for advanced manual edits without SSH access.
File selector:
| File | Location | Description |
|---|---|---|
datalayer-mappings.json |
$SNAP_DATA/datalayer-mappings.json |
ctrlX Data Layer ↔ MQTT bridge mapping definitions |
inventory.json |
$SNAP_DATA/tedge/device/inventory.json |
Device inventory reported to cloud (hardware, snap list) |
mosquitto.conf |
$SNAP_DATA/mosquitto/mosquitto.conf |
Mosquitto MQTT broker configuration (ports, TLS, bridge) |
tedge.toml |
$SNAP_DATA/tedge/tedge.toml |
Main thin-edge.io configuration (URLs, paths, plugin settings) |
tedge-log-plugin.toml |
$SNAP_DATA/tedge/plugins/tedge-log-plugin.toml |
Log file paths exposed for remote log upload requests |
tedge-configuration-plugin.toml |
$SNAP_DATA/tedge/plugins/tedge-configuration-plugin.toml |
Config files exposed for remote configuration management |
The file's full path is shown below the selector as a hint. The editor textarea is resizable vertically.
- Load — reads the file via
GET /api/snapconfig?file=<name> - Save — writes back via
POST /api/snapconfig(requiresthin-edge-io.rwscope) - Copy — copies editor content to clipboard
Manages the optional ctrlX Data Layer ↔ MQTT bridge service (tedge-datalayer-bridge).
Status row: Shows the bridge service dot and connection state; Refresh button re-polls GET /api/datalayer/status.
Connection Settings (collapsible <details>):
| Field | Description |
|---|---|
| Base URL | ctrlX Data Layer base URL (default https://localhost) |
| Username | Data Layer username (default boschrexroth) |
| Password | Data Layer password |
| Poll interval (ms) | How often the bridge polls Data Layer nodes (default 5000) |
| Static Token | Optional bearer token (overrides username/password) |
| Enabled toggle | Enable/disable the bridge |
| Accept invalid TLS certs | Skip TLS verification (useful for self-signed certificiates on local device) |
| Save Connection | Saves via POST /api/datalayer/config |
Node Browser (collapsible <details>):
- Path input + Browse button — lists child nodes of the given Data Layer path via
GET /api/datalayer/browse - ↑ Up — navigates to the parent path
- Clicking a node reads its current value; a + icon in the node list opens the Add Mapping form pre-filled with that path
Mappings Form (shown when adding or editing):
| Field | Description |
|---|---|
| Datalayer Path | Full path to the Data Layer node (e.g. /framework/metrics/system/memfree-mb) |
| Direction | Datalayer ➔ tedge (read) or tedge ➔ Datalayer (write) |
| tedge MQTT Topic | Auto-suggested based on transform type; editable (e.g. c8y/mqtt/out/myTopic) |
| Transform | raw, measurement, event, or alarm |
| Field name | JSON field name in the payload (auto-derived from path if left empty) |
| Unit | Optional unit string (e.g. °C, MB, %) — published as top-level "unit" field |
Measurement Payload Format (when using Cumulocity MQTT Service, port 9883):
{
"memfree-mb": 6892.03,
"unit": "MB",
"time": "2026-04-21T09:30:00.123Z",
"externalId": "ctrlx-984c906200b9425eb91c96474c64c938"
}"time": UTC timestamp, added automatically on each poll cycle"unit": included only if configured in the mapping"externalId": automatically injected for topics starting withc8y/mqtt/out/; equals the device certificate CN (= the external ID registered in Cumulocity)- Multiple mappings can use the same MQTT topic — each is identified by its UUID and processed independently
Mappings Table (bottom): lists all saved mappings with columns Path, Topic, Direction (arrow icon), Type · Field, Active toggle, and an edit button. Changes to individual rows are saved via PUT /api/datalayer/mappings/{id} or DELETE /api/datalayer/mappings/{id}.
Shows the ctrlX OS licenses currently active on the device. Loaded automatically when the section is opened.
| Element | Description |
|---|---|
| License table | Lists all capabilities returned by the ctrlX License Manager API (/license-manager/api/v1/capabilities) — name, permanent flag, expiry date, count |
| Refresh button | Re-fetches GET /api/licenses |
| Manage Licenses button | Opens /license-manager (ctrlX License Manager UI) in a new tab |
If no valid license is held, a red warning banner is shown at the top of the page with a link to the Licensing section and the Bosch Rexroth Licensing Center.
Displays read-only device and build metadata:
| Field | Source |
|---|---|
| Version | Snap version (from GET /api/build-info) |
| Build | Build number / Git commit from configs/build-info.txt |
| Architecture | CPU architecture (amd64 or arm64) |
Refresh button reloads all status data (same as the button in Connection Status).
The web server exposes the following API endpoints under /api/:
| Method | Endpoint | Description |
|---|---|---|
| GET | /status |
Service status for all components |
| GET | /config |
Current tedge configuration |
| POST | /config/c8y |
Save Cumulocity configuration |
| POST | /config/aws |
Save AWS configuration |
| POST | /config/az |
Save Azure configuration |
| POST | /config/device |
Save device configuration |
| GET | /device-id |
Get current device ID |
| POST | /device-id |
Set device ID |
| POST | /device-id/recreate |
Recreate device certificate |
| POST | /device-id/create-auto |
Auto-create certificate from device ID |
| GET | /device-id/cert-info |
Show certificate details |
| POST | /connect/{cloud} |
Connect to cloud (c8y/aws/az) |
| POST | /disconnect/{cloud} |
Disconnect from cloud |
| POST | /reconnect/{cloud} |
Reconnect to cloud |
| POST | /cert/upload/c8y |
Upload certificate to Cumulocity |
| POST | /test-message |
Publish test MQTT message |
| GET | /logs |
Fetch service logs |
| GET | /tedge-config-list |
Full tedge config list output |
| GET | /build-info |
Build and version information |
| GET | /log-level |
Get configured log level per service |
| POST | /log-level |
Set log level for a service (error/warn/info/debug/trace); restarts service to apply |
| POST | /restart |
Restart all services |
| POST | /restart-service |
Restart a single named service |
| GET | /me |
Current authenticated user and role |
| POST | /set-mqtt-port |
Set MQTT port (8883 = MQTT Core, 9883 = MQTT Service) |
| GET | /snapconfig |
Read raw tedge.toml snap config file |
| POST | /snapconfig |
Write raw tedge.toml snap config file |
| GET | /datalayer/status |
Data Layer bridge status |
| GET | /datalayer/config |
Data Layer bridge configuration |
| POST | /datalayer/config |
Save Data Layer bridge configuration |
| GET | /datalayer/raw-config |
Raw Data Layer config file content |
| GET | /datalayer/mappings |
List MQTT ↔ Data Layer mappings |
| POST | /datalayer/mappings |
Save all mappings |
| POST | /datalayer/mappings/add |
Add a single mapping |
| PUT | /datalayer/mappings/{id} |
Update a mapping by ID |
| DELETE | /datalayer/mappings/{id} |
Delete a mapping by ID |
| GET | /datalayer/browse |
Browse Data Layer nodes |
| GET | /datalayer/node |
Read a single Data Layer node value |
| GET | /licenses |
List all ctrlX OS license capabilities (via Unix socket) |
| GET | /license-status |
Returns {"licensed": true/false} — whether a valid license is currently held |
- ctrlX CORE or ctrlX COREvirtual with ctrlX OS 1.20 or higher
- Network connectivity to your cloud platform
-
Build the snap (see Building from Source) or download a release:
ctrlx-cumulocity-thin-edge-io_2.0.0_amd64.snap— ctrlX COREvirtualctrlx-cumulocity-thin-edge-io_2.0.0_arm64.snap— ctrlX CORE hardware
-
Open the ctrlX CORE web interface
-
Navigate to Settings → Apps
3a. If necessary set Allow installation from unknown source.
-
Switch to Service Mode
-
Click Install from file and select the snap file
-
Switch back to Operation Mode
Open https://<device-ip>/thin-edge-io/ and configure cloud connection, device ID, and certificates directly in the browser.
SSH is only woking if your user is Member of the ssh-users group. You can add your user to this group via the ctrlX CORE web interface under Settings → Users & Groups and SSH is activated in Settings → Apps → SSH.
# Configure Cumulocity IoT
ctrlx-cumulocity-thin-edge-io.tedge config set c8y.url your-tenant.cumulocity.com
# Or configure for AWS IoT
ctrlx-cumulocity-thin-edge-io.tedge config set aws.url your-endpoint.iot.region.amazonaws.com
# Or configure for Azure IoT Hub
ctrlx-cumulocity-thin-edge-io.tedge config set az.url your-hub.azure-devices.net# Create device certificate
ctrlx-cumulocity-thin-edge-io.tedge cert create --device-id your-device-id
# Show certificate details
ctrlx-cumulocity-thin-edge-io.tedge cert show
# Connect to Cumulocity (registers device and uploads cert)
ctrlx-cumulocity-thin-edge-io.tedge connect c8y# Show status of all services
snap services ctrlx-cumulocity-thin-edge-io
Service Startup Current Notes
ctrlx-cumulocity-thin-edge-io.mosquitto enabled active -
ctrlx-cumulocity-thin-edge-io.setup-directories enabled inactive -
ctrlx-cumulocity-thin-edge-io.tedge-agent enabled active -
ctrlx-cumulocity-thin-edge-io.tedge-datalayer-bridge enabled active -
ctrlx-cumulocity-thin-edge-io.tedge-log-upload-manager enabled active -
ctrlx-cumulocity-thin-edge-io.tedge-mapper-aws enabled inactive -
ctrlx-cumulocity-thin-edge-io.tedge-mapper-az enabled inactive -
ctrlx-cumulocity-thin-edge-io.tedge-mapper-c8y enabled active -
ctrlx-cumulocity-thin-edge-io.tedge-watchdog enabled active -
ctrlx-cumulocity-thin-edge-io.webserver enabled active -
# Restart all services
snap restart ctrlx-cumulocity-thin-edge-io
# Restart a single service
snap restart ctrlx-cumulocity-thin-edge-io.tedge-agent
# View live logs of a service
snap logs ctrlx-cumulocity-thin-edge-io.webserver -f
snap logs ctrlx-cumulocity-thin-edge-io.tedge-agent -f
# Show snap version and revision
snap info ctrlx-cumulocity-thin-edge-io
# Disable / enable snap
snap disable ctrlx-cumulocity-thin-edge-io
snap enable ctrlx-cumulocity-thin-edge-io
# View snap configuration (tedge.toml)
snap get ctrlx-cumulocity-thin-edge-io -d
# Remove snap (configuration remains in $SNAP_DATA)
snap remove ctrlx-cumulocity-thin-edge-io
# Completely remove snap including all data
snap remove --purge ctrlx-cumulocity-thin-edge-io
# Revert to previous snap revision after update
snap revert ctrlx-cumulocity-thin-edge-ioDas Snap stellt folgende CLI-Befehle bereit (erreichbar per SSH oder Terminal):
ctrlx-cumulocity-thin-edge-io.manage-device-id <command> [device-id]| Command | Beschreibung |
|---|---|
get-serial |
Gibt die Systemseriennummer aus (DMI/UUID-basiert, für neue Geräte ohne Zertifikat) |
get-current |
Gibt die aktuelle Device-ID aus dem vorhandenen Gerätezertifikat aus |
status |
Zeigt Systemseriennummer und aktuelle Device-ID (aus Zertifikat) an |
create [device-id] |
Erstellt ein neues Zertifikat — ohne Argument wird get-serial verwendet |
recreate [device-id] |
Erstellt das Zertifikat neu (z.B. nach Gerätewechsel) |
set <device-id> |
Setzt eine explizite Device-ID und erstellt das Zertifikat |
Beispiele:
# Status anzeigen
sudo ctrlx-cumulocity-thin-edge-io.manage-device-id status
# Zertifikat mit automatisch erkannter Seriennummer erstellen
sudo ctrlx-cumulocity-thin-edge-io.manage-device-id create
# Explizite Device-ID setzen
sudo ctrlx-cumulocity-thin-edge-io.manage-device-id set my-device-001# Mit Cumulocity IoT verbinden (registriert Gerät, lädt Zertifikat hoch)
ctrlx-cumulocity-thin-edge-io.tedge-connect c8y
# Verbindung trennen
ctrlx-cumulocity-thin-edge-io.tedge-connect c8y --disconnect# Zeigt Versionsinformationen des installierten Snaps
ctrlx-cumulocity-thin-edge-io.build-infoImportant Paths:
| Path | Contents |
|---|---|
/var/snap/ctrlx-cumulocity-thin-edge-io/common/tedge/log/ |
Service logs |
/var/snap/ctrlx-cumulocity-thin-edge-io/common/package-certificates/thin-edge-io/tedge/ |
Device certificate & private key (ctrlX Certificate Store) |
/var/snap/ctrlx-cumulocity-thin-edge-io/common/datalayer-credentials.json |
ctrlX Data Layer credentials (survives snap updates) |
/var/snap/ctrlx-cumulocity-thin-edge-io/current/package-run/thin-edge-io/ |
Runtime status (ctrlX) |
/var/snap/ctrlx-cumulocity-thin-edge-io/current/datalayer-mappings.json |
Data Layer ↔ MQTT bridge mappings |
/var/snap/ctrlx-cumulocity-thin-edge-io/current/log-levels/ |
Log level files per service |
/var/snap/ctrlx-cumulocity-thin-edge-io/current/tedge/ |
tedge configuration (tedge.toml) |
/tmp/ctrlx-cumulocity-thin-edge-io.license |
Held ctrlX license ID (cleared on reboot / snap remove) |
git clone https://github.com/thin-edge/tedge-ctrlx-os.git
cd tedge-ctrlx-os
./setup-and-build-all.sh --fixThis script installs all dependencies (Rust toolchain, Snapcraft) and builds snaps for both architectures.
Note: The first build takes 15–30 minutes as it compiles all Rust dependencies from source.
# Rust toolchain
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup default 1.94
# Snapcraft
sudo snap install snapcraft --classic
# System dependencies
sudo apt-get install pkg-config libssl-dev libsqlite3-dev# ctrlX COREvirtual (amd64)
./build-snap-amd64.sh
# ctrlX CORE hardware (arm64)
./build-snap-arm64.sh (requires arm64 build environment or cross-compilation)The frontend source lives in web/www/ (includes styles.less). After editing, sync to the Rust server:
cp web/www/app.js web/www/index.html web/www/styles.css web-server-rust/www/Warning: A CSS formatter may replace
var(--brand-primary)with hardcoded hex values. After formatter runs, verify with:grep -n "86efac\|4ade80\|FDC000" web-server-rust/www/styles.css
# Test cloud connectivity
ctrlx-cumulocity-thin-edge-io.tedge connect c8y --test
# Show current configuration
ctrlx-cumulocity-thin-edge-io.tedge config list
# Check certificate
ctrlx-cumulocity-thin-edge-io.tedge cert show# View logs (follow)
snap logs thin-edge-io.<service> -f
snap logs thin-edge-io.tedge-agent -f
snap logs thin-edge-io.webserver -f
# Restart all services
snap restart thin-edge-ioThe snap uses $SNAP_DATA (per-revision path) for all runtime data. After a snap update, paths are re-configured automatically via the post-refresh hook:
$SNAP_DATA/tedge/run/ → tedge run.path
$SNAP_DATA/tedge/tmp/ → tedge tmp.path
$SNAP_DATA/tedge/log-plugins/
$SNAP_DATA/tedge/sm-plugins/
apt → $SNAP/bin/tedge-apt-plugin (Debian packages in Cumulocity)
snap → $SNAP/scripts/sm-plugins/tedge-snap-plugin (Snaps in Cumulocity)
$SNAP_DATA/tedge/.agent/
| Direction | Protocol | Port | Purpose |
|---|---|---|---|
| Outbound | HTTPS | 443 | Cloud platform REST API |
| Outbound | MQTT/TLS | 8883 | Secure cloud MQTT (recommended) |
| Outbound | MQTT/TLS | 9883 | Cumulocity MQTT Service (connection only; SmartREST operations not supported) |
| Local | HTTP | 8888 | Web UI (proxied via ctrlX Caddy) |
| Local | MQTT | 1883 | Local broker (internal) |
- All cloud connections use TLS 1.2+
- Certificate-based device authentication (X.509)
- Strict snap confinement — process isolation, no root required
- ctrlX Bearer Token authentication for web UI access
- Role-based scopes:
thin-edge-io.rwx,thin-edge-io.rw,thin-edge-io.r
| Resource | Typical |
|---|---|
| RAM | ~50–100 MB (depending on active mappers) |
| CPU | <5% idle, <20% during active data transfer |
| Storage | ~100 MB for app + logs/cache |
This app packages thin-edge.io, licensed under the Apache License 2.0.
All included open-source components are documented in package-assets/fossinfo.json and package-assets/foss-offer.txt.
- thin-edge.io Docs: https://thin-edge.github.io/thin-edge.io/
- thin-edge.io GitHub: https://github.com/thin-edge/thin-edge.io
- This App Repository: https://github.com/thin-edge/tedge-ctrlx-os
- Discord Community: https://discord.com/invite/sVX3B8nj5d
- ✅ ctrlX License Management integration (acquire/release/periodic re-check + warning banner)
- Enhanced ctrlX Diagnostics/Logbook integration
Contributions to thin-edge.io are welcome! Visit the GitHub repository for contribution guidelines.
thin-edge.io is the first open-source and cloud-agnostic edge framework designed for resource-constrained IoT devices. It provides re-usable and modular components for IoT device enablement across different cloud platforms and industrial IoT scenarios.
The project uses a modular build process:
- setup-and-build-all.sh: Orchestrates the complete build
- scripts/: Contains runtime wrappers and helper scripts
setup-config.sh— Interactive configuration helper scriptsetup-directories.sh— Directory initialization at snap startupmosquitto-wrapper.sh— Mosquitto MQTT broker wrapperconnect-wrapper.sh— Snap-aware tedge connect/disconnect/reconnect (setsmqtt.bridge.built_in=true, reads cert paths)watchdog-wrapper.sh— Health monitoring wrapperwebserver-wrapper.sh— Webserver starter (reads log level from$SNAP_DATA/log-levels/webserver)tedge-service-wrapper.sh— General service wrapper (reads log level from$SNAP_DATA/log-levels/<service>, setsRUST_LOG)manage-device-id.sh— Device ID management (serial number, certificate creation)update-inventory.sh— Inventory update scriptshow-build-info.sh— Build info displaycheck-format.sh— Code format checkclean.sh— Remove build artifacts
Tip: For modifications to build or tests, please edit the respective scripts in scripts/.
./setup-and-build-all.sh
./scripts/clean.sh
The snap auto-configures all required tedge settings on first install and after every update. Below is the complete reference of all configuration blocks managed by this snap.
These are set automatically by the install hook and kept current by the post-refresh hook.
| Key | Value | Description |
|---|---|---|
device.type |
ctrlX-CORE |
Device type reported to cloud |
device.cert_path |
$SNAP_COMMON/package-certificates/thin-edge-io/tedge/own/certs/tedge-certificate.pem |
Device certificate (ctrlX Certificate Store) |
device.key_path |
$SNAP_COMMON/package-certificates/thin-edge-io/tedge/own/private/tedge-private-key.pem |
Private key (ctrlX Certificate Store, mode 700) |
| Key | Value | Description |
|---|---|---|
mqtt.bind.address |
127.0.0.1 |
Mosquitto listens on localhost only |
mqtt.bind.port |
1883 |
Local broker port |
mqtt.client.port |
1883 |
Port used by tedge services to connect to the broker |
| Key | Value | Description |
|---|---|---|
http.bind.address |
127.0.0.1 |
File-transfer service listens on localhost only |
http.bind.port |
8000 |
File-transfer service port |
| Key | Value | Description |
|---|---|---|
software.plugin.default |
snap |
Default software management plugin |
| Key | Value | Description |
|---|---|---|
data.path |
$SNAP_COMMON/tedge |
Persistent data directory (survives snap updates) |
logs.path |
$SNAP_COMMON/tedge/log |
Log directory |
run.path |
$SNAP_DATA/tedge/run |
Runtime sockets and PID files (updated on each refresh) |
tmp.path |
$SNAP_DATA/tedge/tmp |
Temporary files |
log.plugin_paths |
$SNAP_DATA/tedge/log-plugins-disabled |
Set to empty dir to disable tedge-agent's built-in log manager; log uploads are handled by tedge-log-upload-manager |
| Key | Value | Description |
|---|---|---|
sudo.enable |
false |
Disabled — snap runs without root |
These files are re-generated by the post-refresh hook after every snap update to fix revision-specific paths.
| Log type | Path pattern |
|---|---|
software-management |
$SNAP_COMMON/tedge/log/agent/workflow-software_* |
tedge-agent |
$SNAP_COMMON/tedge/log/tedge-agent.log |
tedge-datalayer-bridge |
$SNAP_COMMON/tedge/log/tedge-datalayer-bridge.log |
tedge-mapper-c8y |
$SNAP_COMMON/tedge/log/tedge-mapper.log |
mosquitto |
$SNAP_COMMON/tedge/log/mosquitto.log |
webserver |
$SNAP_COMMON/tedge/log/tedge-web-config.log |
log-upload-manager |
$SNAP_COMMON/tedge/log/tedge-log-upload-manager.log |
| Config type | File path |
|---|---|
tedge.toml / default |
$SNAP_DATA/tedge/tedge.toml |
mosquitto.conf |
$SNAP_DATA/mosquitto/mosquitto.conf |
inventory.json |
$SNAP_DATA/tedge/device/inventory.json |
tedge-log-plugin |
$SNAP_DATA/tedge/plugins/tedge-log-plugin.toml |
The following endpoints manage ctrlX Data Layer ↔ MQTT bridge mappings:
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/datalayer/mappings |
List all mappings |
| POST | /api/datalayer/mappings |
Replace all mappings |
| POST | /api/datalayer/mappings/add |
Add a single mapping |
| PUT | /api/datalayer/mappings/{id} |
Update a mapping by ID |
| DELETE | /api/datalayer/mappings/{id} |
Delete a mapping by ID |
How to connect to Cumulocity IoT and other cloud platforms and run the thin-edge.io snap on ctrlX CORE
See the docs/ folder for detailed guides: