Skip to content

Releases

tedge-dot 0.0.20

Choose a tag to compare

@reubenmiller reubenmiller released this 11 Nov 09:40
1b9e4da

Two interchangeable packages, one binary: tedge-dot-c (C, the default: small, a glibc 2.17
floor, every protocol including the PROFIBUS-DP preview) and tedge-dot-rs (Rust, for the few features
only it has). Whether both remain in the final product is not decided yet; configs and flows work
with either. Install one of them from the thin-edge.io community repository:

sudo apt-get install -y tedge-dot-c    # or tedge-dot-rs

Install & upgrade guide
· README
· Changelog
· SHA256SUMS covers every asset below.

This release also delivers 0.0.19, which was tagged but never published.

Highlights

OPC UA structured values in the default package (tedge-dot-c)

The C build now reads OPC UA structured values, as the Rust build does since the previous release.
You no longer need tedge-dot-rs to read one field of an ExtensionObject. See
doc/connectors/opcua-connector-spec.md §3.7.

  • address.field selects a field of a structure (Motor.Current, Items[1].Value), decoded with
    the DataTypeDefinition the server publishes.
  • address.index selects one element of an array variable.
  • A mode = "raw" point on a structure publishes the encoded body, with addr.encoding_id and
    addr.data_type.
  • DateTime, LocalizedText, StatusCode, Guid, NodeId, ExpandedNodeId and QualifiedName values are
    read as string (DateTime also as int64, StatusCode also as uint32).

Configurations that used field or index with the C build loaded before but gave bad samples.
They now give values, with no change to the configuration.

The C build keeps its fixed value sizes: a raw structure body longer than 256 bytes and a bytes
value longer than 127 bytes are bad samples that name the limit, and string values are cut at
255 bytes, as other C string values are.


0.0.20 (2026-11-11)

Bug Fixes

0.0.19 (2026-11-11)

Features

  • opcua: structured values in the C build (opcua-structures-c) (#112) (ed813af)

tedge-dot 0.0.18

Choose a tag to compare

@reubenmiller reubenmiller released this 09 Nov 21:59
e25e40a

Two interchangeable packages, one binary: tedge-dot-c (C, the default: small, a glibc 2.17
floor, every protocol including the PROFIBUS-DP preview) and tedge-dot-rs (Rust, for the few features
only it has). Whether both remain in the final product is not decided yet; configs and flows work
with either. Install one of them from the thin-edge.io community repository:

sudo apt-get install -y tedge-dot-c    # or tedge-dot-rs

Install & upgrade guide
· README
· Changelog
· SHA256SUMS covers every asset below.

This release also delivers 0.0.17, which was tagged but never published.

Highlights

tedge-dot-c is now the recommended package

The documentation now recommends tedge-dot-c by default: it is about 25 times smaller,
runs down to glibc 2.17 and ships every protocol, including the PROFIBUS-DP preview. Choose tedge-dot-rs
when you need one of the features only the Rust build has (SNMPv3 with SHA-2 or AES-192/256,
OPC UA structured values, the deprecated Basic128Rsa15 policy, CAN FD); the
package picker helps you decide.

  • Nothing changes for an existing install: both packages are still built and released, and a
    config, a flow or a cloud integration works unchanged with either.
  • Whether both packages remain in the final product is not decided yet.

A documentation site

tedge-dot now has a documentation site at https://thin-edge.github.io/tedge-dot/: task-first
guides for every protocol, the reference pages rendered from doc/, and three tools that run in
the browser:

  • a config builder that writes a connector config and checks it against the contract schema
    as you type;
  • a package picker that says whether tedge-dot-rs or tedge-dot-c suits your gateway, and
    why;
  • a report-policy playground that shows what a report table publishes on a signal of your
    choice, using the same rules (and test vectors) as the connectors.

The Markdown in the repository stays the source: edit doc/ and the site follows.

CAN bus, CANopen and PROFIBUS-DP are marked as previews

The CAN bus, CANopen and PROFIBUS-DP connectors are now labelled preview in the README and
the documentation. They are tested in CI against simulators (a virtual SocketCAN bus and a
PROFIBUS-DP slave simulator) but not yet on real equipment, so expect rough edges and changes to
their configuration.

If you run one of them on real hardware, please
tell us how it went.

Measurement output: batched measurements from the connector

A connector can now publish thin-edge measurements itself, hundreds of readings per message,
instead of one sample per reading for the ot-measurement flow to convert. Set
output = "measurements" in the [connector] table. No flow runs for a measurement, which takes
most of the work off the mapper at high reading rates. See
doc/measurement-output.md.

  • Opt-in: without output, a connector publishes samples exactly as before.
  • batch = { group_by = ... } chooses how readings with different timestamps are grouped:
    "time" (default, nothing moved or lost), "frame" (a window) or "sample" (a fixed rate).
  • Samples are still published for points with alarms, events or parameters, and for points with
    sample = true.
  • The OT Connector Contract is now version 0.2.0 (§5.4, §5.5, measured, outputs). The
    additions are optional and do not appear in the default output.

Behavior and API changes. These apply without output = "measurements":

  • Action needed if you use the measurement-series alarm or event (a series in the
    ot-alarm or ot-event params.toml): that mode moved to the new ot-alarm-series and
    ot-event-series flows, and ot-alarm and ot-event no longer subscribe to measurements.
    The package installs the new flow with your params file on upgrade; check that
    /etc/tedge/mappers/c8y/flows/ot-alarm-series/ (or ot-event-series/) exists. If you
    install the flows by hand, copy the new flow from /usr/share/tedge-dot/flows/.
  • Every sample of one read call now has the same ts, the time the call completed. In the C
    build, a module without read_points (Modbus, for example) uses one time per device pass.
    Points that were read together used to have times a few milliseconds apart.
  • Pushed OPC UA values in the C build now carry the server's source timestamp instead of the
    time they arrived, as in the Rust build.
  • For module authors: the Rust Sample has a new public field, source_ts. A module that builds
    a Sample with a struct literal must add source_ts: None (or the protocol's own time). The
    C tdot_sample_t has a new last member, source_ts_ms, so modules must be recompiled against
    the new header; modules that call tdot_sample_init need no source change.

Fewer measurement messages with group_by = "frame"

In measurement output, a frame no longer ends when a point changes twice within the window. The
second value goes into a second message of the same window, the third into a third, and all of
them are published when the window ends. A device with 1,000 changing points now publishes a few
messages per window instead of one for every 30 to 40 values, so a longer window now saves
mapper CPU. See doc/measurement-output.md.

  • Nothing to configure. The examples now use window = "500ms", which suits most pushed
    telemetry.
  • Behavior change for existing frame users: a repeated point's earlier value is published
    at the end of the window instead of at once, still within the window plus one pass.
  • Message times of one measurement topic now always increase. When source times jitter, a
    message can be stamped 1 ms after the previous one instead of with its first reading's time, so
    a point's values reach Cumulocity in the order they were read.
  • The OT Connector Contract is now version 0.2.1 (§5.5).

Mean, minimum and maximum per period in measurement output

A connector in measurement output can now publish, for every point and period, the time-weighted
mean, the minimum, the maximum or the last value, instead of one sampled reading. It accounts for
every reading of the period, so a spike or a drift between two published values still shows. See
doc/measurement-output.md.

[[device]]
name  = "line1"
batch = { aggregate = ["mean", "min", "max"], every = "1s" }   # temp_mean, temp_min, temp_max
  • aggregate = "mean" keeps the point's series name; a list publishes <series>_<aggregate>.
  • The mean is weighted by how long each value held, so change-only pushed data averages correctly.
  • An aggregated point cannot also have a report policy; the configuration is refused.
  • The OT Connector Contract is now version 0.3.0 (§5.5, batch.aggregate).

Devices read in parallel

A connector now reads its devices in parallel, and sends up to four Reads at once to an OPC UA
server, in both builds. A connector used to read one device after another, one request at a
time, so its throughput was set by the PLCs' round-trip times: with 20 ms per read it stopped at
about 22,000 readings/s (16,500 in the C build) while its CPU idled. Measured on the same host,
one connector now reads 64,000 readings/s from 64 devices in both builds, and one OPC UA device
with 20,000 nodes about 64,000 readings/s with the default budget, 80,000 with
max_inflight = 8. See doc/concurrent-reads.md.

  • New max_inflight (default 4) on [connector] or a device: requests in flight to one
    endpoint (a host and port, a serial port or a CAN bus), shared by every device on it. A bus
    always carries one request at a time. max_inflight_total (default 32) bounds all endpoints.
  • A server that answers busy (BadServerTooBusy) gets fewer requests, and the refused one is
    sent again.
  • Behavior change: devices on different endpoints are read in parallel, and OPC UA devices
    get up to four Reads at once. max_inflight = 1 sends one request at a time to each endpoint.
  • Polls now run on their interval's grid, so a 1 s poll no longer runs every 1.0 to 1.2 s.
  • The capability descriptor lists the endpoints (endpoints). The OT Connector Contract is now
    version 0.4.0 (§5.6).

Config workbench

The config builder and the report-policy playground are now one page, the
config workbench (the old links
redirect). Build a connector configuration and try it before you deploy it, in three steps that
share one state:

  1. Signals: up to four simulated signals, each with a behaviour and an optional outage, or
    one of the examples.
  2. Configuration: the config builder, for every protocol, with a point for each signal. Set
    report and batch on [connector] or on a point, and a point's poll_interval,
    sampling_interval or subscribe; a point inherits what it does not set, as on the gateway.
    A demo config runs as well: its point library (points_from) is resolved as the connector
    does. Points and less used sections fold away.
  3. Outcome: which package runs the configuration, what each point's effective report
    policy publishes, and how measurement output batches it: the
    three batch policies (time, frame and sample, with or without aggregates) side by
    side, which signals each measurement is missing, which samples are not sent, and the
    measurement Cumulocity stores.

Its report and batching engines pass the same test vecto...

Read more

v0.0.17

Choose a tag to compare

@reubenmiller reubenmiller released this 13 Oct 16:03
e335e87

0.0.17 (2026-10-13)

Bug Fixes

  • sdk: log link changes, failed writes and unreadable points (#74) (2d6efe4)

tedge-dot 0.0.16

Choose a tag to compare

@reubenmiller reubenmiller released this 12 Oct 15:55
f1dbf9f

Two interchangeable packages, one binary: tedge-dot-rs (Rust, the default) and
tedge-dot-c (C, for small or old devices: glibc 2.17 floor, adds PROFIBUS-DP). Install one
of them from the thin-edge.io community repository:

sudo apt-get install -y tedge-dot-rs    # or tedge-dot-c

Install & upgrade guide
· README
· Changelog
· SHA256SUMS covers every asset below.

This release also delivers 0.0.15, which was tagged but never published.

Highlights

OPC UA method calls

A point can now be an OPC UA method: access = "call_method" with
address = { object_id, method_id, inputs = [...] }. The new call-method command takes
arguments and returns the method's outputs. Both packages support it, with identical failure
reasons.

[[device.point]]
id      = "multiply"
access  = "call_method"
address = { object_id = "ns=2;s=Machine", method_id = "ns=2;s=Machine.Multiply", inputs = ["int32", "int32"] }
  • ot-registration announces a device's methods as the retained ot_call_method command
    capability, and ot-command-forward routes an ot_call_method command to the connector. The
    outputs come back on the command.
  • A method call is never retried. A call that times out may still have run on the server.
  • Method ids follow the device's namespace table (below).
  • Breaking, tedge-dot-rs only: a write-only point (access = "write") is no longer polled and so no longer
    publishes samples, as the contract always required (tedge-dot-c already behaved this way).
    Declare it read_write to keep its samples.
  • See doc/connectors/opcua-connector-spec.md §3.10 and contract §6.6.

OPC UA namespace tables

An OPC UA node id such as ns=3;i=1234 names its namespace by position in the server's
namespace array. A firmware update, or another instance of the same device type, can number the
namespaces differently, and the id then reads a different node, or none. A device
(protocol_address.namespaces) or a point library ([library] namespaces) can now record the
array its ids were written against. On every connect the connector maps each index through
that table to the server's current one, and logs a namespace that moved.

  • Node ids stay numeric, as copied from UaExpert. Without a table nothing changes.
  • A namespace the server does not list fails only its own points (namespace not found: <uri>)
    and is tried again, so one the server adds later is picked up.
  • Both packages support it. An older package ignores a device's table and reads the configured
    index. It rejects a library that carries one.
  • See doc/connectors/opcua-connector-spec.md §3.9.

0.0.16 (2026-10-12)

Bug Fixes

0.0.15 (2026-10-12)

Features

  • opcua: call OPC UA methods (opcua-method-calls) (#71) (39c205f)
  • opcua: namespace tables for numeric node ids (opcua-namespace-table) (#69) (fed70e7)

tedge-dot 0.0.14

Choose a tag to compare

@reubenmiller reubenmiller released this 09 Oct 13:08
d5f5b14

tedge-dot ships as two interchangeable packages, each containing the same
/usr/bin/tedge-dot binary, the same systemd unit and the same
/etc/tedge/plugins/ot/ config layout. They speak the same
OT Connector Contract,
so a config, a flow or a cloud integration built against one works unchanged against
the other. Install one or the other — they declare each other as conflicting.

Package Implementation Pick it when
tedge-dot-rs Rust (impl/rust/) Default. Richest protocol support, one static binary, no shared-library dependencies.
tedge-dot-c C (impl/c/) Small or old devices: ~25x smaller, a glibc 2.17 floor (Debian 8 / RHEL 7 era), and it additionally ships the PROFIBUS-DP connector.

Install

Both packages are published to the thin-edge.io community repository, which
also carries their tedge-parameter-plugin dependency (it maps the Cumulocity
Parameters tab onto point writes). With that repository set up
(instructions):

# Debian / Ubuntu
sudo apt-get install -y tedge-dot-rs                         # or tedge-dot-c
sudo systemctl status tedge-dot

# RPM distros
sudo dnf install tedge-dot-rs                                # or tedge-dot-c

Or download the package for your architecture from the assets below. The
package manager still resolves tedge-parameter-plugin from the community
repository, so set that up first:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb    # or ./tedge-dot-c_*_amd64.deb
sudo dnf install ./tedge-dot-rs_*_linux_amd64.rpm           # or ./tedge-dot-c_*_amd64.rpm

Alpine: the attached .apk files carry a version string apk-tools rejects
(apk version -c refuses both this project's tag format and the snapshot
form), so apk add will not install them. Use the tarball on Alpine until
that is fixed — see TODO.md.

Or grab a tarball and run the binary directly — it doubles as a one-shot
read/write CLI. The tedge-dot-c tarball carries the default configs to start from:

./tedge-dot read -c config-defaults/modbus.toml --json

SHA256SUMS covers every asset in this release.

Upgrading from a release before the split

The package formerly called tedge-dot is now tedge-dot-rs. Both packages
Replaces: the old name, so installing either over an existing tedge-dot
works and keeps your /etc/tedge/plugins/ot/ configuration:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb

Two caveats:

  • apt install tedge-dot no longer resolves — tedge-dot is now a virtual
    package provided by both, so apt cannot choose. Install by the real name.
    Scripts and runbooks using the old name need updating.
  • A plain apt upgrade will not migrate an existing tedge-dot install; it
    stays on the old package name and receives no further updates until you
    install one of the new ones explicitly.

Report by exception (report)

A point, a device or [connector] can now declare a reporting policy, applied by the
connector itself for every protocol before a sample is published: on_change, deadband
(absolute, or a percentage such as "2%"), min_interval (a change held back is published
when the interval ends), max_interval (a heartbeat that publishes a fresh reading of a flat
signal, reading a subscribed OPC UA node on demand) and debounce. See
doc/reducing-data-volume.md.

  • The packaged Modbus, OPC UA, CANopen and PROFIBUS configs set
    [connector] report = { max_interval = "30m" }, so a device whose values never change stays
    available in Cumulocity. This applies to fresh installs only: an existing
    /etc/tedge/plugins/ot/*.toml is kept on upgrade. To opt in, add that line to its
    [connector] section and reload the service. Without a report anywhere, every reading is
    published as before.
  • The ot-measurement flow's on_change, deadband, min_interval and debounce settings,
    and the same keys in a point's meta, are deprecated. They keep working; move them to
    the point's report table, and do not use both.
  • tedge-dot-c, CAN bus: a signal is now published once per received frame, as in
    tedge-dot-rs, instead of republishing the last frame on every poll.

Value mapping (map)

A point can now declare a value map, which the connector applies in both directions for
every protocol. It maps state codes to labels, using exact values, lists or inclusive ranges
with a catch-all default, and it converts with as = "number" | "string" | "bool", so numeric
text becomes a measurement. Samples carry the mapped value and add the original as
source_value.

Writes carry the mapped value as well, and the connector maps it back to the device's code. This
covers the write and write-batch commands, the CLI and Cumulocity device parameters, where
tedge-dot describe offers a mapped parameter's labels as a choice. See
doc/mapping-values.md.

  • A point without map is unchanged.
  • The demo point libraries show the feature: the Modbus boiler_state maps by range, and the
    OPC UA run_state is an enumerated parameter.

Literal device parameters (meta.parameter.fragment)

A device parameter no longer has to sit inside an object. With
meta.parameter = { fragment = "pump_speed" } the point's value is published as the fragment
itself, so the managed object holds "pump_speed": 42 rather than an object around one value.
tedge-dot describe renders it as a primitive Cumulocity definition (number, boolean or string),
and an edit from the Parameters tab carrying the bare value is written to the point.

  • The name is used verbatim, like set. It cannot be combined with set, group or key, and
    one name cannot be both a literal and a set. describe refuses either.
  • Configurations without fragment are unchanged.

OPC UA structured values (tedge-dot-rs only)

The OPC UA connector reads custom data types (structures) from any server without compiled-in
type definitions. Give a point address.field ("Speed", "Motor.Current",
"Items[1].Value"): the connector reads the type's DataTypeDefinition from the server once per
session and publishes that field as an ordinary sample, so map, report and every flow apply.
Several fields of one node share one read. Also new:

  • address.index selects one element of an array variable.
  • A mode = "raw" point on a structure publishes its encoded body, with the type named in
    addr, for a flow to decode (servers that do not describe their types).
  • DateTime, LocalizedText, StatusCode, Guid, NodeId, QualifiedName and ByteString values can be
    read; the point's datatype picks the form, e.g. DateTime as RFC 3339 text or Unix ms.

Field and element points are read-only. A point without field or index is unchanged, except
that a raw point on a structure now publishes good samples where it published bad ones. The C
package does not support this yet. See doc/connectors/opcua-connector-spec.md §3.7 and the
demo-sim-structures point library.

Measurement units reach Cumulocity

A point's unit now arrives in Cumulocity with every measurement ({"value": 6.6, "unit": "l/m"})
on thin-edge.io 2.x. ot-measurement publishes the units as retained measurement metadata on
te/<device>/m/<type>/meta, which the c8y mapper adds to the measurement. The measurement body is
unchanged, so mappers without that support behave as before.

  • The metadata is published only when a unit appears, changes or goes away, one message per
    measurement type. It survives a mapper restart.
  • If you published unit metadata by hand as a workaround, remove that: the flow now owns these
    topics.
  • The first measurement after a unit appears can still go without it.

Config changes are applied on their own

The service now notices when its config files, or the point libraries they reference, change.
It applies the change within a few seconds, with no systemctl reload needed, whether the file
was written by thin-edge.io configuration management, a provisioning tool or an editor.

  • It runs the same reload as SIGHUP, which keeps working: unchanged connectors keep running, a
    changed one applies its file in place, and an invalid file is logged and ignored.
  • A file is read only once it has stopped changing. A save that lands while a reload runs gets a
    reload of its own.
  • TEDGE_DOT_CONFIG_WATCH_INTERVAL sets how often the files are checked (default 2s).
  • To reload only on SIGHUP as before, run tedge-dot run --no-watch, for example in a systemd
    drop-in (see the comments in the unit file), or set the variable to 0.
  • Workarounds that send SIGHUP after a configuration update can be removed.
  • The C package now starts with an empty config directory as the Rust one does, and waits for a
    config to appear.

Notes

  • On a fresh install the service starts with no devices configured. Add
    [[device]] sections under /etc/tedge/plugins/ot/, or copy a demo config
    from /usr/share/tedge-dot/demo/, then restart the service.
  • The connector is a dumb driver: the device-side flows that map its
    envelopes onto the thin-edge data model are deployed active into
    /etc/tedge/mappers/c8y/flows/, with the opt-in alarm/event flows in
    /usr/share/tedge-dot/flows/. See flows/README.md.
  • tedge-dot-c runtime dependencies (Debian/Ubuntu names): libmodbus5,
    libmosquitto1, libcjson1; open62541 is statically linked. It is
    cross-compiled with zig against the glibc 2.17 floor.
  • tedge-dot-rs omits the PROFIBUS connector: its serial dependency has a
    native libudev build script that does not cross-compile. Build from source on
    Linux with cargo build --manifest-path impl/rust/Cargo.toml --features profibus, or use tedge-dot-c.
  • Where the two implementations differ in b...
Read more

tedge-dot 0.0.13

Choose a tag to compare

@github-actions github-actions released this 07 Oct 14:16
315e746

tedge-dot ships as two interchangeable packages, each containing the same
/usr/bin/tedge-dot binary, the same systemd unit and the same
/etc/tedge/plugins/ot/ config layout. They speak the same
OT Connector Contract,
so a config, a flow or a cloud integration built against one works unchanged against
the other. Install one or the other — they declare each other as conflicting.

Package Implementation Pick it when
tedge-dot-rs Rust (impl/rust/) Default. Richest protocol support, one static binary, no shared-library dependencies.
tedge-dot-c C (impl/c/) Small or old devices: ~25x smaller, a glibc 2.17 floor (Debian 8 / RHEL 7 era), and it additionally ships the PROFIBUS-DP connector.

Install

Both packages are published to the thin-edge.io community repository, which
also carries their tedge-parameter-plugin dependency (it maps the Cumulocity
Parameters tab onto point writes). With that repository set up
(instructions):

# Debian / Ubuntu
sudo apt-get install -y tedge-dot-rs                         # or tedge-dot-c
sudo systemctl status tedge-dot

# RPM distros
sudo dnf install tedge-dot-rs                                # or tedge-dot-c

Or download the package for your architecture from the assets below. The
package manager still resolves tedge-parameter-plugin from the community
repository, so set that up first:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb    # or ./tedge-dot-c_*_amd64.deb
sudo dnf install ./tedge-dot-rs_*_linux_amd64.rpm           # or ./tedge-dot-c_*_amd64.rpm

Alpine: the attached .apk files carry a version string apk-tools rejects
(apk version -c refuses both this project's tag format and the snapshot
form), so apk add will not install them. Use the tarball on Alpine until
that is fixed — see TODO.md.

Or grab a tarball and run the binary directly — it doubles as a one-shot
read/write CLI. The tedge-dot-c tarball carries the default configs to start from:

./tedge-dot read -c config-defaults/modbus.toml --json

SHA256SUMS covers every asset in this release.

Upgrading from a release before the split

The package formerly called tedge-dot is now tedge-dot-rs. Both packages
Replaces: the old name, so installing either over an existing tedge-dot
works and keeps your /etc/tedge/plugins/ot/ configuration:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb

Two caveats:

  • apt install tedge-dot no longer resolves — tedge-dot is now a virtual
    package provided by both, so apt cannot choose. Install by the real name.
    Scripts and runbooks using the old name need updating.
  • A plain apt upgrade will not migrate an existing tedge-dot install; it
    stays on the old package name and receives no further updates until you
    install one of the new ones explicitly.

Report by exception (report)

A point, a device or [connector] can now declare a reporting policy, applied by the
connector itself for every protocol before a sample is published: on_change, deadband
(absolute, or a percentage such as "2%"), min_interval (a change held back is published
when the interval ends), max_interval (a heartbeat that publishes a fresh reading of a flat
signal, reading a subscribed OPC UA node on demand) and debounce. See
doc/reducing-data-volume.md.

  • The packaged Modbus, OPC UA, CANopen and PROFIBUS configs set
    [connector] report = { max_interval = "30m" }, so a device whose values never change stays
    available in Cumulocity. This applies to fresh installs only: an existing
    /etc/tedge/plugins/ot/*.toml is kept on upgrade. To opt in, add that line to its
    [connector] section and reload the service. Without a report anywhere, every reading is
    published as before.
  • The ot-measurement flow's on_change, deadband, min_interval and debounce settings,
    and the same keys in a point's meta, are deprecated. They keep working; move them to
    the point's report table, and do not use both.
  • tedge-dot-c, CAN bus: a signal is now published once per received frame, as in
    tedge-dot-rs, instead of republishing the last frame on every poll.

Value mapping (map)

A point can now declare a value map, which the connector applies in both directions for
every protocol. It maps state codes to labels, using exact values, lists or inclusive ranges
with a catch-all default, and it converts with as = "number" | "string" | "bool", so numeric
text becomes a measurement. Samples carry the mapped value and add the original as
source_value.

Writes carry the mapped value as well, and the connector maps it back to the device's code. This
covers the write and write-batch commands, the CLI and Cumulocity device parameters, where
tedge-dot describe offers a mapped parameter's labels as a choice. See
doc/mapping-values.md.

  • A point without map is unchanged.
  • The demo point libraries show the feature: the Modbus boiler_state maps by range, and the
    OPC UA run_state is an enumerated parameter.

Literal device parameters (meta.parameter.fragment)

A device parameter no longer has to sit inside an object. With
meta.parameter = { fragment = "pump_speed" } the point's value is published as the fragment
itself, so the managed object holds "pump_speed": 42 rather than an object around one value.
tedge-dot describe renders it as a primitive Cumulocity definition (number, boolean or string),
and an edit from the Parameters tab carrying the bare value is written to the point.

  • The name is used verbatim, like set. It cannot be combined with set, group or key, and
    one name cannot be both a literal and a set. describe refuses either.
  • Configurations without fragment are unchanged.

OPC UA structured values (tedge-dot-rs only)

The OPC UA connector reads custom data types (structures) from any server without compiled-in
type definitions. Give a point address.field ("Speed", "Motor.Current",
"Items[1].Value"): the connector reads the type's DataTypeDefinition from the server once per
session and publishes that field as an ordinary sample, so map, report and every flow apply.
Several fields of one node share one read. Also new:

  • address.index selects one element of an array variable.
  • A mode = "raw" point on a structure publishes its encoded body, with the type named in
    addr, for a flow to decode (servers that do not describe their types).
  • DateTime, LocalizedText, StatusCode, Guid, NodeId, QualifiedName and ByteString values can be
    read; the point's datatype picks the form, e.g. DateTime as RFC 3339 text or Unix ms.

Field and element points are read-only. A point without field or index is unchanged, except
that a raw point on a structure now publishes good samples where it published bad ones. The C
package does not support this yet. See doc/connectors/opcua-connector-spec.md §3.7 and the
demo-sim-structures point library.

Measurement units reach Cumulocity

A point's unit now arrives in Cumulocity with every measurement ({"value": 6.6, "unit": "l/m"})
on thin-edge.io 2.x. ot-measurement publishes the units as retained measurement metadata on
te/<device>/m/<type>/meta, which the c8y mapper adds to the measurement. The measurement body is
unchanged, so mappers without that support behave as before.

  • The metadata is published only when a unit appears, changes or goes away, one message per
    measurement type. It survives a mapper restart.
  • If you published unit metadata by hand as a workaround, remove that: the flow now owns these
    topics.
  • The first measurement after a unit appears can still go without it.

Config changes are applied on their own

The service now notices when its config files, or the point libraries they reference, change.
It applies the change within a few seconds, with no systemctl reload needed, whether the file
was written by thin-edge.io configuration management, a provisioning tool or an editor.

  • It runs the same reload as SIGHUP, which keeps working: unchanged connectors keep running, a
    changed one applies its file in place, and an invalid file is logged and ignored.
  • A file is read only once it has stopped changing. A save that lands while a reload runs gets a
    reload of its own.
  • TEDGE_DOT_CONFIG_WATCH_INTERVAL sets how often the files are checked (default 2s).
  • To reload only on SIGHUP as before, run tedge-dot run --no-watch, for example in a systemd
    drop-in (see the comments in the unit file), or set the variable to 0.
  • Workarounds that send SIGHUP after a configuration update can be removed.
  • The C package now starts with an empty config directory as the Rust one does, and waits for a
    config to appear.

Notes

  • On a fresh install the service starts with no devices configured. Add
    [[device]] sections under /etc/tedge/plugins/ot/, or copy a demo config
    from /usr/share/tedge-dot/demo/, then restart the service.
  • The connector is a dumb driver: the device-side flows that map its
    envelopes onto the thin-edge data model are deployed active into
    /etc/tedge/mappers/c8y/flows/, with the opt-in alarm/event flows in
    /usr/share/tedge-dot/flows/. See flows/README.md.
  • tedge-dot-c runtime dependencies (Debian/Ubuntu names): libmodbus5,
    libmosquitto1, libcjson1; open62541 is statically linked. It is
    cross-compiled with zig against the glibc 2.17 floor.
  • tedge-dot-rs omits the PROFIBUS connector: its serial dependency has a
    native libudev build script that does not cross-compile. Build from source on
    Linux with cargo build --manifest-path impl/rust/Cargo.toml --features profibus, or use tedge-dot-c.
  • Where the two implementations differ in b...
Read more

tedge-dot 0.0.12

Choose a tag to compare

@github-actions github-actions released this 07 Oct 09:42
8b38d0b

tedge-dot ships as two interchangeable packages, each containing the same
/usr/bin/tedge-dot binary, the same systemd unit and the same
/etc/tedge/plugins/ot/ config layout. They speak the same
OT Connector Contract,
so a config, a flow or a cloud integration built against one works unchanged against
the other. Install one or the other — they declare each other as conflicting.

Package Implementation Pick it when
tedge-dot-rs Rust (impl/rust/) Default. Richest protocol support, one static binary, no shared-library dependencies.
tedge-dot-c C (impl/c/) Small or old devices: ~25x smaller, a glibc 2.17 floor (Debian 8 / RHEL 7 era), and it additionally ships the PROFIBUS-DP connector.

Install

Both packages are published to the thin-edge.io community repository, which
also carries their tedge-parameter-plugin dependency (it maps the Cumulocity
Parameters tab onto point writes). With that repository set up
(instructions):

# Debian / Ubuntu
sudo apt-get install -y tedge-dot-rs                         # or tedge-dot-c
sudo systemctl status tedge-dot

# RPM distros
sudo dnf install tedge-dot-rs                                # or tedge-dot-c

Or download the package for your architecture from the assets below. The
package manager still resolves tedge-parameter-plugin from the community
repository, so set that up first:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb    # or ./tedge-dot-c_*_amd64.deb
sudo dnf install ./tedge-dot-rs_*_linux_amd64.rpm           # or ./tedge-dot-c_*_amd64.rpm

Alpine: the attached .apk files carry a version string apk-tools rejects
(apk version -c refuses both this project's tag format and the snapshot
form), so apk add will not install them. Use the tarball on Alpine until
that is fixed — see TODO.md.

Or grab a tarball and run the binary directly — it doubles as a one-shot
read/write CLI. The tedge-dot-c tarball carries the default configs to start from:

./tedge-dot read -c config-defaults/modbus.toml --json

SHA256SUMS covers every asset in this release.

Upgrading from a release before the split

The package formerly called tedge-dot is now tedge-dot-rs. Both packages
Replaces: the old name, so installing either over an existing tedge-dot
works and keeps your /etc/tedge/plugins/ot/ configuration:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb

Two caveats:

  • apt install tedge-dot no longer resolves — tedge-dot is now a virtual
    package provided by both, so apt cannot choose. Install by the real name.
    Scripts and runbooks using the old name need updating.
  • A plain apt upgrade will not migrate an existing tedge-dot install; it
    stays on the old package name and receives no further updates until you
    install one of the new ones explicitly.

Report by exception (report)

A point, a device or [connector] can now declare a reporting policy, applied by the
connector itself for every protocol before a sample is published: on_change, deadband
(absolute, or a percentage such as "2%"), min_interval (a change held back is published
when the interval ends), max_interval (a heartbeat that publishes a fresh reading of a flat
signal, reading a subscribed OPC UA node on demand) and debounce. See
doc/reducing-data-volume.md.

  • The packaged Modbus, OPC UA, CANopen and PROFIBUS configs set
    [connector] report = { max_interval = "30m" }, so a device whose values never change stays
    available in Cumulocity. This applies to fresh installs only: an existing
    /etc/tedge/plugins/ot/*.toml is kept on upgrade. To opt in, add that line to its
    [connector] section and reload the service. Without a report anywhere, every reading is
    published as before.
  • The ot-measurement flow's on_change, deadband, min_interval and debounce settings,
    and the same keys in a point's meta, are deprecated. They keep working; move them to
    the point's report table, and do not use both.
  • tedge-dot-c, CAN bus: a signal is now published once per received frame, as in
    tedge-dot-rs, instead of republishing the last frame on every poll.

Value mapping (map)

A point can now declare a value map, which the connector applies in both directions for
every protocol. It maps state codes to labels, using exact values, lists or inclusive ranges
with a catch-all default, and it converts with as = "number" | "string" | "bool", so numeric
text becomes a measurement. Samples carry the mapped value and add the original as
source_value.

Writes carry the mapped value as well, and the connector maps it back to the device's code. This
covers the write and write-batch commands, the CLI and Cumulocity device parameters, where
tedge-dot describe offers a mapped parameter's labels as a choice. See
doc/mapping-values.md.

  • A point without map is unchanged.
  • The demo point libraries show the feature: the Modbus boiler_state maps by range, and the
    OPC UA run_state is an enumerated parameter.

Literal device parameters (meta.parameter.fragment)

A device parameter no longer has to sit inside an object. With
meta.parameter = { fragment = "pump_speed" } the point's value is published as the fragment
itself, so the managed object holds "pump_speed": 42 rather than an object around one value.
tedge-dot describe renders it as a primitive Cumulocity definition (number, boolean or string),
and an edit from the Parameters tab carrying the bare value is written to the point.

  • The name is used verbatim, like set. It cannot be combined with set, group or key, and
    one name cannot be both a literal and a set. describe refuses either.
  • Configurations without fragment are unchanged.

OPC UA structured values (tedge-dot-rs only)

The OPC UA connector reads custom data types (structures) from any server without compiled-in
type definitions. Give a point address.field ("Speed", "Motor.Current",
"Items[1].Value"): the connector reads the type's DataTypeDefinition from the server once per
session and publishes that field as an ordinary sample, so map, report and every flow apply.
Several fields of one node share one read. Also new:

  • address.index selects one element of an array variable.
  • A mode = "raw" point on a structure publishes its encoded body, with the type named in
    addr, for a flow to decode (servers that do not describe their types).
  • DateTime, LocalizedText, StatusCode, Guid, NodeId, QualifiedName and ByteString values can be
    read; the point's datatype picks the form, e.g. DateTime as RFC 3339 text or Unix ms.

Field and element points are read-only. A point without field or index is unchanged, except
that a raw point on a structure now publishes good samples where it published bad ones. The C
package does not support this yet. See doc/connectors/opcua-connector-spec.md §3.7 and the
demo-sim-structures point library.

Notes

  • On a fresh install the service starts with no devices configured. Add
    [[device]] sections under /etc/tedge/plugins/ot/, or copy a demo config
    from /usr/share/tedge-dot/demo/, then restart the service.
  • The connector is a dumb driver: the device-side flows that map its
    envelopes onto the thin-edge data model are deployed active into
    /etc/tedge/mappers/c8y/flows/, with the opt-in alarm/event flows in
    /usr/share/tedge-dot/flows/. See flows/README.md.
  • tedge-dot-c runtime dependencies (Debian/Ubuntu names): libmodbus5,
    libmosquitto1, libcjson1; open62541 is statically linked. It is
    cross-compiled with zig against the glibc 2.17 floor.
  • tedge-dot-rs omits the PROFIBUS connector: its serial dependency has a
    native libudev build script that does not cross-compile. Build from source on
    Linux with cargo build --manifest-path impl/rust/Cargo.toml --features profibus, or use tedge-dot-c.
  • Where the two implementations differ in behaviour, see the parity table in
    impl/c/README.md.
  • On Alpine, the two packages are not mutually exclusive by metadata: apk
    expresses conflicts differently and the conflicts field is not carried into
    the .apk. Installing one over the other will collide on
    /usr/bin/tedge-dot — remove the first with apk del before installing the
    second, rather than forcing the overwrite.

What's Changed

  • test(modbus): fix flaky 'A Parameter Removed On Reload Leaves The Twin' by @reubenmiller in #60
  • docs(cli): explain what describe --set does by @reubenmiller in #62
  • feat(opcua): structured values, array elements and more built-in types (Rust; C: bytes) by @mstoffel-sag in #61
  • feat: sampling_interval for pushed points, separate from poll_interval by @reubenmiller in #63

New Contributors

Full Changelog: 0.0.11...0.0.12

tedge-dot 0.0.11

Choose a tag to compare

@github-actions github-actions released this 06 Oct 14:34
d9fdac7

tedge-dot ships as two interchangeable packages, each containing the same
/usr/bin/tedge-dot binary, the same systemd unit and the same
/etc/tedge/plugins/ot/ config layout. They speak the same
OT Connector Contract,
so a config, a flow or a cloud integration built against one works unchanged against
the other. Install one or the other — they declare each other as conflicting.

Package Implementation Pick it when
tedge-dot-rs Rust (impl/rust/) Default. Richest protocol support, one static binary, no shared-library dependencies.
tedge-dot-c C (impl/c/) Small or old devices: ~25x smaller, a glibc 2.17 floor (Debian 8 / RHEL 7 era), and it additionally ships the PROFIBUS-DP connector.

Install

Both packages are published to the thin-edge.io community repository, which
also carries their tedge-parameter-plugin dependency (it maps the Cumulocity
Parameters tab onto point writes). With that repository set up
(instructions):

# Debian / Ubuntu
sudo apt-get install -y tedge-dot-rs                         # or tedge-dot-c
sudo systemctl status tedge-dot

# RPM distros
sudo dnf install tedge-dot-rs                                # or tedge-dot-c

Or download the package for your architecture from the assets below. The
package manager still resolves tedge-parameter-plugin from the community
repository, so set that up first:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb    # or ./tedge-dot-c_*_amd64.deb
sudo dnf install ./tedge-dot-rs_*_linux_amd64.rpm           # or ./tedge-dot-c_*_amd64.rpm

Alpine: the attached .apk files carry a version string apk-tools rejects
(apk version -c refuses both this project's tag format and the snapshot
form), so apk add will not install them. Use the tarball on Alpine until
that is fixed — see TODO.md.

Or grab a tarball and run the binary directly — it doubles as a one-shot
read/write CLI. The tedge-dot-c tarball carries the default configs to start from:

./tedge-dot read -c config-defaults/modbus.toml --json

SHA256SUMS covers every asset in this release.

Upgrading from a release before the split

The package formerly called tedge-dot is now tedge-dot-rs. Both packages
Replaces: the old name, so installing either over an existing tedge-dot
works and keeps your /etc/tedge/plugins/ot/ configuration:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb

Two caveats:

  • apt install tedge-dot no longer resolves — tedge-dot is now a virtual
    package provided by both, so apt cannot choose. Install by the real name.
    Scripts and runbooks using the old name need updating.
  • A plain apt upgrade will not migrate an existing tedge-dot install; it
    stays on the old package name and receives no further updates until you
    install one of the new ones explicitly.

Report by exception (report)

A point, a device or [connector] can now declare a reporting policy, applied by the
connector itself for every protocol before a sample is published: on_change, deadband
(absolute, or a percentage such as "2%"), min_interval (a change held back is published
when the interval ends), max_interval (a heartbeat that publishes a fresh reading of a flat
signal, reading a subscribed OPC UA node on demand) and debounce. See
doc/reducing-data-volume.md.

  • The packaged Modbus, OPC UA, CANopen and PROFIBUS configs set
    [connector] report = { max_interval = "30m" }, so a device whose values never change stays
    available in Cumulocity. This applies to fresh installs only: an existing
    /etc/tedge/plugins/ot/*.toml is kept on upgrade. To opt in, add that line to its
    [connector] section and reload the service. Without a report anywhere, every reading is
    published as before.
  • The ot-measurement flow's on_change, deadband, min_interval and debounce settings,
    and the same keys in a point's meta, are deprecated. They keep working; move them to
    the point's report table, and do not use both.
  • tedge-dot-c, CAN bus: a signal is now published once per received frame, as in
    tedge-dot-rs, instead of republishing the last frame on every poll.

Value mapping (map)

A point can now declare a value map, which the connector applies in both directions for
every protocol. It maps state codes to labels, using exact values, lists or inclusive ranges
with a catch-all default, and it converts with as = "number" | "string" | "bool", so numeric
text becomes a measurement. Samples carry the mapped value and add the original as
source_value.

Writes carry the mapped value as well, and the connector maps it back to the device's code. This
covers the write and write-batch commands, the CLI and Cumulocity device parameters, where
tedge-dot describe offers a mapped parameter's labels as a choice. See
doc/mapping-values.md.

  • A point without map is unchanged.
  • The demo point libraries show the feature: the Modbus boiler_state maps by range, and the
    OPC UA run_state is an enumerated parameter.

Literal device parameters (meta.parameter.fragment)

A device parameter no longer has to sit inside an object. With
meta.parameter = { fragment = "pump_speed" } the point's value is published as the fragment
itself, so the managed object holds "pump_speed": 42 rather than an object around one value.
tedge-dot describe renders it as a primitive Cumulocity definition (number, boolean or string),
and an edit from the Parameters tab carrying the bare value is written to the point.

  • The name is used verbatim, like set. It cannot be combined with set, group or key, and
    one name cannot be both a literal and a set. describe refuses either.
  • Configurations without fragment are unchanged.

Notes

  • On a fresh install the service starts with no devices configured. Add
    [[device]] sections under /etc/tedge/plugins/ot/, or copy a demo config
    from /usr/share/tedge-dot/demo/, then restart the service.
  • The connector is a dumb driver: the device-side flows that map its
    envelopes onto the thin-edge data model are deployed active into
    /etc/tedge/mappers/c8y/flows/, with the opt-in alarm/event flows in
    /usr/share/tedge-dot/flows/. See flows/README.md.
  • tedge-dot-c runtime dependencies (Debian/Ubuntu names): libmodbus5,
    libmosquitto1, libcjson1; open62541 is statically linked. It is
    cross-compiled with zig against the glibc 2.17 floor.
  • tedge-dot-rs omits the PROFIBUS connector: its serial dependency has a
    native libudev build script that does not cross-compile. Build from source on
    Linux with cargo build --manifest-path impl/rust/Cargo.toml --features profibus, or use tedge-dot-c.
  • Where the two implementations differ in behaviour, see the parity table in
    impl/c/README.md.
  • On Alpine, the two packages are not mutually exclusive by metadata: apk
    expresses conflicts differently and the conflicts field is not carried into
    the .apk. Installing one over the other will collide on
    /usr/bin/tedge-dot — remove the first with apk del before installing the
    second, rather than forcing the overwrite.

What's Changed

  • feat: value mapping between device values and readable ones (map) by @reubenmiller in #58
  • feat: literal device parameters (meta.parameter.fragment) by @reubenmiller in #59

Full Changelog: 0.0.10...0.0.11

tedge-dot 0.0.10

Choose a tag to compare

@github-actions github-actions released this 18 Sep 18:54
fbed196

tedge-dot ships as two interchangeable packages, each containing the same
/usr/bin/tedge-dot binary, the same systemd unit and the same
/etc/tedge/plugins/ot/ config layout. They speak the same
OT Connector Contract,
so a config, a flow or a cloud integration built against one works unchanged against
the other. Install one or the other — they declare each other as conflicting.

Package Implementation Pick it when
tedge-dot-rs Rust (impl/rust/) Default. Richest protocol support, one static binary, no shared-library dependencies.
tedge-dot-c C (impl/c/) Small or old devices: ~25x smaller, a glibc 2.17 floor (Debian 8 / RHEL 7 era), and it additionally ships the PROFIBUS-DP connector.

Install

Both packages are published to the thin-edge.io community repository, which
also carries their tedge-parameter-plugin dependency (it maps the Cumulocity
Parameters tab onto point writes). With that repository set up
(instructions):

# Debian / Ubuntu
sudo apt-get install -y tedge-dot-rs                         # or tedge-dot-c
sudo systemctl status tedge-dot

# RPM distros
sudo dnf install tedge-dot-rs                                # or tedge-dot-c

Or download the package for your architecture from the assets below. The
package manager still resolves tedge-parameter-plugin from the community
repository, so set that up first:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb    # or ./tedge-dot-c_*_amd64.deb
sudo dnf install ./tedge-dot-rs_*_linux_amd64.rpm           # or ./tedge-dot-c_*_amd64.rpm

Alpine: the attached .apk files carry a version string apk-tools rejects
(apk version -c refuses both this project's tag format and the snapshot
form), so apk add will not install them. Use the tarball on Alpine until
that is fixed — see TODO.md.

Or grab a tarball and run the binary directly — it doubles as a one-shot
read/write CLI. The tedge-dot-c tarball carries the default configs to start from:

./tedge-dot read -c config-defaults/modbus.toml --json

SHA256SUMS covers every asset in this release.

Upgrading from a release before the split

The package formerly called tedge-dot is now tedge-dot-rs. Both packages
Replaces: the old name, so installing either over an existing tedge-dot
works and keeps your /etc/tedge/plugins/ot/ configuration:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb

Two caveats:

  • apt install tedge-dot no longer resolves — tedge-dot is now a virtual
    package provided by both, so apt cannot choose. Install by the real name.
    Scripts and runbooks using the old name need updating.
  • A plain apt upgrade will not migrate an existing tedge-dot install; it
    stays on the old package name and receives no further updates until you
    install one of the new ones explicitly.

Report by exception (report)

A point, a device or [connector] can now declare a reporting policy, applied by the
connector itself for every protocol before a sample is published: on_change, deadband
(absolute, or a percentage such as "2%"), min_interval (a change held back is published
when the interval ends), max_interval (a heartbeat that publishes a fresh reading of a flat
signal, reading a subscribed OPC UA node on demand) and debounce. See
doc/reducing-data-volume.md.

  • The packaged Modbus, OPC UA, CANopen and PROFIBUS configs set
    [connector] report = { max_interval = "30m" }, so a device whose values never change stays
    available in Cumulocity. This applies to fresh installs only: an existing
    /etc/tedge/plugins/ot/*.toml is kept on upgrade. To opt in, add that line to its
    [connector] section and reload the service. Without a report anywhere, every reading is
    published as before.
  • The ot-measurement flow's on_change, deadband, min_interval and debounce settings,
    and the same keys in a point's meta, are deprecated. They keep working; move them to
    the point's report table, and do not use both.
  • tedge-dot-c, CAN bus: a signal is now published once per received frame, as in
    tedge-dot-rs, instead of republishing the last frame on every poll.

Notes

  • On a fresh install the service starts with no devices configured. Add
    [[device]] sections under /etc/tedge/plugins/ot/, or copy a demo config
    from /usr/share/tedge-dot/demo/, then restart the service.
  • The connector is a dumb driver: the device-side flows that map its
    envelopes onto the thin-edge data model are deployed active into
    /etc/tedge/mappers/c8y/flows/, with the opt-in alarm/event flows in
    /usr/share/tedge-dot/flows/. See flows/README.md.
  • tedge-dot-c runtime dependencies (Debian/Ubuntu names): libmodbus5,
    libmosquitto1, libcjson1; open62541 is statically linked. It is
    cross-compiled with zig against the glibc 2.17 floor.
  • tedge-dot-rs omits the PROFIBUS connector: its serial dependency has a
    native libudev build script that does not cross-compile. Build from source on
    Linux with cargo build --manifest-path impl/rust/Cargo.toml --features profibus, or use tedge-dot-c.
  • Where the two implementations differ in behaviour, see the parity table in
    impl/c/README.md.
  • On Alpine, the two packages are not mutually exclusive by metadata: apk
    expresses conflicts differently and the conflicts field is not carried into
    the .apk. Installing one over the other will collide on
    /usr/bin/tedge-dot — remove the first with apk del before installing the
    second, rather than forcing the overwrite.

What's Changed

  • fix(snmp): don't bind the trap port for CLI read/write by @reubenmiller in #53
  • fix(sdk): apply the inverse point transform on writes by @reubenmiller in #56
  • test(opcua): validate the connector against the UA-.NETStandard reference server by @reubenmiller in #54
  • feat: report by exception in the SDK runtime (on_change / deadband / heartbeat) by @reubenmiller in #55

Full Changelog: 0.0.9...0.0.10

tedge-dot 0.0.9

Choose a tag to compare

@github-actions github-actions released this 18 Sep 11:02
f58e727

tedge-dot ships as two interchangeable packages, each containing the same
/usr/bin/tedge-dot binary, the same systemd unit and the same
/etc/tedge/plugins/ot/ config layout. They speak the same
OT Connector Contract,
so a config, a flow or a cloud integration built against one works unchanged against
the other. Install one or the other — they declare each other as conflicting.

Package Implementation Pick it when
tedge-dot-rs Rust (impl/rust/) Default. Richest protocol support, one static binary, no shared-library dependencies.
tedge-dot-c C (impl/c/) Small or old devices: ~25x smaller, a glibc 2.17 floor (Debian 8 / RHEL 7 era), and it additionally ships the PROFIBUS-DP connector.

Install

Both packages are published to the thin-edge.io community repository, which
also carries their tedge-parameter-plugin dependency (it maps the Cumulocity
Parameters tab onto point writes). With that repository set up
(instructions):

# Debian / Ubuntu
sudo apt-get install -y tedge-dot-rs                         # or tedge-dot-c
sudo systemctl status tedge-dot

# RPM distros
sudo dnf install tedge-dot-rs                                # or tedge-dot-c

Or download the package for your architecture from the assets below. The
package manager still resolves tedge-parameter-plugin from the community
repository, so set that up first:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb    # or ./tedge-dot-c_*_amd64.deb
sudo dnf install ./tedge-dot-rs_*_linux_amd64.rpm           # or ./tedge-dot-c_*_amd64.rpm

Alpine: the attached .apk files carry a version string apk-tools rejects
(apk version -c refuses both this project's tag format and the snapshot
form), so apk add will not install them. Use the tarball on Alpine until
that is fixed — see TODO.md.

Or grab a tarball and run the binary directly — it doubles as a one-shot
read/write CLI. The tedge-dot-c tarball carries the default configs to start from:

./tedge-dot read -c config-defaults/modbus.toml --json

SHA256SUMS covers every asset in this release.

Upgrading from a release before the split

The package formerly called tedge-dot is now tedge-dot-rs. Both packages
Replaces: the old name, so installing either over an existing tedge-dot
works and keeps your /etc/tedge/plugins/ot/ configuration:

sudo apt-get install -y ./tedge-dot-rs_*_linux_amd64.deb

Two caveats:

  • apt install tedge-dot no longer resolves — tedge-dot is now a virtual
    package provided by both, so apt cannot choose. Install by the real name.
    Scripts and runbooks using the old name need updating.
  • A plain apt upgrade will not migrate an existing tedge-dot install; it
    stays on the old package name and receives no further updates until you
    install one of the new ones explicitly.

Notes

  • On a fresh install the service starts with no devices configured. Add
    [[device]] sections under /etc/tedge/plugins/ot/, or copy a demo config
    from /usr/share/tedge-dot/demo/, then restart the service.
  • The connector is a dumb driver: the device-side flows that map its
    envelopes onto the thin-edge data model are deployed active into
    /etc/tedge/mappers/c8y/flows/, with the opt-in alarm/event flows in
    /usr/share/tedge-dot/flows/. See flows/README.md.
  • tedge-dot-c runtime dependencies (Debian/Ubuntu names): libmodbus5,
    libmosquitto1, libcjson1; open62541 is statically linked. It is
    cross-compiled with zig against the glibc 2.17 floor.
  • tedge-dot-rs omits the PROFIBUS connector: its serial dependency has a
    native libudev build script that does not cross-compile. Build from source on
    Linux with cargo build --manifest-path impl/rust/Cargo.toml --features profibus, or use tedge-dot-c.
  • Where the two implementations differ in behaviour, see the parity table in
    impl/c/README.md.
  • On Alpine, the two packages are not mutually exclusive by metadata: apk
    expresses conflicts differently and the conflicts field is not carried into
    the .apk. Installing one over the other will collide on
    /usr/bin/tedge-dot — remove the first with apk del before installing the
    second, rather than forcing the overwrite.

What's Changed

Full Changelog: 0.0.8...0.0.9