Tags

Tags give the ability to mark specific points in history as being important
  • v0.6.2

    9f8a2fd4 · release: v0.6.2 ·
    Release: v0.6.2
    ### 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

    f2d918ab · release: v0.6.1 ·
    Release: v0.6.1
    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

    a7cd4a3c · release: v0.6.0 ·
    Release: system-mqtt v0.6.0
    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.1
    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.0
    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.3
    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.