From 3b73225236a2f55abdedd2daa91db067262545e2 Mon Sep 17 00:00:00 2001 From: phenning <> Date: Mon, 13 Nov 2017 20:30:11 +0000 Subject: [PATCH] 95_Astro.pm: Neue Version, u.a. mit Mondphasenbildern 95_YAAHM.pm: Neue Version mit verbesserter Weckzeitanzeige git-svn-id: https://svn.fhem.de/fhem/trunk@15430 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/95_Astro.pm | 96 ++++++++++++++++++++++++++++++++++++------- fhem/FHEM/95_YAAHM.pm | 32 ++++++++++----- 2 files changed, 103 insertions(+), 25 deletions(-) diff --git a/fhem/FHEM/95_Astro.pm b/fhem/FHEM/95_Astro.pm index 6a2cf680e..f275c427f 100644 --- a/fhem/FHEM/95_Astro.pm +++ b/fhem/FHEM/95_Astro.pm @@ -1,4 +1,3 @@ -#2017.07.31 08:04:33 1: PERL WARNING: Use of uninitialized value $Astro{"MoonPhaseS"} in sprintf at /opt/fhem/FHEM/95_Astro.pm line 1302. ######################################################################################## # # 95_Astro.pm @@ -48,7 +47,7 @@ my $deltaT = 65; # Correction time in s my %Astro; my %Date; -my $astroversion = 1.35; +my $astroversion = 1.37; #-- These we may get on request my %gets = ( @@ -265,7 +264,10 @@ sub Astro_Initialize ($) { $hash->{GetFn} = "Astro_Get"; $hash->{UndefFn} = "Astro_Undef"; $hash->{AttrFn} = "Astro_Attr"; - $hash->{AttrList} = "interval longitude latitude altitude horizon"; + $hash->{AttrList} = "interval longitude latitude altitude horizon ".$readingFnAttributes;; + + $data{FWEXT}{"/Astro_moonwidget"}{FUNC} = "Astro_moonwidget"; + $data{FWEXT}{"/Astr_moonwidget"}{FORKABLE} = 0; return undef; } @@ -348,6 +350,13 @@ sub Astro_mod($$) { my ($a,$b)=@_;if( $a =~ /\d*\.\d*/){return($a-floor($a/$b)*$ sub Astro_mod2Pi($) { my ($x)=@_;$x = Astro_mod($x, 2.*pi);return($x); } sub Astro_round($$) { my ($x,$n)=@_; return int(10**$n*$x+0.5)/10**$n}; +sub Astro_tzoffset($) { + my ($t) = @_; + my $utc = mktime(gmtime($t)); + my $local = mktime(localtime($t)); + return (($local - $utc)/36); +} + ######################################################################################################## # # time fragments into minutes, seconds @@ -1189,6 +1198,54 @@ sub Astro_Compute($){ return( undef ); }; +######################################################################################## +# +# Astro_moonwidget - SVG picture of the moon +# +# Parameter hash = hash of the bus master a = argument array +# +######################################################################################## + +sub Astro_moonwidget($){ + my ($arg) = @_; + my $name = $FW_webArgs{name}; + $name =~ s/'//g; + my $hash = $defs{$name}; + + my @size=split('x',($FW_webArgs{size} ? $FW_webArgs{size} : '400x400')); + + $FW_RETTYPE = "image/svg+xml"; + $FW_RET=""; + FW_pO ''; + return ($FW_RETTYPE, $FW_RET); +} + ######################################################################################## # # Astro_Update - Update readings @@ -1217,8 +1274,11 @@ sub Astro_Update($@) { $Date{hour} = $hour; $Date{min} = $min; $Date{sec} = $sec; - $Date{zonedelta} = (strftime "%z", localtime)/100; - $Date{dayofyear} = strftime("%-j", localtime); + #-- broken on windows + #$Date{zonedelta} = (strftime "%z", localtime)/100; + $Date{zonedelta} = Astro_tzoffset(time)/100; + #-- half broken in windows + $Date{dayofyear} = 1*strftime("%j", localtime); Astro_Compute($hash); @@ -1260,8 +1320,11 @@ sub Astro_Get($@) { $Date{min} = (defined($6)) ? $6 : 0; $Date{sec} = (defined($8)) ? $8 : 0; my $fTot = timelocal($Date{sec},$Date{min},$Date{hour},$Date{day},$Date{month}-1,$Date{year}); - $Date{zonedelta} = (strftime "%z", localtime($fTot))/100; - $Date{dayofyear} = strftime("%-j", localtime($fTot)); + #-- broken on windows + #$Date{zonedelta} = (strftime "%z", localtime($fTot))/100; + $Date{zonedelta} = Astro_tzoffset($fTot)/100; + #-- half broken in windows + $Date{dayofyear} = 1*strftime("%j", localtime($fTot)); }else{ return "[Astro_Get] $name has improper time specification, use YYYY-MM-DD HH:MM:SS"; } @@ -1276,8 +1339,11 @@ sub Astro_Get($@) { $Date{hour} = $hour; $Date{min} = $min; $Date{sec} = $sec; - $Date{zonedelta} = (strftime "%z", localtime)/100; - $Date{dayofyear} = strftime("%-j", localtime); + #-- broken on windows + #$Date{zonedelta} = (strftime "%z", localtime)/100; + $Date{zonedelta} = Astro_tzoffset(time)/100; + #-- half broken in windows + $Date{dayofyear} = 1*strftime("%j", localtime); } if( $a[1] eq "version") { @@ -1321,9 +1387,7 @@ sub Astro_Get($@) { $Astro{MoonRa},$astro_tt->{"dec"},$Astro{MoonDec},$astro_tt->{"az"},$Astro{MoonAz},$astro_tt->{"alt"},$Astro{MoonAlt}); $ret .= sprintf("%s %2.1f', %s %2.1f°, %s %1.2f = %s, %s %s\n",$astro_tt->{"diameter"}, $Astro{MoonDiameter},$astro_tt->{"age"},$Astro{MoonAge},$astro_tt->{"phase"},$Astro{MoonPhaseN},$Astro{MoonPhaseS},$astro_tt->{"sign"},$Astro{MoonSign}); - - #$ret .="\ndistance=".$moonCoor->{distance}." test=".sqrt( ($xm)**2 + ($ym)**2 + ($zm)**2 )." $xm $ym $zm"; - #$ret .="\ndistance=".$radius." test=".sqrt( ($x)**2 + ($y)**2 + ($z)**2 )." $x $y $z"; + return $ret; } }else { @@ -1372,6 +1436,10 @@ sub Astro_Get($@) {
+ An SVG image of the current moon phase may be obtained under the link
+ <ip address of fhem>/fhem/Astro_moonwidget?name='<device name>'&size='<width>x<height>'
+
Notes:
attr <name> longitude <value>
attr <name> latitude <value>
attr <name> altitude <value>
(in m above sea level)attr <name> horizon <value>
custom horizon angle in degrees, default 0attr <name> horizon <value>
custom horizon angle in degrees, default 0