| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- ##############################################
- # - 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;
|