This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

rrdtool problem
#1
Hi,

As it is not possible to have a graph with more than one variable, I decided to make my own graphs with rrdtool.
At first I was going to use another server that would collect data with remote xlm service, create the graph, put it on a webpage and display that graph in an iframe in LM.

I had progressed up to the point of moving the graph to the web server when it occurred to me that the rrdtool package is available in LM![Image: rolleyes.png]
The new plan was then to create an rrd archive in LM, put the graph in the img directory and then use that image in my visualisation.

What I did (this is in LM4 firmware 20160714):
-create a directory /data/storage/rrd
-create a rrd archive as follows:

Code:
create_rrd = "rrdtool create /data/storage/rrd/ventilatie.rrd --start N --step 300" ..
" DS:T_intake:GAUGE:600:-20:50" ..
" DS:T_supply:GAUGE:600:-20:50" ..
" DS:T_discharge:GAUGE:600:-20:50" ..
" DS:T_exhaust:GAUGE:600:-20:50" ..
" RRA:MIN:0.5:12:1440" ..
" RRA:MAX:0.5:12:1440" ..
" RRA:AVERAGE:0.5:1:1440"
result = os.execute(create_rrd)

-update the rrd with data:

Code:
-- get data
T_intake = grp.getvalue('4/1/11')
T_supply = grp.getvalue('4/1/12')
T_discharge = grp.getvalue('4/1/14')
T_exhaust = grp.getvalue('4/1/13')
log(T_intake ..":" ..T_supply..":" ..T_discharge..":" ..T_exhaust)
rrdupdate = "rrdtool update /data/storage/rrd/ventilatie.rrd N:" ..T_intake ..":" ..T_supply ..":" ..T_discharge ..":" ..T_exhaust
result = io.readproc(rrdupdate)
-verify that data was being written with rrdtool first and rrdtool last

All this went well. I then wanted to create a graph as follows:

Code:
rrdgraph = "rrdtool  graph /data/storage/img/ventilatie.png DEF:T_i=/data/storage/rrd/ventilatie.rrd:T_intake:AVERAGE LINE1:T_i#ff0000:Invoer"
log(rrdgraph)
result = os.execute(rrdgraph)

This fails, with the os.execute statement returning 256. Obviously no graph is created.
The manual states that the return code of os.execute is system dependent. I have no idea what values to expect on LM...
On the other machine this worked without any problems. The only difference is the version of rrdtool: on LM this is 1.4.7 whereas on the other machine it is 1.6

What is going wrong here?

Thanks.
Reply
#2
The built-in RRDtool does not have the graph option, it can only be used to store/retrieve data.
Reply
#3
OK, mystery solved... [Image: smile.png]

Back to the original plan then, unless there is a more elegant solution?

Thanks.
Reply
#4
Hi
I don't know if it solves your problem but you can usemultiple trends. Below is my example of 1hr averages of brightness from 4 directions + max value.

Attached Files Thumbnail(s)
   
LM5Lp, firmware: 2018.08.22 and 2021.12.15, FlashSYS v2, ARMv7 Processor rev 5 (v7l), kernel 4.4.151 and 4.4.259
Reply
#5
I did look at the multiple trends possibility, but I saw two problems with them:

1)unless I am mistaken, the moment you choose to have a multiple trend for a number of variables, you can't look at other trends in single mode anymore, unless you undo the multiple trend
2) minimum resolution is 5 min which is too long if you want to monitor some potentially fast changing variable (spikes in cpu load for example).
Reply
#6
Hi,

For those who might be interested to get these multi-valued graphs in their visualization, this is what I ended up doing:

-mark the objects to be used as 'export'.
-the second step involves another server that runs 24x7, otherwise the graphs will be incomplete... I used a powerful machine that I use for backups, Logitech Media Server, zoneminder, etc. I believe that a simple raspberry should do the trick also.
-create rrd archive (see original post).
-schedule a script that runs every x minutes. My script fetches the data, updates the rrd, creates the graph and moves it to the DocumentRoot of the webserver.

This is the script (note that this is quite a basic script with no error checking etc...


Code:
require('socket.http')
socket.http.TIMEOUT = 15

-- get data
local LM_data = socket.http.request('http://remote:remote@<ip_of_LM>/scada-remote?m=xml&r=objects')

if not LM_data then
 log('Data cannot be fetched.')
 return
end
for i in string.gmatch(LM_data, '<object.-</object>') do
 if i ~= nil then
     address =  i:match([[<address>(.-)</address>]])
     data =  i:match([[<data>(.-)</data>]])
     if address == '4/1/11' then
         T_intake = data
     end
     if address == '4/1/12' then
         T_supply = data
     end
     if address == '4/1/14' then
         T_discharge = data
     end
     if address == '4/1/13' then
         T_exhaust = data
     end
 end
end

-- update rrd
rrdupdate = "rrdtool update <path_to>/ventilatie.rrd N:" ..T_intake ..":" ..T_supply ..":" ..T_discharge ..":" ..T_exhaust

result = os.execute(rrdupdate)

--create graph
rrdgraph = "rrdtool graph <path_to>/ventilatie.png -a PNG --title='Ventilatie °C' --slope-mode " ..
" DEF:T_i=<path_to>/ventilatie.rrd:T_intake:AVERAGE " ..
" DEF:T_s=<path_to>/ventilatie.rrd:T_supply:AVERAGE " ..
" DEF:T_d=<path_to>/ventilatie.rrd:T_discharge:AVERAGE " ..
" DEF:T_e=<path_to>/ventilatie.rrd:T_exhaust:AVERAGE " ..
" --width 640" ..
" --height 240" ..
" --full-size-mode" ..
" --color BACK#243d47" ..
" --color CANVAS#243d47" ..
" --color FRAME#243d47" ..
" --color FONT#ffffff" ..
" --color AXIS#515d62" ..
" --color GRID#515d62" ..
" --color MGRID#515d62" ..
" --font TITLE:13:Arial" ..
" --font AXIS:10:Arial" ..
" --font LEGEND:9:Arial" ..
" --grid-dash 1:0" ..
" --border 0" ..
" --y-grid 10:1" ..
" LINE1:T_i#ff0000:' Invoer'" ..
" LINE1:T_s#0400ff:' Toevoer'" ..
" LINE1:T_d#aaff00:' Afvoer'" ..
" LINE1:T_e#35b73d:' Uitvoer'"

result = os.execute(rrdgraph)

-- move graph to web server
result = os.execute("sudo mv <path_to>/ventialtie.png /var/www/html/ventilatie")

Attached is the result.

Attached Files Thumbnail(s)
   
Reply
#7
Hi
I like your symbols at the picture. Is it your work? Or can it be freely downloaded from somewhere?
LM5Lp, firmware: 2018.08.22 and 2021.12.15, FlashSYS v2, ARMv7 Processor rev 5 (v7l), kernel 4.4.151 and 4.4.259
Reply
#8
These icons come from the KNX-userforum iconset.

You can find info on:

KNX iconset
Reply


Forum Jump: