Skip to content
back to projects
Observability

Observability stack

InfluxDB + Grafana split out of Home Assistant into their own containers, now serving 14 dashboards across the cluster, power, energy costs and Home Assistant.

InfluxDB 1.8.10Grafana 13Telegraf-freePVE metrics
InfluxDB
1.8.10
Grafana
OSS 13
Datasources
2
Dashboards
14

At a glance

cpu34%
net124 mbps
ram58%
io22 mb/s

Out of HAOS

InfluxDB used to live as a Home Assistant add-on, which meant every HA restart took down metric collection for the whole cluster. It now runs as a standalone LXC on the EliteDesk mini, pinned to 1.8.10 via apt-mark hold so a stray upgrade can’t lose data, with its own users for the PVE metric server, HA, and a read-only Grafana account.

text
         ┌──────────────┐
         │ pvestatd × 4 │  push interval: 30s
         └──────┬───────┘
                ▼
        ┌───────────────┐
        │  InfluxDB     │  CT 113 · 192.168.1.118:8086
        │  1.8.10 (held)│  dbs: proxmox · homeassistant
        └───┬───────┬───┘
            │       │  read-only grafana_reader
            ▼       ▼
        ┌───────────────┐
        │   Grafana 13  │  CT 117 · 192.168.1.139:3000
        └───────────────┘  14 dashboards, AU date formats

The dashboards

Fourteen in all, grown from the four I bootstrapped the stack with. The ones worth describing:

  • Proxmox cluster. Telmate 10048 with all four nodes wired in, the obvious choice for at-a-glance health.
  • Laptop battery. Nine custom panels on the laptop node’s battery. The health percentage is a stored constant, not a measurement: the fuel gauge only re-learns full capacity on a complete discharge, and the node halts itself at 20 % before one can happen. The panels that matter are the charge cap, which must read 80 %, and the live charge level.
  • HA state changes. The Grafana 12705 community dashboard with template-variable dropdowns for domain, measurement and entity_id.
  • HA overview. A custom 23-panel home dashboard with collapsible rows for climate, energy and the retail tariff, smart-device batteries, air quality, health metrics and BLE presence.
  • Energy. Four boards on the household energy meters: a long-history view, a card-for-card rebuild of Home Assistant’s Energy dashboard, battery ROI and bills, and grid-charge arbitrage. Two Python engines on a daily systemd timer compute the savings and arbitrage series and write them back to InfluxDB.
  • UPS. Power and runtime every 10 seconds from the laptop node, buffered and replayed if the write fails, because InfluxDB lives on a node that shuts down when the UPS runs low.
  • Smaller boards. Page views for the three sites I host, this one included; a household food log; and trips and fuel per car, from ESP32 loggers on the OBD ports.

Provisioning

Datasources are set up via Grafana’s file provisioning so a rebuild brings them back identically, and the UI lock keeps them tamper-proof. The Grafana CT itself reads its InfluxDB password from pmxcfs via a tiny one-shot at start.

yaml
# /etc/grafana/provisioning/datasources/influxdb.yaml
apiVersion: 1
datasources:
  - name: InfluxDB-Proxmox
    type: influxdb
    access: proxy
    url: http://192.168.1.118:8086
    database: proxmox
    user: grafana_reader
    secureJsonData:
      password: ${GRAFANA_READER_PASSWORD}
    editable: false
    isDefault: true
  - name: InfluxDB-HomeAssistant
    type: influxdb
    access: proxy
    url: http://192.168.1.118:8086
    database: homeassistant
    user: grafana_reader
    secureJsonData:
      password: ${GRAFANA_READER_PASSWORD}
    editable: false