2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2024-11-22 02:59:49 +00:00
fhem-mirror/fhem/contrib/99_SUNRISE.pm
rudolfkoenig 58b84edf1d Preparing 4.4: Doc checking and small fixes
git-svn-id: https://svn.fhem.de/fhem/trunk@217 2b470e98-0d58-463d-a4d8-8e2adae1ed80
2008-07-28 12:33:29 +00:00

90 lines
2.5 KiB
Perl
Executable File

##############################################
# - Use 99_SUNRISE_EL.pm instead of this module
# - Be aware: Installing the DateTime modules might be tedious, one way is:
# perl -MCPAN -e shell
# cpan> install DateTime::Event::Sunrise
# - Please call sunrise_coord before using this module, else you'll get times
# for frankfurt am main (germany). See the "at" entry in commandref.html
package main;
use strict;
use warnings;
use DateTime;
use DateTime::Event::Sunrise;
sub sr($$$$);
sub sunrise_rel(@);
sub sunset_rel(@);
sub sunrise_abs(@);
sub sunset_abs(@);
sub isday();
sub sunrise_coord($$$);
sub SUNRISE_Initialize($);
# See perldoc DateTime::Event::Sunrise for details
my $long = "8.686";
my $lat = "50.112";
my $tz = "Europe/Berlin";
sub
SUNRISE_Initialize($)
{
my ($hash) = @_;
}
##########################
# Compute:
# rise: 1: event is sunrise (else sunset)
# isrel: 1: _relative_ times until the next event (else absolute for today)
# seconds: second offset to event
# daycheck: if set, then return 1 if the sun is visible, 0 else
sub
sr($$$$)
{
my ($rise, $seconds, $isrel, $daycheck) = @_;
my $sunrise = DateTime::Event::Sunrise ->new(
longitude => $long,
latitude => $lat,
altitude => '-6', # Civil twilight
iteration => '3');
my $now = DateTime->now(time_zone => $tz);
my $stm = ($rise ? $sunrise->sunrise_datetime( $now ) :
$sunrise->sunset_datetime( $now ));
if($daycheck) {
return 0 if(DateTime->compare($now, $stm) < 0);
$stm = $sunrise->sunset_datetime( $now );
return 0 if(DateTime->compare($now, $stm) > 0);
return 1;
}
if(!$isrel) {
$stm = $stm->add(seconds => $seconds) if($seconds);
return $stm->hms();
}
$stm = $stm->add(seconds => $seconds) if($seconds);
if(DateTime->compare($now, $stm) >= 0) {
my $tom = DateTime->now(time_zone => $tz)->add(days => 1);
$stm = ($rise ? $sunrise->sunrise_datetime( $tom ) :
$sunrise->sunset_datetime( $tom ));
$stm = $stm->add(seconds => $seconds) if($seconds);
}
my $diff = $stm->epoch - $now->epoch;
return sprintf("%02d:%02d:%02d", $diff/3600, ($diff/60)%60, $diff%60);
}
sub sunrise_rel(@) { return sr(1, shift, 1, 0) }
sub sunset_rel(@) { return sr(0, shift, 1, 0) }
sub sunrise_abs(@) { return sr(1, shift, 0, 0) }
sub sunset_abs(@) { return sr(0, shift, 0, 0) }
sub isday() { return sr(1, 0, 0, 1) }
sub sunrise_coord($$$) { ($long, $lat, $tz) = @_; return undef; }
1;