Xtremer.nl

Persoonlijke pagina van Christian & Esther

Domoticz weerstation op je pagina.

Intro.

Er is veel vraag over hoe ik mijn vorige weerstation pagina had gemaakt in combinatie met mijn Homewizard. Omdat nu het nieuwe weerstation via domoticz loopt, wil ik deze informatie delen met jullie.

De Basis.

De basis is Domoticz welke werkend moet zijn met informatie van een weerstation. Vervolgens dien je ook nog kennis te hebben van PHP. Hieronder beschrijf ik hoe ik vanuit een PHP pagina Domoticz uitlees en presenteer op mijn website.

Verbinding maken het Domoticz.

Het eerste wat ik controleer tijdens het laden van mijn weerstation pagina, is om te kijken of Domoticz bereikbaar is en reageert.

Dat doe ik het het onderstaande script in PHP.

    /* Controleren of Domoticz Online is. */
    if ($socket = @fsockopen($domoticzurl, $port, $errno, $errstr, 2))
    {
        fclose($socket);
    }
    else
    {
        goto offline;
    }

Indien Domoticz niet reageert spreekt de volgende script aan.

    /* Domoticz Off-line */
    offline:
        print '<H5><p style="color: red;">Helaas is het weerstation off-line.</P></H5>';
        goto einde;

Inlezen data vanuit domoticz.

Als eerst heb ik wat algemene gegevens, zodat bekend is wat waar is te vinden.

/* Instellingen */

$protocol 		= "http"; 					/* Http or HTTPS */
$domoticzurl 	= "0.0.0.0"; 				/* Domoticz url or ip */
$port 			= "80"; 					/* Domoticz poort */
$username 		= "GEBRUIKERSNAAM"; 		/* Gebruikersnaam Domoticz */
$password 		= "WACHTWOORD123456"; 		/* Password Domoticz */


/* IDX Gegevens van weersensoren van Domoticz*/

$buitentempsensor = "123"; /* Buitentemperatuur, Vochtigheid & Dauwpunt */
$gevoeltempsensor = "123"; /* Gevoelstemperatuur */
$grondtempsensor = "123"; /* Grondtemperatuur 10cm */
$zonkrachtsensor = "123"; /* Zonnekracht */
$uvisensor = "123"; /* UV index */
$regensensor = "123"; /* Regen per 24h & Regen mm/h */
$regenmmusensor = "123"; /* Regen mm/h */
$windsensor = "123"; /* Windmeter (Windgraden, Richting, Windsnelheid, Rukwind, Temperatuur, Windchill */
$luchtdruksensor = "123"; /* Luchtdruk & voorspelling */
$luchtdruksensor_abs = "123"; /* Luchtdruk & voorspelling ABS*/
$zichtmeterssensor = "123"; /* Zichtmeters */

Om wat veiliger in te loggen gebruik maken van headers.

/* Header toevoegen */
$auth     		= base64_encode( "{$username}:{$password}" );
$http_header = stream_context_create([
    "http" => [
        "header" => "Authorization: Basic $auth"
    ]
]);

Indien Domoticz online is, dan laad ik alle http requests in.
Hiervoor doe ik in totaal 10 http requests.

/* Buitentemperatuur, Vochtigheid,Dauwpunt */

$json_string_buitentempsensor = file_get_contents("" . $protocol . "://" . $domoticzurl . ":" . $port . "/json.htm?type=devices&rid=" . $buitentempsensor . "", false, $http_header );
$parsed_json_buitentempsensor = json_decode($json_string_buitentempsensor, true);
$parsed_json_buitentempsensor = $parsed_json_buitentempsensor['result'][0];
$buitentemperatuur = $parsed_json_buitentempsensor['Temp'];
$buitenluchtvochtigheid = $parsed_json_buitentempsensor['Humidity'];
/* $dauwpunt = $parsed_json_buitentempsensor['DewPoint']; */
$dauwpunt = round ($parsed_json_buitentempsensor['DewPoint'], 1) ;
$buitentemperatuurupdate = $parsed_json_buitentempsensor['LastUpdate'];

/* Gevoelstemperatuur */

$json_string_gevoeltempsensor = file_get_contents("" . $protocol . "://" . $domoticzurl . ":" . $port . "/json.htm?type=devices&rid=" . $gevoeltempsensor . "", false, $http_header );
$parsed_json_gevoeltempsensor = json_decode($json_string_gevoeltempsensor, true);
$parsed_json_gevoeltempsensor = $parsed_json_gevoeltempsensor['result'][0];
$gevoelstemperatuur = $parsed_json_gevoeltempsensor['Temp'];
$gevoelstemperatuurupdate = $parsed_json_gevoeltempsensor['LastUpdate'];

/* Hitteindex */

$json_string_hitteindexsensor = file_get_contents("" . $protocol . "://" . $domoticzurl . ":" . $port . "/json.htm?type=devices&rid=" . $hitteindexsensor . "", false, $http_header );
$parsed_json_hitteindextempsensor = json_decode($json_string_hitteindexsensor, true);
$parsed_json_hitteindextempsensor = $parsed_json_hitteindextempsensor['result'][0];
$hitteindex = $parsed_json_hitteindextempsensor['Temp'];
$hitteindexupdate = $parsed_json_hitteindextempsensor['LastUpdate'];

/* Zonnekracht */

$json_string_zonkrachtsensor = file_get_contents("" . $protocol . "://" . $domoticzurl . ":" . $port . "/json.htm?type=devices&rid=" . $zonkrachtsensor . "", false, $http_header );
$parsed_json_zonkrachtsensor = json_decode($json_string_zonkrachtsensor, true);
$parsed_json_zonkrachtsensor = $parsed_json_zonkrachtsensor['result'][0];
$zonkracht = $parsed_json_zonkrachtsensor['Radiation'];
$zonkrachtupdate = $parsed_json_zonkrachtsensor['LastUpdate'];

/* UV index */

$json_string_uvisensor = file_get_contents("" . $protocol . "://" . $domoticzurl . ":" . $port . "/json.htm?type=devices&rid=" . $uvisensor . "", false, $http_header );
$parsed_json_uvisensor = json_decode($json_string_uvisensor, true);
$parsed_json_uvisensor = $parsed_json_uvisensor['result'][0];
$uvi = $parsed_json_uvisensor['UVI'];
$uvicor = round ($uvi * $uvi / ($uvi * 1.5), 0) ;
$uvupdate = $parsed_json_uvisensor['LastUpdate'];

/* Regen */

$json_string_regensensor = file_get_contents("" . $protocol . "://" . $domoticzurl . ":" . $port . "/json.htm?type=devices&rid=" . $regensensor . "", false, $http_header );
$parsed_json_regensensor = json_decode($json_string_regensensor, true);
$parsed_json_regensensor = $parsed_json_regensensor['result'][0];
$regen = $parsed_json_regensensor['Rain'];
$regenval_h = $parsed_json_regensensor['RainRate'];
$regenvalupdate = $parsed_json_regensensor['LastUpdate'];

/* Wind -> Windgraden, Richting, Windsnhelheid, Rukwind, Temperatuur, Windchill */

$json_string_windsensor = file_get_contents("" . $protocol . "://" . $domoticzurl . ":" . $port . "/json.htm?type=devices&rid=" . $windsensor . "", false, $http_header );
$parsed_json_windsensor = json_decode($json_string_windsensor, true);
$parsed_json_windsensor = $parsed_json_windsensor['result'][0];
$windsnelheid = $parsed_json_windsensor['Speed'];
$rukwind = $parsed_json_windsensor['Gust'];
$windrichtingeng = $parsed_json_windsensor['DirectionStr'];
$windrichtinggraden = $parsed_json_windsensor['Direction'];
$windtemperatuur = $parsed_json_windsensor['Temp'];
$gevoelstemperatuur = $parsed_json_windsensor['Chill'];
$windupdate = $parsed_json_windsensor['LastUpdate'];

/* Luchtdruk & voorspelling */

$json_string_luchtdruksensor = file_get_contents("" . $protocol . "://" . $domoticzurl . ":" . $port . "/json.htm?type=devices&rid=" . $luchtdruksensor . "", false, $http_header );
$parsed_json_luchtdruksensor = json_decode($json_string_luchtdruksensor, true);
$parsed_json_luchtdruksensor = $parsed_json_luchtdruksensor['result'][0];
$luchtdruk = $parsed_json_luchtdruksensor['Barometer'];
$voorspelling = $parsed_json_luchtdruksensor['Forecast'];
$voorspellingtekst = $parsed_json_luchtdruksensor['ForecastStr'];
$luchtdrukupdate = $parsed_json_luchtdruksensor['LastUpdate'];

/* Luchtdruk & voorspelling ABS */

$json_string_luchtdruksensor_abs = file_get_contents("" . $protocol . "://" . $domoticzurl . ":" . $port . "/json.htm?type=devices&rid=" . $luchtdruksensor_abs . "", false, $http_header );
$parsed_json_luchtdruksensor_abs = json_decode($json_string_luchtdruksensor_abs, true);
$parsed_json_luchtdruksensor_abs = $parsed_json_luchtdruksensor_abs['result'][0];
$luchtdrukabs = $parsed_json_luchtdruksensor_abs['Barometer'];
$voorspellingabs = $parsed_json_luchtdruksensor_abs['Forecast'];
$voorspellingtekstabs = $parsed_json_luchtdruksensor_abs['ForecastStr'];
$luchtdrukabsupdate = $parsed_json_luchtdruksensor_abs['LastUpdate'];

Data verwerking

Nadat ik de gegevens heb uitgelezen kom ik aan bij het verwerken van de data.

De gegevens uit de windmeter wordt verwerken en aan tekst gekoppeld, dit gebeurd door middel van de switch functie van PHP

/* Wind omzetten van km/h naar tekst */

switch ($windsnelheid)
{

	case ($windsnelheid >= 0.1 && $windsnelheid <= 1):
		$windbenaming = "windstil";
		$beaufort = 0;
	break;

	case ($windsnelheid >= 1 && $windsnelheid <= 6):
		$windbenaming = "er staat een zeer zwakke wind";
		$beaufort = 1;
	break;

	case ($windsnelheid >= 6 && $windsnelheid <= 12):
		$windbenaming = "er staat een zwakke wind";
		$beaufort = 2;
	break;

	case ($windsnelheid >= 12 && $windsnelheid <= 20):
		$windbenaming = "er staat een vrij matige wind";
		$beaufort = 3;
	break;

	case ($windsnelheid >= 20 && $windsnelheid <= 29):
		$windbenaming = "er staat een matige wind";
		$beaufort = 4;
	break;

	case ($windsnelheid >= 29 && $windsnelheid <= 39):
		$windbenaming = "er staat een vrij krachtige wind";
		$beaufort = 5;
	break;

	case ($windsnelheid >= 39 && $windsnelheid <= 50):
		$windbenaming = "er staat een krachtige wind";
		$beaufort = 6;

	break;

	case ($windsnelheid >= 50 && $windsnelheid <= 62):
		$windbenaming = "er staat een harde wind";
		$beaufort = 7;
	break;

	case ($windsnelheid >= 62 && $windsnelheid <= 75):
		$windbenaming = "het is stormachtig";
		$beaufort = 8;
	break;

	case ($windsnelheid >= 75 && $windsnelheid <= 89):
		$windbenaming = "let op, er staat een storm!";
		$beaufort = 9;
	break;

	case ($windsnelheid >= 89 && $windsnelheid <= 103):
		$windbenaming = "let op: er staat een zware storm!";
		$beaufort = 10;
	break;

	case ($windsnelheid >= 103 && $windsnelheid <= 117):
		$windbenaming = "let op: er staat een zeer zware storm!!";
		$beaufort = 11;
	break;

	case ($windsnelheid >= 117):
		$windbenaming = "let op: orkaan!!!";
		$beaufort = 12;
	break;

	default: //default
		$windbenaming = "!foutmelding!";
		$beaufort = "!foutmelding!";
	break;
}

Tevens moet de windrichting ontcijferd worden vanuit Domoticz.
Om vervolgens de “windrichtingeng” te vertalen naar een leesbare tekst. Dit gebeurd weer door de switch functie van PHP

/* Wind richting omzetten van Engelse afkorting naar Nederlandse afkorting & tekst */
switch ($windrichtingeng)
	{

	case N:
		$windrichtingnld = "noorden";
		$windrichtingnldkort = "N";
	break;

	case NNE:
		$windrichtingnld = "noord-noordoosten";
		$windrichtingnldkort = "NNO";
	break;

	case NE:
		$windrichtingnld = "noordoosten";
		$windrichtingnldkort = "NO";
	break;

	case ENE:
		$windrichtingnld = "oost-noordoosten";
		$windrichtingnldkort = "ONO";
	break;

	case E:
		$windrichtingnld = "oosten";
		$windrichtingnldkort = "O";
	break;

	case ESE:
		$windrichtingnld = "oost-zuidoosten";
		$windrichtingnldkort = "OZO";
	break;

	case SE:
		$windrichtingnld = "zuidoosten";
		$windrichtingnldkort = "ZO";
	break;

	case SSE:
		$windrichtingnld = "zuid-zuidoosten";
		$windrichtingnldkort = "ZZO";
	break;

	case S:
		$windrichtingnld = "zuiden";
		$windrichtingnldkort = "Z";
	break;

	case SSW:
		$windrichtingnld = "zuid-zuidwesten";
		$windrichtingnldkort = "ZZW";
	break;

	case SW:
		$windrichtingnld = "zuidwesten";
		$windrichtingnldkort = "ZW";
	break;

	case WSW:
		$windrichtingnld = "west-zuidwesten";
		$windrichtingnldkort = "WZW";
	break;

	case W:
		$windrichtingnld = "westen";
		$windrichtingnldkort = "W";
	break;

	case WNW:
		$windrichtingnld = "west-noordwesten";
		$windrichtingnldkort = "WNW";
	break;

	case NW:
		$windrichtingnld = "noordwesten";
		$windrichtingnldkort = "NW";
	break;

	case NNW:
		$windrichtingnld = "noord-noordwesten";
		$windrichtingnldkort = "NNW";
	break;

	default: //default
		$windrichtingnld = "!foutmelding!";
		$windrichtingnldkort = "!foutmelding!";
	break;
	}

UV Cijfer verwerken en begeleidende tekst koppelen. Ook dit gebeurd weer door de switch functie van PHP.

/* UV omzetten van getal naar tekst en kleur */

switch ($uvicor)
	{

	case ($uvicor <= 0.1 ):
		$uvkleur = 1;
		$uvkleurtekst = 'Groen';
		$uvtekst = 'geen';
		$uvbescherming = '';
		$uvaanbeveling1 = '';
		$uvaanbeveling2 = '';
		$uvverbrandtijd = '';
	break;

	case ($uvicor >= 0.1 && $uvicor < 3):
		$uvkleur = 1;
		$uvkleurtekst = 'Groen';
		$uvtekst = 'zwak';
		$uvbescherming = 'Geen bescherming nodig.';
		$uvaanbeveling1 = 'U kunt zich veilig buiten begeven.';
		$uvaanbeveling2 = '';
		$uvverbrandtijd = '100 tot 50 minuten';

	break;

	case ($uvicor >= 3 && $uvicor < 6):
		$uvkleur = 2;
		$uvkleurtekst = 'Geel';
		$uvtekst = 'matig';
		$uvbescherming = 'Bescherming nodig.';
		$uvaanbeveling1 = 'Waneer u zich voor langere tijd in de zon begeeft zeker als u een licht huid hebt.';
		$uvaanbeveling2 = '';
		$uvverbrandtijd = '35 tot 20 minuten';
	break;

	case ($uvicor >= 6 && $uvicor < 8):
		$uvkleur = 3;
		$uvkleurtekst = 'Oranje';
		$uvtekst = 'hoog';
		$uvbescherming = 'Extra bescherming essentieel.';
		$uvaanbeveling1 = 'Draag een zonnebril, hoofddeksel en beschermde kleding.';
		$uvaanbeveling2 = 'Smeer u goed in met zonnebrandcreme en blijf zoveel mogenlijk uit de zon.';
		$uvverbrandtijd = '20 tot 10 minuten';
	break;

	case ($uvicor >= 8 && $uvicor < 11):
		$uvkleur = 4;
		$uvkleurtekst = 'Rood';
		$uvtekst = 'heel hoog';
		$uvbescherming = 'Zoek de schaduw op.';
		$uvaanbeveling1 = 'Draag een zonnebril, hoofddeksel en beschermde kleding.';
		$uvaanbeveling2 = 'Smeer u goed en regelmatig in met zonnebrandcreme en blijf overdag uit de zon.';
		$uvverbrandtijd = '10 tot 5 minuten';

	case ($uvicor >= 11):
		$uvkleur = 5;
		$uvkleurtekst = 'Paars';
		$uvtekst = 'extreme';
		$uvbescherming = 'Verzet uw buitenactiviteiten naar de vroege ochtend en avond.';
		$uvaanbeveling1 = 'Volledig bescherming is essentieel';
		$uvaanbeveling2 = '';
		$uvverbrandtijd = 'Korter dan 5 minuten';
	break;

	default: //default
		$uvkleur = 0;
		$uvkleurtekst = '!foutmelding!';
		$uvtekst = '!foutmelding!';
		$uvbescherming = '!foutmelding!';
		$uvaanbeveling1 = '!foutmelding!';
		$uvaanbeveling2 = '!foutmelding!';
		$uvverbrandtijd = '!foutmelding!';
	break;
}

Weersvoorspelling verwerken en begeleidende tekst koppelen. Ook dit gebeurd weer door de switch functie van PHP.

/* Voorspelling weer */
			
switch ($voorspelling)
{
	case ($voorspelling == 0):
	$voorspellingtekst = 'geen informatie';
	break;

	case ($voorspelling == 1):
	$voorspellingtekst = 'zonnig';				
	break;

	case ($voorspelling == 2):
	$voorspellingtekst = 'deels bewolkt';
	break;

	case ($voorspelling == 3):
	$voorspellingtekst = 'bewolkt';
	break;

	case ($voorspelling == 4):
	$voorspellingtekst = 'regen';
	break;

	case ($voorspelling == 5):
	$voorspellingtekst = 'onbekend';
	break;

	default: //default
	$voorspellingtekst = '!foutmelding!';
	break;
}

Cachen van de gegevens

Alle gegevens uit Domoticz worden gecached.
Indien de gegevens ouder zijn dan 16 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');

/* Cache file ophalen */
$cacheFile = 'map/cache.html';

if ((file_exists($cacheFile)) && ((fileatime($cacheFile) + 16) > 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
{

            unlink($cacheFile);

            /* Hier alles wat je wilt weergeven & cachen */

            $content = ob_get_contents();
            ob_end_clean();
            file_put_contents($cacheFile, $content);
            echo $content;
        }

Door middel van de “print” functie presenteer ik de uitgelezen data op mijn pagina.

print .$buitentemperatuur. /* Actuele buitentemperatuur. */
print .$buitenluchtvochtigheid. /* Actuele luchtvochtigheid */
print .$dauwpunt. /* Actuele Dauwpunt temperatuur. */
print .$buitentemperatuurupdate. /* Tijdstip van de bovenstaande gegevens. */

print .$gevoelstemperatuur. /* Gevoelstemperatuur. */
print .$gevoelstemperatuurupdate. /* Tijdstip van de bovenstaande gegevens. */

print .$grondtemperatuur. /* Actuele grondtemperatuur. */
print .$grondtemperatuurupdate. /* Tijdstip van de bovenstaande gegevens. */

print .$windsnelheid. /* Actuele windsnelheid. */
print .$windbenaming. /* Actuele windsnelheid als beschrijving */
print .$beaufort. /* Actuele windsnelheid in beaufort */
print .$windtemperatuur. /* Actuele windtemperatuur */
print .$rukwind. /* Actuele rukwinden */
print .$windrichtingnld. /* Windrichting */
print .$windrichtingnldkort. /* Windrichting afkorting */
print .$windrichtinggraden. /* Windrichting in graden */
print .$windupdate. /* Tijdstip van de bovenstaande gegevens. */

print .$regen. /* Regenval vandaag */
print .$regenval_h. /* Regenval per uur */
print .$regenvalupdate. /* Tijdstip van de bovenstaande gegevens. */

print .$zonkracht. /* Actuele zonkracht */
print .$uvicor. /* Actuele UV gecorrigeerd */
print .$uvbescherming. /* Bescherming tekst */
print .$uvaanbeveling1. /* Advies regel 1 */
print .$uvaanbeveling2. /* Advies regel 2 */
print .$uvverbrandtijd. /* Verbrandingstijd */
print .$zonkrachtupdate. /* Tijdstip van de bovenstaande gegevens. */

print .$zichtmeters. /* Actuele zichtmeters */
print .$zichtmetersupdate. /* Tijdstip van de bovenstaande gegevens. */

print .$luchtdruk. /* Actuele luchtdruk */
print .$luchtdrukabs. /* Actuele ABS luchtdruk */
print .$voorspellingtekst. /* Actuele voorspelling */
print .$luchtdrukupdate. /* Tijdstip van de bovenstaande gegevens. */

Laat een reactie achter

© 2024 Xtremer.nl