Skip to content

sys-oled 2.0.0

Choose a tag to compare

@rpardini rpardini released this 06 Nov 01:28
· 3 commits to master since this release
v2.0.0
45df9c9

A ground-up rewrite. It still drives the same little OLED, but now on any SSD1306-class I2C display (SH1106, SSD1305, SSD1309, SSD1315; 128x64 and 128x32) on any Linux board with /dev/i2c-*: Amlogic, Rockchip, MediaTek Genio, Allwinner, Raspberry Pi, x86.

Status Kubernetes Logo + clock Big-font temp Alert
status k8s logo temp alert

Highlights

  • Everything is auto-detected at startup, with no i2c-tools or lm-sensors needed:

    • the I2C bus and address;
    • the best temperature sensor, chosen per SoC family;
    • fan tachometers;
    • the default-route interface;
    • the most relevant storage: root first, then the largest data filesystems (RAID, ZFS pools, NVMe…).
  • Low steady-state cost. Detection runs once, and runs again only on failure or when the kernel reports a mount or network change.

  • Distro packages only. It runs on Debian 13 (Trixie) and Ubuntu 25.04 or newer, Armbian included, using apt packages. There's no pip and no venv.

  • One YAML config. Settings come from /etc/sys-oled.yaml, drop-ins, environment variables, Kubernetes node labels and annotations, and CLI flags. sys-oled config shows the effective value of every setting and where it came from.

  • Pages:

    • status;
    • Kubernetes;
    • the new Armbian logo with a clock;
    • big-font load, temperature and fan pages that are readable from across the room.

    The order is configurable, and screen-off periods help prevent OLED burn-in.

  • Alerts. When the temperature goes too high or a fan runs too slowly, the panel wakes and flashes a warning.

  • Deployment options:

    • a bare-metal curl | bash installer with --uninstall and --purge;
    • a multi-arch container image for amd64, arm64, armv7 and riscv64;
    • docker compose;
    • a Helm chart. It runs a DaemonSet on labeled nodes, takes per-node config from labels and annotations, uses read-only RBAC, and adds an in-cluster status page.

Install

Bare metal:

curl -fsSL https://raw.githubusercontent.com/rpardini/sys-oled-hc4/master/install.sh | sudo SYS_OLED_REF=v2.0.0 bash

Container: ghcr.io/rpardini/sys-oled-hc4:2.0.0. See deploy/compose.yaml.

Kubernetes:

helm install sys-oled oci://ghcr.io/rpardini/sys-oled-hc4/charts/sys-oled --version 2.0.0
kubectl label node <node-with-oled> sys-oled/enabled=true

Upgrading from 1.x

Re-run the installer. It handles the migration:

  • /etc/sys-oled.conf becomes /etc/sys-oled.yaml.
  • Display model and rotation flags from the old systemd unit move to a drop-in.
  • A hardcoded --i2c-port is dropped on purpose, because the bus is now detected at every start.
  • The old copied script and assets are replaced.

The legacy INI file and the old luma-style flags are still understood.

Breaking: Debian 12 (Bookworm) and Ubuntu 24.04 and older are no longer supported on bare metal, because Python 3.13 is now the minimum. On those systems, use the container image instead.

See the README for details.

Thanks to everyone who sent PRs over the years (#1, #2, #3, #4); their ideas are all part of this release.