Intro.
Er is veel vraag over hoe ik mijn vorige weerstation pagina had gemaakt in combinatie met mijn Homewizard.
Daarom heb ik een pagina gemaakt over hoe je de homewizard kan uitlezen en aansturen. Tevens heb ik ook een pagina over hoe je de gegevens kan presenteren op een website.
De Basis.
De basis is als eerste je Homewizard kunnen uitlezen, wat je op deze pagina kan lezen. Vervolgens dien je ook nog kennis te hebben van PHP. Hieronder beschrijf ik hoe ik vanuit een PHP pagina de Homewizard uitlees en presenteer op mijn website.
Verbinding maken het de homewizard.
Het eerste wat ik controleer tijdens het laden van mijn weerstation pagina, is om te kijken of de Homewizard bereikbaar is en reageert.
Dat doe ik het het onderstaande script in PHP.
$host = ‘<Homewizard-IP>’;
if($socket =@ fsockopen($host, 80, $errno, $errstr, 2)) {
fclose($socket);
} else {
goto offline;
}
goto online;
Indien de Homewizard niet reageert spreekt de volgende script aan.
offline:
print ‘<H5><p style=”color: red;”>Helaas is het weerstation off-line.</P></H5>’;
goto einde;
Inlezen data vanuit de homewizard.
Indien de Homewizard online is, dan laad ik alle http requests in.
Hiervoor doe ik 4 http requests naar de Homewizard en één naar buienradar voor de luchtdruk, zichtmeters
online:
unlink($cacheFile);
$content = file_get_contents(‘http://xml.buienradar.nl/’);
$xml = simplexml_load_string($content);$ipadress = “<Homewizard-IP>”;
$password = “<Homewizard-wachtwoord>”;$jsonurl1 = “http://”.$ipadress.”/”.$password.”/wilist”;
$json1 = file_get_contents($jsonurl1);
$wind = json_decode($json1,true);
$windmeter = $wind[‘response’];$jsonurl2 = “http://”.$ipadress.”/”.$password.”/ralist”;
$json2 = file_get_contents($jsonurl2);
$regen = json_decode($json2,true);
$regenmeter = $regen[‘response’];$jsonurl3 = “http://”.$ipadress.”/”.$password.”/telist”;
$json3 = file_get_contents($jsonurl3);
$temp = json_decode($json3,true);
$thermometers = $temp[‘response’];
$temperatuurmeter = array_values($thermometers);$jsonurl4 = “http://”.$ipadress.”/”.$password.”/suntimes”;
$json4 = file_get_contents($jsonurl4);
$zon = json_decode($json4,true);
$zonopneer = $zon[‘response’];
Data verwerking
Nadat ik de gegevens heb uitgelezen kom ik aan bij het verwerken van de data.
hieronder wordt mijn dauwpunt berekend.
$A = log($temperatuurmeter[<id>][‘hu’] / 100) + (17.62 * $temperatuurmeter[<id>][‘te’] / (243.12 + $temperatuurmeter[<id>][‘te’]));
$dauwpunt = 243.12 * $A / (17.62 – $A);
Mijn zonuren worden hier berekend voor vandaag, morgen en over een week.
$diff1 = (strtotime($zonopneer[0][‘sunset’]) – strtotime($zonopneer[0][‘sunrise’]));
$Daglengte1 = $diff1/60;$diff2 = (strtotime($zonopneer[1][‘sunset’]) – strtotime($zonopneer[1][‘sunrise’]));
$Daglengte2 = $diff2/60;$diff3 = (strtotime($zonopneer[6][‘sunset’]) – strtotime($zonopneer[6][‘sunrise’]));
$Daglengte3 = $diff3/60;
Vervolgens ga ik de gegevens uit de windmeter verwerken en tekst aan koppelen, dit gebeurd door middel van de switch functie van PHP
$windkmh = $windmeter[<id>][‘ws’];
switch ($windkmh){
case ($windkmh>= 0.1 && $windkmh <= 1):
$windbenaming = “windstil”;
$beaufort = 0;
break;case ($windkmh>= 1 && $windkmh<= 6):
$windbenaming = “er staat een zeer zwakke wind”;
$beaufort = 1;
break;case ($windkmh>= 6 && $windkmh<= 12):
$windbenaming = “er staat een zwakke wind”;
$beaufort = 2;
break;case ($windkmh>= 12 && $windkmh<= 20):
$windbenaming = “er staat een vrij matige wind”;
$beaufort = 3;
break;case ($windkmh>= 20 && $windkmh<= 29):
$windbenaming = “er staat een matige wind”;
$beaufort = 4;
break;case ($windkmh>= 29 && $windkmh<= 39):
$windbenaming = “er staat een vrij krachtige wind”;
$beaufort = 5;
break;case ($windkmh>= 39 && $windkmh<= 50):
$windbenaming = “er staat een krachtige wind”;
$beaufort = 6;break;
case ($windkmh>= 50 && $windkmh<= 62):
$windbenaming = “er staat een harde wind”;
$beaufort = 7;
break;case ($windkmh>= 62 && $windkmh<= 75):
$windbenaming = “het is stormachtig”;
$beaufort = 8;
break;case ($windkmh>= 75 && $windkmh<= 89):
$windbenaming = “let op, er staat een storm!”;
$beaufort = 9;
break;case ($windkmh>= 89 && $windkmh<= 103):
$windbenaming = “let op: er staat een zware storm!”;
$beaufort = 10;
break;case ($windkmh>= 103 && $windkmh<= 117):
$windbenaming = “let op: er staat een zeer zware storm!!”;
$beaufort = 11;
break;case ($windkmh>= 117):
$windbenaming = “let op: orkaan!!!”;
$beaufort = 12;
break;default: //default
$windbenaming = “!foutmelding!”;
$beaufort = “!foutmelding!”;
$offlinewind = 1;
break;
}
Tevens moet de windrichting ontcijferd worden vanuit de homewizard.
Als eerst gaan we de waarde die door de homewizard word doorgegeven opslitsen naar 2 verschillende datapunten
$parts = explode(” “, $windmeter[<id>][‘dir’]);
$windrichtingeng = $parts[0];
$windrichtinggraden = $parts[1];
Om vervolgens de “windrichtingeng” te vertalen naar een leesbare tekst. Dit gebeurd weer door de switch functie van PHP
switch ($windrichtingeng){
case N:
$windrichtingnld = “noorden”;
$windrichtingnldkort = “N”;
break;case NNE:
$windrichtingnld = “noordnoordoosten”;
$windrichtingnldkort = “NNO”;
break;case NE:
$windrichtingnld = “noordoosten”;
$windrichtingnldkort = “NO”;
break;case ENE:
$windrichtingnld = “oostnoordoosten”;
$windrichtingnldkort = “ONO”;
break;case E:
$windrichtingnld = “oosten”;
$windrichtingnldkort = “O”;
break;case ESE :
$windrichtingnld = “oostzuidoosten”;
$windrichtingnldkort = “OZO”;
break;case SE:
$windrichtingnld = “zuidoosten”;
$windrichtingnldkort = “ZO”;
break;case SSE:
$windrichtingnld = “zuidzuidoosten”;
$windrichtingnldkort = “ZZO”;
break;case S:
$windrichtingnld = “zuiden”;
$windrichtingnldkort = “Z”;
break;case SSW:
$windrichtingnld = “zuidzuidwesten”;
$windrichtingnldkort = “ZZW”;
break;case SW:
$windrichtingnld = “zuidwesten”;
$windrichtingnldkort = “ZW”;
break;case WSW:
$windrichtingnld = “westzuidwesten”;
$windrichtingnldkort = “WZW”;
break;case W:
$windrichtingnld = “westen”;
$windrichtingnldkort = “W”;
break;case WNW:
$windrichtingnld = “westnoordwesten”;
$windrichtingnldkort = “WNW”;
break;case NW:
$windrichtingnld = “noordwesten”;
$windrichtingnldkort = “NW”;
break;case NNW:
$windrichtingnld = “noordnoordwesten”;
$windrichtingnldkort = “NNW”;
break;default: //default
$windrichtingnld = “!foutmelding!”;
$windrichtingnldkort = “!foutmelding!”;
$offlinewind = 1;
break;
}
Cachen van de gegevens
Omdat de Homewizard maar beperkte capaciteit heeft, cache ik de gegevens van afgelopen minuut.
Indien de gegevens ouder zijn dan 60 seconde, worden de gegevens opnieuw opgehaald bij het opvragen van de pagina.
Deze script staat bovenaan de php pagina.
<?php
date_default_timezone_set(‘Europe/Amsterdam’);$cacheFile = ‘cache.html’;
if ( (file_exists($cacheFile)) && ((fileatime($cacheFile) + 60) > time()) )
{
$content = file_get_contents($cacheFile);
print ‘De onderstaande gegevens zijn uitgelezen op ‘.date(“H:i:s d-F-Y.”,filemtime($cacheFile));
echo $content;} else
{Hieronder komt de rest van de php pagina.
Vervolgens dien je op te gegeven wat er gecached dient te worden.
Dit gebeurd bij mij na de gegevens verwerking en voor de presentatie van de gegevens.
ob_start();
// write contentHier staat de tekst presentatie van de homewizard gegevens.
$content = ob_get_contents();
ob_end_clean();
file_put_contents($cacheFile,$content);
echo $content;
}
Gegevens presenteren op de pagina
Door middel van de “echo” en “print” functie presenteer ik de uitgelezen data op mijn pagina.
Hieronder een overzicht van de data uit de homewizard, en de verwerkte data.
presenteren van temperatuur en luchtvochtigheid.
print .$temperatuurmeter[<id>][‘te’].
Actuele buitentemperatuur.print .$temperatuurmeter[<id>][‘hu’].
Actuele luchtvochtigheidprintf(“%.1f”, $dauwpunt);
Actuele Dauwpunt temperatuur.print .$temperatuurmeter[<id>][‘te+’].
Maximale temperatuur voor vandaag.print .$temperatuurmeter[<id>][‘te+t’].
Tijdstip maximale temperatuur voor vandaag.print .$temperatuurmeter[<id>][‘te-‘].
Minimale temperatuur voor vandaag.print .$temperatuurmeter[<id>][‘te-t’].
Tijdstip minimale temperatuur voor vandaag.print .$temperatuurmeter[<id>][‘hu+’].
Maximale luchtvochtigheid voor vandaag.print .$temperatuurmeter[<id>][‘hu+t’].
Tijdstip maximale luchtvochtigheid voor vandaag.print .$temperatuurmeter[<id>][‘hu-‘].
Minimale luchtvochtigheid voor vandaag.print .$temperatuurmeter[<id>][‘hu-t’].
Tijdstip minimale luchtvochtigheid voor vandaag.
presenteren van windsnelheid, richting en wind temperatuur.
print .$windmeter[<ID>][‘ws’].
Actuele windsnelheid.print .$windbenaming.
tekstuele benaming van de windsnelheid, Deze komt niet uit de homewizard, maar is verwerkt in de php pagina.print .$windmeter[<ID>][‘wc’].
Actuele windtemperatuur.print .$beaufort.
Actuele windsnelheid in beaufort. Deze komt niet uit de homewizard, maar is verwerkt in de php pagina.print .$windmeter[<ID>][‘gu’].
Actuele snelheid van de windvlagen.print .$windrichtingnld.
Actuele windrichting. Deze komt niet uit de homewizard, maar is verwerkt in de php pagina.print .$windrichtingnldkort.
Actuele windrichting. Deze komt niet uit de homewizard, maar is verwerkt in de php pagina.print .$windrichtinggraden.
Actuele windrichting in graden. Deze komt niet uit de homewizard, maar is verwerkt in de php pagina.
presenteren van de regenval.
print .$regenmeter[<ID>][‘mm’].
Regenval van afgelopen 24 uur.print .$regenmeter[<ID>][‘3h’].
Regenval van afgelopen 3 uur.
presenteren van de zontijden.
print .$zonopneer[0][‘sunrise’].
Zonsopgang voor vandaag.print .$zonopneer[0][‘sunset’].
Zonsondergang voor vandaag.print .$zonopneer[1][‘sunrise’].
Zonsopgang voor morgen.print .$zonopneer[1][‘sunset’].
Zonsondergang voor morgen.print .$zonopneer[6][‘sunrise’].
Zonsopgang voor over een week.print .$zonopneer[6][‘sunset’].
Zonsondergang voor over een week.
presenteren van de actuele grondtemperatuur, luchtdruk en zichtmeters.
Omdat de homewizard deze gegevens niet door geven maak ik gebruik van buienradar.
Deze werken met stationscode’s voor de gegevens uit verschillende lokatie’s
[6391] Venlo (Station Arcen)
[6275] Arnhem (Station Arnhem)
[6249] Berkhout (Station Berkhout)
[6308] Cadzand (Station Cadzand)
[6260] Utrecht (Station Utrecht)
[6235] Den Helder (Station Den Helder)
[6370] Eindhoven (Station Eindhoven)
[6321] Noordzee (Station Euro platform)
[6350] Gilze Rijen (Station Gilze Rijen)
[6323] Goes (Station Goes)
[6283] Oost-Overijssel (Station Groenlo-Hupsel)
[6280] Groningen (Station Groningen)
[6315] Oost-Zeeland (Station Hansweert)
[6278] Zwolle (Station Heino)
[6356] Gorinchem (Station Herwijnen)
[6330] Hoek van Holland (Station Hoek van Holland)
[6311] Zuid-Zeeland (Station Hoofdplaat)
[6279] Hoogeveen (Station Hoogeveen)
[6251] Wadden (Station Hoorn Terschelling)
[6258] Enkhuizen-Lelystad (Station Houtribdijk)
[6285] Schiermonnikoog (Station Huibertgat)
[6209] IJmond (Station IJmond)
[6225] IJmuiden (Station IJmuiden)
[6210] Katwijk (Station Katwijk)
[6277] Noord-Groningen (Station Lauwersoog)
[6320] Goeree (Station LE Goeree)
[6270] Leeuwarden (Station Leeuwarden)
[6269] Lelystad (Station Lelystad)
[6348] West-Utrecht (Station Lopik-Cabauw)
[6380] Maastricht (Station Maastricht)
[6273] Noordoostpolder (Station Marknesse)
[6286] Oost-Groningen (Station Nieuw Beerta)
[6312] Oosterschelde (Station Oosterschelde)
[6344] Rotterdam (Station Rotterdam)
[6343] Rotterdam Haven (Station Rotterdam Geulhaven)
[6316] Schaar (Station Schaar)
[6240] Amsterdam (Station Schiphol)
[6324] Midden-Zeeland (Station Stavenisse)
[6267] West-Friesland (Station Stavoren)
[6229] Texel (Station Texelhors)
[6331] Tholen (Station Tholen)
[6290] Twente (Station Twente)
[6313] West-Zeeland (Station Vlakte aan de Raan)
[6242] Vlieland (Station Vlieland)
[6310] Vlissingen (Station Vlissingen)
[6375] Uden (Station Volkel)
[6319] Terneuzen (Station Westdorpe)
[6248] Hoorn (Station Wijdenes)
[6257] Wijk aan Zee (Station Wijk aan Zee)
[6340] Woensdrecht (Station Woensdrecht)
[6239] Noordzee (Station Zeeplatform F-3)
[6252] Noordzee (Station Zeeplatform K13)
uitlezing van de grondtemperatuur.
foreach($xml->weergegevens->actueel_weer->weerstations->children() as $station) {
if ($station->stationcode == ‘0000’) {
echo ‘De actuele temperatuur net boven de grond is ‘, $station->temperatuur10cm,’ °C.<br />’, PHP_EOL;
break;
}
}
Uitlezing van luchtdruk en zichtmeters:
foreach($xml->weergegevens->actueel_weer->weerstations->children() as $station) {
if ($station->stationcode == ‘0000’) {
echo ‘De actuele luchtdruk is ‘, $station->luchtdruk,’ millibar.<br />’, PHP_EOL;
echo ‘Het actuele aantal zicht meters ‘, $station->zichtmeters, ‘ meter.<br />’, PHP_EOL;
break;
}
}