Skip to main content
Technical Preview

Overview

Litmus Edge is an industrial edge data platform: it connects PLCs and other devices through DeviceHub, stores tag data locally, runs Node-RED flows and analytics, and forwards data through integrations. The LitmusEdge connector lets a Coreflux broker manage and query an edge over its REST and GraphQL API (https://<edge>/..., the same address as the web UI). Each event publishes the edge’s reply on <topic>/response. DeviceHub is GraphQL: every DeviceHub event posts to /devicehub/v2, and you send the GraphQL document in the payload as body ({"query": "...", "variables": {...}}). The event name tells you which query or mutation it is meant for.
Live tag values and tag writes are not REST in Litmus Edge. Litmus documents tag writes only on the edge’s NATS bus (devicehub.write.<device>.<tag>), and live values stream on devicehub.alias.<device>.<tag>. To move live data between Litmus Edge and Coreflux, use a Litmus Edge MQTT integration pointed at this broker. Use this connector for configuration and control.

Prerequisites

  1. Litmus Edge 4.0.x, reachable from the broker host on HTTPS (port 443 on an appliance or VM; a Docker install usually publishes it on host port 8443).
  2. An OAuth2 client (client ID and secret) or a REST API token from System > Access Control > Tokens, with permission for DeviceHub, DataHub and Flows Manager.
  3. The edge certificate is self-signed by default. Install the edge CA on the broker host (download it from System > Network > Certificates), or replace it with a trusted certificate.
  4. Store the credentials in Hub secrets, for example LITMUS_CLIENT_ID and LITMUS_CLIENT_SECRET, or LITMUS_API_TOKEN.

Authentication

Every event except GetAccessToken takes the full Authorization header value in the payload as authorization:
  • OAuth2 client credentials: publish {"client_id": "...", "client_secret": "..."} to historian/litmus-edge/auth-token/create. The reply holds access_token and expires_in. Send "authorization": "Bearer <access_token>".
  • REST API token: send "authorization": "Basic <base64 of token:>" (the token is the username, the password is empty).
Token lifetime depends on the edge. Litmus reports expires_in values as short as 300 seconds, so refresh the token on a timer shorter than expires_in (the example below refreshes every 4 minutes).

Configuration

Replace YOUR_LITMUS_EDGE_HOST in BASE_ADDRESS with the edge address, for example https://10.0.0.20 or https://10.0.0.20:8443 for Docker.

Examples

List devices:
List the tags of one device:
Create a tag:
Stop and start a device:
Restart a Node-RED flow instance:
Register properties (Name, Properties keys) depend on the device’s driver; Litmus lists them per driver in its DeviceHub register reference.

Example actions

Keep GraphQL documents in a retained topic (for example config/litmus-edge/list-devices holding {"query": "query ListDevices { ListDevices { ID Name DriverID } }"}) and read them with GET TOPIC, so the GraphQL text never sits inside a LoT JSON literal.

Responses and errors

Always check the errors key in DeviceHub responses, not only the HTTP status.

Testing

Checked 2026-10-05 against Litmus’s Litmus Edge 4.0.x API reference (17/17 events, endpoints, methods and GraphQL operations) and a local mock edge (19/19 calls, plus wrong secret 401, wrong token 401, API token over Basic, missing DeviceID BAD_USER_INPUT, unknown flow 404). A run against a real Litmus Edge and a broker MQTT round-trip are still open. See TEST.md in the app package for the smoke script.

Not covered

  • Tag value writes and live values (NATS bus only, see the note above). Use a Litmus Edge MQTT integration.
  • DeviceHub subscriptions (RegisterStatus, DeviceConnectionStatus), which need a GraphQL websocket.
  • Browse, asset discovery, digital twins, analytics, applications, OPC UA server, system administration (network, backups, certificates, RBAC) and Litmus Edge Manager (LEM) fleet APIs.
  • Litmus Edge 3.16.x endpoints.
Last modified on October 21, 2026