InfluxDB + Grafana — historiadatan tallennus ja visualisointi

Tämä ohje kattaa InfluxDB 2.x:n ja Grafanan asennuksen Docker-kontteihin sekä Home Assistantin konfiguroinnin lähettämään data InfluxDB:hen. Ohje olettaa että Docker ja Docker Compose ovat asennettuna ja että muut EnergyHub-kontit (HA, Node-RED, Mosquitto) pyörivät jo.

Arkkitehtuuritausta löytyy sarjan osista Osa 8 — MQTT ja Osa 9 — Hintaohjauksen flow.

Versiohuomio: Ohje perustuu InfluxDB 2.7 -versioon. InfluxDB 3.x käyttää osittain eri arkkitehtuuria ja SQL-pohjaista kyselymallia — Flux-kyselyt eivät toimi suoraan 3.x:ssä.

Miksi InfluxDB eikä HA:n Recorder tai MariaDB

Home Assistantin Recorder + MariaDB sopii hyvin käyttöliittymän historiatiedolle — entiteettien tilahistoria, automaatioiden lokit, päivän kulutus. Se on luotettava ja HA-integroitu ratkaisu.

InfluxDB:n etuna ovat tehokkaat aikasarjakyselyt, pitkä säilytys ilman hidastumista, joustava aggregointi ja Grafana-integraatio. EnergyHubissa InfluxDB on myös optimoinnin kehittämisen työkalu: EV tapering-käyrien analysointi, Thermian COP-seuranta, sulakepiikkien jälkianalyysi ja negatiivisten hintojen vaikutusten tutkiminen vaativat historiaa jota Recorder ei tehokkaasti tarjoa.

InfluxDB on aikasarjatietokanta joka on suunniteltu juuri tähän: mittausdatan tallennukseen ja nopeaan hakuun. Grafana on visualisointityökalu joka kytkeytyy InfluxDB:hen ja mahdollistaa interaktiiviset dashboardit.

Yhdessä ne muodostavat EnergyHubin observability-kerroksen — sen joka mahdollistaa kysymyksen ”mitä tapahtui tiistaina klo 14” ja vastauksen löytymisen.

Laitteistovaatimukset

Testattu ympäristö:

  • Lenovo ThinkCentre (tai vastaava miniPC)
  • Ubuntu/Debian Linux
  • Docker + Docker Compose
  • Vähintään 4 GB RAM, 20 GB vapaata levytilaa

Docker Compose -konfiguraatio

Lisää docker-compose.yml:iin InfluxDB ja Grafana:

yaml

  influxdb:
    container_name: influxdb
    image: influxdb:2.7
    volumes:
      - ./influxdb/data:/var/lib/influxdb2
      - ./influxdb/config:/etc/influxdb2
    network_mode: host  # Yksinkertaisuuden vuoksi — tuotannossa harkitse omaa Docker-verkkoa
    restart: unless-stopped
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=salasana_tähän
      - DOCKER_INFLUXDB_INIT_ORG=energyhub
      - DOCKER_INFLUXDB_INIT_BUCKET=energyhub
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=token_tähän

  grafana:
    container_name: grafana
    image: grafana/grafana:11  # Kiinteä versio — latest voi muuttua merkittävästi
    volumes:
      - ./grafana/data:/var/lib/grafana
    network_mode: host  # Yksinkertaisuuden vuoksi — tuotannossa harkitse omaa Docker-verkkoa
    restart: unless-stopped
    environment:
      - GF_SERVER_HTTP_PORT=3000
      - GF_SECURITY_ADMIN_PASSWORD=salasana_tähän

Luo hakemistot ja käynnistä:

bash

mkdir -p ./influxdb/data ./influxdb/config ./grafana/data
sudo chown -R 472:472 ./grafana/data  # Grafana ajaa UID 472
docker compose up -d influxdb grafana

Tarkista käynnistyminen:

bash

curl -s http://localhost:8086/health
curl -s http://localhost:3000/api/health

Molempien pitäisi vastata status: pass tai database: ok.

HA:n InfluxDB-integraatio

Lisää configuration.yaml:iin:

yaml

influxdb:
  api_version: 2
  ssl: false
  host: localhost  # Toimii kun sekä HA että InfluxDB käyttävät host networkia
  port: 8086
  token: token_tähän
  organization: energyhub
  bucket: energyhub
  tags:
    source: energyhub
  tags_attributes:
    - friendly_name
  default_measurement: state
  include:
    domains:
      - sensor
      - binary_sensor
    entities:
      - switch.shellypro1_ec62608be038      # EV-rele
      - switch.shellypro2_ec62609153c8_output_0  # HP EVU
      - switch.shellypro2_ec62609153c8_output_1  # HP Boost
  exclude:
    domains:
      - persistent_notification
      - person
      - zone
      - update
      - button

Huomio localhost: Tämä toimii vain kun molemmat kontit käyttävät network_mode: host. Docker bridge -verkossa käytetään palvelun nimeä (influxdb) hostin sijaan.

Huomio include/exclude: include + exclude yhdistelmässä include lisää yksittäisiä entiteettejä jotka muuten jäisivät pois (kuten switch-domain). Switch-entiteetit tallentuvat vain tilamuutosten yhteydessä — pakotettu tilamuutos Developer Toolsissa käynnistää ensimmäisen kirjauksen.

Käynnistä HA uudelleen:

bash

docker restart homeassistant

Tarkista data:

bash

curl -s "http://localhost:8086/api/v2/query?org=energyhub" \
  -H "Authorization: Token token_tähän" \
  -H "Content-Type: application/vnd.flux" \
  -d 'from(bucket:"energyhub") |> range(start: -5m) |> limit(n:3)'

Grafana — data source

  1. Avaa http://localhost:3000 — kirjaudu admin / salasanalla
  2. Connections → Data sources → Add data source → InfluxDB
  3. Asetukset:
    • Query Language: Flux
    • URL: http://localhost:8086
    • Basic auth: pois päältä
    • Organization: energyhub
    • Token: token_tähän
    • Default Bucket: energyhub
  4. Save & test — pitäisi näyttää ”3 buckets found”

Dashboardit

EnergyHub käyttää neljää dashboardia. Jokainen on importoitavissa JSON-tiedostona:

Dashboard 1 — Energian yleiskatsaus

  • Verkkoteho, PV-tuotanto, vaihevirrat, EV-lataus, Thermia-lämpötilat, spot-hinta

Dashboard 2 — Päätösanalyysi

  • Spot-hinta hintakynnyksillä, vaihevirrat sulakerajoilla, PV + verkko, EV + SOC, HP EVU/Boost tila, PV-rajoitus

Dashboard 3 — Laitteiden seuranta

  • Thermia: lämpötilat, kompressori, käyttötila, sähkönkulutus
  • Sungrow: PV-tuotanto, MPPT-jännitteet, PV-rajoitus
  • EV: latausteho, SOC, rele

Dashboard 4 — Talous

  • Päivittäinen PV-tuotanto, osto vs myynti, spot-hinta tunneittain, negatiiviset hintatunnit

Dashboardit importoidaan: Dashboards → Import → Upload JSON file.

Käytetyt esimerkki JSON-tiedostot löytyvät GitHubista.

Flux-kyselyesimerkkejä

InfluxDB 2.x käyttää Flux-kyselykieltä. Muutama hyödyllinen peruskysely:

Viimeisin arvo:

flux

from(bucket: "energyhub")
  |> range(start: -5m)
  |> filter(fn: (r) => r["entity_id"] == "m_spot_price_eur_kwh")
  |> filter(fn: (r) => r["_field"] == "value")
  |> last()

Tuntikohtainen keskiarvo:

flux

from(bucket: "energyhub")
  |> range(start: -24h)
  |> filter(fn: (r) => r["entity_id"] == "m_pv_power_w")
  |> filter(fn: (r) => r["_field"] == "value")
  |> aggregateWindow(every: 1h, fn: mean, createEmpty: false)

Negatiiviset hintatunnit:

flux

from(bucket: "energyhub")
  |> range(start: -30d)
  |> filter(fn: (r) => r["entity_id"] == "m_spot_price_eur_kwh")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["_value"] < 0.0)
  |> count()

Tietojen säilytys

InfluxDB:n oletusretentio on ikuinen. EnergyHub-dataa kertyy noin 50–200 MB kuukaudessa riippuen sensorimäärästä. Retentiopolicyn voi asettaa InfluxDB:n käyttöliittymästä: Load Data → Buckets → energyhub → Settings.

JärjestelmäArvioitu datamäärä
Kevyt HA50–100 MB/kk
EnergyHub + Thermia + Sungrow100–300 MB/kk
Koko talon telemetria300–1000 MB/kk

Suositus: 1–2 vuotta riittää trendien analysointiin. Tätä vanhempi data voidaan arkistoida tai poistaa.

Varmuuskopiointi

InfluxDB:n data kannattaa varmuuskopioida säännöllisesti — vuosien historiadatan menetys levyrikon yhteydessä on kallis oppi.

InfluxDB — sisäänrakennettu backup:

bash

docker exec influxdb influx backup /tmp/influxdb_backup
docker cp influxdb:/tmp/influxdb_backup ./influxdb_backup_$(date +%Y-%m-%d)

Grafana — dashboardien export: Grafanassa jokainen dashboard voidaan exportoida JSON-muodossa: Dashboard → Share → Export. Tallenna JSON-tiedostot versionhallintaan.

Grafanan data/-kansio sisältää dashboardit ja konfiguraation — se kannattaa sisällyttää varmuuskopiointiskriptiin.

Katso erillinen ohje: Varmuuskopiointi — rclone + Google Drive.

Yleisimmät ongelmat

Data ei tallennu InfluxDB:hen

  • Tarkista token configuration.yaml:ssa
  • Tarkista HA:n lokit: docker logs homeassistant | grep -i influx
  • Switch-entiteetit tallentuvat vain muutosten yhteydessä — pakota tilamuutos

Grafana ei löydä dataa

  • Tarkista data source — ”Save & test” pitäisi onnistua
  • Tarkista Flux-kyselyn entity_id — sen pitää vastata InfluxDB:n tallennettua arvoa (ilman sensor.-etuliitettä)

Grafana ei käynnisty (Permission denied)

  • sudo chown -R 472:472 ./grafana/data — Grafana ajaa UID 472:lla

InfluxDB vie liikaa muistia

  • Lisää INFLUXD_ENGINE_WAL_MAX_CONCURRENT_WRITES=1 ympäristömuuttujiin

Piditkö artikkelista?

Seuraa blogia myös Blogit.fi:ssä, niin löydät uudet kirjoitukset helposti.

Seuraa blogia Blogit.fi:ssä