2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 12:49:34 +00:00

- 59_Weather refined, language selection (en, de, uncomplete nl) added

- 95_FLOORPLAN.pm: Attribute stylesheetPrefix replaced by stylesheet



git-svn-id: https://svn.fhem.de/fhem/trunk@1885 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
borisneubert 2012-09-23 16:44:23 +00:00
parent c6d0d3b21b
commit ed470fa7ca
4 changed files with 106 additions and 68 deletions

View File

@ -32,6 +32,7 @@
- feature: new attribute group for FHEMWEB (Boris) - feature: new attribute group for FHEMWEB (Boris)
- change: 11_FHT.pm, 50_WS300.pm, 59_Weather.pm migrated to readingsUpdate - change: 11_FHT.pm, 50_WS300.pm, 59_Weather.pm migrated to readingsUpdate
mechanism (Boris) mechanism (Boris)
- change: 59_Weather.pm migrated from Google to Yahoo Weather API (Boris)
- change: updatefhem modifications to support a clean install of fhem and - change: updatefhem modifications to support a clean install of fhem and
pgm2 installation, see commandref.html (M. Fischer) pgm2 installation, see commandref.html (M. Fischer)
- change: FHEMWEB support for the new www/pgm2 directroy added (M. Fischer) - change: FHEMWEB support for the new www/pgm2 directroy added (M. Fischer)

View File

@ -19,29 +19,8 @@ use Time::HiRes qw(gettimeofday);
# #
# Mapping of current supported encodings
my %DEFAULT_ENCODINGS = (
en => 'latin1',
da => 'latin1',
de => 'latin1',
es => 'latin1',
fi => 'latin1',
fr => 'latin1',
it => 'latin1',
ja => 'utf-8',
ko => 'utf-8',
nl => 'latin1',
no => 'latin1',
'pt-BR' => 'latin1',
ru => 'utf-8',
sv => 'latin1',
'zh-CN' => 'utf-8',
'zh-TW' => 'utf-8',
);
# Mapping / translation of current weather codes 0-47 # Mapping / translation of current weather codes 0-47
my @YahooCodes_us = ( my @YahooCodes_en = (
'tornado', 'tropical storm', 'hurricane', 'severe thunderstorms', 'thunderstorms', 'mixed rain and snow', 'tornado', 'tropical storm', 'hurricane', 'severe thunderstorms', 'thunderstorms', 'mixed rain and snow',
'mixed rain and sleet', 'mixed snow and sleet', 'freezing drizzle', 'drizzle', 'freezing rain' ,'showers', 'mixed rain and sleet', 'mixed snow and sleet', 'freezing drizzle', 'drizzle', 'freezing rain' ,'showers',
'showers', 'snow flurries', 'light snow showers', 'blowing snow', 'snow', 'hail', 'showers', 'snow flurries', 'light snow showers', 'blowing snow', 'snow', 'hail',
@ -61,9 +40,9 @@ my @YahooCodes_us = (
my @YahooCodes_de = ( my @YahooCodes_de = (
'Tornado', 'schwerer Sturm', 'Sturm', 'schwere Gewitter', 'Gewitter', 'Regen und Schnee', 'Tornado', 'schwerer Sturm', 'Sturm', 'schwere Gewitter', 'Gewitter', 'Regen und Schnee',
'Regen und Schnee', 'Schnee und Regen', 'Eisregen', 'Graupelschauer', 'gefrierender Regen' ,'Regen', 'Regen und Graupel', 'Schnee und Graupel', 'Eisregen', 'Nieselregen', 'gefrierender Regen' ,'Schauer',
'Regen', 'Schneegestöber', 'leichter Schneeschauer', 'Schneeverwehungen', 'Schnee', 'Hagel', 'Schauer', 'Schneetreiben', 'leichter Schneeschauer', 'Schneeverwehungen', 'Schnee', 'Hagel',
'Schnee und Regen', 'Dunst', 'neblig', 'Staub oder Rauch', 'Smog', 'blustery', 'Graupel', 'Staub', 'Nebel', 'Dunst', 'Smog', 'Sturm',
'windig', 'kalt', 'wolkig', 'windig', 'kalt', 'wolkig',
'überwiegend wolkig', # night 'überwiegend wolkig', # night
'überwiegend wolkig', # day 'überwiegend wolkig', # day
@ -74,12 +53,45 @@ my @YahooCodes_de = (
'bewölkt', # night 'bewölkt', # night
'bewölkt', # day 'bewölkt', # day
'Regen und Hagel', 'Regen und Hagel',
'heiss', 'einzelne Gewitter', 'vereinzelt Gewitter', 'vereinzelt Gewitter', 'vereinzelt Regen', 'heftiger Schneefall', 'heiß', 'einzelne Gewitter', 'vereinzelt Gewitter', 'vereinzelt Gewitter', 'vereinzelt Schauer', 'starker Schneefall',
'vereinzelt Schneeschauer', 'heftiger Schneefall', 'teilweise wolkig', 'Gewitterregen', 'Schneeschauer', 'vereinzelt Gewitter'); 'vereinzelt Schneeschauer', 'starker Schneefall', 'teilweise wolkig', 'Gewitterregen', 'Schneeschauer', 'vereinzelt Gewitter');
my @directions_de = ('N', 'NNO', 'NO', 'ONO', 'O', 'OSO', 'SO', 'SSO', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'); my @YahooCodes_nl = (
'tornado', 'zware storm', 'orkaan', 'hevig onweer', 'onweer',
'regen en sneeuw',
'regen en ijzel', 'sneeuw en ijzel', 'aanvriezende motregen',
'motregen', 'aanvriezende regen' ,'regenbuien',
'buien', 'sneeuw windstoten', 'lichte sneeuwbuien',
'stuifsneeuw', 'sneeuw', 'hagel',
'ijzel', 'stof', 'mist', 'waas', 'smog', 'heftig',
'winderig', 'koud', 'bewolkt',
'overwegend bewolkt', # night
'overwegend bewolkt', # day
'gedeeltelijk bewolkt', # night
'gedeeltelijk bewolkt', # day
'helder', #night
'zonnig',
'bewolkt', #night
'bewolkt', #day
'regen en hagel',
'heet', 'plaatselijk onweer', 'af en toe onweer', 'af en toe onweer', 'af en toe regenbuien', 'hevige sneeuwval',
'af en toe sneeuwbuien', 'hevige sneeuwval', 'deels bewolkt',
'onweersbuien', 'sneeuwbuien', 'af en toe onweersbuien');
my %wdayXlate = ('Mon' => 'Mo.', 'Tue' => 'Di.', 'Wed'=> 'Mi.', 'Thu' => 'Do.', 'Fri' => 'Fr.', 'Sat' => 'Sa.', 'Sun' => 'So.');
my %pressure_trend_txt_en = ( 0 => "steady", 1 => "rising", 2 => "falling" );
my %pressure_trend_txt_de = ( 0 => "gleichbleibend", 1 => "steigend", 2 => "fallend" );
my %pressure_trend_txt_nl = ( 0 => "steady", 1 => "rising", 2 => "falling" );
my %pressure_trend_sym = ( 0 => "=", 1 => "+", 2 => "-" );
my @directions_txt_en = ('N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW');
my @directions_txt_de = ('N', 'NNO', 'NO', 'ONO', 'O', 'OSO', 'SO', 'SSO', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW');
my @directions_txt_nl = ('N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW');
my %wdays_txt_en = ('Mon' => 'Mon', 'Tue' => 'Tue', 'Wed'=> 'Wed', 'Thu' => 'Thu', 'Fri' => 'Fri', 'Sat' => 'Sat', 'Sun' => 'Sun');
my %wdays_txt_de = ('Mon' => 'Mo', 'Tue' => 'Di', 'Wed'=> 'Mi', 'Thu' => 'Do', 'Fri' => 'Fr', 'Sat' => 'Sa', 'Sun' => 'So');
my %wdays_txt_nl = ('Mon' => 'Mo.', 'Tue' => 'Di.', 'Wed'=> 'Mi.', 'Thu' => 'Do.', 'Fri' => 'Fr.', 'Sat' => 'Sa.', 'Sun' => 'So.');
my @iconlist = ( my @iconlist = (
'storm', 'storm', 'storm', 'thunderstorm', 'thunderstorm', 'rainsnow', 'storm', 'storm', 'storm', 'thunderstorm', 'thunderstorm', 'rainsnow',
@ -125,10 +137,10 @@ sub wind_in_km_per_h($$) {
return $unitsystem ne "SI" ? int(1.609344*$wind+0.5) : $wind; return $unitsystem ne "SI" ? int(1.609344*$wind+0.5) : $wind;
} }
sub degrees_to_direction($) { sub degrees_to_direction($@) {
my ($degrees) = @_; my ($degrees,@directions_txt_i18n) = @_;
my $mod = int((($degrees + 11.25) % 360) / 22.5); my $mod = int((($degrees + 11.25) % 360) / 22.5);
return $directions_de[$mod]; return $directions_txt_i18n[$mod];
} }
################################### ###################################
@ -178,6 +190,30 @@ sub Weather_RetrieveData($)
my $xml = GetFileFromURL("http://weather.yahooapis.com/forecastrss?w=" . $location . "&u=" . $units, 3, undef, 1); my $xml = GetFileFromURL("http://weather.yahooapis.com/forecastrss?w=" . $location . "&u=" . $units, 3, undef, 1);
return 0 if( ! defined $xml || $xml eq ""); return 0 if( ! defined $xml || $xml eq "");
my $lang= $hash->{LANG};
my @YahooCodes_i18n;
my %wdays_txt_i18n;
my @directions_txt_i18n;
my %pressure_trend_txt_i18n;
if($lang eq "de") {
@YahooCodes_i18n= @YahooCodes_de;
%wdays_txt_i18n= %wdays_txt_de;
@directions_txt_i18n= @directions_txt_de;
%pressure_trend_txt_i18n= %pressure_trend_txt_de;
} elsif($lang eq "nl") {
@YahooCodes_i18n= @YahooCodes_nl;
%wdays_txt_i18n= %wdays_txt_nl;
@directions_txt_i18n= @directions_txt_nl;
%pressure_trend_txt_i18n= %pressure_trend_txt_nl;
} else {
@YahooCodes_i18n= @YahooCodes_en;
%wdays_txt_i18n= %wdays_txt_en;
@directions_txt_i18n= @directions_txt_en;
%pressure_trend_txt_i18n= %pressure_trend_txt_en;
}
foreach my $l (split("<",$xml)) { foreach my $l (split("<",$xml)) {
#Log 1, "DEBUG WEATHER: line=\"$l\""; #Log 1, "DEBUG WEATHER: line=\"$l\"";
next if($l eq ""); # skip empty lines next if($l eq ""); # skip empty lines
@ -202,7 +238,7 @@ sub Weather_RetrieveData($)
my $code = (($value =~/code="([0-9]*?)".*/) ? $1 : undef); my $code = (($value =~/code="([0-9]*?)".*/) ? $1 : undef);
if (defined($code)) { if (defined($code)) {
readingsUpdate($hash, $prefix . "code", $code); readingsUpdate($hash, $prefix . "code", $code);
my $text = $YahooCodes_de[$code]; my $text = $YahooCodes_i18n[$code];
if ($text) { readingsUpdate($hash, $prefix . "condition", $text); } if ($text) { readingsUpdate($hash, $prefix . "condition", $text); }
#### add icon logic here - generate from code #### add icon logic here - generate from code
$text = $iconlist[$code]; $text = $iconlist[$code];
@ -216,7 +252,7 @@ sub Weather_RetrieveData($)
if ($temp) { if ($temp) {
readingsUpdate($hash, "temperature", $temp); readingsUpdate($hash, "temperature", $temp);
readingsUpdate($hash, "temp_c", $temp); # compatibility readingsUpdate($hash, "temp_c", $temp); # compatibility
$temp = ( $temp * 9 / 5 ) + 32; # Celsius to Fahrenheit $temp = int(( $temp * 9 / 5 ) + 32.5); # Celsius to Fahrenheit
readingsUpdate($hash, "temp_f", $temp); # compatibility readingsUpdate($hash, "temp_f", $temp); # compatibility
} }
@ -225,8 +261,7 @@ sub Weather_RetrieveData($)
my $day = (($value =~/date="(.*?), .*/) ? $1 : undef); my $day = (($value =~/date="(.*?), .*/) ? $1 : undef);
if ($day) { if ($day) {
my $day_de = $wdayXlate{$day}; readingsUpdate($hash, "day_of_week", $wdays_txt_i18n{$day});
readingsUpdate($hash, "day_of_week", $day_de);
} }
} }
@ -238,8 +273,7 @@ sub Weather_RetrieveData($)
if ($high_c) { readingsUpdate($hash, $prefix . "high_c", $high_c); } if ($high_c) { readingsUpdate($hash, $prefix . "high_c", $high_c); }
my $day1 = (($value =~/day="(.*?)" .*/) ? $1 : undef); # forecast my $day1 = (($value =~/day="(.*?)" .*/) ? $1 : undef); # forecast
if ($day1) { if ($day1) {
my $day1_de = $wdayXlate{$day1}; readingsUpdate($hash, $prefix . "day_of_week", $wdays_txt_i18n{$day1});
readingsUpdate($hash, $prefix . "day_of_week", $day1_de);
} }
} }
@ -248,10 +282,14 @@ sub Weather_RetrieveData($)
$value =~/humidity="([0-9.]*?)" .*visibility="([0-9.]*?|\s*?)" .*pressure="([0-9.]*?)" .*rising="([0-9.]*?)" .*/; $value =~/humidity="([0-9.]*?)" .*visibility="([0-9.]*?|\s*?)" .*pressure="([0-9.]*?)" .*rising="([0-9.]*?)" .*/;
if ($1) { readingsUpdate($hash, "humidity", $1); } if ($1) { readingsUpdate($hash, "humidity", $1); }
my $vis = (($2 eq "") ? " " : $2); # clear visibility field my $vis = (($2 eq "") ? " " : int($2+0.5)); # clear visibility field
readingsUpdate($hash, "visibility", $vis); readingsUpdate($hash, "visibility", $vis);
if ($3) { readingsUpdate($hash, "pressure", $3); } if ($3) { readingsUpdate($hash, "pressure", int($3+0.5)); }
if ($4) { readingsUpdate($hash, "pressure_trend", $4); } if ($4) {
readingsUpdate($hash, "pressure_trend", $4);
readingsUpdate($hash, "pressure_trend_txt", $pressure_trend_txt_i18n{$4});
readingsUpdate($hash, "pressure_trend_sym", $pressure_trend_sym{$4});
}
} }
### wind ### wind
@ -259,12 +297,12 @@ sub Weather_RetrieveData($)
$value =~/chill="([0-9.]*?)" .*direction="([0-9.]*?)" .*speed="([0-9.]*?)" .*/; $value =~/chill="([0-9.]*?)" .*direction="([0-9.]*?)" .*speed="([0-9.]*?)" .*/;
readingsUpdate($hash, "wind_chill", $1) if (defined($1)); readingsUpdate($hash, "wind_chill", $1) if (defined($1));
readingsUpdate($hash, "wind_direction", $2) if (defined($2)); readingsUpdate($hash, "wind_direction", $2) if (defined($2));
my $windspeed= defined($3) ? int($3) : ""; my $windspeed= defined($3) ? int($3+0.5) : "";
readingsUpdate($hash, "wind_speed", $windspeed); readingsUpdate($hash, "wind_speed", $windspeed);
readingsUpdate($hash, "wind", $windspeed); # duplicate for compatibility readingsUpdate($hash, "wind", $windspeed); # duplicate for compatibility
if (defined($2) & defined($3)) { if (defined($2) & defined($3)) {
my $wdir = degrees_to_direction($2); my $wdir = degrees_to_direction($2,@directions_txt_i18n);
readingsUpdate($hash, "wind_condition", "Wind: $wdir mit $windspeed km/h"); # compatibility readingsUpdate($hash, "wind_condition", "Wind: $wdir $windspeed km/h"); # compatibility
} }
} }
} }
@ -351,7 +389,7 @@ sub Weather_Define($$) {
my @a = split("[ \t][ \t]*", $def); my @a = split("[ \t][ \t]*", $def);
return "syntax: define <name> Weather <location> [interval [en|de|fr|es]]" return "syntax: define <name> Weather <location> [interval [en|de|nl]]"
if(int(@a) < 3 && int(@a) > 5); if(int(@a) < 3 && int(@a) > 5);
$hash->{STATE} = "Initialized"; $hash->{STATE} = "Initialized";

View File

@ -124,7 +124,7 @@ FLOORPLAN_Initialize($)
{ {
my ($hash) = @_; my ($hash) = @_;
$hash->{DefFn} = "FP_define"; $hash->{DefFn} = "FP_define";
$hash->{AttrList} = "loglevel:0,1,2,3,4,5,6 refresh fp_arrange:1,detail,WEB,0 commandfield:1,0 fp_default:1,0 fp_stylesheetPrefix fp_noMenu:1,0"; $hash->{AttrList} = "loglevel:0,1,2,3,4,5,6 refresh fp_arrange:1,detail,WEB,0 commandfield:1,0 fp_default:1,0 stylesheet fp_noMenu:1,0";
# fp_arrange : show addtl. menu for attr fp_<name> .... # fp_arrange : show addtl. menu for attr fp_<name> ....
# commandfield : shows an fhem-commandline inputfield on floorplan # commandfield : shows an fhem-commandline inputfield on floorplan
# fp_default : set for ONE floorplan. If set, floorplan-startscreen is skipped. # fp_default : set for ONE floorplan. If set, floorplan-startscreen is skipped.
@ -315,15 +315,8 @@ FP_htmlHeader($) {
my $rf = AttrVal($FW_wname, "refresh", ""); my $rf = AttrVal($FW_wname, "refresh", "");
FW_pO "<meta http-equiv=\"refresh\" content=\"$rf\">" if($rf); # use refresh-value from Web-Instance FW_pO "<meta http-equiv=\"refresh\" content=\"$rf\">" if($rf); # use refresh-value from Web-Instance
# stylesheet # stylesheet
# removed the option to have different styles for FHEMWEB and FLOORPLAN my $defaultcss = AttrVal($FW_wname, "stylesheetPrefix", "") . "floorplanstyle.css";
# if ($FP_name) { my $css= AttrVal($FP_name, "stylesheet", $defaultcss);
# my $prf = AttrVal($FP_name, "fp_stylesheetPrefix", "");
# FW_pO ("<link href=\"$FW_ME/css/$prf"."floorplanstyle.css\" rel=\"stylesheet\"/>"); #use floorplanstyle.css for floorplans, evtl. with fp_stylesheetPrefix #20120730 0017
# } else {
# my $css = AttrVal($FW_wname, "stylesheetPrefix", "") . "floorplanstyle.css";
# FW_pO "<link href=\"$FW_ME/css/$css\" rel=\"stylesheet\"/>"; #use floorplanstyle.css (incl. FW-stylesheetPrefix) for fp-start-screen #20120730 0017
# }
my $css = AttrVal($FW_wname, "stylesheetPrefix", "") . "floorplanstyle.css";
FW_pO "<link href=\"$FW_ME/css/$css\" rel=\"stylesheet\"/>"; FW_pO "<link href=\"$FW_ME/css/$css\" rel=\"stylesheet\"/>";
#set sripts #set sripts

View File

@ -5235,12 +5235,15 @@ To send the data, both send or write could be used.<br>
<tr><td>humidity</td><td>current humidity in %</td></tr> <tr><td>humidity</td><td>current humidity in %</td></tr>
<tr><td>icon</td><td>relative path for current icon</td></tr> <tr><td>icon</td><td>relative path for current icon</td></tr>
<tr><td>pressure</td><td>air pressure in hPa</td></tr> <tr><td>pressure</td><td>air pressure in hPa</td></tr>
<tr><td>pressure_trend</td><td>air pressure trend (unit?)</td></tr> <tr><td>pressure_trend</td><td>air pressure trend (0= steady, 1= rising, 2= falling)</td></tr>
<tr><td>pressure_trend_txt</td><td>textual representation of air pressure trend</td></tr>
<tr><td>pressure_trend_sym</td><td>symbolic representation of air pressure trend</td></tr>
<tr><td>temperature</td><td>current temperature in degrees centigrade</td></tr> <tr><td>temperature</td><td>current temperature in degrees centigrade</td></tr>
<tr><td>temp_c</td><td>current temperature in degrees centigrade</td></tr> <tr><td>temp_c</td><td>current temperature in degrees centigrade</td></tr>
<tr><td>temp_f</td><td>current temperature in degrees Fahrenheit</td></tr> <tr><td>temp_f</td><td>current temperature in degrees Fahrenheit</td></tr>
<tr><td>visibility</td><td>visibility in km</td></tr>
<tr><td>wind</td><td>wind speed in km/h</td></tr> <tr><td>wind</td><td>wind speed in km/h</td></tr>
<tr><td>wind_chill</td><td>?</td></tr> <tr><td>wind_chill</td><td>wind chill in degrees centigrade</td></tr>
<tr><td>wind_condition</td><td>wind direction and speed</td></tr> <tr><td>wind_condition</td><td>wind direction and speed</td></tr>
<tr><td>wind_direction</td><td>direction wind comes from in degrees (0 = north wind)</td></tr> <tr><td>wind_direction</td><td>direction wind comes from in degrees (0 = north wind)</td></tr>
<tr><td>wind_speed</td><td>same as wind</td></tr> <tr><td>wind_speed</td><td>same as wind</td></tr>
@ -9739,12 +9742,15 @@ KlikAanKlikUit, NEXA, CHACON, HomeEasy UK. <br> You need to define an RFXtrx433
<code>attr Groundfloor fp_arrange WEB #activates arrange mode for frontend-device WEB only</code><br><br> <code>attr Groundfloor fp_arrange WEB #activates arrange mode for frontend-device WEB only</code><br><br>
</ul> </ul>
</li> </li>
<li><a name="fp_stylesheetPrefix">fp_stylesheetPrefix</a><br> <li><a name="stylesheet">stylesheet</a><br>
Allows the usage of a separate stylesheet like <a href="#stylesheetPrefix">stylesheetPrefix</a>.<br> Explicitely sets your personal stylesheet for the floorplan. This overrides the standard stylesheet.
The prefix is prepended the standard stylesheet floorplanstyle.css .<br> The standard stylesheet for floorplans is <code>floorplanstyle.css</code>. If the <a href="#stylesheetPrefix">stylesheetPrefix</a> is set for the corresponding FHEMWEB instance, this same
<code>stylesheetPrefix</code> is also prepended to the stylesheet for floorplans.<br>
All stylesheets must be stored in the stylesheet subfolder of the fhem filesystem hierarchy. Store your personal
stylesheet along with <code>floorplanstyle.css</code> in the same folder.<br>
Example: Example:
<ul> <ul>
<code>attr Groundfloor fp_stylesheetPrefix dark # use darkfloorplanstyle.css</code><br><br> <code>attr Groundfloor stylesheet myfloorplanstyle.css</code><br><br>
</ul> </ul>
</li> </li>