Anzeige aufgezeichneter Wetterdaten

In diesem Beitrag möchte ich nun noch auf das Speichern und Anzeigen der Messdaten, welche durch meine DIY ESP8266 Wetterstation* viertelstündlich an meinen NAS übermittelt werden, ein wenig näher eingehen. Da die Art der Daten dabei eigentlich nur eine untergeordnete Rolle spielt, habe ich diesen Beitrag von der Wetterstation getrennt erstellt, so könnte er vielleicht auch als Vorlage für die Anzeige anderer Daten als Inspiration dienen.

 

Datenempfang und Speicherung

Der Empfang und das Speichern der Messdaten ist recht trivial. Die Wetterstation ruft nach dem Verbinden mit dem Netzwerk ein PHP-Script auf, welches die Messwertdaten per HTTP_GET entgegennimmt und dann innerhalb einer Datei speichert. An dieser Stelle sei gesagt, dass das Sammeln der Daten natürlich genauso gut (oder vielleicht sogar besser) in einer Datenbank machbar wäre. Ich habe mich damals für die Dateivariante entschieden, da sich diese beim Erstellen der Scripte leichter überprüfen und debuggen lassen hat. 

Um eine übersichtliche Einteilung der Daten zu erreichen, werden vom Script automatisch Unterordner für den aktuellen Monat des Jahres und den jeweiligen Tag der Messaufzeichnung wie folgt erstellt. Für den unwahrscheinlichen Fall, dass irgendwann eine zweite Wetterstation hinzukommen sollte, wird geprüft, ob der innerhalb der Wetterstation gesetzte Gerätename als oberste Verzeichnisebene vorhanden ist. Ist dies der Fall wird geprüft, ob der Ordner für den aktuellen Monat vorhanden ist – falls nicht, wird dieser erzeugt. Danach wird geprüft, ob der Ordner für den aktuellen Tag vorhanden ist – falls nicht, wird auch dieser erzeugt. Im letzten Schritt wird geprüft, ob innerhalb des Tagesordners die Messdatei vorhanden ist – falls nicht, wird diese ebenfalls erzeugt. Anschließend werden die Messdaten in diese Messdatei geschrieben und die Datei gespeichert.

 

Screenshot der Ordnerstruktur für die Ablage der Messwertdateien

 

Jede Zeile innerhalb der erzeugten oder erweiterten Messdatendatei stellt eine der alle 15 Minuten übertragenen Messungen dar. Die Daten werden hierbei als eine Art zeichensepariertes Array in ihrer Rohform abgelegt. Diese Zeilen lassen sich per explode-Befehl innerhalb von PHP einfach in einzelne Werte zerlegen, wobei nur die Position des jeweiligen Messwertes bekannt sein muss. Das Konvertieren der Daten in Ihre jeweiligen SI-Einheiten erfolgt übrigens erst implizit beim Anzeigen der Messdaten, so müssen bei evtl. nötigen Anpassungen (Software-Kalibrierung) nicht alle gespeicherten Daten überarbeitet werden.

  

Schematische Darstellung der Trennung einer Messwertzeile

 

Eine Sonderstellung nimmt der letzte Messwertblock für die Windrichtung und die Windgeschwindigkeit ein. Da hier die Daten in der Auflösung von einer Minute vorhanden sind, kommt hier ebenfalls ein Array zum Einsatz. Somit ergibt sich dann als Beispiel folgender Dateiinhalt.

 

Auszug des Dateiinhaltes der Datei „Wetterdaten.stats“ vom 17.04.2022

 

Im Monatsordner speichere ich außerdem eine Datei mit den Höchst- und Tiefstwerten des aktuellen Monats. Diese wird bei Speichern der aktuellen Messdaten gelesen und die entsprechenden Werte bei Bedarf durch den neuen Höchst- oder Tiefstwert ersetzt. So kann man eine Monats-Topübersicht anzeigen, ohne dazu alle bereits gespeicherten Messdaten noch einmal analysieren zu müssen.  Selbes gilt für eine Datei, welche dies für die komplette Aufzeichnungsdauer aller bereits erfassten Messdaten erledigt. 

Da es hier ums Programmieren geht, möchte ich den PHP Code natürlich nicht vorenthalten. Dieser beinhaltet einige weitere Features für eine Zusatzanzeige mittels Nextion-Display und eines weiteren ESP8266, auf welche ich aber nicht weiter eingehen werde. Da der Code etwas umfangreicher ist, verpacke ich ihn in das folgende Spoilerfenster. 

PHP Code für das Speichern der Messdaten

<?php
	echo"Start weather script";

	//Aufruf durch die Wetterstation und anlegen und verarbeiten der Wetterdaten!!!
	$Device	= $_GET["Device"];	
	$IP	= $_GET["IP"];
	$VCC = $_GET["VCC"];
	$Temp = $_GET["Temp"];
	$Feuchte = $_GET["Feuchte"];
	$Helligkeit = $_GET["Helligkeit"];
	$Regen = $_GET["Regen"];
	$UV = $_GET["UV"];
	$p_Temp = $_GET["Temp_DS"];
	$p_DS = $_GET["p_DS"];
	$p_DS_SL = $_GET["p_DS_SL"];
	$p_Alt = $_GET["p_Alt"];
	$RMS_Wippe = $_GET["RMS_Wippe"];
	$Windgeschwindigkeit = $_GET["Windgeschwindigkeit"];

	$filename = './Zusatz/'.$Device.'.shas';
	if (file_exists($filename)) 
	{
		echo "<br>Found folder \"Zusatz\" and device!<br>";

		
		$handle = fopen ("./Zusatz/".$Device.".shas" , "r");
		$Inhalt_last = fread($handle, filesize("./Zusatz/".$Device.".shas"));
		fclose($handle);
		
		$Inhalt_last = explode("**", $Inhalt_last);
		//Inhalt_last -->
		// [0] $Device
		// [1] $IP
		// [2] $VCC
		// [3] $Temp
		// [4] $Feuchte
		// [5] $Helligkeit
		// [6] $Regen
		// [7] $UV
		// [8] $p_Temp
		// [9] $p_DS
		// [10] $p_DS_SL
		// [11] $p_Alt
		// [12] $RMS_Wippe
		// [13] $Windgeschwindigkeit
		// [14] date("d.m.Y H:i");
		// [15] Tagesregenmenge
		// [16] Monatsregenmenge
		// [17] Temp_day_String = Temp_day_min / Temp_day_max
		// [18] Feuchte_day_String = Feuchte_day_min / Feuchte_day_max
		// [19] Luftdruck_day_String = Luftdruck_day_min / Luftdruck_day_max	
		// [20] UV_day_String = UV_day_min / UV_day_max		
		// [21] höchste Windgeschwindigkeit der letzten Aufzeichnung -> $Windspeed_now_max
		
		//aktuelle Tagesregenmenge auslesen
		$Tagesregenmenge = $Inhalt_last[15];
	}

	//Korrektur Luftdruckabweichung eingebaut am 29.07.2018
	$p_DS = $p_DS + 57;
	$p_DS_SL = $p_DS_SL + 57;
			

	//////////////////////////////Anlegen des Sensordatenpools//////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	//Zeit festlegen
	$timezone = 'Europe/Berlin';
	date_default_timezone_set($timezone);

	//aktuelle Zeit vom Server
	$timestamp = time();
	$Tag  = date("d",$timestamp);
	$Monat = date("m",$timestamp);	
	$Jahr = date("Y",$timestamp);
	$Day_new = "false";

	//Prüfen ob Ornder für aktuellen Monat schon angelegt ist
	//Wenn Monatsordner noch nicht vorhanden dann anlegen
	if (!is_dir("Statistik Wetter/".$Device."/".$Monat."-".$Jahr))
	{
		echo "<br>Folder \"Statistik Wetter/".$Device."/".$Monat."-".$Jahr."\" not found!<br>";

		mkdir("Statistik Wetter/".$Device."/".$Monat."-".$Jahr , 0777);
		
		$MStat = "File Created";
		
		//Datei für Monatsübersicht anlegen
		$handle = fopen ("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/Monstat.shas" , "w+");
		fwrite($handle, $MStat);
		fclose($handle);	
	}

	//Wenn Monatsordner vorhanden ist
	if (is_dir("Statistik Wetter/".$Device."/".$Monat."-".$Jahr))
	{
		echo "<br>Found folder \"Statistik Wetter/".$Device."/".$Monat."-".$Jahr."\"!<br>";
		
		//Wenn Tagesordner noch nicht vorhanden dann anlegen
		if (!is_dir("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/".$Tag))
		{
			mkdir("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/".$Tag , 0777);
			
			//Regenmenge für regenreichsten Tag zurücksetzen
			$Inhalt_last[15] = "0";
			$Tagesregenmenge = "0";
			
			//Tages Min/Max Values für Anzeigedisplay löschen
			$Day_new = "true";
			$Inhalt_last[21] = "0";
			$Windspeed_now_max = "0";
		}
		
		//Daten für aktuellen Statistiktag schreiben
		//Wenn Tagesordner vorhanden ist
		if (is_dir("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/".$Tag))
		{				
			///////////////////////////////////////////SENSOREN EINLESEN//////////////////////////////////////////////
			//////////////////////////////////////////////////////////////////////////////////////////////////////////
							
			//Datum wann Datei zuletzt geändert wurde
			$Zeit = date("d.m.Y H:i");
			
			
			//sporadische Fehler des DHT22 mit vorher gespeicherten Werten überbrücken
			if($Temp > 120 || $Temp == "nan")
			{
				//als nan setzen --> dieser Wert wird bei der Auswertung durch den vorhergehenden Wert ersetzt
				$Temp = $Inhalt_last[3];
			}

			if($Feuchte > 101 || $Feuchte == "nan")
			{
				//als nan setzen --> dieser Wert wird bei der Auswertung durch den vorhergehenden Wert ersetzt
				$Feuchte = $Inhalt_last[4];
			}
			
			//Der Fileinhalt setzt sich wie folgt zusammen ZEIT**TEMPERATUR_DHT**FEUCHTIGKEIT_DHT**HELLIGKEIT**REGEN/TAUPUNKT**UV-Strahlung**TEMPERATUR_DRUCKSENSOR**LUFTDRUCK**LUFTDRUCK_MEERESSPIEGEL**HÖHENLAGE**WIPPVORGÄNGE_REGENSENSOR**STRING_WINDRICHTUNG_WINDGESCHWINDIGKEIT*##*...
			$Inhalt_Stats = " \r\n".$Zeit."**".$Temp."**".$Feuchte."**".$Helligkeit."**".$Regen."**".$UV."**".$p_Temp."**".$p_DS."**".$p_DS_SL."**".$p_Alt."**".$RMS_Wippe."**".$Windgeschwindigkeit."**".$VCC."*##*";
			
			//Für erste Zeile in Datei ohne Umbruch am Anfang
			//Der Fileinhalt setzt sich wie folgt zusammen ZEIT**TEMPERATUR_DHT**FEUCHTIGKEIT_DHT**HELLIGKEIT**REGEN/TAUPUNKT**UV-Strahlung**TEMPERATUR_DRUCKSENSOR**LUFTDRUCK**LUFTDRUCK_MEERESSPIEGEL**HÖHENLAGE**WIPPVORGÄNGE_REGENSENSOR**STRING_WINDRICHTUNG_WINDGESCHWINDIGKEIT*##*...
			$Inhalt_Stats_first = $Zeit."**".$Temp."**".$Feuchte."**".$Helligkeit."**".$Regen."**".$UV."**".$p_Temp."**".$p_DS."**".$p_DS_SL."**".$p_Alt."**".$RMS_Wippe."**".$Windgeschwindigkeit."**".$VCC."*##*";
			
			//Umlaute auch in Dateinamen richtig schreiben
			$Datei[1] = utf8_encode($Datei[1]);
			
			//Zu speicherde Werte in Statistikfile schreiben
			//Prüfen ob die Datei existiert und wenn ja dann die ausgelesenen Werte in die File speichern
			if (file_exists("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/".$Tag."/Wetterdaten.stats")) 
			{
				//Neue Werte in Datei schreiben
				$handle = fopen("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/".$Tag."/Wetterdaten.stats" , "a+");
				fwrite($handle, $Inhalt_Stats);
				fclose($handle);					
			}
			//Wenn Datei nicht existiert diese erzeugen und dann mit ersten Werten füllen
			else
			{		
				//Neue Werte in Datei schreiben
				$handle = fopen("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/".$Tag."/Wetterdaten.stats" , "w+");
				fwrite($handle, $Inhalt_Stats_first);
				fclose($handle);			
			}

			//Monatsstatisktik auf neu zu setzende Werte prüfen
			if (file_exists("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/Monstat.shas")) 
			{
				//Stringarray == Temp_max##Datum**Temp_min##Datum**P_DS_max##Datum**P_DS_min##Datum**UV_max##Datum**WIND_max##Datum**Regen_ges**Regenreichster Tag
				$handle = fopen ("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/Monstat.shas" , "r");
				$Inhalt_MStat = fread($handle, filesize("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/Monstat.shas"));
				fclose($handle);
				
				//File Created evtl. löschen
				if($Inhalt_MStat == "File Created")
				{
					$Inhalt_MStat = "";
				}
				
				$Inhalt_MStat = explode ("**", $Inhalt_MStat);			
				
				//prüfen ob aktuelle Werte die Werte der Monatsstatistik über- / unterschreiten
				//Temp_max
				//Wert und Datum trennen
				$Temp_max = explode("##", $Inhalt_MStat[0]);
				$Temp_max = $Temp_max[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($Temp_max == "" || $Temp_max <= $Temp)
				{
					$Temp_max = $Temp;
					$Datum_Temp_max = $Zeit;
					$Inhalt_MStat[0] = $Temp_max."##".$Datum_Temp_max;
				}
				
				//Temp_min
				//Wert und Datum trennen
				$Temp_min = explode("##", $Inhalt_MStat[1]);
				$Temp_min = $Temp_min[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($Temp_min == "" || $Temp_min >= $Temp)
				{
					$Temp_min = $Temp;
					$Datum_Temp_min = $Zeit;
					$Inhalt_MStat[1] = $Temp_min."##".$Datum_Temp_min;
				}			

				//p_DS_max
				//Wert und Datum trennen
				$p_DS_max = explode("##", $Inhalt_MStat[2]);
				$p_DS_max = $p_DS_max[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($p_DS_max == "" || $p_DS_max <= $p_DS)
				{
					$p_DS_max = $p_DS;
					$Datum_p_DS_max = $Zeit;
					$Inhalt_MStat[2] = $p_DS_max."##".$Datum_p_DS_max;
				}	

				//p_DS_min
				//Wert und Datum trennen
				$p_DS_min = explode("##", $Inhalt_MStat[3]);
				$p_DS_min = $p_DS_min[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($p_DS_min == "" || $p_DS_min >= $p_DS)
				{
					$p_DS_min = $p_DS;
					$Datum_p_DS_min = $Zeit;
					$Inhalt_MStat[3] = $p_DS_min."##".$Datum_p_DS_min;
				}	

				//UV_max
				//Wert und Datum trennen
				$UV_max = explode("##", $Inhalt_MStat[4]);
				$UV_max = $UV_max[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($UV_max == "" || $UV_max <= $UV)
				{
					$UV_max = $UV;
					$Datum_UV_max = $Zeit;
					$Inhalt_MStat[4] = $UV_max."##".$Datum_UV_max;
				}
				
				//Windgeschwindigkeit und Richtung trennen
				
				//gespeicherter Max Windspeed
				$Windspeed_max = explode("##", $Inhalt_MStat[5]);
				$Windspeed_max = $Windspeed_max[0];
				$Windspeed_now_max = $Inhalt_last[21];
				
				//gemessenen Windspeed zerlegen
				$Windspeed = explode(".", $Windgeschwindigkeit);
				
				//Prüfen ob Zahl gerade oder ungerade und dann diferenzieren
				$Windcount = 0;
				$Timecount = 15;
				while ($Windcount  < count($Windspeed) -1) 
				{
					//die Werte an der Position für Windspeed		
					if ($Windcount % 2 == 0) 
					{					
						//Windgeschwindigkeit ausrechnen
						$Windspeed_value = $Windspeed[$Windcount];
						
						//$Windspeed_value entspricht jetzt wieder X-Werten pro 3s ->
						$Windspeed_value = (($Windspeed_value / 3) * 2.4);
						
						//$Windspeed_value auf Impulse pro Sekunde umgerechnet und die mal 2,4 ergibt Windspeed in km/h
						$Start_date = new DateTime( date("d.m.Y H:i"));
						$Start_date->modify("-" .$Timecount. " minutes");
						$Start_date = $Start_date->format("d.m.Y H:i");
						
						//Wenn Windwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
						if($Windspeed_max == "" || $Windspeed_max <= $Windspeed_value)
						{					
							$Windspeed_max = $Windspeed_value;
							$Datum_Windspeed_max = $Start_date;
							$Inhalt_MStat[5] = $Windspeed_max."##".$Datum_Windspeed_max;				
						}
						
						//durchschnittliche Windgeschwindigkeit der letzten 15min für Anzeigedisplay zusammenzählen
						$Windspeed_round = $Windspeed_round + $Windspeed_value;
						$Windspeed_count++;
						
						//höchste Windgeschwindigkeit der letzten Aufzeichnung ermitteln
						if($Windspeed_value > $Windspeed_now_max)
						{
							$Windspeed_now_max = round($Windspeed_value, 2);
						}
						
						$teiler++;
						$Timecount--;					
					}

					$Windcount++;
				}
				
				//Durchschnittliche Windgeschwindigkeit errechnen
				$Windspeed_round = round(($Windspeed_round / $Windspeed_count), 2);
				
			//Regengesamtmenge			
			if($RMS_Wippe > 0)
			{
				$Inhalt_MStat[6] = $Inhalt_MStat[6] + $RMS_Wippe;
				$Tagesregenmenge = 	$Tagesregenmenge + $RMS_Wippe;
			}
			
			$Monatsregenmenge = $Inhalt_MStat[6];
			
			//regenreichster Tag
			//Wert und Datum trennen
			$R_Tag = explode("##", $Inhalt_MStat[7]);
			$R_Tag = $R_Tag[0];
				
			if($R_Tag == "" || $R_Tag <= $Tagesregenmenge)
			{
				$R_Tag = $Tagesregenmenge;
				$Datum_R_Tag = $Tag.".".$Monat.".".$Jahr;
				$Inhalt_MStat[7] = $R_Tag."##".$Datum_R_Tag;
			}		
				//Werte zurückschreiben
				$MStat = implode("**", $Inhalt_MStat);
				
				//Datei für Monatsübersicht anlegen
				$handle = fopen ("Statistik Wetter/".$Device."/".$Monat."-".$Jahr."/Monstat.shas" , "w+");
				fwrite($handle, $MStat);
				fclose($handle);	
			}

	//---------------		
	//---------------	Statistik seit Aufzeichnung der Wetterdaten	
	//---------------		
			
			//Komplettaufzeichnung OA (Over all) auf neu zu setzende Werte prüfen
			if (file_exists("Statistik Wetter/".$Device.".shas")) 
			{
				//Stringarray == Temp_max##Datum**Temp_min##Datum**P_DS_max##Datum**P_DS_min##Datum**UV_max##Datum**WIND_max##Datum**Regen_ges
				$handle = fopen ("Statistik Wetter/".$Device.".shas" , "r");
				$Inhalt_OAStat = fread($handle, filesize("Statistik Wetter/".$Device.".shas"));
				fclose($handle);
				
				$Inhalt_OAStat = explode ("**", $Inhalt_OAStat);
				
			//prüfen ob aktuelle Werte die Werte der Statistik über- / unterschreiten
			//Temp_max
				//Wert und Datum trennen
				$Temp_OA_max = explode("##", $Inhalt_OAStat[0]);
				$Temp_OA_max = $Temp_OA_max[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($Temp_OA_max == "" || $Temp_OA_max <= $Temp)
				{
					$Temp_OA_max = $Temp;
					$Datum_Temp_OA_max = $Zeit;
					$Inhalt_OAStat[0] = $Temp_OA_max."##".$Datum_Temp_OA_max;
				}
				
				//Temp_min
				//Wert und Datum trennen
				$Temp_OA_min = explode("##", $Inhalt_OAStat[1]);
				$Temp_OA_min = $Temp_OA_min[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($Temp_OA_min == "" || $Temp_OA_min >= $Temp)
				{
					$Temp_OA_min = $Temp;
					$Datum_Temp_OA_min = $Zeit;
					$Inhalt_OAStat[1] = $Temp_OA_min."##".$Datum_Temp_OA_min;
				}			

				//p_DS_max
				//Wert und Datum trennen
				$p_DS_OA_max = explode("##", $Inhalt_OAStat[2]);
				$p_DS_OA_max = $p_DS_OA_max[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($p_DS_OA_max == "" || $p_DS_OA_max <= $p_DS)
				{
					$p_DS_OA_max = $p_DS;
					$Datum_p_DS_OA_max = $Zeit;
					$Inhalt_OAStat[2] = $p_DS_OA_max."##".$Datum_p_DS_OA_max;
				}	

				//p_DS_min
				//Wert und Datum trennen
				$p_DS_OA_min = explode("##", $Inhalt_OAStat[3]);
				$p_DS_OA_min = $p_DS_OA_min[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($p_DS_OA_min == "" || $p_DS_OA_min >= $p_DS)
				{
					$p_DS_OA_min = $p_DS;
					$Datum_p_DS_OA_min = $Zeit;
					$Inhalt_OAStat[3] = $p_DS_OA_min."##".$Datum_p_DS_OA_min;
				}	

				//UV_max
				//Wert und Datum trennen
				$UV_OA_max = explode("##", $Inhalt_OAStat[4]);
				$UV_OA_max = $UV_OA_max[0];
				
				//Wenn Temperaturwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
				if($UV_OA_max == "" || $UV_OA_max <= $UV)
				{
					$UV_OA_max = $UV;
					$Datum_UV_OA_max = $Zeit;
					$Inhalt_OAStat[4] = $UV_OA_max."##".$Datum_UV_OA_max;
				}
				
				//Windgeschwindigkeit und Richtung trennen			
				//gespeicherter Max Windspeed
				$Windspeed_OA_max = explode("##", $Inhalt_OAStat[5]);
				$Windspeed_OA_max = $Windspeed_OA_max[0];
				
				//gemessenen Windspeed zerlegen
				$Windspeed = explode(".", $Windgeschwindigkeit);
				
				//Prüfen ob Zahl gerade oder ungerade und dann diferenzieren
				$Windcount = 0;
				$Timecount = 15;
				$Windrichtung = array(0,0,0,0,0,0,0,0,0,0,0,0);	
				$Windstill = "true";
				
				while ($Windcount  < count($Windspeed) -1) 
				{
					//die Werte an der Position für Windspeed		
					if ($Windcount % 2 == 0) 
					{					
						//Windgeschwindigkeit ausrechnen
						$Windspeed_value = $Windspeed[$Windcount];
						
						//$Windspeed_value entspricht jetzt wieder X-Werten pro 3s ->
						$Windspeed_value = (($Windspeed_value / 3) * 2.4);
						
						//$Windspeed_value auf Impulse pro Sekunde umgerechnet und die mal 2,4 ergibt Windspeed in km/h
						$Start_date = new DateTime( date("d.m.Y H:i"));
						$Start_date->modify('-'.$Timecount.' minutes');
						$Start_date = $Start_date->format("d.m.Y H:i");
						
						//Wenn Windwert noch leer ist diesen mit dem aktuellen Wert füllen (1 Wert im Monat!)
						if($Windspeed_OA_max == "" || $Windspeed_OA_max <= $Windspeed_value)
						{					
							$Windspeed_OA_max = $Windspeed_value;
							$Datum_Windspeed_OA_max = $Start_date;
							$Inhalt_OAStat[5] = $Windspeed_OA_max."##".$Datum_Windspeed_OA_max;				
						}
						
						$teiler++;
						$Timecount--;					
					}
					else
					{
						//Windrichtung
						/*aufteilen des Array in die jeweiligen Himmelsrichtungen
						[0] = N		= 254
						[1] = N-NE	= 62
						[2] = NE-E	= 76
						[3] = E		= 9	
						[4] = E-SE	= 21
						[5] = SE-S	= 13	
						[6] = S		= 37	
						[7] = S-SW	= 140
						[8] = SW-W	= 126
						[9] = W		= 47
						[10] = W-NW	= 146
						[11] = NW-N	= 183
						*/	
						
						//Prüfen ob überhaupt Wind ging und nur dann die Richtung berücksichtigen
						if($Windspeed[$Windcount-1] > 0)
						{
							$Windstill = "false";
						
							//Nord
							if ($Windspeed[$Windcount] >= 252 && $Windspeed[$Windcount] <= 255)
							{
								$Windrichtung[0] = $Windrichtung[0]+1;
							}	

							//Nord - Nord-Ost
							if ($Windspeed[$Windcount] >= 60 && $Windspeed[$Windcount] <= 64) 
							{
								$Windrichtung[1] = $Windrichtung[1]+1;
							}

							//Nord-Ost - Ost
							if ($Windspeed[$Windcount] >= 74 && $Windspeed[$Windcount] <= 78) 
							{
								$Windrichtung[2] = $Windrichtung[2]+1;
							}

							//Ost
							if ($Windspeed[$Windcount] >= 7 && $Windspeed[$Windcount] <= 11)
							{
								$Windrichtung[3] = $Windrichtung[3]+1;
							}				
				
							//Ost - Süd-Ost
							if ($Windspeed[$Windcount] >= 19 && $Windspeed[$Windcount] <= 23)
							{
								$Windrichtung[4] = $Windrichtung[4]+1;
							}

							//Süd-Ost - Süd
							if ($Windspeed[$Windcount] >= 11 && $Windspeed[$Windcount] <= 15) 
							{
								$Windrichtung[5] = $Windrichtung[5]+1;
							}
								
							//Süd
							if ($Windspeed[$Windcount] >= 35 && $Windspeed[$Windcount] <= 39) 
							{
								$Windrichtung[6] = $Windrichtung[6]+1;
							}

							//Süd - Süd-West
							if ($Windspeed[$Windcount] >= 138 && $Windspeed[$Windcount] <= 142)
							{
								$Windrichtung[7] = $Windrichtung[7]+1;
							}

							//Süd-West - West
							if ($Windspeed[$Windcount] >= 124 && $Windspeed[$Windcount] <= 128)
							{
								$Windrichtung[8] = $Windrichtung[8]+1;
							}
							
							//West
							if ($Windspeed[$Windcount] >= 45 && $Windspeed[$Windcount] <= 49) 
							{
								$Windrichtung[9] = $Windrichtung[9]+1;
							}
								
							//West - Nord-West
							if ($Windspeed[$Windcount] >= 144 && $Windspeed[$Windcount] <= 148) 
							{
								$Windrichtung[10] = $Windrichtung[10]+1;
							}

							//Nord-West - Nord
							if ($Windspeed[$Windcount] >= 181 && $Windspeed[$Windcount] <= 185)
							{
								$Windrichtung[11] = $Windrichtung[11]+1;
							}				
						
						}//Prüfen auf Windstille ENDE				
					}
					
					$Windcount++;
				}
				
				
				if ($Windstill == "false")
				{	
					//häufigste Windrichtung der letzten 15min suchen und Himmelsrichtung ermitteln
					$value = max($Windrichtung);
					$Array_pos = array_search($value, $Windrichtung);
					
					if ($Array_pos == "0")
					{
						$Windrichtung_String = "N";
					}
					
					if ($Array_pos == "1")
					{
						$Windrichtung_String = "N-NO";
					}		

					if ($Array_pos == "2")
					{
						$Windrichtung_String = "NO-O";
					}

					if ($Array_pos == "3")
					{
					$Windrichtung_String = "O";
					}

					if ($Array_pos == "4")
					{
					$Windrichtung_String = "O-SO";
					}			

					if ($Array_pos == "5")
					{
					$Windrichtung_String = "SO-S";
					}

					if ($Array_pos == "6")
					{
					$Windrichtung_String = "S";
					}

					if ($Array_pos == "7")
					{
					$Windrichtung_String = "S-SW";
					}

					if ($Array_pos == "8")
					{
					$Windrichtung_String = "SW-W";
					}		

					if ($Array_pos == "9")
					{
					$Windrichtung_String = "W";
					}

					if ($Array_pos == "10")
					{
					$Windrichtung_String = "W-NW";
					}

					if ($Array_pos == "11")
					{
					$Windrichtung_String = "NW-N";
					}			

				}
				else
				{
					$Windrichtung_String = "k.A.";
				}
				
				//Regenreichster Monat seit beginn der Aufzeichnung
				$Regenmonat_OA = explode("##", $Inhalt_OAStat[6]);
				$Regenmenge_OA = $Regenmonat_OA[0];			
				
				if($Inhalt_OAStat[6] == "" || $Inhalt_MStat[6] > $Regenmenge_OA)
				{
					$Inhalt_OAStat[6] = $Inhalt_MStat[6]."##".$Monat.".".$Jahr;
				}	
				
				$Regentag_OA = explode("##", $Inhalt_OAStat[7]);
				$Regenmenge_tag_OA = $Regentag_OA[0];					

				//Regenreichster Tag seit beginn der Aufzeichnung
				if($Inhalt_OAStat[7] == "" || $Regenmenge_tag_OA <= $R_Tag)
				{
					$Datum_R_Tag = $Tag.".".$Monat.".".$Jahr;
					$Inhalt_OAStat[7] = $R_Tag."##".$Datum_R_Tag;
				}

				//Werte zurückschreiben
				$OAStat = implode("**", $Inhalt_OAStat);
				
				//Datei für Monatsübersicht anlegen
				$handle = fopen ("Statistik Wetter/".$Device.".shas" , "w+");
				fwrite($handle, $OAStat);
				fclose($handle);	
			
			}//OAStat Exists ENDE		
		}//Day Exists ENDE
	}

	//Datei mit dem aktuellen Werten neu befüllen
	if (file_exists($filename)) 
	{
		if ($Day_new == "true")
		{
			$Temp_day_min = $Temp;
			$Temp_day_max = $Temp;
			$Feuchte_day_min = $Feuchte;
			$Feuchte_day_max = $Feuchte;
			$Luftdruck_day_min = $p_DS;
			$Luftdruck_day_max = $p_DS;
			$UV_day_min = $UV;
			$UV_day_max = $UV;
		}
		else
		{
			//Temp_min / Temp_max lesen
			$Temp_day_exp = explode(" | ", $Inhalt_last[17]);
			$Temp_day_min = $Temp_day_exp[0];
			$Temp_day_max = $Temp_day_exp[1];
			
			//Feuchte_min / Feuchte_max lesen
			$Feuchte_day_exp = explode(" | ", $Inhalt_last[18]);
			$Feuchte_day_min = $Feuchte_day_exp[0];
			$Feuchte_day_max = $Feuchte_day_exp[1];

			//Luftdruck_min / Luftdruck_max lesen
			$Luftdruck_day_exp = explode(" | ", $Inhalt_last[19]);
			$Luftdruck_day_min = $Luftdruck_day_exp[0];
			$Luftdruck_day_max = $Luftdruck_day_exp[1];

			//UV_min / UV_max lesen
			$UV_day_exp = explode(" | ", $Inhalt_last[20]);
			$UV_day_min = $UV_day_exp[0];
			$UV_day_max = $UV_day_exp[1];
			
			//Tagestemperatur MAX
			if($Temp > $Temp_day_max)
			{
				$Temp_day_max = $Temp;
			}

			//Tagestemperatur MIN
			if($Temp < $Temp_day_min)
			{
				$Temp_day_min = $Temp;
			}
		
			//Tagesfeuchte MAX
			if($Feuchte > $Feuchte_day_max)
			{
				$Feuchte_day_max = $Feuchte;
			}

			//Tagesfeuchte MIN
			if($Feuchte < $Feuchte_day_min)
			{
				$Feuchte_day_min = $Feuchte;
			}

			//Tagesluftdruck MAX
			if($p_DS > $Luftdruck_day_max)
			{
				$Luftdruck_day_max = $p_DS;
			}

			//Tagesluftdruck MIN
			if($p_DS < $Luftdruck_day_min)
			{
				$Luftdruck_day_min = $p_DS;
			}
		
			//TagesUV MAX
			if($UV > $UV_day_max)
			{
				$UV_day_max = $UV;
			}

			//TagesUV MIN
			if($UV < $UV_day_min)
			{
				$UV_day_min = $UV;
			}
			
		}
		
		$Temp_day_String = $Temp_day_min. " | " .$Temp_day_max;
		$Feuchte_day_String = $Feuchte_day_min. " | " .$Feuchte_day_max;
		$Luftdruck_day_String = $Luftdruck_day_min. " | " .$Luftdruck_day_max;
		$UV_day_String = $UV_day_min. " | " .$UV_day_max;
		
		//Wenn beide Dateien erfolgreich geladen wurden
		$Inhalt = $Device."**".$IP."**".$VCC."**".$Temp."**".$Feuchte."**".$Helligkeit."**".$Regen."**".$UV."**".$p_Temp."**".$p_DS."**".$p_DS_SL."**".$p_Alt."**".$RMS_Wippe."**".$Windspeed_round."**".date("d.m.Y H:i")."**".$Tagesregenmenge."**".$Monatsregenmenge."**".$Temp_day_String."**".$Feuchte_day_String."**".$Luftdruck_day_String."**".$UV_day_String."**".$Windspeed_now_max."**".$Windrichtung_String."**";
		
		//Datei öffnen und neuen Wert schreiben
		$handle = fopen ("./Zusatz/".$Device.".shas" , "w+");
		fwrite($handle, $Inhalt);
		fclose($handle);		

		echo "Inhalt:".$Inhalt;
	}

	//Anzeigedisplay Chartanzeige setzen

	//Temperatur
	if (file_exists("./Zusatz/".$Device."_Tempchart.shas")) 
	{	
		$handle = fopen ("./Zusatz/".$Device."_Tempchart.shas" , "r");
		$Inhalt_chart = fread($handle, filesize("./Zusatz/".$Device."_Tempchart.shas"));
		fclose($handle);
		
		//Array anlegen (auslesen) und anschließend 1. Wert löschen + den aktuellen Wert hinten anhängen
		$Inhalt_chart = explode("_", $Inhalt_chart);
		array_shift($Inhalt_chart);
		array_push($Inhalt_chart, $Temp);
		
		$Inhalt_chart = implode("_", $Inhalt_chart);

		//Datei öffnen und neuen Wert schreiben
		$handle = fopen ("./Zusatz/".$Device."_Tempchart.shas" , "w+");
		fwrite($handle, $Inhalt_chart);
		fclose($handle);	
	}

	//Temperatur Drucksensor
	if (file_exists("./Zusatz/".$Device."_pTempchart.shas")) 
	{	
		$handle = fopen ("./Zusatz/".$Device."_pTempchart.shas" , "r");
		$Inhalt_chart = fread($handle, filesize("./Zusatz/".$Device."_pTempchart.shas"));
		fclose($handle);
		
		//Array anlegen (auslesen) und anschließend 1. Wert löschen + den aktuellen Wert hinten anhängen
		$Inhalt_chart = explode("_", $Inhalt_chart);
		array_shift($Inhalt_chart);
		array_push($Inhalt_chart, $p_Temp);
		
		$Inhalt_chart = implode("_", $Inhalt_chart);

		//Datei öffnen und neuen Wert schreiben
		$handle = fopen ("./Zusatz/".$Device."_pTempchart.shas" , "w+");
		fwrite($handle, $Inhalt_chart);
		fclose($handle);	
	}

	//Feuchtigkeit
	if (file_exists("./Zusatz/".$Device."_Feuchtechart.shas")) 
	{	
		$handle = fopen ("./Zusatz/".$Device."_Feuchtechart.shas" , "r");
		$Inhalt_chart = fread($handle, filesize("./Zusatz/".$Device."_Feuchtechart.shas"));
		fclose($handle);
		
		//Array anlegen (auslesen) und anschließend 1. Wert löschen + den aktuellen Wert hinten anhängen
		$Inhalt_chart = explode("_", $Inhalt_chart);
		array_shift($Inhalt_chart);
		array_push($Inhalt_chart, $Feuchte);
		
		$Inhalt_chart = implode("_", $Inhalt_chart);

		//Datei öffnen und neuen Wert schreiben
		$handle = fopen ("./Zusatz/".$Device."_Feuchtechart.shas" , "w+");
		fwrite($handle, $Inhalt_chart);
		fclose($handle);	
	}	

	//Luftdruck	
	if (file_exists("./Zusatz/".$Device."_Preschart.shas")) 
	{	
		$handle = fopen ("./Zusatz/".$Device."_Preschart.shas" , "r");
		$Inhalt_chart = fread($handle, filesize("./Zusatz/".$Device."_Preschart.shas"));
		fclose($handle);
		
		//Array anlegen (auslesen) und anschließend 1. Wert löschen + den aktuellen Wert hinten anhängen
		$Inhalt_chart = explode("_", $Inhalt_chart);
		array_shift($Inhalt_chart);
		array_push($Inhalt_chart, $p_DS);
		
		$Inhalt_chart = implode("_", $Inhalt_chart);

		//Datei öffnen und neuen Wert schreiben
		$handle = fopen ("./Zusatz/".$Device."_Preschart.shas" , "w+");
		fwrite($handle, $Inhalt_chart);
		fclose($handle);	
	}	

	//Regenmenge
	if (file_exists("./Zusatz/".$Device."_Rainchart.shas")) 
	{	
		$handle = fopen ("./Zusatz/".$Device."_Rainchart.shas" , "r");
		$Inhalt_chart = fread($handle, filesize("./Zusatz/".$Device."_Rainchart.shas"));
		fclose($handle);
		
		$Regenmenge = $RMS_Wippe * 0.273;
		
		//Array anlegen (auslesen) und anschließend 1. Wert löschen + den aktuellen Wert hinten anhängen
		$Inhalt_chart = explode("_", $Inhalt_chart);
		array_shift($Inhalt_chart);
		array_push($Inhalt_chart, $Regenmenge);
		
		$Inhalt_chart = implode("_", $Inhalt_chart);

		//Datei öffnen und neuen Wert schreiben
		$handle = fopen ("./Zusatz/".$Device."_Rainchart.shas" , "w+");
		fwrite($handle, $Inhalt_chart);
		fclose($handle);	
	}	

	//UV Index	
	if (file_exists("./Zusatz/".$Device."_UVchart.shas")) 
	{	
		$handle = fopen ("./Zusatz/".$Device."_UVchart.shas" , "r");
		$Inhalt_chart = fread($handle, filesize("./Zusatz/".$Device."_UVchart.shas"));
		fclose($handle);
		
		//Array anlegen (auslesen) und anschließend 1. Wert löschen + den aktuellen Wert hinten anhängen
		$Inhalt_chart = explode("_", $Inhalt_chart);
		array_shift($Inhalt_chart);
		array_push($Inhalt_chart, $UV);
		
		$Inhalt_chart = implode("_", $Inhalt_chart);

		//Datei öffnen und neuen Wert schreiben
		$handle = fopen ("./Zusatz/".$Device."_UVchart.shas" , "w+");
		fwrite($handle, $Inhalt_chart);
		fclose($handle);	
	}

	//Windgeschwindigkeit
	if (file_exists("./Zusatz/".$Device."_Windchart.shas")) 
	{	
		$handle = fopen ("./Zusatz/".$Device."_Windchart.shas" , "r");
		$Inhalt_chart = fread($handle, filesize("./Zusatz/".$Device."_Windchart.shas"));
		fclose($handle);
		
		//Array anlegen (auslesen) und anschließend 1. Wert löschen + den aktuellen Wert hinten anhängen
		$Inhalt_chart = explode("_", $Inhalt_chart);
		array_shift($Inhalt_chart);
		array_push($Inhalt_chart, $Windspeed_round);
		
		$Inhalt_chart = implode("_", $Inhalt_chart);

		//Datei öffnen und neuen Wert schreiben
		$handle = fopen ("./Zusatz/".$Device."_Windchart.shas" , "w+");
		fwrite($handle, $Inhalt_chart);
		fclose($handle);	
	}
		
?>

 

Anzeige der gespeicherten Messdaten

Nachdem die Daten mit dem vorhergehenden Script kontinuierlich gespeichert werden, sollen diese natürlich auch angezeigt werden. Dabei wollte ich zum einen wie bei den Kaufwetterstationen die aktuellen Werte, zum anderen aber auch einen längerfristigen Verlauf der aufgezeichneten Daten grafisch darstellen können. Das ganze sollte ebenfalls wieder für alle möglichen Geräte und unabhängig vom Betriebssystem zugänglich sein, weshalb ich auch hier auf ein Webscript setzte. 

Die Anzeige der aktuellen Daten ist dabei weniger ein Problem. Das Script sucht in der oben vorgestellten Ordnerstruktur nach dem aktuellen Tag, öffnet die Datei und wertet die zuletzt eingetragene Zeile aus, da diese die aktuellsten Messdaten enthält.

Für die Anzeige des Verlaufs über mehrere Tage musste ich allerdings ein wenig mehr Arbeit investieren, da die Trennung in einzelne Ordner / Dateien hier natürlich hinderlicher als eine endlos fortgeführte Liste oder Datenbank ist. Außerdem wollte ich die Daten als Verlaufs-Chart darstellen, um auf den ersten Blick Änderungen oder Schwankungen gleich erkennen zu können. Jetzt kann man sich solch eine Funktionalität sicherlich selbst erstellen, da es für mich beim Programmieren aber nicht darum geht ständig das Rad neu erfinden zu wollen, schaute ich mich erst einmal nach bereits fertigen Anzeigelösungen um und wurde bei den Google-APIs fündig.

 

Google Chart API

Da ich schon seit einiger Zeit ein Google Developer Konto besaß und auch damals schon mehrfach andere von Google bereitgestellte API Funktionen genutzt hatte, stand nach dem Anschauen der Startseite von Google Chart* recht schnell fest, dass ich diese Funktion nutzen werde. Bezüglich Google und deren Monopolstellung mag man denken was man möchte, die für Entwickler angebotenen Funktionen sind meiner Meinung nach aber echt super. Das die Nutzung dieser Services dann, wie bei der Chart API, zum Teil sogar kostenlos möglich ist, finde ich ebenfalls bemerkenswert. 

Wie für gewöhnlich findet man auf der Seite der Google Chart API* eine anständige Dokumentation, wie die einzelnen Funktionen aufgerufen und welche Daten übergeben werden müssen. Das Herumprobieren mit den Beispielcodes bringt für mich hier immer noch die Bestätigung, dass ich die Doku auch richtig verstanden habe und alles so funktioniert wie angenommen. Außerdem macht es mir Spaß herum zu experimentieren 🙂 .

Dies kann man nun natürlich auf seinem eigenen Webspace machen, in dem man eine entsprechende Testdatei anlegt, diese mit dem Test-Code befüllt und dann im Webbrowser aufruft. Ich nutze in letzter Zeit häufiger Onlinetools wie zum Beispiel den Online-Editor Liveweave*. Dieser hat den Vorteil, dass die Änderungen am eigegebenen Code sofort angezeigt werden und man sich das hin- und herspringen zwischen IDE und Browser spart. Das ein wenig abgeänderte Quick-Start Beispiel schaut dann wie folgt aus.

       

Screenshot des in Liveweave geladenen Quick-Start Beispiels der Chart API

 

Da ich aufgrund der verschiedenen Wertebereiche der Messwerte gleich mehrere Charts anzeigen lassen wollte, erstellte ich eine PHP Funktion, welche es mir ermöglicht genau dies zu tun. Diese Funktion wird anschließend zum Erzeugen der Charts mehrfach aufgerufen und die anzuzeigenden Überschriften, Farben, Messwerte,  etc. als Parameter übergeben. Die Aufrufe dieser Funktion lagerte ich in eine externe PHP-Datei aus, womit es nun möglich ist ein weiteres Chart der Anzeigeseite hinzuzufügen, ohne am Quellcode der Seite Änderungen durchführen zu müssen.   

 

// Funktion zur Anzeige der Kurven
function ShowChart($Chartname, $Wert1, $Wert2, $Zeit, $Array, $Array2, $Color1, $Color2, $Chartbeschriftung, $Skalen, $Charttyp, $Datum_beschr, $Smooth = "false") 
{		
    // Prüfen ob eine Zweite Achsenbeschriftung angegeben wurde
    if ($Wert2 != "")		
    {		
        // 2 Kurven
        // Ausgabe des Datenblockheaders mit der zu setzenden Kurvenbeschriftung
        echo
        "											 
            var data_".utf8_decode($Chartname)." = new google.visualization.arrayToDataTable([
                ['Uhrzeit', '".$Wert1."', '".$Wert2."'],				  
        ";
        
        // Anzahl Skalen und dazugehörige Kurvenfarben setzen			
        $Chartstyle = 
        "
            series: 
            {
            0:{ targetAxisIndex: 0 },
            1: { targetAxisIndex: ".($Skalen-1)."}
            },
            colors:['".$Color1."','".$Color2."'],
        ";
    }
    else			
    {
        // 1 Kurve
        // Ausgabe des Datenblockheaders mit der zu setzenden Kurvenbeschriftung
        echo
        "											 
            var data_".utf8_decode($Chartname)." = new google.visualization.arrayToDataTable([
                ['Uhrzeit', '".$Wert1."'],				  
        ";	
        
        // Skala und dazugehörige Kurvenfarbe setzen
        $Chartstyle = "
            series: 
            {
            0:{ targetAxisIndex: 0 }
            },
            colors:['".$Color1."'],
        ";	
    }
    
    // Prüfen ob Kurve geglättet angezeigt werden soll
    if ($Smooth == "true")
    {
        $Smooth_string = "curveType: 'function',";
    }
    
    // Werte sammeln und anschließend in das Chart einfügen
    for($Statcount = 0; $Statcount < count($Array); $Statcount++) 
    {
        // Uhrzeit aus Zeitstring extrahieren 
        $Zeit_split = explode(" ", $Zeit[$Statcount]);
        
        // Prüfen ob aktuelle Position kleiner letztem Wert
        if($Statcount < count($Array) - 1)
        {
            // 1 oder 2 Kurven einbinden
            if ($Wert2 != "")
                echo "['".$Zeit_split[1]."',".$Array[$Statcount].",".$Array2[$Statcount]."],";
            else
                echo "['".$Zeit_split[1]."',".$Array[$Statcount]."],";
        }
        else
        {		
            // Einfügen des letzten Wertepaars ohne , am Ende)

            // 1 oder 2 Kurven einbinden
            if ($Wert2 != "")
                echo "['".$Zeit_split[1]."',".$Array[$Statcount].",".$Array2[$Statcount]."],";
            else
                echo "['".$Zeit_split[1]."',".$Array[$Statcount]."]";
        }
    }	

    //Chartoptionen einfügen
    echo 
    "
        ]);
        
        var options_".utf8_decode($Chartname)." = 
        {
        title: '".utf8_decode($Chartbeschriftung)." vom ".$Datum_beschr."',
        titlePosition: 'out',
        
        vAxis: {viewWindowMode:'explicit'},
        $Smooth_string
        $Chartstyle
            
        chartArea:{left:45,top:70,width:'90%',height:'55%'},
        legend: {position: 'top', textStyle: {color: '#333', fontSize: 12}}
        };
                                
        var charts_".utf8_decode($Chartname)." = new google.visualization.".$Charttyp."(document.getElementById('chart_div_".utf8_decode($Chartname)."'));
        charts_".utf8_decode($Chartname).".draw(data_".utf8_decode($Chartname).", options_".utf8_decode($Chartname).");
    ";	
}

 

Der Inhalt der externen PHP Datei mit den multiplen Aufrufen der ShowChart()-Funktion wird dann ganz einfach per include-Befehl in die Anzeigeseite eingebunden und schaut wie folgt aus.

 

<?php
	//Mehrfachansicht
		
	//CHARTNAME , BEZEICHNUNG WERT1 , BEZEICHNUNG WERT2, X-ACHSE, Y-ACHSE1, Y-ACHSE2, FARBE Y-ACHSE1, FARBE Y-ACHSE1, ->
        // -> BESCHRIFTUNG, SKALENANZAHL, SKALENTYP 
	ShowChart("Temperatur", "Temperatur DHT22 (°C)", "Temperatur Drucksensor (°C)", $Uhrzeit, $Temp, $p_Temp, "red", "purple", 
			  "Temperatur", "1", "LineChart", $Zeitraum_beschr); 

	ShowChart("Feuchtigkeit", "Luftfeuchtigkeit DHT22 (%)", "", $Uhrzeit, $Feuchte, "", "blue", "" , "Luftfeuchtigkeit", "1", 
			  "LineChart", $Zeitraum_beschr);

	ShowChart("Taufeuchte", "Feuchtigkeit / Tau", "", $Uhrzeit, $Regen, "", "blue","", "Tau / Tropffeuchtigkeit", "1", 
			  "LineChart", $Zeitraum_beschr, "true");

	ShowChart("UV", "UV Belastung (mW/cm²)", "Helligkeit (0 - 10)", $Uhrzeit, $UV, $Helligkeit,"red","orange", 
			  "UV Strahlung und Lichteinfall", "2", "LineChart", $Zeitraum_beschr);

	ShowChart("Luftdruck", "Luftdruck NN errechnet (mbar)", "Luftdruck gemessen (mbar)", $Uhrzeit, $p_DS_SL, $p_DS_SL, 
			  "lightblue","blue", "Luftdruck", "1", "LineChart", $Zeitraum_beschr);

	ShowChart("Regenmenge", "Regenmenge (l/m² [15min])", "Regenmenge (l/m² [1h])", $Uhrzeit, $RMS_Wippe, $RMS_Wippe_h, 
			  "darkred", "lightgrey", "Niederschlagsmenge", "1", "LineChart", $Zeitraum_beschr, "true");

	ShowChart("Windgeschwindigkeit", "Windgeschwindigkeit (km/h)", "", $Minuten, $Windgeschwindigkeit, "", "lightblue",
			  "", "Windgeschwindigkeit", "1", "LineChart", $Zeitraum_beschr, "true");

	ShowChart("Windrichtung", "Windrichtung (Häufigkeit / min)", "", $Winddirection, $Windrichtung, "", "lightgreen",
			  "", "Windrichtung", "1", "SteppedAreaChart", $Zeitraum_beschr);

	ShowChart("Batteriespannung", "Batteriespannung (V)", "", $Uhrzeit, $VCC_overview, "", "red",
			  "", "Batteriespannung", "1", "LineChart", $Zeitraum_beschr);	

?>

 

Da ich zwischen der Anzeige von einen Tag und der Anzeige eines Zeitraumes unterschiedliche Achsenbeschriftung  in den Charts verwende, gibt es 2 Dateien mit dem oben gezeigten Inhalt, welche sich lediglich am übergebenen Parameter „$Datum_beschr“ unterscheiden. Da diese Änderung wirklich nur die Beschriftung der Charts betrifft und beide Dateien weiter unten im Beitrag sowieso noch einmal angehängt sind, stelle ich die Zweite der beiden Dateien hier nicht noch extra vor. Die mit dieser Methode erzeugten Charts können sich meiner Meinung nach durchaus sehen lassen und bieten genau den Informationsgehalt, welchen ich mir erhofft habe. Sie zeigen den Verlauf der Messdaten über einen bestimmten Zeitraum in übersichtlicher Form.

 

Screenshot der Chartanzeige vom 06.06.2022 bis zum aktuellen Zeitpunkt am 07.06.2022

 

Um die gewünschte Wetterstation, den zu setzenden Tag und den anzuzeigenden Zeitraum auch auswählen zu können, habe ich oberhalb der Chartanzeigen ein paar einfache HTML-Steuerelemente integriert, über welche ich bequem die nötigen Einstellungen vornehmen kann. Außerdem werden hier die Zusammenfassung der Minimal- und Maximalwerte in 2 Anzeigenboxen dargestellt. In der rechten der beiden Boxen kann darüber hinaus noch von der Monatsübersicht auf die Gesamtübersicht seit Aufzeichnungsbeginn umgeschaltet werden.

  

Screenshot der Steuerelemente

 

Somit kann über die angesprochene PHP-Datei sowohl die Anzeige, als auch die Steuerung der anzuzeigenden Daten durchgeführt werden. Weitere Auswertemöglichkeiten habe ich seit dem initialen Anlegen der hier gezeigten Dateien aus Zeitmangel leider nicht mehr umgesetzt. Da ich die ESP8266 Wetterstation* nach knapp zweieinhalb Jahren im April 2022 wieder aus ihrem „Dornröschenschlaf“ geweckt habe, kann das aber vielleicht noch kommen.

Anbei nun noch die PHP-Scripte für die Anzeigeseite der Wetterdaten. Hier habe ich mich nun doch dazu hinreisen lassen den Code im Jahr 2022 zu optimieren und verschiedene Teile in externe PHP-Dateien auszulagern. Das macht das Projekt für mich ein wenig übersichtlicher und Änderungen sind leichter umsetzbar. Die Includes dafür befinden sich in der Hauptdatei „Wettercharts.php“, welche ich hier als erstes vorstellen möchte. 

Da die Codeausschnitte hier ebenfalls recht umfangreich sein können, verpacke ich auch dies wieder in ausklappbare Spoilerfenster. 

 

PHP und HTML Code der Hauptdatei "Wettercharts.php"

<?php
	// relative Pfade zum Statistik und Zusatz Ordner
	$path_ext = "Statistik Wetter/";
	$path_zus = "Zusatz/";

	//GET Variablen
	$Day_sel	=   $_GET["Day_sel"];  // Wenn anderer Monat gewählt wurde
	$Month_sel	=   $_GET["Month_sel"];  // Wenn ein anderer Monat gewählt wurde
	$Range_sel	=   $_GET["Range_sel"];  // Wenn andere Anzeigerange gewählt wurde
	$Failure	=   $_GET["Failure"];  // Wenn andere Anzeigerange gewählt wurde
	$Oview_sel	=   $_GET["Oview_sel"];  // Welche Schnellübersicht gwählt werden soll
	$Dev_sel	=   $_GET["Dev_sel"];  // gewähltes Gerät welches angezeigt werden soll

	// aktuelle Zeit vom Server
	$timestamp = time();

	// Device setzen  -> wenn keiner gewählt dann die SLSS Wetterstation vorwählen
	if($Dev_sel == "")
	{
		$Device= "ESP-Wetterstation";
		$Device_string = "Balkonwetter Kammerberg";
	}
	else
	{			
		$Device = $Dev_sel;  // Devicebezeichnung übergeben
		
		// Name von aktueller Wetterstation setzen
		if($Device == "ESP-Wetterstation")
			$Device_string = "Balkonwetter Kammerberg";		
		else
			$Device_string = $Device;
	}

	// Prüfen welcher Tag gewünscht
	if($Day_sel == "")
		$Tag  = date("d",$timestamp);
	else
		$Tag = $Day_sel; 
	
	// Prüfen welcher Monat gewählt wurde
	if($Month_sel == "")
	{
		// kein Monat gewählt --> aktuellen Monat setzen
		$Monat = date("m-Y",$timestamp);
		
		//Jahr extrahieren
		$Jahr = explode("-", $Monat);
		$Mon_string = $Jahr[0];
		$Jahr = $Jahr[1];
	}
	else
	{
		// gewählten Monat setzen
		$Monat = $Month_sel;

		//Jahr ermitteln
		$Jahr = explode("-", $Month_sel);
		$Mon_string = $Jahr[0];
		$Jahr = $Jahr[1];
	}	
	
	// Anzeigedauer auf 1 Tag setzen, wenn nichts ausgewählt oder übergeben wurde
	if($Range_sel == "")
	{
		$Range_sel = 1;
	}

	// Pfad zur anzuzeigenden Wetterstation
	$dir_Stats = $path_ext.$Device."/";

	// Anzeigbare Monate + Jahre ermitteln
	if (file_exists($dir_Stats)) 
	{
		$files = scandir($dir_Stats);
			
		// Arrays für die Anzeige anlegen
		$Day_arr = array();
		$Month_arr = array();
		
		// über alle Ordnerinhalte iterieren
		foreach($files as $folder) 
		{
			// ".", ".." und die Datei der Monatsstatistik nicht beachten
			if($folder != "." && $folder != ".." && $folder != "Monstat.shas")
			{
				//vorhandenen Monat-Jahr in den Array schieben 
				array_push($Month_arr, $folder);							
			}			
		}
						
		// alle Tage im Monatsordner auslesen
		$files_days = scandir($dir_Stats.$Monat);

		// über alle Ordnerinhalte iterieren
		foreach($files_days as $folder_days) 
		{
			if($folder_days != "." && $folder_days != ".." && $folder_days != "Monstat.shas")
			{		
				//vorhandenen Tag in den Array schieben 
				array_push($Day_arr, $folder_days);			
			}
		}			
			
		//Array umgekehrt sortieren
		rsort($Month_arr);
		sort($Day_arr);			
	}

	// Überprüfen ob ausgewählter Tag exisitert -> wenn nicht Fehlermeldung anzeigen und letzten Tag im verfügbaren Monat anzeigen
	$dir_full = $path_ext.$Device."/".$Monat."/".$Tag;

	// Prüfen ob Datei existiert	
	if (!file_exists($dir_full) )
	{		
		if ($Failure != "")
		{
			header("Location: Wettercharts.php?Month_sel=".$Monat."&Day_sel=".$Day_arr[count($Day_arr)-1]."&Dev_sel=".$Device."&Failure=nofile");
		}	
	}

	// Fehlermeldung über nicht vorhandenen Anzeigetag ausgeben
	if ($Failure == "nofile")
	{
		echo
		" 	
			<div id=\"Errorlabel\" style=\"position: absolute; left: 95px; top: 535px; width: 1107px; height: 16px; text-align: justify;\">
			<span class=\"arial12808080FFFFFFt\"><font color=\"red\">Der ausgewählte Tag ist nicht in den Wetteraufzeichnungen vorhanden.Zur Anzeige im ausgewählten Monat wurde der letzte verfügbare Tag (".$Day_arr[count($Day_arr)-1].") gesetzt! </font></span></div>
		";
	}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>SLSS Wettervisualization Tool</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="refresh" content="900">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="icon" type="image/png" href="<?php echo $path_zus; ?>Wetter_files/pageicon.png">
<link rel="stylesheet" type="text/css" href="<?php echo $path_zus; ?>Wetter_files/Homeprojekt.css">

<style type="text/css">
div#dhecenterdiv1 {margin: 0px auto; position: relative; top: 40px; width: 1750px;}
body {margin: 0px; padding: 0px; }
form {margin: 0px; padding: 0px; border: 0px;}
.smooth1 {border: 1px #808080 solid; border-radius:5px; background:linear-gradient( white, silver, white); color:  #808080; font-family: Arial, Tahoma, Helvetica, sans-serif; font-size: 18px; text-decoration: none;}
body {margin: 0px; padding: 0px; text-align: center; }
form {margin: 0px; padding: 0px; border: 0px;}
.smooth {border: 1px #808080 solid; border-radius:5px; background:linear-gradient( white, silver, white); color:  #808080; font-family: Arial, Tahoma, Helvetica, sans-serif; font-size: 18px; text-decoration: none;}
.temp_select {background-color: transparent; color: #808080; font-family: Arial, Tahoma, Helvetica, sans-serif; font-size: 27px; text-decoration: none; text-align: center; vertical-align: baseline; border: none;}
.range { -webkit-appearance: none; border: 1px #808080 solid; border-radius:5px; background:linear-gradient( white, silver, white); color: #000000; font-family: "MS Sans Serif", sans-serif; font-size: 13px; text-decoration: none;}

	input[type='range']::-moz-range-thumb {
		-moz-appearance: none;
		background-color: transparent;
	    border-radius: 20px;
		background:linear-gradient( white, silver, white);
		box-shadow:inset 0 0 40px rgba(000,000,000,0.5);
		border: 1px solid #808080;
		width: 20px;
		height: 20px;
	}

	input[type=range].vVertical {
		-webkit-appearance: slider-vertical;
		background-color: transparent;
		width: 10px;
		height:100px;
	}
	input[type="range"]::-webkit-slider-thumb {
		-webkit-appearance: none !important;
		background-color: transparent;
	    border-radius: 20px;
		background:linear-gradient( white, silver, white);
		box-shadow:inset 0 0 40px rgba(000,000,000,0.5);
		border: 1px solid #808080;
		width: 20px;
		height: 20px;
	}

</style>

<script language="javascript" type="text/javascript" src="<?php echo $path_zus; ?>Wetter_files/dhwe6x.min.js"></script>

<!-- Google Chart für Temperaturstatistik    -->
  <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {'packages':['corechart']});
      google.charts.setOnLoadCallback(drawChart);
      function drawChart() {
          
<?php	

	// ShowChart Funktion einbinden
	require_once $path_ext."/PHP_Functions/ShowChart.php";

	// Statistik Funktion einbinden
	require_once $path_ext."/PHP_Functions/AddStatistic.php";

	// Zeitzone festlegen
	$timezone = 'Europe/Berlin';
	date_default_timezone_set($timezone);
	
	$Temp_min = 100;  // hohen Wert als Ausgangspunkt für Minimaltemperatur vorgeben	
	$p_DS_min = 10000;  // hohen Wert als Ausgangspunkt für Minimalluftdruck vorgeben
	
	//einzelnen Arrays für die Messdaten anlegen
	$Uhrzeit = array();
	$Minuten = array();
	$Temp = array();
	$Feuchte = array();
	$Helligkeit = array();
	$Regen = array();
	$UV = array();
	$p_Temp = array();
	$p_DS = array();
	$p_DS_SL = array();
	$p_Alt = array();
	$RMS_Wippe = array();
	$RMS_Wippe_h = array();
	$Windgeschwindigkeit = array();
	$Windrichtung = array(0,0,0,0,0,0,0,0,0,0,0,0);	
	$VCC_overview = array();
			
	/* Anzeige nur eines Tages */
	//Prüfen ob die Datei existiert und wenn ja dann die ausgelesenen Werte in die File speichern
	if (file_exists($path_ext.$Device."/".$Monat."/".$Tag."/Wetterdaten.stats") && $Range_sel == 1) 
	{		
		// Anzeige des aktuellen Tages einbinden
		include($path_ext."/PHP_Includes/GetDayData.php"); 						
		
		//Datei mit den Kurveneinstellungen einbinden
		include($path_ext."/PHP_Includes/".$Device."_E.php");		
	}
	
	/* Anzeige mehrerer Tage */
	// Prüfen ob die Datei existiert und wenn ja dann die ausgelesenen Werte in die File speichern
	if (file_exists($path_ext.$Device."/".$Monat."/".$Tag."/Wetterdaten.stats") && $Range_sel > 1) 
	{
	
		// $Startdatum ist der erste Tag ab dem angezeigt werden sollen
		// Variable um Tage bis heut hochzählen zu können
		$Tag_Position = $Range_sel-1;
			
		// Ausgangsdatum speichern
		$Tag_Ausgang = $Tag;
		$Monat_Ausgang = $Monat;			
		
		// über Anzahl gewünschter Tage iterieren
		while($Tag_Position >= 0)
		{		
			// vor Einstieg in die Schleife den entferntesten Tag ermitteln
			$Starttag = new DateTime($Tag_Ausgang."-".$Monat_Ausgang);
			$Starttag->modify("-".($Tag_Position).' days');
			$Starttag = $Starttag->format('d-m-Y');
			$Tag = explode("-",$Starttag);
			$Tag = $Tag[0];
			$Monat = explode("-",$Starttag);
			$Monat = $Monat[1]."-".$Monat[2];
				
			// Prüfen ob der aktuelle Tag auch vorhanden ist
			if (file_exists($path_ext.$Device."/".$Monat."/".$Tag."/Wetterdaten.stats"))
			{				
				// das entfernteste Datum speichern
				if($Faraway != 1)
				{
					$Tagaway = $Tag;
					$Monataway = explode("-", $Monat);
					$Jahraway = $Monataway[1];
					$Monataway = $Monataway[0];
					$Faraway = 1;
					
					$Zeitraum_beschr = $Tagaway.".".$Monataway.".".$Jahraway." bis ".$Tag_Ausgang.".".$Mon_string.".".$Jahr;					
				}
		
				// Anzeige des aktuellen Tages einbinden
				include($path_ext."/PHP_Includes/GetDayData.php"); 				
			}

			// Tag runterzählen
			$Tag_Position--;

		}  // ENDE TAGLÄUFERSCHLEIFE
	
		// Datei mit den Kurveneinstellungen einbinden
		include($path_ext."/PHP_Includes/".$Device."_M.php");
	}

	// Aktuelle Werte aus der Datei mit der letzten Aktualisierung holen
	$handle = fopen ($path_zus.$Device.".shas" , "r");
	$Inhalt = fread($handle, filesize($path_zus.$Device.".shas"));
	fclose($handle);
	
	$Zeit_Aktualize = date("d.m.Y H:i", filemtime($path_zus.$Device.".shas"));  //Datum wann Datei zuletzt geändert wurde
	$VCC = explode("**", $Inhalt)[2];  // Batteriespannung ermitteln

	//Daten für Monatsstatistik laden
	if (file_exists($path_ext.$Device."/".$Monat."/Monstat.shas") && ($Oview_sel == "Monat" || $Oview_sel == "")) 
	{		
		//Aktuelle Werte aus der Übersichtsdatei holen
		//Datei öffnen und auslesen
		$handle = fopen ($path_ext.$Device."/".$Monat."/Monstat.shas" , "r");
		$Inhalt_Monstat = fread($handle, filesize($path_ext.$Device."/".$Monat."/Monstat.shas"));
		$Inhalt_Monstat = explode("**", $Inhalt_Monstat);
		fclose($handle);
		
		//Monat der Statistik anzeigen
		$Mon_of_Monstat = explode("-", $Monat);	 // Monat und Jahr splitten
		$Mon_Array = array('Januar', 'Februar', 'März', 'April','Mai','Juni','Juli','August','September','Oktober','November','Dezember');  // Array für die Zuordnung der Monatszahl zum Monatsstring
		$Mon_of_Monstat = $Mon_Array[(intval($Mon_of_Monstat[0]) - 1)]." ".$Mon_of_Monstat[1];  // Monatszahl durch Monatsstring ersetzen	
		
		//Stringarray == Temp_max##Datum**Temp_min##Datum**P_DS_max##Datum**P_DS_min##Datum**UV_max##Datum**WIND_max##Datum**Regen_ges
		$Temp_max_mon_string = AddStatistic($Inhalt_Monstat[0], "°C", "red");
		$Temp_min_mon_string = AddStatistic($Inhalt_Monstat[1], "°C", "blue");
		
		$p_max_mon_string =  AddStatistic($Inhalt_Monstat[2], "mbar");
		$p_min_mon_string =  AddStatistic($Inhalt_Monstat[3], "mbar");

		$UV_max_mon_string =  AddStatistic($Inhalt_Monstat[4], "mW/cm²");		
		$Windspeed_value_max_mon_string =  AddStatistic($Inhalt_Monstat[5], "km/h");

		$Regenmenge_ges_mon = ($Inhalt_Monstat[6] * 0.3);
		
		$Regnerisch = explode("##", $Inhalt_Monstat[7]);
		$Regnerisch_value = $Regnerisch[0] * 0.3;
		$Regnerisch_value_string = $Regnerisch_value." l/m² (".$Regnerisch[1].")";		
	}	
		
	//Daten für Gesamtstatisktik laden
	if (file_exists($path_ext.$Device.".shas") && $Oview_sel == "Gesamt") 
	{
		//Aktuelle Werte aus der Übersichtsdatei holen
		//Datei öffnen und auslesen
		$handle = fopen ($path_ext.$Device.".shas" , "r");
		$Inhalt_allstat = fread($handle, filesize($path_ext.$Device.".shas"));
		$Inhalt_allstat = explode("**", $Inhalt_allstat);
		fclose($handle);

		//Stringarray == Temp_max##Datum**Temp_min##Datum**P_DS_max##Datum**P_DS_min##Datum**UV_max##Datum**WIND_max##Datum**Regen_ges
		$Temp_max_all_string =  AddStatistic($Inhalt_allstat[0], "°C", "red");
		$Temp_min_all_string =  AddStatistic($Inhalt_allstat[1], "°C", "blue");

		$p_max_all_string =  AddStatistic($Inhalt_allstat[2], "mbar");
		$p_min_all_string =  AddStatistic($Inhalt_allstat[3], "mbar");

		$UV_max_all_string =  AddStatistic($Inhalt_allstat[4], "mW/cm²");
		$Windspeed_value_max_all_string =  AddStatistic($Inhalt_allstat[5], "km/h");

		//Regenreichster Monat
		$Regenmonat_value_max_all_string =  explode("##", $Inhalt_allstat[6]);
		$Regenmonat_value_max_all_string = ($Regenmonat_value_max_all_string[0] * 0.3)." l/m² (".		$Regenmonat_value_max_all_string[1].")";	

		//Regenreichster Tag
		$Regnerisch_value_all_string  =  explode("##", $Inhalt_allstat[7]);
		$Regnerisch_value_all_string  = ($Regnerisch_value_all_string[0] * 0.3)." l/m² (".		$Regnerisch_value_all_string[1].")";		
	}		

	//Beschreibung für Range Schnellübersicht > 1 oder Tag
	if ($Zeitraum_beschr != "")
		$Date_overview = $Zeitraum_beschr;
	else
		$Date_overview = $Tag.".".$Mon_string.".".$Jahr;	
?>
	  		  
}

</script>

<body>
<div id="dhecenterdiv1">

<!-- Überschrift -->
<div id="Top_Uberschrift" style="position: absolute; left: 10px; top: 15px; width: 600px; height: 150px; text-align: left;" align="left">
<font style="font-family: Arial, Tahoma, Helvetica, sans-serif; font-size: 32px; color: #808080; font-weight: bold; font-style: italic; text-decoration: none;"> SLSS <?php echo $Device_string; ?></font></div>

<!-- Logos -->
<div id="SLSS_Logo" style="position: absolute; left: 1470px; top: 0px;" align="left">
<img id="SLSS_Logo name="SLSS_LOGO" src="<?php echo $path_zus; ?>Wetter_files/Wetter_Logo.png" width="125" height="125" border="0" alt=""></div>
<div id="SLSS_Logo" style="position: absolute; left: 1600px; top: 0px;" align="left">
<img id="SLSS_Logo name="SLSS_LOGO" src="<?php echo $path_zus; ?>Wetter_files/Wetter_Logo_Wetter.png" width="125" height="125" border="0" alt=""></div>

<br><br>

<!-- letzte Aktualisierung und Batteriespannung  -->
<div id="ldheAktualize" style="position: absolute; left: 15px; top: 126px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt">letzte Aktualisierung: <?php echo $Zeit_Aktualize; ?></span></div>
<div id="ldheVCC" style="position: absolute; left: 15px; top: 150px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt">VCC_Bat: <?php echo $VCC; ?> V</span></div>

<!-- Schnellübersicht aktuelle Auswahl -->
<div id="Dayframeborder" style="position: absolute; left: 555px; top: 126px; width: 600px; height: 294px; text-align: left; border:1px solid darkgrey;" align="left" ></div>
<div id="Anzeigewerte_beschr" style="position: absolute; left: 575px; top: 146px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt"><b><i>Schnellübersicht vom <?php echo $Date_overview; ?></i></b></span></div>

<div id="Temp_max" style="position: absolute; left: 575px; top: 196px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt">gemessene Temperatur DHT22 (max):</span></div>
<div id="Temp_max" style="position: absolute; left: 875px; top: 196px; width: 600px; height: 6px; text-align: left;" align="left"> 
<span class="arial12808080FFFFFFt"><?php echo $Temp_max_string; ?></span></div>

<div id="Temp_min" style="position: absolute; left: 575px; top: 220px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt">gemessene Temperatur DHT22 (min):</span></div> 
<div id="Temp_min" style="position: absolute; left: 875px; top: 220px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt"><?php echo $Temp_min_string; ?></span></div>

<div id="UV_max" style="position: absolute; left: 575px; top: 244px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt">gemessener Luftdruck (max):</span></div> 
<div id="UV_max" style="position: absolute; left: 875px; top: 244px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt"><?php echo $p_DS_max_string; ?></span></div>

<div id="Temp_min" style="position: absolute; left: 575px; top: 268px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt">gemessener Luftdruck (min):</span></div>
<div id="Temp_min" style="position: absolute; left: 875px; top: 268px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt"><?php echo $p_DS_min_string; ?></span></div>

<div id="UV_max" style="position: absolute; left: 575px; top: 292px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt">höchste UV-Belastung:</span></div>
<div id="UV_max" style="position: absolute; left: 875px; top: 292px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt"><?php echo $UV_max_string; ?></span></div>

<div id="ldheVCC" style="position: absolute; left: 575px; top: 316px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt">höchste Windgeschwindigkeit:</span></div>
<div id="ldheVCC" style="position: absolute; left: 875px; top: 316px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt"><?php echo $Windspeed_value_max_string; ?></span></div>

<div id="ldheVCC" style="position: absolute; left: 575px; top: 340px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt">Gesamtregenmenge:</span></div>
<div id="ldheVCC" style="position: absolute; left: 875px; top: 340px; width: 600px; height: 6px; text-align: left;" align="left">
<span class="arial12808080FFFFFFt"><?php echo $Regenmenge_ges; ?> l/m²</span></div>

<!-- Monats / Gesamtübersicht -->
<div id="Monframeborder" style="position: absolute; left: 1160px; top: 126px; width: 568px; height: 294px; text-align: left; border:1px solid darkgrey;" align="left" >
</div>

<?php 
	if($Oview_sel == "Monat" || $Oview_sel == "")
	{		
		// Monatsübersicht angezeigen
		include $path_ext."/PHP_Includes/MonthStatOverview.php";
	}
	elseif($Oview_sel == "Gesamt")
	{
		// Gesamtübersicht angezeigen
		include $path_ext."/PHP_Includes/OverallStatOverview.php";
	}

	//Deviceliste einbinden
	//Aktuelle Werte aus der Übersichtsdatei holen
	//Datei öffnen und auslesen
	$handle = fopen ($path_ext."/Devices.shas" , "r");
	$Inhalt_Devices = fread($handle, filesize($path_ext."/Devices.shas"));
	fclose($handle);
?>

<!-- Formular Bedienelemente -->
<div id="Bedienelemente" style="position: absolute; left: 15px; top: 160px;">
<form id="Form1" name="Form1" style="position: absolute; left: 0px; top: 60px; margin: 0px; padding: 0px; border: 0px;" action="" method="post">

<div id="ldheLabel1" style="position: absolute; left: 0px; top: -20px; width: 150px; height: 16px; text-align: justify;">
<span class="arial12808080FFFFFFt">Stationsauswahl</span></div>
<div id="ldheOption1" style="position: absolute; left: 0px; top: 4px;">
<select id="Option0" name="Option0" class="smooth1" style="width: 475px;" onchange="jsLink('Wettercharts.php?Dev_sel='+this.value+'<?php echo "&Month_sel=".$Monat."&Day_sel=".$Tag."&Range_sel=".$Range_sel."&Oview_sel=".$Oview_sel;?>','');return false;">
<?php						
	$Devices = explode("**", $Inhalt_Devices);	
	
	//Prüfen ob Zahl gerade oder ungerade und dann diferenzieren
	$Devicecount = 0;
	while ($Devicecount < count($Devices)) 
	{
		$Dev_anzeige = explode("##", $Devices[$Devicecount]);
		echo"<option value=\"$Dev_anzeige[0]\">".$Dev_anzeige[1]."</option>";
		$Devicecount++;
	}	
?>
</select></div>

<!-- Auswahl Tag -->
<div id="ldheLabel1" style="position: absolute; left: 0px; top: 54px; width: 150px; height: 16px; text-align: justify;">
<span class="arial12808080FFFFFFt">Tag</span></div>
<div id="ldheOption1" style="position: absolute; left: 0px; top: 74px;">
<select id="Option1" name="Option1" class="smooth1" style="width: 200px;" onchange="jsLink('Wettercharts.php?Month_sel=<?php echo $Monat."&Day_sel='+this.value+'&Range_sel=".$Range_sel."&Dev_sel=".$Dev_sel."&Oview_sel=".$Oview_sel; ?>','');return false;">
<?php
	echo"<option disabled=\"disabled\" selected>".$Tag."</option><option></option>";

	foreach ($Day_arr as $value)
	{
		echo"<option>$value</option>";
	}	
?>
</select></div>

<!-- Auswahl Monat / Jahr -->
<div id="ldheLabel2" style="position: absolute; left: 268px; top: 54px; width: 150px; height: 16px; text-align: justify;">
<span class="arial12808080FFFFFFt">Monat</span></div>
<div id="ldheOption2" style="position: absolute; left: 268px; top: 74px;">
<select id="Option2" name="Option2" class="smooth1" style="width: 207px;" onchange="jsLink('Wettercharts.php?Month_sel='+this.value+'&Day_sel=<?php echo $Tag."&Range_sel=".$Range_sel."&Dev_sel=".$Dev_sel."&Oview_sel=".$Oview_sel;?>','');return false;">
<?php
	echo"<option disabled=\"disabled\" selected>".$Monat."</option><option></option>";
		
	foreach ($Month_arr as $value)
	{
		echo"<option>$value</option>";
	}	
?>
</select></div>

<!-- Slider Anzeigezeitraum -->
<div id="ldheLabel3" style="position: absolute; left: 3px; top: 186px; width: 250px; height: 16px; text-align: justify;">
<span class="arial12808080FFFFFFt">Anzeigezeitraum (Tage)</span></div>

<div id="ticks" style="position: absolute; left: 1px; top: 133px;" align="left">
<img id="tickpic" name="tickpic" src="<?php echo $path_zus; ?>Wetter_files/wetterticks.png" width="476" height="26" border="0" alt=""></div>

<div id="Anzeigerange" style="position: absolute; left: 0px; top: 154px; width: 371px;" align="left">
<input id="Range" type="range" class="range" min="1" max="31" value="<?php echo $Range_sel; ?>" step="1" style="width: 473px; height: 28px;" onchange="jsLink('Wettercharts.php?Month_sel=<?php echo $Monat."&Day_sel=".$Tag."&Range_sel='+this.value+'&Dev_sel=".$Dev_sel."&Oview_sel=".$Oview_sel;?>','');return false;">
</input></div>	
</form></div>

<?php
//Die Kurven für die HTML Anzeige aus Datei einbinden
	//Datei mit den Kurveneinstellungen einbinden
	include($path_ext."/PHP_Includes/".$Device."_Kurven.php");
	echo $Kurven;

?>

<br><br><br>
</div> 
</body>
</html>

 

Die Dateien und Funktionen welche in die Hauptdatei „Wettercharts.php“ per include oder require_once eingebunden werden befinden sich in Unterverzeichnissen und können so recht einfach anhand ihrer Funktionalität „gruppiert“ werden. Die oben bereits aufgeführte Funktion „ShowChart()“ befindet sich ebenfalls in einer dieser Dateien, welche als erstes per „require_once“-Befehl in Zeile 195 in die Hauptdatei eingebunden wird.

 

PHP Code der Datei "AddStatistic.php", welche die gleichnamige Funktion zum Erzeugen der Statistikeinträge beinhaltet

<?php

    Function AddStatistic($Inhalt_Stats, $ElementUnit, $Color="")
    {
        $Inhalt_Stats = explode("##", $Inhalt_Stats);
        
        if($Color != "")
            $Color_String = "<font color=\"$Color\">";

        $return_Value = $Color_String.$Inhalt_Stats[0]."</font> $ElementUnit (".$Inhalt_Stats[1].")";
        return $return_Value;        

    }

?>

PHP Code der Datei "GetDayData.php", welche den Programmcode für die Anzeige eines Tages beinhaltet

<?php

    // Datei mit gespeicherten Daten öffnen 
    $handle = fopen($path_ext.$Device."/".$Monat."/".$Tag."/Wetterdaten.stats" , "r");

    // Zeilenweise bis zum Dateiende auslesen
    while (!feof($handle))
    {		
    
        $line = fgets($handle);  // Zeile lesen
        $Items = explode("*##*", $line)[0];  // Zeilenendmarkierung abtrennen
        $Einzelwerte = explode("**", $Items);  // Zeileninhalt in Einzelwerte zerlegen 

        //Werte die Unverändert in den Array geschoben werden können 	
        array_push($Uhrzeit, $Einzelwerte[0]);
        
        /*
            DHT22 TEMPERATUR
        */
        
        // selten auftretende "nan"-Wert vom DHT22 Filtern
        if($Einzelwerte[1] != "nan")
        {
            array_push($Temp, $Einzelwerte[1]);  // gelesene Temperatur in den Array pushen            
            $Temp_last = $Einzelwerte[1];  // Temp_last setzen um damit evtl. den als nächstes folgenden "nan"-Wert zu ersetzen

                // minimal / maximal Temperatur aktualisieren
                if($Einzelwerte[1] <= $Temp_min)
                {				
                    $Temp_min = $Einzelwerte[1];
                    $Temp_min_string = "<font color=\"blue\">".$Temp_min."</font> °C (".$Einzelwerte[0].")";				
                }
                elseif($Einzelwerte[1] >= $Temp_max)
                {				
                    $Temp_max = $Einzelwerte[1];
                    $Temp_max_string = "<font color=\"red\">".$Temp_max."</font> °C (".$Einzelwerte[0].")";				
                }
        }
        else
        {
            array_push($Temp, $Temp_last);  // "nan"-Wert durch letzte gemessene Temperatur ersetzen
        }

        /*
            DHT22 LUFTFEUCHTIGKEIT
        */
        
        // selten auftretende "nan"-Wert vom DHT22 Filtern
        if($Einzelwerte[2] != "nan")
        {
            array_push($Feuchte, $Einzelwerte[2]);  // gelesene Luftfeuchtigkeit in den Array pushen
            $Feuchte_last = $Einzelwerte[2];  // Feuchte_last setzen um damit evtl. den als nächstes folgenden "nan"-Wert zu ersetzen
        }
        else
        {
            array_push($Feuchte, $Feuchte_last);
        }
        
        /*
            HELLIGKEITSSENSOR (FOTODIODE)
        */

        array_push($Helligkeit, round($Einzelwerte[3] / 100, 1));  // gespeicherten Wert (0-1024) auf Skala von 0-10 Mappen
        
        /*
            FEUCHTIGKEITSSENSOR
        */
    
        $Regenwert = $Einzelwerte[4] - 1024;  // Wert umrechnen da 1024 = trocken und kleiner 1024 = nass       
        
        //Wenn $Regenwert kleiner 0 dann Kehrwert bilden um positive Kurvenauslenkung zu erreichen
        if($Regenwert < 0) 
            $Regenwert = $Regenwert * -1;  				
        
        $Regenwert = round($Regenwert / 100, 1);  // errechneten Wert (0-1024) auf Skala von 0-10 Mappen
        
        // Nullpunkt unschärfe setzen
        if ($Regenwert < 0.3) 
            $Regenwert = 0.0;
        
        array_push($Regen, $Regenwert);
        
        /*
            UV SENSOR
        */

        array_push($UV, $Einzelwerte[5]);

        // ggf. maximale UV Belastung aktualisieren			
        if($Einzelwerte[5] >= $UV_max)
        {
            $UV_max = $Einzelwerte[5];
            $UV_max_string = "<font color=\"purple\">".$UV_max."</font> mW/cm² (".$Einzelwerte[0].")";
        }

        /*
            TEMPERATUR BMP085
        */

        array_push($p_Temp, $Einzelwerte[6]);

        /*
            LUFTDRUCK BMP085
        */

        array_push($p_DS, $Einzelwerte[7]);

        // ggf. minimalen / maximalen Luftdruck aktualisieren
        if($Einzelwerte[7] <= $p_DS_min)
        {
            $p_DS_min = $Einzelwerte[7];
            $p_DS_min_string = $p_DS_min." mbar (".$Einzelwerte[0].")";
        }		
        elseif($Einzelwerte[7] >= $p_DS_max)
        {
            $p_DS_max = $Einzelwerte[7];
            $p_DS_max_string = $p_DS_max." mbar (".$Einzelwerte[0].")";
        }        

        /*
            LUFTDRUCK NN BMP085
        */

        array_push($p_DS_SL, $Einzelwerte[8]);

        /*
            ERRECHNETE HÖHE ÜBER NN BMP085
        */

        array_push($p_Alt, $Einzelwerte[9]);

        /*
            REGENMENGENSENSOR
        */	
            
        $Regenmenge = ($Einzelwerte[10] * 0.3);   // Regenmenge über Wippsensor ausrechnen --> 1 Wippvorgang = 0,3 l/m^2 in 15min
        array_push($RMS_Wippe, $Regenmenge);        // aktuelle Regenmenge in den letzen 15min
        array_push($RMS_Wippe_h, $Regenmenge * 4);  // berechnete Regenmenge für die kommende Stunde

        $Regenmenge_ges += $Regenmenge;  // Gesamtregenmenge erhöhen

        /*
            WINDGESCHWINDIGKEIT UND WINDRICHTUNG
        */	

                    
        $Windspeed = explode(".", $Einzelwerte[11]);  // Windgeschwindigkeit und Richtung voneinander trennen
        $Timecount = 15;  // Zeitzähler initialisieren

        // über Werte des Windarrays iterieren 
        for($Windcount = 0; $Windcount < count($Windspeed) -1; $Windcount++) 
        {
            // Zwischen Windgeschwindigkeit und Windrichtung unterscheiden		
            if ($Windcount % 2 == 0) 
            {					
                // Windgeschwindigkeit ausrechnen               
                // $Windspeed_value in km/h entspricht gemessene Impulse mal 24 (da ich IC / 24 geteilt) /60s * 2,4
                $Windspeed_value = (($Windspeed[$Windcount] * 24 / 60) * 2.4);
                
                // Minuteneinteilung ausgehend von der Zeilenzeit errechnen
                $Start_date = new DateTime($Einzelwerte[0]);
                $Start_date->modify('-'.$Timecount.' minutes');
                $Start_date = $Start_date->format('H:i');
                
                array_push($Minuten, $Tag.".".$Monat.".".$Jahr." ".$Start_date);  // Array mit Minuten befüllen
                array_push($Windgeschwindigkeit, $Windspeed_value);  // Array mit Windgeschwindigkeit befüllen
                
                // Maximal gemessene Windgeschwindigkeit
                if($Windspeed_value >= $Windspeed_value_max)
                {
                    $Windspeed_value_max = $Windspeed_value;
                    $Monat_expl = explode("-", $Monat);
                    $Windspeed_value_max_string = $Windspeed_value_max." km/h (".$Tag.".".$Monat_expl[0].".".$Jahr." ".$Start_date.")";
                }

                $Timecount--;                
            } 
            else 
            {                
                // Funktion zur Windrichtungsberechnung einbinden
	            require_once $path_ext."/PHP_Functions/GetWindDirection.php";
	
                // Prüfen ob überhaupt eine Windgeschwindigkeit gemessen wurde und nur dann die Windrichtung berücksichtigen
                if($Windspeed[$Windcount-1] > 0)
                {				
                    // Windrichtung über eingebundene Funktion ermitteln
                    $Windrichtung = GetWindDirection($Windrichtung, $Windspeed[$Windcount]);
                                        
                }//Windstilleprüfung ENDE	
            }//Werte auswerten                        
        }//Windgeschwindigkeit ENDE
        
        /*
            BATTERIESPANNUNG 
        */

        $VCC = $Einzelwerte[12];
        array_push($VCC_overview, $VCC);
        
    } // while feof end 
    fclose($handle);
?>

PHP Code der Datei "ESP-Wetterstation_E.php", welche die Funktionsaufrufe der Kurven für die Anzeige eines Tags beinhaltet

<?php
	// Achsenparametrisierung für Windrichtung
	$Winddirection = array(" N"," N-NE"," NE-E"," E"," E-SE"," SE-S"," S"," S-SW"," SW-W"," W"," W-NW",$Tag.".".$Monat.".".$Jahr." NW-N");
	
	// Chartanzeigen		
	// CHARTNAME , BEZEICHNUNG WERT1 , BEZEICHNUNG WERT2, X-ACHSE, Y-ACHSE1, Y-ACHSE2, FARBE Y-ACHSE1, FARBE Y-ACHSE1, BESCHRIFTUNG, SKALENANZAHL, SKALENTYP, ACHSENBESCHRIFTUNG, SMOOTH  
	ShowChart("Temperatur", "Temperatur DHT22 (°C)", "Temperatur Drucksensor (°C)", $Uhrzeit, $Temp, $p_Temp, "red", "purple", "Temperatur", "1", "LineChart", $Tag.".".$Mon_string.".".$Jahr); 
	ShowChart("Feuchtigkeit", "Luftfeuchtigkeit DHT22 (%)", "", $Uhrzeit, $Feuchte, "", "blue", "" , "Luftfeuchtigkeit", "1", "LineChart", $Tag.".".$Mon_string.".".$Jahr);
	ShowChart("Taufeuchte", "Feuchtigkeit / Tau", "", $Uhrzeit, $Regen, "", "blue","", "Tau / Tropffeuchtigkeit", "1", "LineChart", $Tag.".".$Mon_string.".".$Jahr, "true");
	ShowChart("UV", "UV Belastung (mW/cm²)", "Helligkeit (0 - 10)", $Uhrzeit, $UV, $Helligkeit,"red","orange", "UV Strahlung und Lichteinfall", "2", "LineChart", $Tag.".".$Mon_string.".".$Jahr);
	ShowChart("Luftdruck", "Luftdruck NN errechnet (mbar)", "Luftdruck gemessen (mbar)", $Uhrzeit, $p_DS_SL, $p_DS, "lightblue","blue", "Luftdruck", "1", "LineChart", $Tag.".".$Mon_string.".".$Jahr);
	ShowChart("Regenmenge", "Regenmenge (l/m² [15min])", "Regenmenge (l/m² [1h])", $Uhrzeit, $RMS_Wippe, $RMS_Wippe_h, "darkred", "lightgrey", "Niederschlagsmenge", "1", "LineChart", $Tag.".".$Mon_string.".".$Jahr, "true");
	ShowChart("Windgeschwindigkeit", "Windgeschwindigkeit (km/h)", "", $Minuten, $Windgeschwindigkeit, "", "lightblue","", "Windgeschwindigkeit", "1", "LineChart", $Tag.".".$Mon_string.".".$Jahr, "true");
	ShowChart("Windrichtung", "Windrichtung (Häufigkeit / min)", "", $Winddirection, $Windrichtung, "", "lightgreen","", "Windrichtung", "1", "SteppedAreaChart", $Tag.".".$Mon_string.".".$Jahr);	
	ShowChart("Batteriespannung", "Batteriespannung (V)", "", $Uhrzeit, $VCC_overview, "", "red","", "Batteriespannung", "1", "LineChart", $Tag.".".$Mon_string.".".$Jahr);	

?>

PHP Code der Datei "ESP-Wetterstation_M.php", welche die Funktionsaufrufe der Kurven für die Anzeige mehrerer Tage beinhaltet

<?php
	// Achsenparametrisierung für Windrichtung
	$Winddirection = array(" N"," N-NE"," NE-E"," E"," E-SE"," SE-S"," S"," S-SW"," SW-W"," W"," W-NW",$Tag.".".$Monat.".".$Jahr." NW-N");
	
	// Chartanzeigen		
	// CHARTNAME , BEZEICHNUNG WERT1 , BEZEICHNUNG WERT2, X-ACHSE, Y-ACHSE1, Y-ACHSE2, FARBE Y-ACHSE1, FARBE Y-ACHSE1, BESCHRIFTUNG, SKALENANZAHL, SKALENTYP, ACHSENBESCHRIFTUNG, SMOOTH 
	ShowChart("Temperatur", "Temperatur DHT22 (°C)", "Temperatur Drucksensor (°C)", $Uhrzeit, $Temp, $p_Temp, "red", "purple", "Temperatur", "1", "LineChart", $Zeitraum_beschr); 
	ShowChart("Feuchtigkeit", "Luftfeuchtigkeit DHT22 (%)", "", $Uhrzeit, $Feuchte, "", "blue", "" , "Luftfeuchtigkeit", "1", "LineChart", $Zeitraum_beschr);
	ShowChart("Taufeuchte", "Feuchtigkeit / Tau", "", $Uhrzeit, $Regen, "", "blue","", "Tau / Tropffeuchtigkeit", "1", "LineChart", $Zeitraum_beschr, "true");
	ShowChart("UV", "UV Belastung (mW/cm²)", "Helligkeit (0 - 10)", $Uhrzeit, $UV, $Helligkeit,"red","orange", "UV Strahlung und Lichteinfall", "2", "LineChart", $Zeitraum_beschr);
	ShowChart("Luftdruck", "Luftdruck NN errechnet (mbar)", "Luftdruck gemessen (mbar)", $Uhrzeit, $p_DS_SL, $p_DS_SL, "blue","lightblue", "Luftdruck", "1", "LineChart", $Zeitraum_beschr);
	ShowChart("Regenmenge", "Regenmenge (l/m² [15min])", "Regenmenge (l/m² [1h])", $Uhrzeit, $RMS_Wippe, $RMS_Wippe_h, "darkred", "lightgrey", "Niederschlagsmenge", "1", "LineChart", $Zeitraum_beschr, "true");
	ShowChart("Windgeschwindigkeit", "Windgeschwindigkeit (km/h)", "", $Minuten, $Windgeschwindigkeit, "", "lightblue","", "Windgeschwindigkeit", "1", "LineChart", $Zeitraum_beschr, "true");
	ShowChart("Windrichtung", "Windrichtung (Häufigkeit / min)", "", $Winddirection, $Windrichtung, "", "lightgreen","", "Windrichtung", "1", "SteppedAreaChart", $Zeitraum_beschr);
	ShowChart("Batteriespannung", "Batteriespannung (V)", "", $Uhrzeit, $VCC_overview, "", "red","", "Batteriespannung", "1", "LineChart", $Zeitraum_beschr);	

?>

PHP und HTML Code der Datei "MonthStatOverview.php", welche die Anzeigeelemente der Monatsstatistik beinhaltet

<?php

// HTML Quellcode für Monatsstatistik

echo
		"
			<div id=\"Monselect\" style=\"position: absolute; left: 1460px; top: 402px; width: 133px; height: 18px; text-align: left; background: linear-gradient(#F8F8FF,#DCDCDC); border:1px solid darkgrey;\" align=\"left\">
			<div id=\"Anzeige\" style=\"position: absolute; left: 0px; top: 3px; width: 133px; height: 6px; text-align: center;\" align=\"left\">
			<font color=\"#708090\" face=\"Arial\" size=\"1\"><b>Monatsübersicht</b></font>
			</div></div>

			<a href=\"#\" onclick=\"jsLink('Wettercharts.php?Dev_sel=".$Device."&Month_sel=".$Monat."&Day_sel=".$Tag."&Range_sel=".$Range_sel."&Oview_sel=Gesamt','');return false;\">
			<div id=\"Monselect\" style=\"position: absolute; left: 1594px; top: 402px; width: 134px; height: 18px; text-align: left; border:1px solid darkgrey;\" align=\"left\">
			<div id=\"Anzeige\" style=\"position: absolute; left: 0px; top: 3px; width: 134px; height: 6px; text-align: center;\" align=\"left\">
			<font color=\"darkgrey\" face=\"Arial\" size=\"1\">Gesamtübersicht</font>
			</div></div></a>

			<div id=\"Anzeigewerte_beschr\" style=\"position: absolute; left: 1180px; top: 146px; width: 550px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\"><b><i>Monatsübersicht für  $Mon_of_Monstat </i></b></span></div>

			<div id=\"Temp_max\" style=\"position: absolute; left: 1180px; top: 196px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">gemessene Temperatur DHT22 (max):</span></div>
			<div id=\"Temp_max\" style=\"position: absolute; left: 1480px; top: 196px; width: 250px; height: 6px; text-align: left;\" align=\"left\"> 
			<span class=\"arial12808080FFFFFFt\">  $Temp_max_mon_string </span></div>

			<div id=\"Temp_min\" style=\"position: absolute; left: 1180px; top: 220px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">gemessene Temperatur DHT22 (min):</span></div> 
			<div id=\"Temp_min\" style=\"position: absolute; left: 1480px; top: 220px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $Temp_min_mon_string </span></div>

			<div id=\"UV_max\" style=\"position: absolute; left: 1180px; top: 244px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">gemessener Luftdruck (max):</span></div> 
			<div id=\"UV_max\" style=\"position: absolute; left: 1480px; top: 244px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $p_max_mon_string </span></div>

			<div id=\"Temp_min\" style=\"position: absolute; left: 1180px; top: 268px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">gemessener Luftdruck (min):</span></div>
			<div id=\"Temp_min\" style=\"position: absolute; left: 1480px; top: 268px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $p_min_mon_string </span></div>

			<div id=\"UV_max\" style=\"position: absolute; left: 1180px; top: 292px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">höchste UV-Belastung:</span></div>
			<div id=\"UV_max\" style=\"position: absolute; left: 1480px; top: 292px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $UV_max_mon_string </span></div>

			<div id=\"ldheVCC\" style=\"position: absolute; left: 1180px; top: 316px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">höchste Windgeschwindigkeit:</span></div>
			<div id=\"ldheVCC\" style=\"position: absolute; left: 1480px; top: 316px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $Windspeed_value_max_mon_string </span></div>

			<div id=\"ldheVCC\" style=\"position: absolute; left: 1180px; top: 340px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">regenreichster Tag:</span></div>
			<div id=\"ldheVCC\" style=\"position: absolute; left: 1480px; top: 340px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $Regnerisch_value_string  </span></div>

			<div id=\"ldheVCC\" style=\"position: absolute; left: 1180px; top: 364px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">Gesamtregenmenge:</span></div>
			<div id=\"ldheVCC\" style=\"position: absolute; left: 1480px; top: 364px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $Regenmenge_ges_mon  l/m²</span></div>
		";
?>

PHP und HTML Code der Datei "OverallStatOverview.php", welche die Anzeigeelemente der Gesamtstatistik beinhaltet

<?php

// HTML Quellcode für Gesamtstatistik

echo
		"
			<a href=\"#\" onclick=\"jsLink('Wettercharts.php?Dev_sel=".$Device."&Month_sel=".$Monat."&Day_sel=".$Tag."&Range_sel=".$Range_sel."&Oview_sel=Monat','');return false;\">
			<div id=\"Monselect\" style=\"position: absolute; left: 1460px; top: 402px; width: 133px; height: 18px; text-align: left; border:1px solid darkgrey;\" align=\"left\">
			<div id=\"Anzeige\" style=\"position: absolute; left: 0px; top: 3px; width: 133px; height: 6px; text-align: center;\" align=\"left\">
			<font color=\"darkgrey\" face=\"Arial\" size=\"1\">Monatsübersicht</font>
			</div></div></a>

			<div id=\"Monselect\" style=\"position: absolute; left: 1594px; top: 402px; width: 134px; height: 18px; text-align: left;  background: linear-gradient(#F8F8FF,#DCDCDC); border:1px solid darkgrey;\" align=\"left\" >
			<div id=\"Anzeige\" style=\"position: absolute; left: 0px; top: 3px; width: 134px; height: 6px; text-align: center;\" align=\"left\">
			<font color=\"#708090\" face=\"Arial\" size=\"1\"><b>Gesamtübersicht</b></font>
			</div></div>

			<div id=\"Anzeigewerte_beschr\" style=\"position: absolute; left: 1180px; top: 146px; width: 550px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\"><b><i>Gesamtübersicht seit Aufzeichnungsbeginn </i></b></span></div>

			<div id=\"Temp_max\" style=\"position: absolute; left: 1180px; top: 196px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">gemessene Temperatur DHT22 (max):</span></div>
			<div id=\"Temp_max\" style=\"position: absolute; left: 1480px; top: 196px; width: 250px; height: 6px; text-align: left;\" align=\"left\"> 
			<span class=\"arial12808080FFFFFFt\">  $Temp_max_all_string </span></div>

			<div id=\"Temp_min\" style=\"position: absolute; left: 1180px; top: 220px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">gemessene Temperatur DHT22 (min):</span></div> 
			<div id=\"Temp_min\" style=\"position: absolute; left: 1480px; top: 220px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $Temp_min_all_string </span></div>

			<div id=\"UV_max\" style=\"position: absolute; left: 1180px; top: 244px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">gemessener Luftdruck (max):</span></div> 
			<div id=\"UV_max\" style=\"position: absolute; left: 1480px; top: 244px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $p_max_all_string </span></div>

			<div id=\"Temp_min\" style=\"position: absolute; left: 1180px; top: 268px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">gemessener Luftdruck (min):</span></div>
			<div id=\"Temp_min\" style=\"position: absolute; left: 1480px; top: 268px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $p_min_all_string </span></div>

			<div id=\"UV_max\" style=\"position: absolute; left: 1180px; top: 292px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">höchste UV-Belastung:</span></div>
			<div id=\"UV_max\" style=\"position: absolute; left: 1480px; top: 292px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $UV_max_all_string </span></div>

			<div id=\"ldheVCC\" style=\"position: absolute; left: 1180px; top: 316px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">höchste Windgeschwindigkeit:</span></div>
			<div id=\"ldheVCC\" style=\"position: absolute; left: 1480px; top: 316px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $Windspeed_value_max_all_string </span></div>

			<div id=\"ldheVCC\" style=\"position: absolute; left: 1180px; top: 340px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">regenreichster Tag:</span></div>
			<div id=\"ldheVCC\" style=\"position: absolute; left: 1480px; top: 340px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $Regnerisch_value_all_string  </span></div>

			<div id=\"ldheVCC\" style=\"position: absolute; left: 1180px; top: 364px; width: 300px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">regenreichster Monat:</span></div>
			<div id=\"ldheVCC\" style=\"position: absolute; left: 1480px; top: 364px; width: 250px; height: 6px; text-align: left;\" align=\"left\">
			<span class=\"arial12808080FFFFFFt\">  $Regenmonat_value_max_all_string </span></div>
		";

?>

PHP Code der Datei "ESP-Wetterstation_Kurven.php", welche das Chartlayout der anzuzeigenden Kurven beinhaltet

<?php

$Kurven = "
	<div id=\"Charts\" style=\"position: absolute; left: 15px; top: 520px; width: 1720px; height: 1400px; text-align: left;\" align=\"left\">
	<table class=\"columns\">
	<tr>
	<td><div id=\"chart_div_Temperatur\" style=\"width: 852px; height: 266px; text-align: justify; border:1px solid #C0C0C0;\" align=\"left\" ></div></td>
	<td><div id=\"chart_div_Feuchtigkeit\" style=\"width: 852px; height: 266px; text-align: justify; border:1px solid #C0C0C0;\" align=\"left\" ></div></td>
	</tr>
	<tr><td><br></td></tr>
	<tr>
	<td><div id=\"chart_div_UV\" style=\"width: 852px; height: 266px; text-align: justify; border:1px solid #C0C0C0;\" align=\"left\" ></div></td>
	<td><div id=\"chart_div_Taufeuchte\" style=\"width: 852px; height: 266px; text-align: justify; border:1px solid #C0C0C0;\" align=\"left\" ></div></td>
	</tr>
	<tr><td><br></td></tr>
	<tr>
	<td><div id=\"chart_div_Luftdruck\" style=\"width: 852px; height: 266px; text-align: justify; border:1px solid #C0C0C0;\" align=\"left\" ></div></td>
	<td><div id=\"chart_div_Regenmenge\" style=\"width: 852px; height: 266px; text-align: justify; border:1px solid #C0C0C0;\" align=\"left\" ></div></td>
	</tr>
	<tr><td><br></td></tr>
	<tr>
	<td><div id=\"chart_div_Windgeschwindigkeit\" style=\"width: 852px; height: 266px; text-align: justify; border:1px solid #C0C0C0;\" align=\"left\" ></div></td>
	<td><div id=\"chart_div_Windrichtung\" style=\"width: 852px; height: 266px; text-align: justify; border:1px solid #C0C0C0;\" align=\"left\" ></div></td>
	</tr>
	<tr>
	<td><div id=\"chart_div_Batteriespannung\" style=\"width: 852px; height: 266px; text-align: justify; border:1px solid #C0C0C0;\" align=\"left\" ></div></td>
	</tr>
	</table>
	<!-- Footer einbinden --> 
	<br><br><br>
	<span class=\"arial12808080FFFFFFt\"><b><i><center>SLSS - Sebastian Langer Software Solutions @ 2018</center></i></b></span>
	<br><br><br>
	</div>
";

?>

 

Fazit

Der Einsatz von PHP hat sich auch hier wieder einmal bewährt. Die Anzeige der Wetterdaten ist auf jedem Gerät und von jedem Standort aus problemlos möglich. Wie man sieht, kommt bei etwas komplexeren Funktionen, schnell einiges an Code zusammen. Diesen konnte ich durch das Optimieren von Abläufen und Auslagern wiederholter Funktionalitäten in eigene Funktionen zwar schon um einiges einkürzen (ca. 400 Zeilen) und vielleicht könnte man dies an einigen Stellen sogar noch ein wenig weiter treiben, um den Überblick nicht zu verlieren und den Code wartbar zu halten habe ich mich aber an einigen Stellen dagegen entschieden.

Für alle diejenigen, welche bis hierher durchgehalten haben, gibt es hier noch die Live-Demo* (https://langersebastian.no-ip.org/Seiten/Wetterstation/Wettercharts.php) der Anzeigeseite. Viel Spaß beim Anschauen und Ausprobieren…

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert