2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 03:06:37 +00:00

added retrieval for condition maps

added	retrieval for forecast maps
added	retrieval for warning maps
added	retrieval for radar maps
changed	use LWP::ua for some file transfers instead of ftp
		due to transfer errors on image files
		use parameter #5 = 1 in RetrieveFile for ftp

To Be Done: Documentation for new functionality

git-svn-id: https://svn.fhem.de/fhem/trunk@3663 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
betateilchen 2013-08-11 00:36:17 +00:00
parent 464963bf77
commit bdd7765dc8

View File

@ -35,6 +35,22 @@
# added AttrFn
# modi retrieval of VHDL messages 30-33
#
# 2013-08-09 added more logging
# fixed missing error message if WARNCELLID does not exist
# update commandref
#
# 2013-08-10 added some more tolerance on text inputs
# changed switched from GetLogList to Log3
#
# 2013-08-11 added retrieval for condition maps
# added retrieval for forecast maps
# added retrieval for warning maps
# added retrieval for radar maps
#
# changed use LWP::ua for some file transfers instead of ftp
# due to transfer errors on image files
# use parameter #5 = 1 in RetrieveFile for ftp
#
package main;
@ -45,6 +61,9 @@ use Time::HiRes qw(gettimeofday);
use Net::FTP;
use List::MoreUtils 'first_index';
use XML::Simple;
use HttpUtils;
require LWP::UserAgent;
sub GDS_Define($$$);
sub GDS_Undef($$);
@ -56,11 +75,56 @@ sub getListStationsDropdown();
sub buildCAPList();
my $bulaList = "Baden-Württemberg,Bayern,Berlin,Brandenburg,Bremen,".
my $bulaList = "Baden-Württemberg,Bayern,Berlin,Brandenburg,Bremen,".
"Hamburg,Hessen,Mecklenburg-Vorpommern,Niedersachsen,".
"Nordrhein-Westfalen,Rheinland-Pfalz,Saarland,Sachsen,".
"Sachsen-Anhalt,Schleswig-Holstein,Thüringen";
my $cmapList = "Deutschland,Mitte,Nordost,Nordwest,Ost,Suedost,Suedwest,West";
my %rmapList = (
Deutschland => "",
Mitte => "central/",
Nordost => "northeast/",
Nordwest => "northwest/",
Ost => "east/",
Suedost => "southeast/",
Suedwest => "southwest/",
West => "west/");
my $fmapList = "Deutschland_heute_frueh,Deutschland_heute_mittag,Deutschland_heute_spaet,Deutschland_heute_nacht,".
"Deutschland_morgen_frueh,Deutschland_morgen_spaet,".
"Deutschland_ueberm_frueh,Deutschland_ueberm_spaet,".
"Deutschland_tag4_frueh,Deutschland_tag4_spaet".
"Mitte_heute_frueh,Mitte_heute_mittag,Mitte_heute_spaet,Mitte_heute_nacht,".
"Mitte_morgen_frueh,Mitte_morgen_spaet,".
"Mitte_ueberm_frueh,Mitte_ueberm_spaet,".
"Mitte_tag4_frueh,Mitte_tag4_spaet".
"Nordost_heute_frueh,Nordost_heute_mittag,Nordost_heute_spaet,Nordost_heute_nacht,".
"Nordost_morgen_frueh,Nordost_morgen_spaet,".
"Nordost_ueberm_frueh,Nordost_ueberm_spaet,".
"Nordost_tag4_frueh,Nordost_tag4_spaet".
"Nordwest_heute_frueh,Nordwest_heute_mittag,Nordwest_heute_spaet,Nordwest_heute_nacht,".
"Nordwest_morgen_frueh,Nordwest_morgen_spaet,".
"Nordwest_ueberm_frueh,Nordwest_ueberm_spaet,".
"Nordwest_tag4_frueh,Nordwest_tag4_spaet".
"Ost_heute_frueh,Ost_heute_mittag,Ost_heute_spaet,Ost_heute_nacht,".
"Ost_morgen_frueh,Ost_morgen_spaet,".
"Ost_ueberm_frueh,Ost_ueberm_spaet,".
"Ost_tag4_frueh,Ost_tag4_spaet".
"Suedost_heute_frueh,Suedost_heute_mittag,Suedost_heute_spaet,Suedost_heute_nacht,".
"Suedost_morgen_frueh,Suedost_morgen_spaet,".
"Suedost_ueberm_frueh,Suedost_ueberm_spaet,".
"Suedost_tag4_frueh,Suedost_tag4_spaet".
"Suedwest_heute_frueh,Suedwest_heute_mittag,Suedwest_heute_spaet,Suedwest_heute_nacht,".
"Suedwest_morgen_frueh,Suedwest_morgen_spaet,".
"Suedwest_ueberm_frueh,Suedwest_ueberm_spaet,".
"Suedwest_tag4_frueh,Suedwest_tag4_spaet".
"West_heute_frueh,West_heute_mittag,West_heute_spaet,West_heute_nacht,".
"West_morgen_frueh,West_morgen_spaet,".
"West_ueberm_frueh,West_ueberm_spaet,".
"West_tag4_frueh,West_tag4_spaet";
#
# Bundesländer den entsprechenden Dienststellen zuordnen
#
@ -80,7 +144,9 @@ my %bula2bulaShort = (
"sachsen" => "sn",
"sachsen-anhalt" => "st",
"schleswig-holstein" => "sh",
"thüringen" => "th" );
"thüringen" => "th",
"deutschland" => "xde",
"bodensee" => "xbo" );
my %bulaShort2dwd = (
bw => "DWSG",
@ -98,7 +164,9 @@ my %bulaShort2dwd = (
sn => "DWLG",
st => "DWLH",
sh => "DWHH",
th => "DWLI" );
th => "DWLI",
xde => "xde",
xbo => "xbo" );
#
# Dienststellen den entsprechenden Serververzeichnissen zuordnen
@ -128,7 +196,9 @@ my %dwd2Dir = (
DWOF => "OF", # Offenbach
DWTR => "OF", # Offenbach
DWSU => "SU", # Stuttgart
DWMS => "MS" # München
DWMS => "MS",
xde => "D",
xbo => "Bodensee" # München
# ???? => "FG" # Freiburg
);
@ -143,56 +213,6 @@ my %dwd2Name = (
SU => "Stuttgart"
);
# my %iiList = (
# "31" => "Gewitter",
# "33" => "Starkes Gewitter",
# "34" => "Starkes Gewitter",
# "36" => "Starkes Gewitter",
# "38" => "Starkes Gewitter",
# "40" => "Schweres Gewitter",
# "41" => "Schweres Gewitter mit extremen Orkanböen",
# "42" => "Schweres Gewitter",
# "44" => "Schweres Gewitter",
# "45" => "Schweres Gewitter mit extremen Orkanböen",
# "46" => "Schweres Gewitter",
# "48" => "Schweres Gewitter",
# "49" => "Schweres Gewitter mit extremen Orkanböen",
# "51" => "Windböen",
# "52" => "Sturmböen",
# "53" => "Schwere Sturmböen",
# "54" => "Orkanartige Böen",
# "55" => "Orkanböen",
# "56" => "Extreme Orkanböen",
# "59" => "Nebel",
# "61" => "Starkregen",
# "62" => "Heftiger Starkregen",
# "63" => "Dauerregen",
# "64" => "Ergiebiger Dauerregen",
# "65" => "Extrem ergiebiger Dauerregen",
# "66" => "Extrem heftiger Starkregen",
# "70" => "Schneefall",
# "71" => "Schneefall",
# "72" => "Starker Schneefall",
# "73" => "Extrem starker Schneefall",
# "74" => "Schneeverwehung",
# "75" => "Starke Schneeverwehung",
# "76" => "Schneeverwehung",
# "77" => "Starke Schneeverwehung",
# "78" => "Extrem starke Schneeverwehung",
# "81" => "Frost",
# "82" => "Strenger Frost",
# "83" => "Glätte",
# "84" => "Glätte",
# "85" => "Glatteis",
# "86" => "Glätte",
# "87" => "Glätte",
# "88" => "Tauwetter",
# "89" => "Starkes Tauwetter",
# "94" => "Schweres Gewitter",
# "95" => "Schweres Gewitter mit extrem heftigem Starkregen",
# "96" => "Schweres Gewitter mit extrem heftigem Starkregen"
# );
my ($alertsXml, %capCityHash, %capCellHash);
my $sList;
@ -228,6 +248,8 @@ sub GDS_Initialize($) {
"gdsFwName gdsFwType:0,1,2,3,4,5,6,7 ".
"gdsAll:0,1 gdsDebug:0,1 gdsLong:0,1 gdsPolygon:0,1 ".
$readingFnAttributes;
CommandDefine(undef, "gds_web HTTPSRV gds /tmp/ GDS Files");
}
sub GDS_Define($$$) {
@ -262,7 +284,7 @@ sub GDS_Define($$$) {
sub GDS_Undef($$) {
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
RemoveInternalTimer($hash);
return undef;
}
@ -311,12 +333,42 @@ sub GDS_Get($@) {
"list:stations,data ".
"alerts:".$aList." ".
"conditions:".$sList." ".
"conditionsmap:".$cmapList." ".
"forecastsmap:".$fmapList." ".
"radarmap:".$cmapList." ".
"warningsmap:"."Deutschland,Bodensee,".$bulaList." ".
"warnings:".$bulaList;
my ($result, $datensatz, $found);
given($command) {
when("conditionsmap"){
# retrieve map: current conditions
retrieveFile($hash,$command,$parameter);
break;
}
when("forecastsmap"){
# retrieve map: forecasts
retrieveFile($hash,$command,$parameter);
break;
}
when("warningsmap"){
# retrieve map: warnings
retrieveFile($hash,$command,$parameter);
break;
}
when("radarmap"){
# retrieve map: radar
$parameter = ucfirst($parameter);
retrieveFile($hash,$command,$parameter,$rmapList{$parameter});
break;
}
when("help"){
$result = getHelp();
break;
@ -365,11 +417,11 @@ sub GDS_Get($@) {
when("warnings"){
my $vhdl;
$result = "VHDL30 = current / VHDL31 = weekend or holiday\n".
"VHDL32 = preliminary / VHDL33 = cancel VHDL32\n".
sepLine(70);
$result = " VHDL30 = current | VHDL31 = weekend or holiday\n".
" VHDL32 = preliminary | VHDL33 = cancel VHDL32\n".
sepLine(31)."+".sepLine(38);
for ($vhdl=30; $vhdl <=33; $vhdl++){
(undef, $found) = retrieveFile($hash, $command, $parameter, $vhdl);
(undef, $found) = retrieveFile($hash, $command, $parameter, $vhdl,1);
if($found){
$result .= retrieveTextWarn($hash,@a);
$result .= "\n".sepLine(70);
@ -662,12 +714,10 @@ sub findCAPWarnCellId($$){
sub retrieveTextWarn($@){
my ($line, @a);
open WXDATA, "/tmp/warnings";
while (chomp($line = <WXDATA>)) { push @a, latin1ToUtf8($line); }
close WXDATA;
return join("\n", @a);
return join("", @a);
}
sub retrieveConditions($$@){
@ -737,12 +787,12 @@ sub retrieveConditions($$@){
return ;
}
sub retrieveFile($$;$$){
sub retrieveFile($$;$$$){
#
# request = type, e.g. alerts, conditions, warnings
# parameter = additional selector, e.g. Bundesland
#
my ($hash, $request, $parameter, $parameter2) = @_;
my ($hash, $request, $parameter, $parameter2, $useFtp) = @_;
my $name = $hash->{NAME};
my $user = $hash->{helper}{USER};
my $pass = $hash->{helper}{PASS};
@ -751,9 +801,45 @@ sub retrieveFile($$;$$){
my $debug = AttrVal($name, "gdsDebug",0);
my ($dwd, $dir, $ftp, @files, $dataFile, $targetFile, $found, $readingName);
my $urlString = "ftp://$user:$pass\@ftp-outgoing2.dwd.de/";
my $ua = LWP::UserAgent->new; # test
$ua->timeout(10); # test
$ua->env_proxy; # test
given($request){
when("conditionsmap"){
$dir = "gds/specials/observations/maps/germany/";
$dwd = $parameter."*";
$targetFile = "/tmp/cmap.jpg";
break;
}
when("forecastsmap"){
$dir = "gds/specials/forecasts/maps/germany/";
$dwd = $parameter."*";
$targetFile = "/tmp/fmap.jpg";
break;
}
when("warningsmap"){
if(length($parameter) != 2){
$parameter = $bula2bulaShort{lc($parameter)};
}
$dwd = "Schilder".$dwd2Dir{$bulaShort2dwd{lc($parameter)}}.".jpg";
$dir = "gds/specials/warnings/maps/";
$targetFile = "/tmp/wmap.jpg";
break;
}
when("radarmap"){
$dir = "gds/specials/radar/".$parameter2;
$dwd = "Webradar_".$parameter."*";
$targetFile = "/tmp/rmap.jpg";
break;
}
when("alerts"){
$dir = "gds/specials/warnings/xml/PVW/";
$dwd = "Z_CAP*";
@ -781,11 +867,12 @@ sub retrieveFile($$;$$){
}
}
Log3($name, 3, "GDS $name: retrieving $dir".$dwd." from DWD server");
Log3($name, 3, "GDS $name: searching $dir".$dwd." on DWD server");
$urlString .= $dir;
$found = 0;
eval {
$ftp = Net::FTP->new( "ftp-outgoing2.dwd.de",
$ftp = Net::FTP->new( "ftp-outgoing2.dwd.de",
Debug => 0,
Timeout => 360,
FirewallType => $proxyType,
@ -798,7 +885,13 @@ sub retrieveFile($$;$$){
if(@files){
@files = sort(@files);
$dataFile = $files[-1];
$ftp->get($files[-1], $targetFile);
$urlString .= $dataFile;
Log3($name, 3, "GDS $name: retrieving $urlString");
if($useFtp){
$ftp->get($files[-1], $targetFile);
} else {
$ua->get($urlString,':content_file' => $targetFile);
}
$found = 1;
} else {
$found = 0;