mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +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/fhem@3663 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
0677d56879
commit
dc1b1b51f0
227
FHEM/55_GDS.pm
227
FHEM/55_GDS.pm
@ -35,6 +35,22 @@
|
|||||||
# added AttrFn
|
# added AttrFn
|
||||||
# modi retrieval of VHDL messages 30-33
|
# 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;
|
package main;
|
||||||
|
|
||||||
@ -45,6 +61,9 @@ use Time::HiRes qw(gettimeofday);
|
|||||||
use Net::FTP;
|
use Net::FTP;
|
||||||
use List::MoreUtils 'first_index';
|
use List::MoreUtils 'first_index';
|
||||||
use XML::Simple;
|
use XML::Simple;
|
||||||
|
use HttpUtils;
|
||||||
|
require LWP::UserAgent;
|
||||||
|
|
||||||
|
|
||||||
sub GDS_Define($$$);
|
sub GDS_Define($$$);
|
||||||
sub GDS_Undef($$);
|
sub GDS_Undef($$);
|
||||||
@ -56,11 +75,56 @@ sub getListStationsDropdown();
|
|||||||
sub buildCAPList();
|
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,".
|
"Hamburg,Hessen,Mecklenburg-Vorpommern,Niedersachsen,".
|
||||||
"Nordrhein-Westfalen,Rheinland-Pfalz,Saarland,Sachsen,".
|
"Nordrhein-Westfalen,Rheinland-Pfalz,Saarland,Sachsen,".
|
||||||
"Sachsen-Anhalt,Schleswig-Holstein,Thüringen";
|
"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
|
# Bundesländer den entsprechenden Dienststellen zuordnen
|
||||||
#
|
#
|
||||||
@ -80,7 +144,9 @@ my %bula2bulaShort = (
|
|||||||
"sachsen" => "sn",
|
"sachsen" => "sn",
|
||||||
"sachsen-anhalt" => "st",
|
"sachsen-anhalt" => "st",
|
||||||
"schleswig-holstein" => "sh",
|
"schleswig-holstein" => "sh",
|
||||||
"thüringen" => "th" );
|
"thüringen" => "th",
|
||||||
|
"deutschland" => "xde",
|
||||||
|
"bodensee" => "xbo" );
|
||||||
|
|
||||||
my %bulaShort2dwd = (
|
my %bulaShort2dwd = (
|
||||||
bw => "DWSG",
|
bw => "DWSG",
|
||||||
@ -98,7 +164,9 @@ my %bulaShort2dwd = (
|
|||||||
sn => "DWLG",
|
sn => "DWLG",
|
||||||
st => "DWLH",
|
st => "DWLH",
|
||||||
sh => "DWHH",
|
sh => "DWHH",
|
||||||
th => "DWLI" );
|
th => "DWLI",
|
||||||
|
xde => "xde",
|
||||||
|
xbo => "xbo" );
|
||||||
|
|
||||||
#
|
#
|
||||||
# Dienststellen den entsprechenden Serververzeichnissen zuordnen
|
# Dienststellen den entsprechenden Serververzeichnissen zuordnen
|
||||||
@ -128,7 +196,9 @@ my %dwd2Dir = (
|
|||||||
DWOF => "OF", # Offenbach
|
DWOF => "OF", # Offenbach
|
||||||
DWTR => "OF", # Offenbach
|
DWTR => "OF", # Offenbach
|
||||||
DWSU => "SU", # Stuttgart
|
DWSU => "SU", # Stuttgart
|
||||||
DWMS => "MS" # München
|
DWMS => "MS",
|
||||||
|
xde => "D",
|
||||||
|
xbo => "Bodensee" # München
|
||||||
# ???? => "FG" # Freiburg
|
# ???? => "FG" # Freiburg
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -143,56 +213,6 @@ my %dwd2Name = (
|
|||||||
SU => "Stuttgart"
|
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 ($alertsXml, %capCityHash, %capCellHash);
|
||||||
|
|
||||||
my $sList;
|
my $sList;
|
||||||
@ -228,6 +248,8 @@ sub GDS_Initialize($) {
|
|||||||
"gdsFwName gdsFwType:0,1,2,3,4,5,6,7 ".
|
"gdsFwName gdsFwType:0,1,2,3,4,5,6,7 ".
|
||||||
"gdsAll:0,1 gdsDebug:0,1 gdsLong:0,1 gdsPolygon:0,1 ".
|
"gdsAll:0,1 gdsDebug:0,1 gdsLong:0,1 gdsPolygon:0,1 ".
|
||||||
$readingFnAttributes;
|
$readingFnAttributes;
|
||||||
|
|
||||||
|
CommandDefine(undef, "gds_web HTTPSRV gds /tmp/ GDS Files");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub GDS_Define($$$) {
|
sub GDS_Define($$$) {
|
||||||
@ -262,7 +284,7 @@ sub GDS_Define($$$) {
|
|||||||
|
|
||||||
sub GDS_Undef($$) {
|
sub GDS_Undef($$) {
|
||||||
my ($hash, $arg) = @_;
|
my ($hash, $arg) = @_;
|
||||||
|
my $name = $hash->{NAME};
|
||||||
RemoveInternalTimer($hash);
|
RemoveInternalTimer($hash);
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
@ -311,12 +333,42 @@ sub GDS_Get($@) {
|
|||||||
"list:stations,data ".
|
"list:stations,data ".
|
||||||
"alerts:".$aList." ".
|
"alerts:".$aList." ".
|
||||||
"conditions:".$sList." ".
|
"conditions:".$sList." ".
|
||||||
|
"conditionsmap:".$cmapList." ".
|
||||||
|
"forecastsmap:".$fmapList." ".
|
||||||
|
"radarmap:".$cmapList." ".
|
||||||
|
"warningsmap:"."Deutschland,Bodensee,".$bulaList." ".
|
||||||
"warnings:".$bulaList;
|
"warnings:".$bulaList;
|
||||||
|
|
||||||
|
|
||||||
my ($result, $datensatz, $found);
|
my ($result, $datensatz, $found);
|
||||||
|
|
||||||
given($command) {
|
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"){
|
when("help"){
|
||||||
$result = getHelp();
|
$result = getHelp();
|
||||||
break;
|
break;
|
||||||
@ -365,11 +417,11 @@ sub GDS_Get($@) {
|
|||||||
|
|
||||||
when("warnings"){
|
when("warnings"){
|
||||||
my $vhdl;
|
my $vhdl;
|
||||||
$result = "VHDL30 = current / VHDL31 = weekend or holiday\n".
|
$result = " VHDL30 = current | VHDL31 = weekend or holiday\n".
|
||||||
"VHDL32 = preliminary / VHDL33 = cancel VHDL32\n".
|
" VHDL32 = preliminary | VHDL33 = cancel VHDL32\n".
|
||||||
sepLine(70);
|
sepLine(31)."+".sepLine(38);
|
||||||
for ($vhdl=30; $vhdl <=33; $vhdl++){
|
for ($vhdl=30; $vhdl <=33; $vhdl++){
|
||||||
(undef, $found) = retrieveFile($hash, $command, $parameter, $vhdl);
|
(undef, $found) = retrieveFile($hash, $command, $parameter, $vhdl,1);
|
||||||
if($found){
|
if($found){
|
||||||
$result .= retrieveTextWarn($hash,@a);
|
$result .= retrieveTextWarn($hash,@a);
|
||||||
$result .= "\n".sepLine(70);
|
$result .= "\n".sepLine(70);
|
||||||
@ -662,12 +714,10 @@ sub findCAPWarnCellId($$){
|
|||||||
|
|
||||||
sub retrieveTextWarn($@){
|
sub retrieveTextWarn($@){
|
||||||
my ($line, @a);
|
my ($line, @a);
|
||||||
|
|
||||||
open WXDATA, "/tmp/warnings";
|
open WXDATA, "/tmp/warnings";
|
||||||
while (chomp($line = <WXDATA>)) { push @a, latin1ToUtf8($line); }
|
while (chomp($line = <WXDATA>)) { push @a, latin1ToUtf8($line); }
|
||||||
close WXDATA;
|
close WXDATA;
|
||||||
|
return join("", @a);
|
||||||
return join("\n", @a);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub retrieveConditions($$@){
|
sub retrieveConditions($$@){
|
||||||
@ -737,12 +787,12 @@ sub retrieveConditions($$@){
|
|||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub retrieveFile($$;$$){
|
sub retrieveFile($$;$$$){
|
||||||
#
|
#
|
||||||
# request = type, e.g. alerts, conditions, warnings
|
# request = type, e.g. alerts, conditions, warnings
|
||||||
# parameter = additional selector, e.g. Bundesland
|
# parameter = additional selector, e.g. Bundesland
|
||||||
#
|
#
|
||||||
my ($hash, $request, $parameter, $parameter2) = @_;
|
my ($hash, $request, $parameter, $parameter2, $useFtp) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $user = $hash->{helper}{USER};
|
my $user = $hash->{helper}{USER};
|
||||||
my $pass = $hash->{helper}{PASS};
|
my $pass = $hash->{helper}{PASS};
|
||||||
@ -751,9 +801,45 @@ sub retrieveFile($$;$$){
|
|||||||
my $debug = AttrVal($name, "gdsDebug",0);
|
my $debug = AttrVal($name, "gdsDebug",0);
|
||||||
|
|
||||||
my ($dwd, $dir, $ftp, @files, $dataFile, $targetFile, $found, $readingName);
|
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){
|
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"){
|
when("alerts"){
|
||||||
$dir = "gds/specials/warnings/xml/PVW/";
|
$dir = "gds/specials/warnings/xml/PVW/";
|
||||||
$dwd = "Z_CAP*";
|
$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;
|
$found = 0;
|
||||||
eval {
|
eval {
|
||||||
$ftp = Net::FTP->new( "ftp-outgoing2.dwd.de",
|
$ftp = Net::FTP->new( "ftp-outgoing2.dwd.de",
|
||||||
Debug => 0,
|
Debug => 0,
|
||||||
Timeout => 360,
|
Timeout => 360,
|
||||||
FirewallType => $proxyType,
|
FirewallType => $proxyType,
|
||||||
@ -798,7 +885,13 @@ sub retrieveFile($$;$$){
|
|||||||
if(@files){
|
if(@files){
|
||||||
@files = sort(@files);
|
@files = sort(@files);
|
||||||
$dataFile = $files[-1];
|
$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;
|
$found = 1;
|
||||||
} else {
|
} else {
|
||||||
$found = 0;
|
$found = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user