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.

Universellt graf görarscript

Inläggav daromer » 13 nov 2010, 01:43

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
Har temperatur.nu som hobby
 
Inlägg: 742
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Annons


Re: Universellt graf görarscript

Inläggav daromer » 13 nov 2010, 07:58

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.
daromer
Har temperatur.nu som hobby
 
Inlägg: 742
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inläggav elf98 » 13 nov 2010, 11:12

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");
        }
}
Driver temperatur.nu
Användarvisningsbild
elf98
Har temperatur.nu som hobby
 
Inlägg: 3430
Blev medlem: 27 okt 2006, 13:49
Ort: Linköping

Re: Universellt graf görarscript

Inläggav daromer » 13 nov 2010, 20:25

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.
daromer
Har temperatur.nu som hobby
 
Inlägg: 742
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inläggav CirruZZ » 14 nov 2010, 11:05

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 21 nov 2010, 13:57, redigerad totalt 1 gång.
Anledning: kod borttagen pga säkerhetslucka i den.
Projekt tråd | Blogg | Hemautomation
Rapporterar för : Ystad & Duved
Användarvisningsbild
CirruZZ
Master Moderator
 
Inlägg: 1286
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad

Re: Universellt graf görarscript

Inläggav daromer » 15 nov 2010, 05:30

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
Har temperatur.nu som hobby
 
Inlägg: 742
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inläggav daromer » 21 nov 2010, 11:27

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.
daromer
Har temperatur.nu som hobby
 
Inlägg: 742
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inläggav bertilson » 30 jan 2012, 22:40

precis detta som jag är ute efter. har du lust att dela med dig av dina script?
bertilson
Väderfreak
 
Inlägg: 70
Blev medlem: 21 dec 2009, 11:41
Ort: Borås

Re: Universellt graf görarscript

Inläggav daromer » 31 jan 2012, 14:28

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å.
daromer
Har temperatur.nu som hobby
 
Inlägg: 742
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Universellt graf görarscript

Inläggav CirruZZ » 31 jan 2012, 20:06

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.
Projekt tråd | Blogg | Hemautomation
Rapporterar för : Ystad & Duved
Användarvisningsbild
CirruZZ
Master Moderator
 
Inlägg: 1286
Blev medlem: 13 feb 2008, 16:46
Ort: Ystad


Återgå till RRDTool

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 2 gäster