bijmij-grafana: OpenTherm Gateway

Door nickyb2 op zaterdag 30 april 2016 14:51 - Reacties (14)
CategorieŽn: grafana, influxdb, otgw, Views: 8.361

Een korte tijd geleden ben ik begonnen met een project dat ik 'bijmij' gedoopt heb. Bijmij is een verzameling ideeŽn, scripts, blogs en aanverwante zaken over hoe ik 'bijmij' monitoring doe, hoe mijn domotica werkt of hoe ik bijvoorbeeld mijn CV ketel in de gaten hou.

Deze post gaat over hoe we met een OpenTherm Gateway en wat software het volgende Dashboard kunnen maken.
bijmij-grafana-otgw


Het dashboard geeft je een redelijk inzicht in hoe je CV ketel zijn werk aan het doen is en is onderverdeeld in vier blokken:
  • De huidige en gewenste temperatuur zoals door je thermostaat wordt gemeten.
  • De aanvoer en retour temperatuur van en naar de CV ketel toe en tonen we de maximum retour van 55 graden.
  • Het modulatie niveau van je CV ketel
  • Welke modus aanstaan, Vlam, CV-modus of Warm Water Modus
Het dashboard is gemaakt in Grafana, een software pakket waarmee je aan de hand van tijdseries data dashboards en grafieken kunt maken. De tijdseries data zit opgeslagen in een InfluxDB.

Wat heb je allemaal nodig:
Om van CV ketel tot aan het dashboard te komen hebben we een aantal onderdelen nodig:Hieronder een schema van waar welk onderdeel zich bevindt.

bijmij-grafana-otgw-components


Er zijn meerdere manieren om de OTGW uit te lezen. Ik heb gekozen om dit via de otmonitor software te doen en wel om de volgende redenen:
  • otmonitor biedt een json api waarin alle laatst gemeten waarden in staan. Dit wordt gebruikt voor het periodiek (elke x aantal seconden) uitlezen van alle meetwaarden
  • otmonitor biedt een WebSocket waarin alle wijzigingen op doorkomen. Dit wordt gebruikt om bij bepaalde wijzigingen, zoals warm water open/dicht een meting op te slaan in de InfluxDB. Doen we dit niet, dan kunnen we interessante metingen missen. Stel de warm water kraan gaat open en dicht binnen de periodieke uitlezing, dan missen we die waardes en dan zien we dat niet terug in het Dashboard
  • los van het uitlezen van meetwaarden wil ik ook mijn setpoint kunnen beÔnvloeden via een domotica oplossing, otmonitor ondersteund dit via de command pagina

Voorbereidingen:
Ik zal nu uitleggen hoe ik de installatie bij mij gedaan heb en het is aan jou om dit aan te passen aan jou gekozen platform en naam keuzes.

Als eerste zul je Grafana en InfluxDB moeten installeren en de websites van zowel Grafana als InfluxDB bieden voldoende houvast om dit te doen en zal ik hier niet nogmaals gaan herhalen. Kies voor Grafana voor versie 3 (nu nog beta).

Zowel Grafana als InfluxDB draaien bij mij in dezelfde VM op Ubuntu 16.04 LTS. Als je beide geÔnstalleerd hebt zal je een database moeten aanmaken op de InfluxDB en ik raad je aan om een retention policy aan te maken.

Je kunt de CLI van InfluxDB opstarten doormiddel van:

code:
1
$ influx


Ik heb gekozen om mijn database 'bijmij' te noemen.

code:
1
influx$ CREATE DATABASE bijmij;


Een retention policy zorgt ervoor dat je niet oneindig data in je database gaat pompen. Mijn retention policy houdt maximaal 30 dagen vast, daarna worden de oudste records automatisch verwijderd. De retention policy noem ik 'raw' als hierin zit de ruwe data en moeten we misschien nog wat mee doen. Langer dan 30 dagen wil ik het in ieder geval niet bewaren.

code:
1
influx$ CREATE RETENTION POLICY raw ON bijmij DURATION 30d REPLICATION 1;


Vervolgens kun je in Grafana een InfluxDB koppelen via een DataSource:

http://static.tweakers.net/ext/f/9DPWRM7yHvCUWuTYKyiDGT1U/full.png



De OTGW hangt via USB aan een Raspberry PI Model 2 welke ook de otmonitor software draait. De otmonitor moet in daemon mode gezet worden en beschikbaar zijn via http.

Ik gebruik supervisor om de otmonitor op de juiste manier te starten. Je kunt onderstaand supervisor config gebruiken, uiteraard zul je de paden en dergelijk moeten aanpassen aan jou eigen situatie.

code:
1
2
3
4
5
6
7
[program:otmonitor-ahf]
command = <PATH TO OTMONITOR>/otmonitor-ahf --daemon -w 8080 /dev/ttyUSB0
user = pi
autostart = true
autorestart = true
stdout_logfile = NONE
stderr_logfile = NONE



Uitlezen OTGW -> InfluxDB:
De volgende stap is het uitlezen van de OTGW en de meetgevens plaatsen in de InfluxDB. Ik heb hiervoor een script geschreven in Python en gebruik ook een aantal dependencies. Laten we eerst de dependencies gaan installeren via pip:

code:
1
2
3
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo -H pip install "influxdb>=2.12.0" "requests>=2.9.1" "websocket-client>=0.37.0"



Vervolgens kunnen we het script gaan downloaden en aanroepen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
usage: bijmij-otmonitor-influxdb.py [-h] [--hostname hostname] [-p port]
                                    [-s secs] [--rml-min min] [--rml-max max]
                                    [--influx-hostname hostname]
                                    [--influx-port port]
                                    [--influx-username username]
                                    [--influx-password password]
                                    [--influx-database dbname]
                                    [--influx-retention-policy policy]
                                    [--influx-measurement measurement]
                                    [-v | -q]
                                    [tag ...]

Send otmonitor updates to an InfluxDB API

optional arguments:
  -h, --help            show this help message and exit
  --hostname hostname   hostname to connect to otmonitor, defaults to
                        'localhost'
  -p port, --port port  port to connect to otmonitor, defaults to 8080
  -s secs, --sleep secs
                        number of seconds to sleep between updates, defaults
                        to 60
  --rml-min min         minimum modulation, defaults to 30
  --rml-max max         maximum modulation, defaults to 100
  -v, --verbose         Be verbose
  -q, --quiet           Be very quiet

  --influx-hostname hostname
                        hostname to connect to InfluxDB, defaults to
                        'localhost'
  --influx-port port    port to connect to InfluxDB, defaults to 8086
  --influx-username username
                        user to connect, defaults to 'root'
  --influx-password password
                        password of the user, defaults to 'root'
  --influx-database dbname
                        database name to connect to, defaults to 'bijmij'
  --influx-retention-policy policy
                        retention policy to use
  --influx-measurement measurement
                        measurement name to store points, defaults to
                        otmonitor
  tag ...               any tag to the measurement


Het ziet er ingewikkelder uit dan het is. De gekozen default zijn vrijwel altijd de juiste maar er is voldoende flexibiliteit om aan te passen aan jouw eigen situatie. Waar je goed op moet letten is welke retention policy je neemt, je wilt hier waarschijnlijk net als ik de 'raw' nemen en als je hem niet invult komt hij standaard op default te staan. Dit script start ik weer met supervisor en dan kun je gelijk mijn eigen aanroep zien:

code:
1
2
3
4
5
6
7
8
9
10
[program:bijmij-otmonitor-influxdb]
command = python <PATH TO>bijmij-otmonitor-influxdb.py -q --hostname <otmonitor IP> -s 15 --influx-retention-policy raw
user = bijmij
autostart = true
autorestart = true

redirect_stderr = true
stdout_logfile = /var/log/bijmij/bijmij-otmonitor-influxdb.log
stdout_logfile_maxbytes = 1MB
stdout_logfile_backups = 3



Bovenstaand schrijft mijn OTGW gegevens elke 15 seconden weg in de bijmij database onder retention policy raw in de measurement otmonitor. De otmonitor draait op <otmonitor IP>:8080 en de InfluxDB op de localhost:8086.

Grafana Dashboard
Het laatste stukje van deze puzzel is het Dashboard in Grafana maken. Laat Grafana nu een 'export' en 'import' functie hebben ingebouwd, ik kan dus eenvoudig mijn Dashboard met jullie delen.

Grafana draait op poort 3000, dus: http://<ip grafana>:3000

Het Dashboard kun je importeren bij Dashboard en dan Import, vervolgens een bestand kiezen. Als je nu dezelfde naamgeving hebt gebruikt als die van mij dan zou je een werkend Dashboard moeten krijgen. Heb je een andere naamgeving gekozen dan zul je de queries die onder de grafieken zitten aan moeten passen. Je kiest hier dan de juiste retention policy en dan de juiste measurement.


Nawoord
Als het goed is zou je nu een redelijk inzicht moeten krijgen in het gedrag van je OpenTherm CV ketel. Wees vrij om verbeteringen door te voeren, graag zie ik die dan terug zodat ik deze post kan updaten.

De installatie heb ik uit mijn hoofd gedaan, bij mij draait het al een tijdje, mocht er dus iets niet duidelijk zijn of iets niet werken zoals ik me herinneren laat me het dan weten dan ga ik dat uitzoeken en zal dan de post aanpassen.