Tags give the ability to mark specific points in history as being important
-
v0.6.2
Release: v0.6.29f8a2fd4 · ·### Added - SHA256SUMS published alongside .deb / .rpm on tag releases. Enables direct consumption by Ansible's get_url checksum: and hand-verification via sha256sum -c. SHA-only verification is partial — neither the artifacts nor SHA256SUMS are signed yet; signing tracked separately and will land in a future release. ### Fixed - Discovery configs no longer republish twice on initial broker connect. Each entity registers once per fresh-session connect, halving discovery traffic and journal "Registering topic" lines per startup.
-
v0.6.1
Release: v0.6.1f2d918ab · ·This release ships no binary changes. It's a patch-version bump to validate the CI release flow that failed on v0.6.0 (release-cli image deprecation surfaced as a bash-not-available failure during release-page creation; fixed by migration to `gitlab-org/cli` and POSIX-rewriting the changelog extraction script). Operators on v0.6.0 do not need to upgrade; the binary is byte-identical.
-
v0.6.0
Release: system-mqtt v0.6.0a7cd4a3c · ·This release is a **breaking** modernisation of the MQTT discovery shape to align with Home Assistant's recommended payload conventions. Operator impact is mostly upside (per-host device card, unlocked entity-management UI), but one entity goes away (`version`) and every entity's discovery JSON gains new fields. Read the `### Changed` and `### Removed` notes below before upgrading existing hosts. - Per-cycle health-summary log line. After each successful publish cycle the binary writes `publish cycle complete: N topics published` at info level. Visible in `journalctl` / `systemctl status` as a one-line confirmation that the publish loop is alive, and used by the local smoke harness as a greppable marker for cycle-count assertions. - **Publish-task heartbeat (Piece B) and systemd watchdog integration.** A second supervisor branch now watches the publish task itself: if no successful publish cycle completes within 180 seconds the binary log-and-bails (`publish-task: no progress (...)`) and systemd restarts it. This catches the silent-deaf class where the eventloop is healthy (PingResp keeps the broker connection lively) but the publish task is wedged — channel saturation, blocked await, the v0.5.x field signature where the binary went silent for thirteen minutes after a keepalive-timeout reconnect. The unit file gains `Type=notify`, `NotifyAccess=main`, and `WatchdogSec=360`; the binary signals `READY=1` after registering with HA and `WATCHDOG=1` after each successful publish cycle. WatchdogSec sits as the outermost layer for hangs not caught by either supervisor branch (hard signals, pathological scheduler stalls). Operator effect: the `availability offline` LWT is now a reliable disconnect signal — the binary either publishes correctly or is killed and restarted cleanly, no third state where it's running but silent. - New `version` subcommand: `system-mqtt version` prints the running binary's version to stdout. Useful for confirming which build is installed on a host without parsing systemd unit files or package manifests. - Startup-time legacy-topic sweep. On every MQTT connect the binary publishes empty-retained to a list of deprecated discovery topic paths, clearing ghost entities left on the broker by prior versions. Currently sweeps the pre-v0.4.0 `available` topic (LWT-rename casualty) and the post-v0.5.1 `version` topic (removed in this release). The list is a `const` in `src/main.rs`; future entity removals append a template. - systemd unit file gained `StartLimitIntervalSec=600` and `StartLimitBurst=10`. Previously a sustained network or broker outage would produce an indefinite restart loop (`RestartSec=10` made the default 10s/5-burst limit mathematically unreachable). After 10 restarts in 600s the unit now enters failed state; operator-visible via `systemctl status system-mqtt`, and Home Assistant sees the LWT-driven `availability offline` and stays there durably rather than flickering. Recovery once the underlying issue is resolved: `systemctl reset-failed system-mqtt && systemctl start system-mqtt`. - Supervisor now detects eventloop task death and stuck `poll()` calls via a timer-driven no-progress check and a `JoinHandle` health check, in addition to the existing event-driven detection. Defensive coverage; certain wedge classes that previously required manual intervention are now caught and trigger systemd restart within ~120s. Supervisor log-and-bail messages follow a new `<source>: <description> (<stale signal>)` format with measured stale-signal parentheticals — easier to grep and post-mortem in `journalctl`. - **Discovery payloads now include `unique_id` and `device.identifiers` on every entity.** The standalone `availability` sensor additionally carries the rich device-metadata block (`name`, `sw_version`) per Home Assistant's shared-device pattern. Operator impact: entities now group under a per-host device card in HA (Settings → Devices & Services → MQTT) instead of appearing ungrouped, and the cog-menu UI controls (entity_id, friendly_name, icon, area) unlock for every entity. `sw_version` on the device card is sourced from the same `CARGO_PKG_VERSION` constant used by the `version` subcommand. - `ExecReload=` directive from the systemd unit. The binary doesn't handle SIGHUP, so the prior `ExecReload=/bin/kill -HUP $MAINPID` setting made `systemctl reload system-mqtt` kill the process and let `Restart=on-failure` revive it — restart-as-reload semantics that surprised more than they helped. With the directive removed `systemctl reload` now correctly fails (`Job type reload is not applicable...`); use `systemctl restart system-mqtt` to pick up config changes. - **Standalone `version` MQTT topic and its discovery registration.** The topic was a placeholder until `sw_version` had a canonical home; that home now exists on the per-host device card via the availability sensor's rich device-metadata block (see `### Changed`). Operator impact: the standalone "version" sensor disappears from Home Assistant; any operator automations referencing the `system-mqtt/<HOST>/version` MQTT topic will need to migrate to reading `sw_version` off the device card instead. Existing brokers with a retained `version/config` discovery topic from a prior release are cleared automatically by the new legacy-topic sweep (see `### Added`). The `system-mqtt version` CLI subcommand is unchanged and still prints the running binary's version on demand. - **Discovery configs now republish on broker fresh-session reconnect.** When the broker accepts a reconnect with `session_present=false` — which it does after a broker restart, retained-state eviction, or any other broker-side state loss — the binary re-publishes the full discovery config set, the legacy-topic empty-retained sweep, and the `availability online` retained payload. Previously the binary registered with Home Assistant once at process startup and never re-emitted, so a broker that lost retained state across a restart would leave HA seeing entities marked unavailable or vanished until the binary itself was restarted. State-topic publishes were unaffected, so the loss was easy to miss in journal output but obvious in HA's UI. Now operator-recovery is automatic on the next successful reconnect; no manual `systemctl restart system-mqtt` needed. - Swap percentage now correctly computed as `used_swap / total_swap` rather than `used_swap / free_swap`. Published values were previously the wrong ratio (and clamped to 0–100% by accident on most hosts); after upgrade the swap graph in Home Assistant will show a step-change to the correct utilisation figure. - Discovery payloads for the `availability`, `uptime`, and `battery_state` sensors no longer include an empty-string `state_class` key. The field is now omitted entirely on these sensors (it stays present with its valid value on `cpu` / `memory` / `swap` / `battery_level` / drive topics). Clears the schema-validation warnings Home Assistant logs on entity registration. - Per-cycle swap publish now skipped on hosts with no swap configured (`total_swap() == 0`), instead of publishing the literal string `"NaN"` from a 0/0 division. Home Assistant on no-swap hosts will see the swap sensor stop receiving updates rather than receiving an unparseable value; the discovery registration for the swap topic is unchanged so the entity still appears.
-
v0.5.1
Release: v0.5.14e0a7d36 · ·v0.5.1: CI validation release No code changes since v0.5.0. Purpose is to exercise the tag pipeline end-to-end with the four .gitlab-ci.yml changes that landed between v0.5.0 and now: binstall for cargo-audit / cargo-deb / cargo-generate-rpm, rust:slim base image, and pull-only cache policy on test/clippy. Main-branch pipeline validated on 4e0a7d3 (pipeline release stages for the first time under the new configuration.
-
v0.5.0
Release: v0.5.038551e1f · ·v0.5.0: rumqttc → rumqttc-v4-next fork (temporary bridge) Clears five RustSec advisories (RUSTSEC-2026-0099 / 0049 / 0098 / 0104, RUSTSEC-2025-0134) against rumqttc 0.25.1's rustls-webpki / rustls-pemfile pins. Migration framed explicitly as a temporary bridge pending upstream rumqttc resumption (bytebeamio/rumqtt#1029); see docs/decisions.md entry dated 2026-04-24 for the full context. Opportunistic: enables rustls ring backend via the fork's use-rustls-ring feature, sheds aws_lc_sys. Stripped release binary 6.52 MiB → 4.56 MiB (-30.1%).
-
v0.4.3
Release: v0.4.3cfa635a6 · ·v0.4.3 — CI publishes GitLab Release with .deb + .rpm attached on tag push. Native apt/dnf install via Package Registry parked upstream (Debian Experiment, RPM not GA on gitlab.com). No wire or contract changes. Patch bumped from 0.4.2 rather than repeated because the prior 0.4.2 artifact existed only as a locally-built test package, and install-state on the test host is unverified.