My guide to grafana / influxdb

From Edgar BV Wiki
Jump to navigation Jump to search

adapted from SmartThings Data Visualisation using InfluxDB and Grafana

Influxdb

apt-get install influxdb influxdb-cli influxdb-client
service influxdb start
systemctl enable influxdb
influx

you can also surf to http://db-01.edgarbv.int:8083/ to check if it works

Back in the cli (influx) enter

Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 1.0.2
InfluxDB shell version: 1.0.2
> create database "honeywell"
> create user "grafana" with password 'password'

InfluxQL functions

Filling influxdb using evologger For Honeywell Evohome

Evohome client readme Evohome client github Freeranger evologger

apt install git
apt-get install python-pip
cd /opt/
git clone https://github.com/freeranger/evologger.git
get clone https://github.com/watchforstock/evohome-client.git
pip install ./evohome-client
pip install influxdb

now cd /evologger

vi config.ini and fill in the usernames and influxdb stuff (port 8806)

To check if the data is being entered, use the influx cli

use honeywell
> show measurements

name: measurements
------------------
name
zone_temp.actual
zone_temp.delta
zone_temp.target

select * from "zone_temp.actual"

should give you some results.

NB this method takes all the data at the time of polling from the honeywell API instead of incrementally adding to it as Domoticz does.

To get it to run as a service

  vi /opt/evologger.sh
#!/bin/bash

pushd /opt/evologger
./evologger.py
  chmod 744 /opt/evologger.sh
  touch /var/log/evologger
  vi /usr/lib/systemd/system/evologger.service
[Unit]
After=grafana.service

[Service]
ExecStart=/opt/evologger/evologger.sh >& /var/log/evologger

[Install]
WantedBy=default.target
  systemctl enable evologger
  systemctl start evologger
  vi /etc/logrotate.d/evologger
/var/log/evologger {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
}

Filling influxdb using domoticz

For Honeywell Evohome

Under Setup -> More Options -> InfluxDB

Under Edit Link select the Device Name, value (Status / Temperature / Set Point), target type (direct: it sends everything it knows periodically / On value change: only when the value changes it will be sent)

Note for target type: for Set Point and Status you will need to set direct, to populate the database with the first data points. Once influxdb has been populated, you can change it to on value change) and click Add. It will appear in the table above.

Under general settings fill in database name and port 8086 :)

Under database in the format: honeywell-domoticz&u=USERNAME&p=PASSWORD

Also fill in username and password

Turn on Debug to test if data is being sent. You can find the log in Setup -> log. It will show entries like

  InfluxLink: value Temperature,idx=1,name=Huisje:-Living-room value=21.0

Save.

Now let it run for a (long) while. Then you can use the influx cli to

> show measurements
name: measurements
------------------
name
Set-point
Status
Temperature

>select * from "Set-point"

Grafana

Installation

The Grafana download page debian installation page for grafana Configuration page for grafana

apt-get install libfontconfig1 apt-transport-https

vi /etc/apt/sources.list

deb https://packages.grafana.com/oss/deb stable main

now you can install

dselect update
apt-get install grafana
systemctl daemon-reload
systemctl enable grafana-server
mv /var/lib/grafana/ /home/
ln -s /home/grafana /var/lib/grafana
systemctl start grafana-server

Verify it works by visiting

http://monitor.edgarbv.int:3000

admin / admin

change password

vi /etc/grafana/grafana.ini

;allow_sign_up = false

Now you can add a data source, which is an influxdb, with name set to Honeywell, URL set to http://db-01.edgarbv.int:8086/ and Influxdb database name, user and password filled in. You can then save and test.

NOTE the URL for data access is port 8086!

Dashboards

Getting started with Grafana guide

If you want to mass search and replace something you can copy the whole JSON model to an editor, change it and paste it back in the Dashboard Settings

https://play.grafana.org has loads of example dashboards to explore and copy

To rename your dashboard, in the settings under General you can change the name

Variables

To simplify your life you can get the keys from influxdb and use them as variables. You can then use them for repeating graphs or to put all the variables into a single graph. In order to do that in the dashboard settings you can create a new variable. Set the name to Room, type to Query. Choose the datasource and put in the query. For the honeywell evo the query is

  show tag values with key = "zone"

which will give you all the rooms / zones. Under selection options, you turn on multi-value and include all option.

To use the variables, when you create a new panel, don't choose to add a visualisation, but choose to Add Query.

Template

To show all the zones in a single graph (templated)

You can now choose the Rooms variable in the FROM statement

  FROM default zone_temp.actual WHERE zone =~ /^$Rooms$/
  SELECT field(value) last()
  GROUP BY time($__interval) tag(zone) fill(previous)
  FORMAT AS Time Series
  ALIAS BY $tag_zone

To get the labels right you need

  GROUP BY tag(zone)
  ALIAS BY $tag_zone

By clicking next to the rooms, you can then select which rooms you want to see.

Template example with influxdb

Repeated panels

When adding / editing repeated panels there are a few gotcha's

  • after an edit, save the dashboard and reload it (open a different one and go back) to see the changes
  • if you can't see any repeats, check the variable up top (eg Rooms) and make sure more than one is selected, or all is selected
  • if you select 'save current variables' during the save, you will also save your layout and time selection
  • only edit the first panel to propagate through to the rest of the panels

So create your variable (see above) For a graph of the honeywell influxdb stuff the Query is:

  FROM default zone_temp.actual WHERE zone =~ /^$Rooms$/
  SELECT field(value) last()
  GROUP BY time($__interval) tag(zone) fill(previous)
  FORMAT AS Time series
  ALIAS BY $tag_zone

Oddly enough you can't use $tag_zone as a variable for the Title in General. For this you need

  Title $Rooms Actual temp

Under repeating

  Repeat Rooms
  Direction Horizontal
  Max per row 2

To get the 2 day average temp for all rooms Query:

  FROM default zone_temp.actual WHERE zone =~ /^$Rooms$/
  SELECT field(value) mean()
  GROUP BY time($__interval) tag(zone) fill(previous)

Visualisation Singlestat:

  Stat Average
  Thresholds 21,24
  Colors blue/green/red
  Spark lines show
  Gauge show
  Gauge show threshold markers

General:

  Title $Rooms 2d Average
  Repeat Rooms
  Direction Horizontal
  Max per row 24

The current temp gauges query:

  FROM default zone_temp.actual WHERE zone =~ /^$Rooms$/
  SELECT field(value) mean()
  GROUP BY time($__interval) tag(zone) fill(previous)

Visualisation Gauge:

  Show Last
  Unit Celcius (oC)
  Gauge min value 0 / max 50 / show marker
  Thresholds red 23

General:

  Title Current temp $Rooms
  Repeat Rooms
  Direction Horizontal
  Max per row 24

Query considerations

Grafana and Influxdb

(Honeywell Evohome) Because you are using Temperatures and you don't want an average temp but the real temp shown, in the SELECT part of the query, change from mean() to last() (which is under selectors).

Because our time is not regular updates, we keep GROUP_BY at time($__interval)

In order to fill up where lines don't meet, in GROUP BY fill(previous). If you don't do this with a gauge and you are using a fixed time interval

If you want to change the name of the line in the legend, fill in ALIAS BY with the label you want to use

To show a specified time range on the dashboard (eg you are looking for a page with graphs that immediately shows the last day, week and month) you fill in all the way below the queries the Relative Time box with 1d, 7d, 4w, etc.