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. |
2 Meldeskript
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:
|
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;




