mirror of
https://github.com/fhem/fhem-mirror.git
synced 2024-11-22 02:59:49 +00:00
58b84edf1d
git-svn-id: https://svn.fhem.de/fhem/trunk@217 2b470e98-0d58-463d-a4d8-8e2adae1ed80
90 lines
2.5 KiB
Perl
Executable File
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;
|