Daten über das Ecowitt-Protokoll an einen eigenen Server übertragen

Für Geräte von froggit
Antworten
WetterMatthi
Offline
Beiträge: 2
Registriert: 08 Aug 2022, 17:44
Danksagung erhalten: 1 mal

Daten über das Ecowitt-Protokoll an einen eigenen Server übertragen

#1

Beitrag von WetterMatthi »

Einige Wetterstationen bieten die Option an Daten über das Ecowitt-Protokoll an einen eigenen Server zu übertragen. Da hier schon öfter besprochen wurde, wie die Daten am eigenen Server nun empfangen werden können und ich dies kürzlich bei mir umgesetzt habe, darf ich euch eine kleine Anleitung bereitstellen :-) In meinem Fall habe ich dies für meine HP1000SE PRO per PHP erledigt.

I. Grundsätzliches zum Verständnis:

1. Der Server kann ein Raspberry Pi im eigenen Netzwerk sein auf dem ein Apache Webserver, PHP und eventuell auch ein Datenbankserver läuft. Selbst ein Raspberry Pi Zero W kann das bewerkstelligen. Auch viele NAS bieten die Möglichkeit an PHP-Scripts auszuführen. Das PHP Script kann jedoch auch auf einem Webspace eines Hostingproviders liegen. Also z.B. auf eurer eigenen Homepage. Es gibt auch einige seriöse Anbieter die Gratis-Pakete zur Verfügung stellen.

2. Die Wetterstation sendet die Daten aktiv an den Server, ruft dort das entsprechende Script auf und übermittelt die Daten per HTTP POST-Methode. Das Script muss die Daten dann weiterverarbeiten. Also zunächst in irgendeiner Form speichern. Beispielsweise in einer CSV-Datei oder in einer SQL-Datenbank.
Was nicht funktioniert ist, dass man ein PHP-Script über einen Browser oder einen Cronjob aufruft und dadurch die Daten der Wetterstation direkt abgefragt oder angezeigt werden. Das ist allerdings problemlos in 2 Schritten möglich. 1. Daten empfangen und abspeichern. 2. abgespeicherte Daten auslesen und darstellen.

II. Einstellungen auf der Wetterstation:

Bei der HP1000SE PRO findet man die entsprechenden Einstellungen unter 'Einstellungen (Zahnrad-Symbol) -> Wetterserver-Einstellungen -> Ind.Server-Einstellungen'
Hier muss u. A. die IP-Adresse oder der Hostname des Servers sowie der Pfad zum PHP-Script angegeben werden. Port ist im Normalfall 80. Die weiteren Einstellungen sollten selbsterklärend sein.
Beispielsweise könnte das dann so aussehen.
img1.jpg
img1.jpg (69.14 KiB) 945 mal betrachtet

III. Die PHP-Scripts

In unserem Fall wollen wir die übermittelten Daten in CSV-Dateien speichern. Pro Tag wird eine Datei erstellt und im angegebenen Intervall befüllt. Die Datei ist mit dem jeweiligen Tagesdatum benannt. Also z.B. 2022-08-09.csv

1. Daten empfangen und in Dateien speichern - Dieses Script muss von der Wetterstation aufgerufen werden.

Grundsätzlich sollte das Script 1:1 so funktionieren. Geändert werden muss lediglich die Variable $mac in Zeile 3. Hier hinterlegt ihr bitte die MAC-Adresse eurer Wetterstation. Bei der HP1000SE PRO findet man die MAC-Adresse unter den Wetterserver-Einstellungen oder unter 'Einstellungen (Zahnrad-Symbol) -> nochmal Zahnrad-Symbol -> nochmal Zahnrad-Symbol -> nochmal Zahnrad-Symbol -> Displayinformationen-Anzeige'.
Hintergrund für die Abfrage der MAC-Adresse ist, dass die Wetterstation beim POST die eigene MAC-Adresse als MD5 Hash übermittelt. So ist zumindest halbwegs sichergestellt, dass nicht jeder x-Beliebige Daten an euer Script übermitteln kann und diese dann auch noch verarbeitet werden. Grundsätzlich sollten alle von extern übermittelten Daten u. A. auf Plausibilität überprüft werden. Das würde aber hier den Rahmen sprengen.
Voraussetzung, dass die CSV-Dateien gespeichert werden können sind natürlich entsprechende Schreibrechte im aktuellen Verzeichnis.

Code: Alles auswählen

<?PHP

$mac = "FF:FF:FF:FF:FF:FF";
$md5hash = strtoupper(md5($mac));

	if ($_POST["PASSKEY"] == $md5hash) 
	{
		$f = date('Y-m-d') .".csv";
		$csv_header = "";
		$csv_data = "";
		$csv_seperator = ";";
		$csv_linebreak = "\n";
		
		$handle = fopen($f, "a");
				
		foreach($_POST as $key => $value)
		{
			$csv_header = $csv_header .$key .$csv_seperator;
			$csv_data = $csv_data .$value .$csv_seperator;
		}
		
		$csv_header = rtrim($csv_header, $csv_seperator);
		$csv_data =	rtrim($csv_data, $csv_seperator);
		
		if (filesize($f) == 0)
		{
			fwrite($handle, $csv_header);
			fwrite($handle, $csv_linebreak);	
		}
		
		fwrite($handle, $csv_data);
		fwrite($handle, $csv_linebreak);
		
		fclose($handle);
	}

?>
2. CSV-Dateien auslesen und in einer Tabelle darstellen - absteigend sortiert. Der aktuellste Eintrag steht also ganz oben. Dieses Script könnt ihr dann über einen Browser aufrufen.

Code: Alles auswählen

<!DOCTYPE html>

<html lang="de">

	<head>
		<meta charset="utf-8"/>
		<title>Demo</title>
		
		<style>
			table {border-collapse: collapse;}
			td {border: 1px solid black; padding: 2px;}
		</style>		
	</head>

	<body>


<?PHP

$csv_seperator = ";";

$files = glob("*.csv");
arsort($files);

foreach ($files as $file) 
{
	echo "<table>";
	
	$lines= file($file);
	// arsort($lines);

		foreach($lines as $line)
		{
			$field = explode($csv_seperator, $line);
			
				echo "<tr>";
				
				foreach($field as $value)
				{
					echo "<td>" .$value ."</td>";
				}
				
				echo "</tr>";
		}
		
		echo "</table><br><br>";
}

?>

	</body>
</html>	
Die Ausgabe sieht dann ungefähr so aus (Bild ist rechts abgeschnitten)
table.jpg
table.jpg (109.63 KiB) 945 mal betrachtet
Antworten