Graf med två y-axlar med RRDTool

Hur gör man för att ... ? Hur fungerar ... ? Steg för steg-guider och förklarande artiklar finns i detta forum.
Många guider finner också på vår blogg: https://blog.m.nu/
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
gein
Tar hemautomation på allvar
Inlägg: 225
Blev medlem: 25 feb 2009, 23:21
Ort: Uppsala

Graf med två y-axlar med RRDTool

Inlägg av gein »

Jag hade ett behov att skaffa en graf med två y-axlar, en för temperatur (°C) och en för golvvärmeaktivitet (0-100%). Detta kan fungera som lite hjälp för den som vill göra liknande sak, även om det inte just är temperatur/golvvärme som man vill plotta.

Först och främst, resultatet (klicka på bilden för att få upp hela bilden):
bedroom3.png
För att åstadkomma detta används flaggan --right-axis och --right-axis-label. Men för att få detta snyggt behöver man även räkna om en av linjerna så att den matchar den andra linjens skala. För att göra det lite enklare för mig har jag i följande skript fördefinierat den övre och undre temperaturgränsen (29 resp. 14°C).

Mitt skript förutsätter även ett par saker. T.ex. att man matar inte två argument, det första med namnet på rummet (kommer till det strax) och det andra argumentet är namnet på grafen. I mitt fall kan det se ut så här:
./room.sh bedroom3 "Lovisas rum"

Namnet på rummet fyller två syften, att hitta rätt rrd-fil samt att välja rätt datasource inom databasen. Mina temperaturfiler heter nämligen t_[rumsnamn].rrd och värmefilerna heter h_[rumsnamn].rrd. T.ex. t_bedroom3.rrd och h_bedroom3.rrd. Dessa innehåller alltid bara en datasource vars namn är samma som rumsnamnet. Nåväl, nog om det. Men det kan vara bra att känna till så att man lättare vet vad man ska ändra i filen.

Här kommer skriptet:

Kod: Markera allt

#!/bin/bash

# EDIT THESE VARIABLES

# Define these two minimum and maximum y-axis values as you see fit.
UPPERLIMIT=29
LOWERLIMIT=14
PATH_TO_RRDS=/home/pakerfeldt/rrd
OUTPUT_PATH=/var/www/graphs

if [ -z "$1" ]; then
    echo "Supply room name as first argument"
    exit 1
fi
if [ -z "$2" ]; then
    echo "Supply graph name as second argument"
    exit 1
fi

# These two are used to go from 0-100% scale (heat) to the temperature scale defined
# by the upper and lower limit
let SHIFT_LEFT=$LOWERLIMIT
SCALE_LEFT=$(printf '%3.3f\n' $(echo "scale=3; ($UPPERLIMIT-$LOWERLIMIT)/100" | bc -l))

# These two are used to go from lower and upper limit to 0-100% (right axis)
SCALE_RIGHT=$(printf '%3.3f\n' $(echo "scale=3; 100/15" | bc -l))
SHIFT_RIGHT=$(printf '%3.3f\n' $(echo "scale=3; ($SCALE_RIGHT*$UPPERLIMIT)-100" | bc -l))

rrdtool graph $OUTPUT_PATH/$1.png \
--height=480 --width=800 \
--color=BACK#FFFFFF \
--start end-1d --vertical-label "Temperatur (°C)"  --title "$2" \
--upper-limit $UPPERLIMIT --lower-limit $LOWERLIMIT --rigid \
--right-axis $SCALE_RIGHT:-$SHIFT_RIGHT --right-axis-label="Värme (%)" \
DEF:temperature=$PATH_TO_RRDS/t_$1.rrd:$1:AVERAGE \
DEF:tempmax=$PATH_TO_RRDS/t_$1.rrd:$1:MAX \
DEF:heating=$PATH_TO_RRDS/h_$1.rrd:$1:AVERAGE \
CDEF:heatings=heating,$SCALE_LEFT,*,$SHIFT_LEFT,+ \
LINE2:temperature#9FEE00:"Temperatur\t" \
GPRINT:temperature:LAST:"Nu\: %6.1lf°C\t" \
GPRINT:temperature:AVERAGE:"Medel\: %6.1lf°C\t" \
GPRINT:temperature:MAX:"Max\: %6.1lf°C\t" \
GPRINT:temperature:MIN:"Min\: %6.1lf°C\\n" \
\
LINE2:heatings#FF0000:"Värme\t\t" \
GPRINT:heating:LAST:"Nu\: %6.0lf %%\t" \
GPRINT:heating:AVERAGE:"Medel\: %6.0lf %%\t" \
GPRINT:heating:MAX:"Max\: %6.0lf %%\t" \
GPRINT:heating:MIN:"Min\: %6.0lf %%\\n"