Portál AbcLinuxu, 12. května 2025 12:35
Zdravim,
poprosil bych vas o pomoc. K routru mam pripojena 2 teplotni cidla a pokousim se merit teplotu kterou ukladam rrdtoolem a nasledne vykresluju grafy denni tydeni mesicni rocni. Pokousel jsem se studovat rrdtool ale porad se v nem moc neorientuji. Problem mam nyni v tom ze minimalni a maximalni hodnoty napric grafama nekoresponduji napr. rocni ma daleko mensi maximalni teplotu i vykresleni nez mesicni ci tydeni graf. Prosim vidite nekde chybu?
#!/opt/bin/perl
my $rrd = '/opt/var/databaze/teplota';
&ProcessSensor(0, "router");
&ProcessSensor(1, "venku");
# kreslime grafy
&CreateGraph("", "hour", "Posledni hodina","SECOND:60:MINUTE:10:MINUTE:5:0:%H:%M","");
&CreateGraph("", "day", "Denni","MINUTE:30:HOUR:1:HOUR:1:0:%Hh","");
&CreateGraph("", "week", "Tydenni","HOUR:6:DAY:1:DAY:1:0:%A","");
&CreateGraph("", "month", "Mesicni","DAY:1:WEEK:1:WEEK:1:0:%d.%m.%Y","");
&CreateGraph("", "year", "Rocni","MONTH:1:MONTH:1:MONTH:1:0:%B","");
sub ProcessSensor
{
# process sensor
# inputs: $_[0]: cislo cidla (ie, 0/1/2/)
# $_[1]: popis cidla
my $temp = `/opt/bin/digitemp_DS9097 -t $_[0] -q -c /opt/etc/teplomer/digitemp.conf -o%C`;
RRDs::create "$rrd/temp$_[0].rrd",
"-s 300",
"DS:temp:GAUGE:600:U:U",
"RRA:AVERAGE:0.5:1:2016",
"RRA:MIN:0.5:1:2016",
"RRA:MAX:0.5:1:2016",
"RRA:AVERAGE:0.5:6:1344",
"RRA:MIN:0.5:6:1344",
"RRA:MAX:0.5:6:1344",
"RRA:AVERAGE:0.5:24:2190",
"RRA:MIN:0.5:24:2190",
"RRA:MAX:0.5:24:2190",
"RRA:AVERAGE:0.5:144:3650",
"RRA:MIN:0.5:144:3650",
"RRA:MAX:0.5:144:3650";
}
#}
sub CreateGraph
{
# creates graph
# inputs: $_[0]: cislo cidla (ie, 0/1/2/etc)
# $_[1]: interval (ie, day, week, month, year)
# $_[2]: popis cidla
RRDs::graph "$img/temp-$_[1].png",
"-s -1$_[1]",
"-t Graf: $_[2]",
"-x","$_[3]",
# "--lazy",
"-h", "333", "-w", "747",
"-a", "PNG",
"-v stupne Celsia",
"--slope-mode",
"DEF:temp0=$rrd/temp0.rrd:temp:AVERAGE",
"DEF:temp1=$rrd/temp1.rrd:temp:AVERAGE",
"DEF:min0=$rrd/temp0.rrd:temp:MIN",
"DEF:max0=$rrd/temp0.rrd:temp:MAX",
"COMMENT: cidlo\\: maximalni minimalni prumerna aktualni\\l",
"LINE2:temp0#0000FF:venku\\: ",
"GPRINT:temp0:MAX:%2.1lf°C ",
"GPRINT:temp0:MIN:%2.1lf°C ",
"GPRINT:temp0:AVERAGE:%2.1lf°C ",
"GPRINT:temp0:LAST:%2.1lf°C\\l",
"LINE2:temp1#008A00:vnitrni\\: ",
"GPRINT:temp1:MAX:%2.1lf°C ",
"GPRINT:temp1:MIN:%2.1lf°C ",
"GPRINT:temp1:AVERAGE:%2.1lf°C ",
"GPRINT:temp1:LAST:%2.1lf°C \\l",
"COMMENT: \\r",
};
Dekuji za kazdou radu
To je tým, že v grafe vykresľuješ len temp0 a temp1, čo máš zadefinované ako priemer. Keď sa vykresľuje obdobie, ktoré presahuje rozsah najpodrobnejšej databázy (RRA:AVERAGE:0.5:1:2016), použije sa najbližšia ďalšia databáza (RRA:AVERAGE:0.5:6:1344), kde sú jednotlivé hodnoty už priemerom zo 6 pôvodných hodnôt. Ak chceš minimum a maximum, tak vykresľuj aj tie min0 a max0, čo si si tam definoval - tie by mali obsahovať nie priemer za 6 hodnôt, ale minimum a maximum za 6 hodnôt.
dekuji za radu myslis tedy takto?
"DEF:temp0=$rrd/temp0.rrd:temp:AVERAGE",
"DEF:temp1=$rrd/temp1.rrd:temp:AVERAGE",
"DEF:min0=$rrd/temp0.rrd:temp:MIN",
"DEF:max0=$rrd/temp0.rrd:temp:MAX",
"DEF:min1=$rrd/temp1.rrd:temp:MIN",
"DEF:max1=$rrd/temp1.rrd:temp:MAX",
"COMMENT: cidlo\\: maximalni minimalni prumerna aktualni\\l",
"LINE2:temp0#0000FF:venku\\: ",
"GPRINT:max0:MAX:%2.1lf°C ",
"GPRINT:min0:MIN:%2.1lf°C ",
"GPRINT:temp0:AVERAGE:%2.1lf°C ",
"GPRINT:temp0:LAST:%2.1lf°C\\l",
"LINE2:temp1#008A00:vnitrni\\: ",
"GPRINT:max1:MAX:%2.1lf°C ",
"GPRINT:max1:MIN:%2.1lf°C ",
"GPRINT:temp1:AVERAGE:%2.1lf°C ",
"GPRINT:temp1:LAST:%2.1lf°C \\l",
"COMMENT: \\r",
jj, tak... len tam ku koncu máš preklep - máš tam 2x max1
jojo
bohuzel ale vyzkousel jsem to ale asi tam bude jeste nejaka chybka:(
nyni to taky nesedi a navic nesedi ani hodnoty v jednom obrazku s krivkou (min max)
dekuju
Skús sem hodiť obrázok, aby som mal predstavu ako to nesedí :) ... no a s krivkou to nesedí, lebo krivku si dal zobraziť len z priemernej hodnoty - to by si musel zobraziť aj krivku maxima a minima a to by asi nebolo veľmi prehľadné...
Aha asi mas pravdu :)
Ovsem lze nejakym zpusobem udelat aby v jedne krivce byl aktualni prubeh jak s minimem tak i s maximem - proste realny prubeh?(ono se spise jedne o graf rocni a mesicni kde je to zkresleni videt nejvice)
Prikladam obrazky
To je presne to - RRD kreslí krivku tak, že v každom bode tej krivky je jedna hodnota. Keďže sa Ti ten tretí graf (month) rozsahom nezmestí do najpodrobnejšieho RRA (rozlíšenie 5 minút), tak sa berie ten ďalší RRA v poradí a tam je každá jedna hodnota už skladaná zo 6-tich (rozlíšenie 30 minút). Takže jeden bod grafu by mal obsahovať aspoň 2 hodnoty - min a max z tých 6. Na to by si potreboval niečo na spôsob candlestick grafu, ale to RRD nekreslí. Takže keď chceš v grafe vykreslené naozajstné minimum a maximum aj v rozlíšení väčšom než 5 minút, tak Ti asi nič neostáva, len ich tam obe vykresliť ako 2 rôzne krivky.
Ok diky moc - takze ani uprava struktury databaze by nepomohlka?
diky
up :)
Chcem sa na to ešte pozrieť, ale najskôr asi až v nedeľu. Zatiaľ k tomu neviem nič viac povedať.
to nevadi budu rad za kazdy poznatek.
dekuju
Aoj AraxoNe nahodou nekoukal se na to jeste?
diky
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.