
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
- Avaa
http://localhost:3000— kirjauduadmin/ salasanalla - Connections → Data sources → Add data source → InfluxDB
- Asetukset:
- Query Language: Flux
- URL:
http://localhost:8086 - Basic auth: pois päältä
- Organization:
energyhub - Token: token_tähän
- Default Bucket:
energyhub
- 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 HA | 50–100 MB/kk |
| EnergyHub + Thermia + Sungrow | 100–300 MB/kk |
| Koko talon telemetria | 300–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 (ilmansensor.-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=1ympäristömuuttujiin