JpGraph -käyrien teko

Aloittaja meteorologi, maanantai, 05.05.2008, 19:58

« edellinen - seuraava »

0 Jäsenet ja 1 Vieras katselee tätä aihetta.

meteorologi

No, liittyipä juvalainen säämestarikin sitten näihin "sääpiireihin". Heh, heh!

Tiedoksi kaikille:
kotikoneella on nyt vain tämä sääasemahommeli, tarkoitus olisi hankkia ihan palvelinkin.


Asiasta kolmanteen...

Testailen vähän PHP-skriptejä testipalvelimella. Nyt tuli uusi testailun aihe: JpGraph -PHPkäyrästöjen tekokirjasto.

WUHU-ohjelmaa pyörittelen ja tarkoitus olisikin saada JpGraph lukemaan tuo currdat.lst -tiedosto ja tehdä siitä käyriä. Olisiko kellään kokemusta?

Ainakin WeatherDisplay-miehet jotenkin luetuttavat JpGraphillä clientraw.txt -tiedostot ja teetyttävät vielä käyrätkin...



J.Jäntti

Lainaus käyttäjältä: Meteorologi - maanantai, 05.05.2008, 19:58
No, liittyipä juvalainen säämestarikin sitten näihin "sääpiireihin". Heh, heh!

Lämpimästi tervetuloa joukkoon! Uskon, että viihdyt täällä :)

Lainaus käyttäjältä: Meteorologi - maanantai, 05.05.2008, 19:58
WUHU-ohjelmaa pyörittelen ja tarkoitus olisikin saada JpGraph lukemaan tuo currdat.lst -tiedosto ja tehdä siitä käyriä. Olisiko kellään kokemusta?

Ainakin WeatherDisplay-miehet jotenkin luetuttavat JpGraphillä clientraw.txt -tiedostot ja teetyttävät vielä käyrätkin...

Olen tullut tuota kerran-pari katsoneeksi, ajatuksena saada nypittyä mittaustietoja jonkinmoiseen käppyrään, mutta homma kuivui lopulta kasaan, osittain siitä syystä, että nykyinen sivusto oli vielä silloin rakentelun alla ja aika oli loppumassa kesken ja pääsääntöisesti siitä syystä, että allekirjoittaneelta loppui ymmärryskyky siihen, miten saisi edes pohjiakaan noita käppyröitä varten rakennettua; mikään PHP-mestari kun en ole.

Mitä tulee currdat.lst -tiedoston lukemiseen, niin omat skriptini lukevat rivinumeroita käyttäen tuota dataa. Tiedän, että jossain päin nettiä pyörii sellaisia versioitakin, jotka osaavat lukea tiedot rivinimen perusteella, jolloin datan ulosajo HTML-koodin sekaan pysyy vahingoittumattomana, jos WUHU:ssa tapahtuu currdat.lst -tiedoston sisällössä muutoksia, kuten viimeisimmässä WUHU:n Beta-versiossa (Beta 40), jonne taisi tulla taas rivi-kaksi lisää. Siksi jättäydyn toistaiseksi Beta 39:n käyttäjäksi, kunnes saan testattua tuon uuden version vaikutuksen säätietojen julkistamiseen.

Jotta niitä käppyröiden tarvitsemia arvoja voisi luetuttaa, olin ymmärtävinäni, että jonkinlainen MySQL-kanta pitäisi olla koneessa raksuttamassa, jotta käppyrää saadaan tuotettua. Tämähän tietenkin tarkoittaisi sitä, että jokin skripti tai muu vastaava automatiikka lisäilisi kantaankin noita tietoja.

Tiettävästi Weather Displayta käyttävät tahot ovat sikäli onnellisessa asemassa, että heidän softansa tekee clientraw.txt -tiedostosta useampia variantteja, joista clientraw.txt -tiedosto sisältää suorassa putkessa kaiken olennaisen tiedon säästä ja muutaman "tuntihistoria"-tiedon. Clientrawhourly.txt -tiedosto taas ilmeisimmin kerää statistiikkaa isommalla (minuutti?) resoluutiolla dataa. Tuo on se, johon WUHU ei vielä ainakaan kykene. Se, miten Weather Display:n käyttäjät saavat tuon JPGraph:n toimimaan käppyröiden teossa on minulle täysi mysteeri. On mahdollista, että Weather Display pitää sisällään lisäosia (plugineja) jotka tekevät "likaisen työn" ja puskevat ulos valmista, käyttökelpoista käppyrää. Siitä en tosin ole missään tapauksessa varma. Luulen, että Weather Display:ta käyttävät henkilöt osaavat vastata tähän paremmin.

Onko esimerkiksi Teutarilla ja Impivaaran Isännällä näkemystä asiaan?
Juha Jäntti
Foorumin ja sivuston ylläpitäjä
Finland Weather Exchange (FinWX)

http://www.finwx.net/
------------------------------------------
Ukkoskausi avattu Suomessa: --.--.2024
Ukkoskausi avattu Helsingissä: --.--.2024
-------------------------------------------
Ukkospäivälaskuri 2024; Helsinki/Viikinmäki
0 ukkospäivää.
------------------------------------------
X, FinWX:n ylläpidon ilmoitukset
------------------------------------------

meteorologi

#2
Tällaisen clientraw-skriptin löysin. Pitää vain muokata currdat.lst:lle sopivaksi. Tummennetulla
on epäselvää asiaa; mitä tarkoittaa ja kuinka tässä tulisi toimia currdat.lst muokkausten suhteen?


<?php
//where are your clientraw*-files relative to where this file is
$hostloc "../";

include (
"jp/src/jpgraph.php");//maybe you have to change this path
include ("jp/src/jpgraph_line.php");//maybe you have to change this path

// MBtoINCHES: converts mb to in/Hg
function MBtoINCHES(&$value) {
  return 
round($value = ($value 33.86388158),3);
// end function MBtoINCHES

//you dont have to change anything below this
//================================================================================================

// Create the graph. These two calls are always required
$graph = new Graph(400,250,"auto",30);
$graph->SetScale("textlin");
$graph->SetMarginColor("#191970");
$graph->img->SetAntiAliasing();

$clientraw get_raw("${hostloc}clientraw.txt");
$clientrawextra get_raw("${hostloc}clientrawextra.txt");
$clientrawdaily get_raw ("${hostloc}clientrawdaily.txt");

function 
get_raw$rawfile ) {
$rawdata = array();
$fd fopen($rawfile"r");
if (
$fd) {
$rawcontents '';
while (! 
feof ($fd) ) {
$rawcontents .= fread($fd8192);
}
fclose($fd);
$delimiter " ";
$rawdata explode ($delimiter$rawcontents);
} else {
$rawdata[0]= -9999;
}
return 
$rawdata;
}

//
// Create aray for y-axis
// 

[b]$y=array($clientrawextra['439'],$clientrawextra['440'],$clientrawextra['441'],$clientrawextra['442'],
$clientrawextra['443'],$clientrawextra['444'],$clientrawextra['445'],$clientrawextra['446'],$clientrawextra['447'],
$clientrawextra['448'],$clientrawextra['449'],$clientrawextra['450'],$clientrawextra['451'],$clientrawextra['452'],
$clientrawextra['453'],$clientrawextra['454'],$clientrawextra['455'],$clientrawextra['456'],$clientrawextra['457'],
$clientrawextra['458'],$clientrawextra['574'],$clientrawextra['575'],$clientrawextra['576'],$clientrawextra['577']);[/b]

array_walk($y"MBtoINCHES");

$datax $y;

//create timearray for the x-axis
$n=1;
$limit=24;
putenv('TZ=US/Central');
$time=date(" H",time());
$datat=array($time);
$x=$datat;
//what you have to add
$add=3600;
$result=strtotime(now);
for (
$n=1;$n++;)
{
$result=($result-$add);
$new=date('ga'$result);
$next=array("$new");
$datatarray_merge ($next,$datat);
if (
$n>=$limit) break;
  }
$datat=array_merge($datat,$x);
// =====================================================================================
// From here we start creating the graphs
// =====================================================================================

// Add a drop shadow
$graph->SetShadow();

// Adjust the margin a bit to make more room for titles
$graph->img->SetMargin(40,40,10,55);

// Create a bar pot
$bplot = new LinePlot($datax);

$bplot->SetFillColor("lightblue@0.7");
$bplot->SetWeight(1);
$bplot->SetColor("blue");

$graph->Add($bplot);

// titles
$graph->title->SetFont(FF_FONT1,FS_BOLD,10);
$graph->title->Set("Barometric Pressure (inHg)");
$graph->title->SetColor("white");
//$graph->xaxis->title->Set("X-axis");
//$graph->yaxis->title->Set("Y-axis");

//x-axis
$time=date("M j",time());
$graph->xaxis->title->Set($time);
$graph->xaxis->title->SetColor(white);
$graph->xaxis->SetFont(FF_FONT1,FS_NORMAL,4);
$graph->xaxis->SetTickLabels($datat); 
$graph->xaxis->SetTextLabelInterval(2);
$graph->xaxis->SetPos("min"); 
$graph->xaxis->HideTicks(true,true); 
$graph->xaxis->SetColor("white"); 
$graph->xgrid->Show(true);

//y-axis
$graph->yaxis->SetColor("white");
$graph->yaxis->scale->SetGrace(10);
//$graph->yscale->SetAutoMin(29);
$graph->yaxis->HideTicks(true,true);
$graph->yaxis->SetLabelFormat('%01.2f');
 
// Display the graph
$graph->Stroke();


?>



Lainaus käyttäjältä: J.Jäntti - maanantai, 05.05.2008, 20:24
Lämpimästi tervetuloa joukkoon! Uskon, että viihdyt täällä :)

Kiitoksia, kiitoksia! Varmasti viihdyn!

Edit: Administraattori käväisi vähän muokkaamassa koodin omalle kohdilleen ;)

J.Jäntti

Lainaus käyttäjältä: Meteorologi - maanantai, 05.05.2008, 21:46
Tällaisen clientraw-skriptin löysin. Pitää vain muokata currdat.lst:lle sopivaksi. Tummennetulla
on epäselvää asiaa; mitä tarkoittaa ja kuinka tässä tulisi toimia currdat.lst muokkausten suhteen?

$y=array($clientrawextra['439'],$clientrawextra['440'],$clientrawextra['441'],$clientrawextra['442'],
$clientrawextra['443'],$clientrawextra['444'],$clientrawextra['445'],$clientrawextra['446'],$clientrawextra['447'],
$clientrawextra['448'],$clientrawextra['449'],$clientrawextra['450'],$clientrawextra['451'],$clientrawextra['452'],
$clientrawextra['453'],$clientrawextra['454'],$clientrawextra['455'],$clientrawextra['456'],$clientrawextra['457'],
$clientrawextra['458'],$clientrawextra['574'],$clientrawextra['575'],$clientrawextra['576'],$clientrawextra['577']);


Ilmeisestikin kaikki Clientraw-tiedostot ovat rakenteeltaan samanlaisia, eli yhdelle riville tulee kaikki data yhteen putkeen välilyönnillä eroteltuna.
Tuo näyttäisi hakevan jossain skriptin alkuvaiheessa lukemastaan clientrawextra.txt -tiedostosta ($clientrawextra -nimestä päätellen) tiettyjä "kenttiä", jotka se, luettuaan tiedoston ensin, on luonut. Nuo numerot, jotka näyttävät olevan välillä 439-458 ja 574-577, kuvastanevat tunnin aikana tulleita lukemia ja nuo kattavat vuorokauden, sillä niitä on 24 kappaletta. Skriptin sisällöstä päätellen yllämainitut kentät pitävät sisällään kunkin kuluneen tunnin ilmanpainelukemat.

Ja tässäpä tuleekin sitten se ongelma:
WUHU kasaa currdat.lst -tiedoston siten, että jokainen mittaustieto on omalla rivillään. Tämä ei varsinaisesti ole ongelma, koska tieto on helposti haettavissa riveiltäkin, mutta kun WUHU ei aja vastaavankaltaista historiatietoa currdat.lst -tiedostoon lainkaan. Currdat.lst -tiedostossa olevat tiedot ovat vain viimeisimmän asemalta tulleen mittaustiedon näyttöpaikka.

Sikäli, kun tiedän, WUHU:n Beta-versio 2.1.6.40 (Beta 40) osaa puskea historiatietoja .csv -tiedostoon, kun niin pyydetään tekemään WUHU Configuration.ini -tiedostossa, mutta WUHU:n puskeman .csv:n toiminnallisuus tiedon purkamiseen PHP:llä onkin sitten ihan toinen juttu, sillä siinä jouduttaisiin kehittämään luettavaksi sekä rivejä, että kenttiä, minkä lisäksi metrijärjestelmää (m/s, hPa, mm) ei tueta, vaan kaikki tungetaan .csv-tiedostoon yhdysvaltalaisittain (mph, inHg, in).

Pitäisi varmaan heittää ehdotus ilmaan WUHU:n Yahoo!-groupissa, että WUHU osaisi  pyynnöstä rakentaa tuollaisen historiatiedoston, joka sisällöltään vastaisi clientrawextra.txt -tiedostoa. Se saattaa tosin herättää närää Weather Display-käyttäjissä, mutta toisaalta se olisi WUHU:n suhteen suurta edistystä.
Juha Jäntti
Foorumin ja sivuston ylläpitäjä
Finland Weather Exchange (FinWX)

http://www.finwx.net/
------------------------------------------
Ukkoskausi avattu Suomessa: --.--.2024
Ukkoskausi avattu Helsingissä: --.--.2024
-------------------------------------------
Ukkospäivälaskuri 2024; Helsinki/Viikinmäki
0 ukkospäivää.
------------------------------------------
X, FinWX:n ylläpidon ilmoitukset
------------------------------------------

Impivaaran isäntä

Valitettavasti en osaa asiaa sanoa mitään kummempaa. Tein vaan kuten ohjeissa kerrotaan. :) http://saa.ekiwx.net/clientraw/

Ohjeessa mainitut linkit ovat vanhentuneet, mutta voi lähettää sinulle nuo grafiikka paketit, jos vaan löydän ne jostain.
Jotain tietoa löytyy myös osoitteesta: http://www.aditus.nu/jpgraph/

Eki


meteorologi

#5
Lainaus käyttäjältä: J.Jäntti - maanantai, 05.05.2008, 23:55

Ja tässäpä tuleekin sitten se ongelma:
WUHU kasaa currdat.lst -tiedoston siten, että jokainen mittaustieto on omalla rivillään. Tämä ei varsinaisesti ole ongelma, koska tieto on helposti haettavissa riveiltäkin, mutta kun WUHU ei aja vastaavankaltaista historiatietoa currdat.lst -tiedostoon lainkaan. Currdat.lst -tiedostossa olevat tiedot ovat vain viimeisimmän asemalta tulleen mittaustiedon näyttöpaikka.

Totta tosiaan, tuo currdat.lst-tiedoston ja clientraw.txt-tiedoston ero historiatiedoissa.

En ole vielä mikään PHP-nero, mutta jos saisi tuohon skriptiin tungettua automaattisen luvun.
Eli JpGraph lukisi automaattisesti (jatkuvasti) currdat.lst-tiedoston ja tekisi käyrät.

Näiden
$y=array($clientrawextra['439'],...
-rivitietojen paikalle vain currdat.lst-tiedoston esimerkiksi suhteellisen ilmanpaineen rivinumero (currdat.lst-tiedostossa) tai mahdollinen [pressure_relative] -tunnus?

Tuossa tilanteessa JpGraph tekisi itse jonkinlaisen muistivedoksen tapahtuneista sääolojen vaihteluista (päivittyneestä/päivittyvästä currdat.lst-tiedostosta). Siis MysQl.

Lainaus käyttäjältä: Impivaaran isäntä - tiistai, 06.05.2008, 09:31
Valitettavasti en osaa asiaa sanoa mitään kummempaa. Tein vaan kuten ohjeissa kerrotaan. :) http://saa.ekiwx.net/clientraw/

Ohjeessa mainitut linkit ovat vanhentuneet, mutta voi lähettää sinulle nuo grafiikka paketit, jos vaan löydän ne jostain.
Jotain tietoa löytyy myös osoitteesta: http://www.aditus.nu/jpgraph/

Eki



Löysin tuon grafiikkapaketin itse. Se sisältää 12 puolivalmista clientraw.txt-skriptiä, joista yksi on mallina eräässä viestissäni ylempänä.

weatherc

#6
Tere!

Itse olen tuota JpGraph:ia käyttänyt aika paljonkin Weather Display kanssa ja voin sanoa että helpompaa käyräntekoa ei voi olla ja suosittelen lämpimästi Weather Display:hin siirtymistä, WD kun osaa tehdä paljon muutakin kun clientraw-filut :)
Koko paketin valmiita clientraw-filuja käyttäviä käyräpohjia voi ladata tästä: http://www.stella-maris.org.uk/code.shtml ja selkennykseksi, JPGraph ei tarvi mitään MySql:ää toimiakseen pelkkä txt-filu tai vastaava josta lukea dataa riittää.

Esimerkkinä http://www.nordicweather.net/clientraw/temp_1hr.php, tuo ei ole miltä osoite näyttää vaan:
Siinä käytetty WD:n customlog-file:ä, eli ei clientraw-filua, siihen voi pistää mitä arvoa haluaa erittäin laajasta custom-tag-arkistosta. Siihen tallentuu tässä tapauksessa kellonaika, lämpötila ja salamatiedot (WD lukee Nexstormin FlahGate IPC:tä) ja tuloksena on 24 tunnin käyrä jossa näytetään salamat/minuutti minuutin tarkkuudella ;)

WD:n custom log tallentaa tiedot kerran minuutissa ja sen kokoa voi itse säätää olisko se tunnista 48 tuntiin, eli filu ei kasva tuon isommaksi vaan se heittää vanhemmat ulos sitä mukaa kun uutta dataa tulee, tuossa käyrässä käytettävä log-filu on 24 tuntinen.

Customlog-filu jonka se tekee ja lataa nettiin on tämän näköinen:
21:15 9.0 0
21:17 8.9 0
21:18 8.9 0
21:19 8.8 0
21:20 8.8 0
21:21 8.8 0
21:22 8.8 0
21:23 8.7 0
21:24 8.7 0


Rivejä on yhteensä 1440 eli yksi per minuutti. Väsäsin koodin lukemaan tuota filua käyrää varten näin:


<?
$file_customtext = file_get_contents("customtextout2.txt");
$file_customtext = str_replace(' ', '|', $file_customtext); // lisätään |-merkki lukemista varten
$datafields = preg_split("/\n+/", $file_customtext);        // Pilkotaan data rivivaihdon avulla
$test = count($datafields);                                       // Lasketaan kuin monta riviä on
for ($i=0; $i<=($test-2); $i++) {
$testdata[$i] = explode("|", $datafields[$i]);                // Pilkotaan joka rivin data omiksi osiksi lisätyn |-merkin avulla
}
for ($i=0; $i<=($test-2); $i++) {
$data = $testdata[$i][2];                                      // otetaan kolmas data rivissä = 2
$data = trim($data);
       if ($data == 0) {
$data = '0';
}
$testtime[] = $testdata[$i][0];                            // otetaan ensimmäinen data rivissä  tehdään siitä array= 0
$teststuff[] = $data;                                         // tehdään array myös datasta
?>


Tuloksena $testtime-array on x-axis:ta varten ja $teststuff-array on y-axis:sta varten jotka voi siirtää sellaisenaan JpGraph:iin näin:


<?
$xtextcolour = "#FFFFFF";
$ytextcolour = "#FFFFFF";
$strikeplot = "#FF8000";
$temp_format = "%0.0f";


// Create the graph. These two calls are always required
$graph = new Graph(720,200,"auto",60);
$graph->SetScale("textlin");

//Setup margin color
$graph->SetMarginColor("$margincolour");

//Here we set a dropshadow around the graph
//$graph->SetShadow();

// Adjust the margin a bit to make more room for titles
$graph->SetMargin($lm,$rm,20,40);
$graph->SetBackgroundGradient('#424242@0.2','#151515',GRAD_HOR,BGRAD_PLOT);
$graph->SetMarginColor("black");
//$graph->SetBackgroundImage("graphback.jpg");
$graph->img->SetAntiAliasing(true);

// Create a bar pot
$lplot = new LinePlot($teststuff);

eval($grace);

//Show the values
//$lplot->value->Show(); //you can comment this out if you do'nt want to show the value's

//Add the graph to the graph-area
$graph->Add($lplot);

// Set the colors for the plots
$lplot->SetColor("$strikeplot");
$lplot->SetWeight(1);

// Setup the titles
$graph->title->Set("temperature from customlog");
$graph->title->SetColor("$textcolour");

//x-axis
$graph->xaxis->SetTextLabelInterval(1);
$graph->xaxis->SetPos("min");
$graph->xaxis->SetFont(FF_VERDANA,FS_NORMAL,7);
$graph->xgrid->Show(true);
$graph->xaxis->SetColor("$xtextcolour");
$graph->xaxis->SetTickLabels($testtime);
$graph->xaxis->HideTicks(false,true);
$graph->xaxis->SetTextTickInterval(60);
$graph->xgrid->SetColor("#2E2E2E");

//y-axis
$graph->yaxis->SetTextLabelInterval(1);
$graph->title->SetFont(FF_VERDANA,FS_NORMAL,10);
$graph->yaxis->SetFont(FF_VERDANA,FS_NORMAL,7);
$graph->yaxis->SetColor("$ytextcolour");
$graph->yaxis->SetLabelFormat("$temp_format");
$graph->yaxis->HideTicks(true,true);
$graph->ygrid->SetColor("#2E2E2E");
$graph->yscale->SetAutoMin(0);
$graph->yaxis->scale->SetGrace(1,0);

// Display the graph
$graph->Stroke();
?>



Henkka


teutari

Jenkit on kovia poikia vääntämään WD:lle noita php-sivuja ja se on ohjelman hyvä puoli. Piti vähän kehasta WD:tä. ;)

Mutta yksi vaihtoehto on kokeilla tota Antoinen tekemää ilmaista GraphWeather ohjelmaa sillä saa aika mukavan näköistä php-grafiikkaa tehtyä.

Tuossa osoite:http://www.aguilmard.com/index.php?page=graphweatherphp

Siellä hänen foorumissaan on myös tobiikki englanniksi.

/jouko

weatherc

Lainaus käyttäjältä: teutari - tiistai, 06.05.2008, 16:56
Jenkit on kovia poikia vääntämään WD:lle noita php-sivuja ja se on ohjelman hyvä puoli. Piti vähän kehasta WD:tä. ;)

Juu, niin ovat ja vielä kun tekevät ne niin että on suunnilleen plug and play-scriptejä eli ei tarvi paljoa itse miettiä. En ole itse kokeillut tuota php-puolta GraphWeatherista, ohjelmaa kylläkin (nykyinen salamakäyrä tutkasivullani on sen tekemä), ja täytyy sanoa että meinas tulla harmaat hiukset sen kanssa ennen sain sen toimimaan eli lukemaan vastavaa logfilua kun aikaisemmassa vastauksessani.
Siinä mielessä JpGraph kyllä helpompi.

Henkka

teutari

Toi on Henkka tosi hieno koodi minkä laitoit ! ;)
Aina kun käyn sun tutkaa tiirailemassa niin tulee kuolattua sitä. :P

/jouko