Hallo,
anbei mein Versuch, eine Steuerung mit den Sonnenaufgangs- und Sonnenuntergangszeiten als Wiregate-Plugin umzusetzen.
Die Formeln zur Berechnung der Zeiten habe ich von hier übernommen:
Formel für Sonnenaufgang, Sonnenuntergang und die Zeitgleichung
Ich hoffe, der Code ist halbwegs verständlich (ist mein erster "Perl"-Versuch), bin aber gerne für Verbesserungen (und Erweiterungen) offen.
Die letzte Funktion "Userlog" war für mich sehr hilfreich, da ich hier alle Variablen etc. ausgeben lassen konnte, ohne den Überblick im normalen Log-File zu verlieren. Die Log-Datei kann genau wie die plugin-Logdatei über den Browser aufgerufen werden (Dateiname ist hier
/var/log/wg_userlog_".$plugname.".log )
Viele Grüße
Christian
anbei mein Versuch, eine Steuerung mit den Sonnenaufgangs- und Sonnenuntergangszeiten als Wiregate-Plugin umzusetzen.
Code:
use Math::Trig; $plugin_info{$plugname.'_cycle'} = 300; # Diese Daten müssen eingepflegt werden; Längengrad und Breitengrad, sowie die Zeitzone # (localtime)[8] gibt an, ob gerade Sommerzeit ist und addiert entsprechend +1 dazu # ************************************************************************************* my $lat = 49.9; my $lon = 10.9; my $timezone = (localtime)[8]; # ************************************************************************************* my $h = -0.0145; my $RAD = pi/180.0; my $B = $lat * $RAD; my $DOY = ((localtime)[7]+1); # DOY = Day Of Year my $timecalc = -0.171 * sin(0.0337 * $DOY + 0.465) - 0.1299 * sin(0.01787 * $DOY - 0.168); my $declination = 0.4095 * sin(0.016906 * ($DOY - 80.086)); my $tmp = (sin($h) - (sin($B) * sin($declination))) / (cos($B) * cos($declination)); my $timediff = 12* acos($tmp)/pi; my $timenow = ((localtime)[2] + (localtime)[1]/60); # Prüft, ob aktuelle Zeit > Sonnenaufgangszeit ist und < Sonnenuntergangszeit if ($plugin_info{$plugname."_status"}!=1 and $timenow > sunrise() and $timenow < sunset() ) { userlog ("Jetzt ist es Sonnenaufgang"); $plugin_info{$plugname."_status"} = 1; } # Prüft, ob aktuelle Zeit > Sonnenuntergangszeit ist if ($plugin_info{$plugname."_status"}!=0 and $timenow > sunset() ) { userlog ("Jetzt ist es Sonnenuntergang"); $plugin_info{$plugname."_status"} = 0; } userlog ($plugname."-Plugin erfolgreich ausgeführt"); sub sunrise{ my $sunrise = 12 - $timediff - $timecalc + (15-$lon)*4/60 + $timezone; return $sunrise; } sub sunset{ my $sunset = 12 + $timediff - $timecalc + (15-$lon)*4/60 + $timezone; return $sunset; } sub userlog { open(LOG, ">>/var/log/wg_userlog_".$plugname.".log") || die "Kann Logdatei nicht öffnen!"; printf LOG "%04d-%02d-%02d %02d:%02d:%02d ",((localtime)[5] +1900),((localtime)[4] +1),(localtime)[3],(localtime)[2],(localtime)[1],(localtime)[0]; print LOG @_[0]."\n"; close LOG; } [FONT="]return;[/FONT]
Formel für Sonnenaufgang, Sonnenuntergang und die Zeitgleichung
Ich hoffe, der Code ist halbwegs verständlich (ist mein erster "Perl"-Versuch), bin aber gerne für Verbesserungen (und Erweiterungen) offen.
Die letzte Funktion "Userlog" war für mich sehr hilfreich, da ich hier alle Variablen etc. ausgeben lassen konnte, ohne den Überblick im normalen Log-File zu verlieren. Die Log-Datei kann genau wie die plugin-Logdatei über den Browser aufgerufen werden (Dateiname ist hier
/var/log/wg_userlog_".$plugname.".log )
Viele Grüße
Christian
Kommentar