Universellt graf görarscript

RRDTool är en Linuxmjukvara som kan användas för att lagra data i Round-Robin Databaser för att sedan generera grafer utifrån den lagrade datan.
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Universellt graf görarscript

Inlägg av daromer »

Jo det jag är ute efter är följande:

Jag har just nu sjukt mycke data lagrat. Och genererar just nu alla graferna via tidsintervall. Detta är ju sjyst när man ska ladda sidan och slipper vänta då bilderna redan finns. Men just nu är jag upp i nästan 500 bilder som genereras varannan minut. Detta funkar inte längre :D

Så jag är i valte och kvalet att bygga ihop ett "script" som sköter genereringen åt mig baserat på ett visst antal variabler.

Innan jag gör detta tänkte jag se om någon annan vänlig själ satt på dylikt? Och som vill dela med sig.

För att krångla till det är jag egentligen ute efter ett som klarar av hantera flera rrds till en och samma bild. Och gärna med dubbla axlar :)

Aja. börjar väl lite så smått att koda på det ikväll om inte annat :)
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inlägg av daromer »

Klarar väl att göra enklare grafer nu ivf. Ska klura på hur jag gör för att generera flera på samma från olika rrds med.
Användarvisningsbild
elf98
Hemautomation - det är mer än en hobby
Inlägg: 5434
Blev medlem: 27 okt 2006, 13:49
Ort: Linköping
Kontakt:

Re: Universellt graf görarscript

Inlägg av elf98 »

Jag skapar några grafer dynamsikt på temperatur.nu.. :)

Så här ser graffunktionen ut för api-funktionen (php), visserligen endast från en db i taget, men det bör inte vara särskilt svårt att modda så det går att hämta från fler.

Kod: Markera allt

function create_graph($stad,$id,$span,$x,$y,$rrd,$verbose,$shift,$oneaxis) {
        $ctime = filectime("/home/httpd/termo/graph/$stad-$span-$x-$y-$verbose-$shift-$oneaxis.png");
        echo "ctime:$ctime:/home/httpd/termo/graph/$stad-$span-$x-$y-$verbose-$shift-$oneaxis.png";
        if ($ctime > 0) {
                echo "G exists";
                $age = time() - $ctime;
        } else
                $age = 900;
        if ($age > 300) {
                if ($span == "1day"){
                        if ($shift == 0)
                                $span_swe="idag";
                        elseif ($shift == 1)
                                $span_swe="I går";
                        else
                                $span_swe=date("Y-m-d",time()-($shift+1)*24*60*60)." - ".date("Y-m-d",time()-$shift*24*60*60);
                        $graph_shift="day";
                }elseif ($span == "1week"){
                        if ($shift == 0)
                        $span_swe="1 vecka";
                        elseif ($shift == 1)
                                $span_swe="förra veckan";
                        else
                                $span_swe=date("Y-m-d",time()-($shift+1)*7*24*60*60)." - ".date("Y-m-d",time()-$shift*7*24*60*60);
                        $graph_shift="week";
                }elseif ($span == "1month") {
                                $span_swe=date("Y-m-d",strtotime("-".($shift+1)." month"))." - ".date("Y-m-d",strtotime("-".($shift). "month"));
                        $graph_shift= "month";
                }elseif ($span == "1year"){
                         $span_swe=date("Y-m-d",strtotime("-".($shift+1)." year"))." - ".date("Y-m-d",strtotime("-".($shift). "year"));
                         $graph_shift= "year";
                }
                if ($x < 250 && strlen($stad)>11)
                        $stad= substr($stad,0,8) . "...";
                elseif ($x < 300 && strlen($stad)>18)
                        $stad= substr($stad,0,15) . "...";
                $rrd ="/special/termo/rrdb/$rrd";
                                $handle = popen("rrdtool last $rrd", "r");
                                $tid = fgets($handle);
                                pclose($handle);
                                date_default_timezone_set('Europe/Stockholm');
                                $lu =date("H:i Y-m-d",$tid);
                                $lu2 = str_replace(":", "\\:",$lu);
                 if ($verbose == 1) {
                        $v_def = "DEF:min=$rrd:ute:MIN DEF:max=$rrd:ute:MAX";
                        $v_comment ="COMMENT:\" Min      Max      Medel    Senast\\c\" GPRINT:min:MIN:\"%5.1lf°C\" GPRINT:max:MAX:\"%5.1lf°C\" GPRINT:ute:AVERAGE:\"%5.1lf°C\" GPRINT:ute:LAST:\"%5.1lf°C\\c\"  COMMENT:\"Senaste data\\: $lu2\\c\"";
                 } else
                        $v_def=$v_comment="";
                 $cmd = "/usr/bin/rrdtool graph '/home/httpd/termo/graph/$id-$span-$x-$y-$verbose-$shift-$oneaxis.png'  --imgformat PNG --start -".($shift+1)."$graph_shift --end ".($shift?"-".$shift.$graph_shift:"now")." --width ".($oneaxis?($x-79):($x - 97))." --height ".($verbose?$y-107:$y - 65)." -v 'www.temperatur.nu' -L 3 -u 5 -l -5 -E -t '$stad $span_swe' ".($oneaxis?"":"--yaxis-side=3")." DEF:ute=$rrd:ute:AVERAGE $v_def  HRULE:0#0000FF LINE1:ute#FF0000 $v_comment";
        #       echo $cmd;
        passthru("export LANG=\"sv_SE\" && $cmd >/dev/null");
        }
}
Grundade m.nu & temperatur.nu

Driver temperatur.nu

Bild
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inlägg av daromer »

Nice. Tack Elf!

Ska se hur långt jag kommer inatt. Ska försöka få till lite fler funktioner för den. Bla Visa flera i samma. Återkommer under natten.
Användarvisningsbild
CirruZZ
Master Moderator
Inlägg: 1621
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad

Re: Universellt graf görarscript

Inlägg av CirruZZ »

Jag har gjort ett också. Precis som du så kändes det "onödigt" att generera grafer 24h om dygnet som aldrig kollas. Nu har jag inte varit på gränsen att det skulle påverka prestandan på något sätt, utan för min del är det snarare principiella skäl :wink:

Jag har valt att göra mitt i PHP. Principen är att man via URL'en väljer vilken graf man vill se, tids ramar, lite annat kan väljas också, å sen så kommer en bild fil tillbaka. Jag har inte skrivit massa funktioner för alla sorters delar i grafen man skulle kunna tänka sig, utan jag konfigurerar graferna med hjälp av arrayer, där man då kan lägga till oändligt antal rader, ganska rättfram kan man säga. Jag ska vara ärlig och säga att jag sneglat en hel del på serverstas lösning, och jag har även kört serverstats, men det är lite för oflexibelt för min smak, jag vill kunna pilla i detalj exakt hur jag vill ha min a grafer. Lösning blev att göra en egen "graf-motor", inspirerad av serverstats

Då vi är flera som sitter på våra kamrar och knackar funktioner för att lösa samma uppgift, kanske vi skulle fundera på att gör något gemensamt, något som vi alla kan använda, och hjälpas åt att få bra?

Som vanligt, koden nedan är inte kommenterad eller snyggt gjord, men ni kan se vad jag har pillat med.

Kod: Markera allt

Koden bort plockad pga en stor säkerhetslucka.
Senast redigerad av CirruZZ den 21 nov 2010, 13:57, redigerad totalt 1 gånger.
Anledning: kod borttagen pga säkerhetslucka i den.
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inlägg av daromer »

Så här ser det ut just nu:

https://luno.mine.nu/temp2/draw_one.php ... emp:ack1_2

Ett exempel ivf. Dock långt ifrån nöjd med skiten. tar nog ett par timmar till. Men det börjar ju ta sig ivf.
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inlägg av daromer »

OBS! Jag mekar med denna filen under tiden så den funkar inte alltid ;)

Har fått ihop den hyffsad nu ivf. Inte mycke till felhantering än men den klarar följande parametrar:

rrd=namnet på rrd1. (Utan .rrd)
ds=ds på rrd2
w = bredden
h=höjden
start=starttiden baserat på now- dsv xx tid tillbaka. (Kommer funktion som ska ta hand om och hantera hela datum snart)
end= sluttiden på samma sät som start
range=tiden från start och frammåt. kan vara bekvämt. Och använder man denna slås end ut.
compare=om man vill jämföra samma tidsspann som tidigare. sätter man denna till 1
name1= om man vill ha flera rrds. i formatet (rrd1:ds1,rrd2:ds2) Används denna slås compare ut t ex.

Nu är det lite problem med småsaker som att compare måste ha startvärdet i sekunder men annars funkar det.

Exempellänk:
https://luno.mine.nu/temp2/draw_one.php ... tart=86400
Senaste dagens temperatur på en av acktankarna jämfört med samma period innan.

Tempen på samma sensor 3 dagar tillbaka och 24h frammåt på 2 olika sätt:
https://luno.mine.nu/temp2/draw_one.php ... =3d&end=2d
och:
https://luno.mine.nu/temp2/draw_one.php ... d&range=1d

Temperaturen på 3 sensorer på en och samma tank:
https://luno.mine.nu/temp2/draw_one.php ... emp:ack1_3

Återkommer med mer senare.
Användarvisningsbild
bertilson
Tar hemautomation på allvar
Inlägg: 133
Blev medlem: 21 dec 2009, 11:41
Ort: Borås

Re: Universellt graf görarscript

Inlägg av bertilson »

precis detta som jag är ute efter. har du lust att dela med dig av dina script?
daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inlägg av daromer »

Oj det var ett tag sedan jag gjorde denna. Måste nog se över koden innan jag ger ut den. Det är mycke statiskt kvar i den som inte är fixat men ge mig ett par dagar eller en vecka så.
Användarvisningsbild
CirruZZ
Master Moderator
Inlägg: 1621
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad

Re: Universellt graf görarscript

Inlägg av CirruZZ »

Jag skriver som jag skrev ovan, vi skulle slå våra kloka ihop :wink: och göra något tillsammans. Jag har för övrigt inte vidareutvecklat mitt script på senaste tiden i någon större utsträckning.
Skriv svar