aoostar-lcd-cards
AOOSTAR · 960×376 USB LCD

Your NAS front panel, your cards.El panel de tu NAS, tus tarjetas.

Rotating status cards for the front LCD of AOOSTAR mini PCs and NAS boxes. Pick which cards appear, in which order and for how long, from one YAML file, or write your own in a few lines of Python. Frames are drawn with Pillow and sent through asterctl. Tarjetas de estado que rotan en la LCD frontal de los mini PC y NAS AOOSTAR. Eliges qué tarjetas aparecen, en qué orden y cuánto duran desde un solo archivo YAML, o escribes las tuyas con pocas líneas de Python. Los cuadros se dibujan con Pillow y se envían con asterctl.

● MIT Python 3.11+ asterctl v0.2.0 pinnedfijado preview without hardwarevista previa sin hardware Proxmox LXC · Docker · systemd
Network card CPU card Memory card Temperature card Storage card Clock card Image card
Rotation preview, synthetic data. The real panel shows each card for its configured duration.Vista previa de la rotación con datos sintéticos. La pantalla real muestra cada tarjeta durante el tiempo configurado.

How it worksCómo funciona

A collector measures, a renderer draws, asterctl talks to the panel. Run them together, or split them between a host and a container.Un colector mide, un renderizador dibuja y asterctl habla con la pantalla. Corren juntos o separados entre un host y un contenedor.

collector card.collect() psutil · /sys · zfs smartctl · commands state.json atomic write renderer rotation · banner card.render(canvas,…) 960×376 PNG asterctl LCD aoostar-lcd run: one process, no file needed host: aoostar-lcd collect LXC / container: aoostar-lcd display

Split for ProxmoxSeparado para Proxmox

The host sees every NIC, pool and disk; an unprivileged LXC only needs the serial device and a read-only bind mount.El host ve todas las NIC, pools y discos; un LXC sin privilegios solo necesita el dispositivo serie y un montaje de solo lectura.

Never staleNunca datos viejos

The state has a timestamp; if it gets too old the panel says NO DATA. History survives restarts.El estado lleva marca de tiempo; si envejece la pantalla dice SIN DATOS. El historial sobrevive a los reinicios.

Gentle on the panelCuida la pantalla

A frame is sent only when it changed; failures are retried on the next interval, never in a tight loop.Solo se envía un cuadro si cambió; un fallo se reintenta en el siguiente intervalo, nunca en un bucle apretado.

ConfigureConfigurar

One YAML file. Order is rotation order; each card has a duration and its own options. Mistakes are reported with the exact key and a suggestion.Un archivo YAML. El orden es el de la rotación; cada tarjeta tiene su duración y sus opciones. Los errores indican la clave exacta y una sugerencia.

config.yaml

language: en              # en | es
display:
  device: /dev/ttyACM0
rotation:
  default_duration: 8
theme:
  preset: dark             # dark | light, any color
cards:
  - type: cpu
    temperature_chip: k10temp
  - type: network
    interfaces: [enp1s0, enp2s0]
    units: bits              # Mbit/s | bytes = MB/s
    mode: aggregate          # or split
  - type: storage
    units: si                # TB | iec = TiB
    volumes:
      - {zfs: tank, label: Data}
      - {mount: /, label: System}
  - type: clock
    duration: 5
  - type: image
    path: /etc/aoostar-lcd/images
    enabled: false

validationvalidación

$ aoostar-lcd check -c config.yaml
aoostar-lcd: configuration error:
cards[1] (network): unknown option 'interface'.
Did you mean "interfaces"? Allowed: bucket_seconds,
exclude, history_minutes, interfaces, labels, ...

$ aoostar-lcd check -c config.yaml
config: config.yaml (OK)
  [on ] cpu        cpu       8 s  refresh 0 s
  [on ] network    network   8 s  refresh 0 s
  [on ] storage    storage   8 s  refresh 30 s
  [on ] clock      clock     5 s  refresh 60 s
  [off] image      image     8 s  refresh 0 s
asterctl: /usr/local/bin/asterctl version 0.2.0

preview, no hardwarevista previa, sin hardware

$ aoostar-lcd preview -c config.yaml --out /tmp/cards
$ aoostar-lcd preview -c config.yaml --out /tmp/cards --live

Your own cards and picturesTarjetas e imágenes propias

From no code to full control: a command, a picture, or a small Python class loaded from the YAML.De cero código a control total: un comando, una imagen o una pequeña clase de Python que se carga desde el YAML.

hello_card.py

from aoostar_lcd import Card


class HelloCard(Card):
    type_name = "hello"
    defaults = {"greeting": "Hello"}

    def collect(self):            # on the host
        import os
        return {"processes": len(os.listdir("/proc"))}

    def render(self, canvas, theme, data):   # next to the LCD
        canvas.title("HELLO")
        canvas.text((canvas.left, canvas.top + 170),
                    self.options["greeting"] + "!", size=90, anchor="ls")

config.yaml

- type: plugin
  plugin: plugins/hello_card.py:HelloCard
  greeting: Hi

- type: custom                 # no Python at all
  title: BACKUPS
  command: [/usr/local/bin/backup-status, --json]
  refresh: 60

- type: image                  # png, jpg, webp, gif
  path: /etc/aoostar-lcd/images
  mode: contain                # cover | fit-width
  background: "#101218"
Image rights. Only display pictures you are allowed to use. The project ships no third-party artwork; the example logo and landscape were generated for it with Pillow.Derechos de las imágenes. Muestra solo imágenes que tengas derecho a usar. El proyecto no incluye arte de terceros; el logo y el paisaje de ejemplo se generaron para él con Pillow.

InstallInstalar

Three ways to run it. asterctl is installed at the pinned version in all of them.Tres formas de correrlo. En todas se instala asterctl en la versión fijada.

# asterctl: pinned release, SHA-256 checked (or --from source = cargo build)
sudo scripts/install-asterctl.sh
# the package, in its own virtual environment
sudo python3 -m venv /opt/aoostar-lcd
sudo /opt/aoostar-lcd/bin/pip install .
sudo ln -sf /opt/aoostar-lcd/bin/aoostar-lcd /usr/local/bin/aoostar-lcd
# configuration and service
sudo install -d /etc/aoostar-lcd && sudo cp config.example.yaml /etc/aoostar-lcd/config.yaml
sudo aoostar-lcd check -c /etc/aoostar-lcd/config.yaml
sudo cp systemd/aoostar-lcd.service /etc/systemd/system/
sudo systemctl daemon-reload && sudo systemctl enable --now aoostar-lcd

asterctl and licensesy licencias

asterctl, by Markus Zehnder, speaks the panel's reverse-engineered protocol. It is a pinned external dependency: never copied into this repository.asterctl, de Markus Zehnder, habla el protocolo de la pantalla, obtenido por ingeniería inversa. Es una dependencia externa fijada: nunca se copia en este repositorio.

ComponentComponenteLicenseLicenciaHow it is usedCómo se usa
aoostar-lcd-cardsMITThis project.Este proyecto.
asterctl v0.2.0MIT OR Apache-2.0Pinned in asterctl.version (commit 078dc267, release SHA-256 d29c1d9b…). Installed by scripts/install-asterctl.sh or the Dockerfile; license texts travel with the binary. CI checks the tag weekly.Fijado en asterctl.version (commit 078dc267, SHA-256 del release d29c1d9b…). Lo instala scripts/install-asterctl.sh o el Dockerfile; los textos de licencia van junto al binario. CI revisa el tag cada semana.
DejaVu Sans / Sans Mono BoldBitstream Vera + ArevBundled fonts, unmodified, license in the package.Fuentes incluidas, sin modificar, con su licencia en el paquete.
Pillow · PyYAML · psutilMIT-CMU · MIT · BSD-3Installed by pip.Las instala pip.
The LCD protocol is undocumented by the manufacturer; asterctl's author warns that a wrong command can hang the display until it is power-cycled. This project has been tested without hardware (previews, asterctl --simulate); sending to a real panel must be confirmed on the device.El fabricante no documenta el protocolo de la pantalla; el autor de asterctl advierte que un comando incorrecto puede colgarla hasta apagarla y encenderla. Este proyecto se probó sin hardware (vistas previas, asterctl --simulate); el envío a una pantalla real hay que confirmarlo en el equipo.