From 1478aed7e71b97ea5c6f4e51c49e803dbddb5a76 Mon Sep 17 00:00:00 2001 From: loredo Date: Mon, 8 Jul 2019 15:47:10 +0000 Subject: [PATCH] 95_Astro: v2.0.3: improved Windows POSIX compatibility for timezone support git-svn-id: https://svn.fhem.de/fhem/trunk@19796 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 ++ fhem/FHEM/95_Astro.pm | 48 +++++++++++++++++++++++++++++-------------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 0fd16e031..f669c9a7d 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - bugfix: 95_Astro: v2.0.3: improved Windows POSIX compatibility for + timezone support - bugfix: 73_AutoShuttersControl: Fix for missing closed tag for strong - feature: 73_AutoShuttersControl: delayed self defense drive then absent, fix many of little bugs, change shading logic diff --git a/fhem/FHEM/95_Astro.pm b/fhem/FHEM/95_Astro.pm index 994395702..74ba458bb 100644 --- a/fhem/FHEM/95_Astro.pm +++ b/fhem/FHEM/95_Astro.pm @@ -41,7 +41,7 @@ use FHEM::Meta; use GPUtils qw(GP_Import GP_Export); use Math::Trig; use Time::HiRes qw(gettimeofday); -use Time::Local; +use Time::Local qw(timelocal_modern); use UConv; #use Data::Dumper; @@ -785,6 +785,8 @@ sub Define ($@) { sub Undef ($$) { my ($hash,$arg) = @_; + my $name = $hash->{NAME}; + my $type = $hash->{TYPE}; RemoveInternalTimer($hash); @@ -806,6 +808,8 @@ sub Notify ($$) { my $devName = $dev->{NAME}; my $devType = GetType($devName); + return "" if ( IsDisabled($name) ); + if ( $devName eq "global" ) { my $events = deviceEvents( $dev, 1 ); return "" unless ($events); @@ -1856,7 +1860,7 @@ sub SetTime (;$$$) { #-- readjust timezone local $ENV{TZ} = $tz if ($tz); - tzset(); + tzset() if ( defined( *{'tzset'} ) ); $time = gettimeofday() unless ( defined($time) ); @@ -1893,7 +1897,7 @@ sub SetTime (;$$$) { delete $Date{tz} if (!$Date{tz} || $Date{tz} eq "" || $Date{tz} eq " "); delete local $ENV{TZ}; - tzset(); + tzset() if ( defined( *{'tzset'} ) ); setlocale(LC_TIME, ""); setlocale(LC_TIME, $old_lctime); @@ -1921,7 +1925,8 @@ sub Compute($;$){ if( defined($params->{"language"}) && exists($transtable{uc($params->{"language"})}) ){ - $tt = $transtable{uc($params->{"language"})}; + $lang = uc($params->{"language"}); + $tt = $transtable{$lang}; }elsif( exists($transtable{uc($lang)}) ){ $tt = $transtable{uc($lang)}; }else{ @@ -1933,7 +1938,7 @@ sub Compute($;$){ $tz = $params->{"timezone"} if ( defined( $params->{"timezone"} ) ); local $ENV{TZ} = $tz if ($tz); - tzset(); + tzset() if ( defined( *{'tzset'} ) ); #-- geodetic latitude and longitude of observer on WGS84 if( defined($params->{"latitude"}) ){ @@ -2185,7 +2190,7 @@ sub Compute($;$){ $Astro{ObsSeasonN} = $seasonn; delete local $ENV{TZ}; - tzset(); + tzset() if ( defined( *{'tzset'} ) ); return( undef ); }; @@ -2292,13 +2297,13 @@ sub Update($@) { { if ( $comp eq 'NewDay' ) { push @next, - timelocal( 0, 0, 0, ( localtime( $now + 86400. ) )[ 3, 4, 5 ] ); + timelocal_modern( 0, 0, 0, (localtime($now + 86400.))[3,4], (localtime($now + 86400.))[5]+1900. ); next; } my $k = ".$comp"; next unless ( defined( $Astro{$k} ) && $Astro{$k} =~ /^\d+(?:\.\d+)?$/ ); my $t = - timelocal( 0, 0, 0, ( localtime($now) )[ 3, 4, 5 ] ) + $Astro{$k} * 3600.; + timelocal_modern( 0, 0, 0, (localtime($now))[3,4], (localtime($now))[5]+1900. ) + $Astro{$k} * 3600.; $t += 86400. if ( $t < $now ); # that is for tomorrow push @next, $t; } @@ -2560,6 +2565,7 @@ sub Get($@) { my $wantsreading = 0; my $dayOffset = 0; + my $now = gettimeofday(); my $html = defined( $hash->{CL} ) && $hash->{CL}{TYPE} eq "FHEMWEB" ? 1 : undef; my $tz = AttrVal( $name, "timezone", AttrVal( "global", "timezone", undef ) ); my $lang = AttrVal( $name, "language", AttrVal( "global", "language", undef ) ); @@ -2620,20 +2626,30 @@ sub Get($@) { if( int(@$a) > (1+$wantsreading) ) { my $str = (int(@$a) == (3+$wantsreading)) ? $a->[1+$wantsreading]." ".$a->[2+$wantsreading] : $a->[1+$wantsreading]; - if( $str =~ /^(\d{2}):(\d{2})(?::(\d{2}))?|(?:(\d{4})-(\d{2})-(\d{2}))(?:\D+(\d{2}):(\d{2})(?::(\d{2}))?)?$/){ + if( $str =~ /^(\d{2}):(\d{2})(?::(\d{2}))?$|^(?:(?:(\d{4})-)?(\d{2})-(\d{2}))(?:\D+(\d{2}):(\d{2})(?::(\d{2}))?)?$/){ + return "[FHEM::Astro::Get] hours can only be between 00 and 23" if (defined($1) && $1 > 23.); + return "[FHEM::Astro::Get] minutes can only be between 00 and 59" if (defined($2) && $2 > 59.); + return "[FHEM::Astro::Get] seconds can only be between 00 and 59" if (defined($3) && $3 > 59.); + return "[FHEM::Astro::Get] month can only be between 01 and 12" if (defined($5) && ($5 > 12. || $5 < 1.)); + return "[FHEM::Astro::Get] day can only be between 01 and 31" if (defined($6) && ($6 > 31. || $6 < 1.)); + return "[FHEM::Astro::Get] hours can only be between 00 and 23" if (defined($7) && $7 > 23.); + return "[FHEM::Astro::Get] minutes can only be between 00 and 59" if (defined($8) && $8 > 59.); + return "[FHEM::Astro::Get] seconds can only be between 00 and 59" if (defined($9) && $9 > 59.); + SetTime( - timelocal( + timelocal_modern( defined($3) ? $3 : (defined($9) ? $9 : 0), defined($2) ? $2 : (defined($8) ? $8 : 0), defined($1) ? $1 : (defined($7) ? $7 : 12), - (defined($4)? ($6,$5-1,$4) : (localtime(gettimeofday()))[3,4,5]) + (defined($5)? ($6,$5-1.) : (localtime($now))[3,4]), + (defined($4)? $4 : (localtime($now))[5]+1900.), ) + ( $dayOffset * 86400. ), $tz, $lc_time ) }else{ - return "[FHEM::Astro::Get] $name has improper time specification $str, use YYYY-MM-DD [HH:MM:SS] [-1|yesterday|+1|tomorrow]"; + return "[FHEM::Astro::Get] $name has improper time specification $str, use [YYYY-]MM-DD [HH:MM[:SS]] [-1|yesterday|+1|tomorrow]"; } }else{ - SetTime(gettimeofday() + ($dayOffset * 86400.), $tz, $lc_time); + SetTime($now + ($dayOffset * 86400.), $tz, $lc_time); } #-- disable automatic links to FHEM devices @@ -2800,7 +2816,7 @@ sub Get($@) {

Define

define <name> Astro -
Defines the Astro device (only one is needed per FHEM installation).

+
Defines the Astro device (only one is needed per FHEM installation).

Readings with prefix Sun refer to the sun, with prefix Moon refer to the moon. The suffixes for these readings are: @@ -2875,6 +2891,7 @@ sub Get($@) {