[rrd-users] Question about averaging daily ; but with 5 min. steps

Jean-Yves Avenard jyavenard at gmail.com
Mon Dec 14 12:11:23 CET 2009


Hi

Putting the final touch to my energy monitoring.

I have pretty much everything up and running as it should ; except for
one type of calculation.

the aim of my calculations is to monitor how much energy I output to
the electricity grid via solar panels.

The calculation is done as a *net* feed ; you receive a discount from
the electrical company for any electricity you output ; with a
premium.

The calculation is made over 5 minutes average.

I have two RRD files ; one containing my power usage ; stored as GAUGE
; as watts . As we get charge in Watt/Hour (Wh) I perform the
calculation using CDEF to transform watts over time into Wh.

The 2nd one is for the solar output, this one is a DERIVE counter of a
Wh value reported by the solar inverter that converts DC to AC.

To calculate what the feed-in value is, I use a RPN calculation in a CDEF..

I create the graph using:

$res = resolution
$timestamp = end period
$start = begin period
$duration = $timestamp - $start

$timestamp and $start are always multiple of $res.

$RRDTOOL graph $name -l 0 \
-t '$title' \
-x $legend  --slope-mode \
--step $res --start $start --end $timestamp \
-w $width -h $height \
DEF:total=currentcost3.rrd:total:AVERAGE \
DEF:total30=currentcost3.rrd:total:AVERAGE:step=300 \
DEF:solar=solarprod3.rrd:total:AVERAGE \
DEF:solar30=solarprod3.rrd:total:AVERAGE:step=300 \
    CDEF:totalw=total,3600,/ CDEF:total30w=total30,3600,/ \
    CDEF:ctotal=totalw,$res,* \
    CDEF:ctotal30=total30w,$res,* \
    CDEF:ctotaltot=total30w,UN,0,total30w,IF,$duration,* \
    CDEF:csolar=solar,$res,* \
    CDEF:csolar30=solar30,$res,* \
    CDEF:csolartot=solar30,UN,0,solar30,IF,$duration,* \
    CDEF:cimport=csolar,UN,0,csolar,IF,ctotal,-,0,MIN \
    CDEF:cimport2=cimport,ABS \
    CDEF:cimport30=ctotal30,csolar30,UN,0,csolar30,IF,-,0,MAX \
    CDEF:cimporttot=total30w,UN,0,total30w,IF,solar30,UN,0,solar30,IF,-,0,MAX,$duration,*
\
    CDEF:cexport=ctotal,csolar,UN,0,csolar,IF,-,0,MIN \
    CDEF:cexport2=cexport,ABS \
    CDEF:cexport30=csolar30,UN,0,csolar30,IF,ctotal30,-,0,MAX \
    CDEF:cexporttot=solar30,UN,0,solar30,IF,total30w,UN,0,total30w,IF,-,0,MAX,$duration,*
\
    VDEF:vtotalmax=ctotal,MAXIMUM \
    VDEF:vtotalavg=ctotal,AVERAGE \
    VDEF:vtotalmin=ctotal,MINIMUM \
    VDEF:vtotaltot=ctotaltot,AVERAGE \
    VDEF:vsolarmax=csolar,MAXIMUM \
    VDEF:vsolaravg=csolar,AVERAGE \
    VDEF:vsolarmin=csolar,MINIMUM \
    VDEF:vsolartot=csolartot,AVERAGE \
    VDEF:vimportmax=cimport2,MAXIMUM \
    VDEF:vimportavg=cimport30,AVERAGE \
    VDEF:vimportmin=cimport2,MINIMUM \
    VDEF:vimporttot=cimporttot,AVERAGE \
    VDEF:vexportmax=cexport2,MAXIMUM \
    VDEF:vexportavg=cexport30,AVERAGE \
    VDEF:vexportmin=cexport2,MINIMUM \
    VDEF:vexporttot=cexporttot,AVERAGE \
 COMMENT:'            ' \
 COMMENT:'Maximum    ' \
    COMMENT:'Average    ' \
    COMMENT:'Minimum    '  \
    COMMENT:'Total View\l'  \
    AREA:ctotal#ff4500:'Total   ' \
    GPRINT:vtotalmax:'%6.1lf %sWh ' \
    GPRINT:vtotalavg:'%6.1lf %sWh ' \
    GPRINT:vtotalmin:'%6.1lf %sWh  ' \
    GPRINT:vtotaltot:'%7.2lf %sWh\l' \
    AREA:csolar#FFd700a0:'Solar   ' \
    GPRINT:vsolarmax:'%6.1lf %sWh ' \
    GPRINT:vsolaravg:'%6.1lf %sWh ' \
    GPRINT:vsolarmin:'%6.1lf %sWh  ' \
    GPRINT:vsolartot:'%7.2lf %sWh\l' \
    COMMENT:'-----------------------------------------------------------------\l'
\
    AREA:cimport#ff4500:'Import  ' \
    GPRINT:vimportmax:'%6.1lf %sWh ' \
    GPRINT:vimportavg:'%6.1lf %sWh ' \
    GPRINT:vimportmin:'%6.1lf %sWh  ' \
    GPRINT:vimporttot:'%7.2lf %sWh\l' \
    AREA:cexport#FFd700a0:'Export  ' \
    GPRINT:vexportmax:'%6.1lf %sWh ' \
    GPRINT:vexportavg:'%6.1lf %sWh ' \
    GPRINT:vexportmin:'%6.1lf %sWh  ' \
    GPRINT:vexporttot:'%7.2lf %sWh\l' \
> /dev/null", $output2, $status2);

The basic calculation is pretty much:
CDEF:cexport=ctotal,csolar,-,0,MAX

so the value is discarded if negative (at those time, I import power)
and kept if positive.

It works well if I'm showing a daily view with 5 minutes average...

However, what I would like, is draw/print of a daily average ; but all
internal calculations are done still using 5 minutes average...
I can do this for calculating the average displayed and the total kWh
; but for the graph, maximum and minimum values ; those aren't daily.

Is this something possible?

The issue with daily average is that with res = 86400 ; as long as my
overal usage is more than what my solar panels output (and that will
always be the case) , the amount exported will always show as 0...

Thanks in advance for your help
Jean-Yves



More information about the rrd-users mailing list