rilpoint_mw113

IP-Wetterdatenempfänger

Contents

1 Einleitung

Hier wird ein Skript vorgestellt, dass periodisch die Wetterdaten Temperatur, Luftfeuchtigkeit, Windgeschwindigkeit und Regenmenge des Kombisensors KS-300 von ELV über den IP-Wetterdatenempfänger ausliest und an die Site wetterarchiv.wetter.com sendet.

Der IP-Wetterdatenempfänger IPWE-1 von ELV empfängt die Funksignale einiger Wettersensoren und liefert die Messwerte als Webseite über die Ethernetschnittstelle. Im IPWE sind keine Sensoren integriert, sodass beim Einsatz des Kombisensors KS-300 von ELV keine Luftdruckwerte geliefert werden.

Der IPWE-1 wird nur als Bausatz geliefert. Alle SMD-Komponenten sind bereits bestückt, sodass sich der Zusammenbau auf das Einlöten der Elkos und Steckverbinder sowie des HF-Moduls beschränkt. Der Zeitaufwand ist kleiner 30 Minuten.

Image:KS300-Screenshot.gif

Image:IPWE1.jpg

2 Meldeskript

Dieses Perlskript liest aus dem IPWE-1 mit angeschlossenem Kombisensor KS-300 die Wetterdaten Temperatur, Luftfeuchte, Windgeschwindigkeit und Regenmenge. Das Skript wird durch einen Cronjob alle 15 Minuten aufgerufen und liest die Historyseite 'history8.cgi' mit den 5 letzten Datensätzen. Über die Temperatur-, Luftfeuchte- und Windgeschwindigkeitswerte wird der Mittelwert gebildet. Die gemeldeten Werte sind also über dieses einfache Tiefpassfilter gedämpft.

Die Regenmenge pro Zeit wird aus dem aktuellen Zählerstand des Regenmengenzählers und dem Zählerstand bei der letzten übermittelten Meldung gebildet. Der Zählerstand und ein Zeitstempel wird nach erfolgreicher Meldung in einer Datei gespeichert und beim nächsten Lauf wieder eingelesen. Wurde ein Kalibrierfaktor für die Regenmessung ermittelt, kann der mit der Variable $rain_adjust gesetzt werden. Der Regenmengenwert wird vor der Meldung mit diesem Wert multipliziert.

Das Skript loggt die Meldungen in das Systemlog, also üblicherweise /var/log/messages. Durch Setzen der Variablen $debug=1 werden zusätzliche Informationen geloggt.

2.1 Konfigurationsvariablen

$station_ip die IP-Adresses oder Hostname des IPWE-1
$history_page die Historyseite des Sensors im IPWE-1
$benutzername_ipwe Basic Auth Benutzername des IPWE-1
§passwort_ipwe Basic Auth Kennwort (leer lassen, wenn kein Kennwort gesetzt)
$lastval_file Absolutpfad der Datei in der Regenmengenzähler und Zeitstempel gespeichert werden
$benutzername_web Benutzername auf wetterarchiv.wetter.com
$passwort_web Kennwort für wetterarchiv.wetter.com
$rain_adjust Korrektorfaktor für die Regenmenge (default ist 1)
$debug auf 1 setzen für mehr Informationen im system log

Image:Wetterstation-KS300.jpg

2.2 Perlskript wetterdatenmeldung.pl

Dieses Skript als /usr/bin/wetterdatenmeldung.pl speichern.

#!/usr/bin/perl -w
use Digest::MD5 qw(md5_hex);
use Date::Format;
use LWP::UserAgent;
use Sys::Syslog qw( :DEFAULT setlogsock);
use LWP::UserAgent;

$station_ip="192.168.111.99"; # IP oder Hostname des IPWE
$history_page="history8.cgi";
$benutzername_ipwe="ssorglos"; # USER
$passwort_ipwe="geheim";  # PASSWORD
$lastval_file="/tmp/niederschlagsmenge.val";
$rain_adjust=1;
$debug=1;

setlogsock('unix');
openlog('Wetterdatenmeldung','','user');

if( open( RAIN, $lastval_file ) )
	{
	($l_time, $l_rain) = split(/:/, <RAIN> );
	close RAIN;
	dp( "Last values: $l_time:$l_rain" );
	}
else
	{
	$l_time=time(); $l_rain=0;
	}

$datum=Date::Format::time2str("%Y%m%d%H%M",time());

$ua = LWP::UserAgent->new;
$ua->timeout(60);
# Sensor 8 (KS 300) History mit 5 Messwertsätzen auslesen
$req = HTTP::Request->new(GET => "http://$station_ip/$history_page");
$req->authorization_basic($benutzername_ipwe, $passwort_ipwe) if $passwort_ipwe;
$response= $ua->request($req);
if( not $response->is_success )
	{
	syslog('info', "ERROR: IP-Wetterdatenempfänger nicht lesbar (".$response->status_line.")");
	exit;
	}
@lines=split(/\r\n/,$response->content);
@val=();
foreach (@lines)
	{
	next if not /(°C|%|km\/h|mm)/;
	s/<.*?>//; s/^ *//; s/ .*//; chomp($_);
	s/([^0-9\.\-])//g;
	push( @val, $_);
	}

if( @val != 20 )
	{
	# 5 gültige Datensätze müssen vorhanden sein
	syslog('info', "ERROR: ungültige Daten von IP-Wetterdatenempfänger gelesen.");
	exit;
	}
$temperatur=$feuchtigkeit=$windstaerke=$rain=0;
$rain=$val[3]; # letzter Regenmengenwert
for( $i=0; $i<20; $i+=4 )
	{
	$temperatur+=$val[$i+0]; # mitteln
	$feuchtigkeit+=$val[$i+1]; # mitteln
	$windstaerke+=$val[$i+2]; # mitteln
	}
$temperatur=sprintf("%.2f",$temperatur/5);
$feuchtigkeit=sprintf("%.2f",$feuchtigkeit/5);
$windstaerke=sprintf("%.2f",$windstaerke/5/3.6); # Umrechnen von km/h in m/s

$niederschlagsmenge = $rain>=$l_rain ? $rain-$l_rain : 0;
$niederschlagsmenge=sprintf("%.2f",$niederschlagsmenge*$rain_adjust);
$niederschlagsmenge_zeit=sprintf("%.0f", (time()-$l_time)/60);

dp( "temperatur=$temperatur" );
dp( "feuchtigkeit=$feuchtigkeit" );
dp( "windstaerke=$windstaerke" );
dp( "niederschlagsmenge_zeit=$niederschlagsmenge_zeit" );
dp( "niederschlagsmenge=$niederschlagsmenge" );

$success=sende_daten();

if( $success )
	{
	open( RAIN, ">$lastval_file" );
	print RAIN time() . ":$rain\n";
	close RAIN;
	dp("written " .time().":$rain");
	}

exit 0;


sub dp # debug print
	{
	$txt=shift;
	syslog('info', "(debug) $txt" ) if $debug;
	}

# meldet Wetterdaten an wetterarchiv.wetter.com
sub sende_daten
	{
	$benutzername_web="ssorglos"; # Benutzername auf wetterarchiv.wetter.com
	$passwort_web="geheim";  # und das Kennwort
	$url="http://www.wetterarchiv.de/interface/http/input.php?"
		. "benutzername=$benutzername_web&"
		. "passwortmd5=".md5_hex($passwort_web)."&"
		. "datum=$datum&"
		. "temperatur=$temperatur&"
		. "feuchtigkeit=$feuchtigkeit&"
		. "windstaerke=$windstaerke&"
		. "niederschlagsmenge_zeit=$niederschlagsmenge_zeit&"
		. "niederschlagsmenge=$niederschlagsmenge";
	dp( "url: $url");
	$res=$ua->get($url)->content;
	chomp($res);
	syslog('info', "Update: T=$temperatur CDeg, Hu=$feuchtigkeit %, V=$windstaerke m/s, "
		. "RnDt=$niederschlagsmenge_zeit min, Rn=$niederschlagsmenge mm): ");
	syslog('info', "Update result: $res");
	return $res=~/SUCCESS/;
	}

2.3 Cron job

Die Site wetterarchiv.wetter.com akzeptiert alle 15 Minuten eine neue Meldung. In /etc/crontab diesen Eintrag machen

*/15 * * * *  root  /usr/bin/wetterdatenmeldung.pl 2>&1 &> /dev/null

3 Kalibrierung der Regenmengenmessung

Um die Genauigkeit der Regenmessung zu erhöhen, sollte der Regensensor kalibriert werden. Die Kalibrierung ist unkompliziert und wird folgendermaßen durchgeführt:

  • IPWE aus- und einschalten, um den Regenmengenzähler auf Null zu setzen
  • eine bestimmte Wassermenge Ri abmessen, z.B. 250 ml. Am einfachsten geht das mit einer Küchenwaage und kaltem Wasser
  • das Regensensorgehäuse nach unten abziehen, sodass die Messwippe sichtbar wird
  • nun langsam Wasser in den Trichter gießen bis die Wippe kippt. Kurze Pause machen, dann weiter gießen. Zu schnelles Gießen verfälscht die Messung!
  • nachdem die gesamte Wassermenge eingegossen wurde, die Regenmenge, die der IPWE anzeigt, als Rg notieren
  • Durchmesser des Regenauffangtrichters messen und als D notieren.

Image:Regensensortrichter.jpg

Formel zur Berechnung des Kalibrierfaktors

K=4*Ri/D2/Rg/1000/3,14159

mit

Zeichen Einheit Beschreibung Beispielwert
Ri ml eingegossene Referenzwassermenge 250 ml
Rg mm/m2 bzw. l/m2 angezeigte Regenmenge 18,0 mm/m2
D m Öffnungsdurchmesser des Trichters 0,1395 m

Beispielrechnung:

K = 4*250 / 0,1395 / 0,1395 / 18 / 1000 / 3,14159 = 0,9087

Den Kalibrierwert in das Skript eintragen:

$rain_adjust=0.9087;

Skin by RIL Partner
mweinber --!>