From e594676075dccf653dd484f365a74af87e889580 Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Mon, 15 Jan 2018 17:18:16 +0100 Subject: [PATCH] Fixes and updates to run out of container --- .gitignore | 3 + functions.php | 4 +- inverter.php | 4 +- inverter.pl | 3186 +++++++++++++++++++------------------- pvoutput.php | 7 +- static/twilight_2012.csv | 367 ----- static/twilight_2013.csv | 367 ----- static/twilight_2014.csv | 367 ----- static/twilight_2015.csv | 367 ----- static/twilight_2016.csv | 367 ----- static/twilight_2017.csv | 1 - static/twilight_2018.csv | 368 ++++- static/twilight_2019.csv | 368 ++++- static/twilight_2020.csv | 368 ++++- wunderground.php | 2 +- 15 files changed, 2704 insertions(+), 3442 deletions(-) delete mode 100644 static/twilight_2012.csv delete mode 100644 static/twilight_2013.csv delete mode 100644 static/twilight_2014.csv delete mode 100644 static/twilight_2015.csv delete mode 100644 static/twilight_2016.csv delete mode 100644 static/twilight_2017.csv mode change 100644 => 100755 static/twilight_2018.csv mode change 100644 => 100755 static/twilight_2019.csv mode change 100644 => 100755 static/twilight_2020.csv diff --git a/.gitignore b/.gitignore index 88a38d8..65aa72c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ daemon_*.sh +config.ini +data/ +wunderground.json diff --git a/functions.php b/functions.php index 4456de7..621f183 100755 --- a/functions.php +++ b/functions.php @@ -1,8 +1,8 @@ /dev/null'))) as $sJob) { /* Wake at sunrise, sleep at sunset */ $fWake = getHour(getWake($aTwilight)); $fSleep = getHour($sSleep = getSleep($aTwilight)); + $sWake = $aTwilight[1]; $sSleep = $aTwilight[3]; System_Daemon::info(sprintf('Be awake between %s and %s', $sWake, $sSleep)); diff --git a/inverter.pl b/inverter.pl index 4cefa87..72dd1c4 100755 --- a/inverter.pl +++ b/inverter.pl @@ -1,1593 +1,1593 @@ -#!/usr/bin/perl -w -# -# AS AT 04May2011 -# -# inverter.pl - polls data from the RS232 port on certain inverters and outputs data to a csv file -# & optionally to http://pvoutput.org, depending on the configuration file settings (config.ini). -# -# Usage examples: -# perl inverter.pl -# perl inverter.pl "COM1" -# perl inverter.pl "/dev/ttyS0" -# -# Arguments: -# $ARGV[0] = OPTIONAL port name (eg: "COM1") if have >1 inverter. See: config.ini for defaults. -# -# Output Filenames -# * inverter_[serial#]_YYYYMMDD.csv -# * inverter_err_[serial#]_YYYYMM.csv -# * inverter_[serial#].rrd -# -####################################################################### -# -# (c) 2010-2011 jinba @ jinba-ittai.net -# Licensed under the GNU GPL version 2 -# -# + editions by shell_l_d: -# + edited to work with ActivePerl (Windows) too -# + added version/firmware checking & combined CMS2k & CMS10k (parseData) versions -# + added data format checking (per findings from JinbaIttai & Ingmar) -# + added %HoH, %HASH -# + added writeToPort() & added warnings to readbuf() -# + edited calc of sleep so dont have to keep DATAPOLL_FREQ_SECS set to 60. -# + edited code so dont have to keep DATAPOLL_FREQ_SECS set to 60. -# + added DESCR to $HoH hash of hashes & used in parseDataFmt() -# + added check if ( $seconds > 0 ) before 'sleep $seconds' -# + added DESCR to parseData() & replaced die with warning in writeToFile() -# + added %HoHparams, closeSerialPort(), parseParamFmt(), parseParam() -# + renamed %HoH items: ETOTAL, HTOTAL, UNK1 through UNK9 -# + edited etotal & htotal calcs in WriteToFile() -# + renamed DIVIDEBY to MULTIPLY & edited their values & replaced / with * in parseParam() & parseData() -# + added rrdtool code -# + edited REINIT_DEFAULT & writeReadBuffer() -# + added warning to closeSerialPort() & edited REINIT_DEFAULT line in writeReadBuffer() -# + added getDate_YYYYMM(), getErrFileName(). -# + edited parseData(). -# + implemented AppConfig & a configuration file (config.ini). -# -# + editions by mmcdon23: -# + added getDateTime_HHMM() & getDate_YYYYMMDD() -# + added date & time strings to writeToFile() -# + added "_YYYYMMDD.csv" to logfile name (suffix) -# + edited parseData() by using 0 for ETODAY in morning if hasn't reset yet -# + moved sleep from parseData() to main -# + moved code from initialise, readbuf & main to writeReadBuffer() -# & altered to continue reading until read pattern matched. -# + added pvoutput code to main & only send to PVoutput every 5 or 10th min per PVOUTPUT_FREQ constant. -# + added calc of sleep seconds to stop the script creeping away from the 00 minute mark. -# + edited added if statement to parseParamFmt() & parseDataFmt() & around the calls to them -# -# + editions by nigol2: -# + added optional port argument in case have more than 1 inverter -# + added serial# to logfile name in case have more than 1 inverter -# -# + editions by slampt: -# + uncommented & edited rrdtool (graphing) code in writeToFile() with help from JinbaIttai -# -####################################################################### -# -# Required to be installed: -# * perl -# * perl AppConfig module -# * perl Win32::SerialPort module (Windows) -# * perl Device::SerialPort module (Unix/Linux) -# -####################################################################### - -#use strict; -use warnings; -use AppConfig; # used to read from a config file - -$| = 1; # don't let Perl buffer I/O - -####################################################################### -# -# Define constants & variables (most from config file) -# - -# create a new AppConfig object & auto-define all variables -my $config = AppConfig->new(); - -# define new variables -$config->define( "flags_debug!" ); -$config->define( "flags_use_pvoutput!" ); -$config->define( "flags_use_rrdtool!" ); -$config->define( "secs_datapoll_freq=s" ); -$config->define( "secs_pvoutput_freq=s" ); -$config->define( "secs_timeout=s" ); -$config->define( "secs_reinit=s" ); -$config->define( "paths_windows=s" ); -$config->define( "paths_other=s" ); -$config->define( "scripts_pvoutput=s" ); -$config->define( "scripts_pvoutput_php=s"); -$config->define( "scripts_create_rrd=s" ); -$config->define( "scripts_rrdtool_exe_win=s" ); -$config->define( "scripts_rrdtool_exe_oth=s" ); -$config->define( "serial_baud=s" ); -$config->define( "serial_port_win=s" ); -$config->define( "serial_port_oth=s" ); -$config->define( "serial_parity=s" ); -$config->define( "serial_databits=s" ); -$config->define( "serial_stopbits=s" ); -$config->define( "serial_handshake=s" ); -$config->define( "serial_datatype=s" ); -$config->define( "hex_data_to_follow_index=s" ); -$config->define( "hex_capacity_index=s" ); -$config->define( "hex_capacity_length=s" ); -$config->define( "hex_firmware_index=s" ); -$config->define( "hex_firmware_length=s" ); -$config->define( "hex_model_index=s" ); -$config->define( "hex_model_length=s" ); -$config->define( "hex_manuf_index=s" ); -$config->define( "hex_manuf_length=s" ); -$config->define( "hex_serial_index=s" ); -$config->define( "hex_serial_length=s" ); -$config->define( "hex_other_index=s" ); -$config->define( "hex_other_length=s" ); -$config->define( "hex_confserial_index=s" ); -$config->define( "sendhex_initialise=s" ); -$config->define( "sendhex_serial=s" ); -$config->define( "sendhex_conf_serial1=s" ); -$config->define( "sendhex_conf_serial2=s" ); -$config->define( "sendhex_version=s" ); -$config->define( "sendhex_paramfmt=s" ); -$config->define( "sendhex_param=s" ); -$config->define( "sendhex_datafmt=s" ); -$config->define( "sendhex_data=s" ); -$config->define( "recvhex_serial=s" ); -$config->define( "recvhex_conf_serial=s" ); -$config->define( "recvhex_version=s" ); -$config->define( "recvhex_paramfmt=s" ); -$config->define( "recvhex_param=s" ); -$config->define( "recvhex_datafmt=s" ); -$config->define( "recvhex_data=s" ); -$config->define( "param_vpvstart_hexcode=s" ); -$config->define( "param_vpvstart_multiply=s" ); -$config->define( "param_vpvstart_measure=s" ); -$config->define( "param_vpvstart_index=s" ); -$config->define( "param_vpvstart_descr=s" ); -$config->define( "param_tstart_hexcode=s" ); -$config->define( "param_tstart_multiply=s" ); -$config->define( "param_tstart_measure=s" ); -$config->define( "param_tstart_index=s" ); -$config->define( "param_tstart_descr=s" ); -$config->define( "param_vacmin_hexcode=s" ); -$config->define( "param_vacmin_multiply=s" ); -$config->define( "param_vacmin_measure=s" ); -$config->define( "param_vacmin_index=s" ); -$config->define( "param_vacmin_descr=s" ); -$config->define( "param_vacmax_hexcode=s" ); -$config->define( "param_vacmax_multiply=s" ); -$config->define( "param_vacmax_measure=s" ); -$config->define( "param_vacmax_index=s" ); -$config->define( "param_vacmax_descr=s" ); -$config->define( "param_facmin_hexcode=s" ); -$config->define( "param_facmin_multiply=s" ); -$config->define( "param_facmin_measure=s" ); -$config->define( "param_facmin_index=s" ); -$config->define( "param_facmin_descr=s" ); -$config->define( "param_facmax_hexcode=s" ); -$config->define( "param_facmax_multiply=s" ); -$config->define( "param_facmax_measure=s" ); -$config->define( "param_facmax_index=s" ); -$config->define( "param_facmax_descr=s" ); -$config->define( "param_zacmax_hexcode=s" ); -$config->define( "param_zacmax_multiply=s" ); -$config->define( "param_zacmax_measure=s" ); -$config->define( "param_zacmax_index=s" ); -$config->define( "param_zacmax_descr=s" ); -$config->define( "param_dzac_hexcode=s" ); -$config->define( "param_dzac_multiply=s" ); -$config->define( "param_dzac_measure=s" ); -$config->define( "param_dzac_index=s" ); -$config->define( "param_dzac_descr=s" ); -$config->define( "data_temp_hexcode=s" ); -$config->define( "data_temp_multiply=s" ); -$config->define( "data_temp_measure=s" ); -$config->define( "data_temp_index=s" ); -$config->define( "data_temp_descr=s" ); -$config->define( "data_vpv1_hexcode=s" ); -$config->define( "data_vpv1_multiply=s" ); -$config->define( "data_vpv1_measure=s" ); -$config->define( "data_vpv1_index=s" ); -$config->define( "data_vpv1_descr=s" ); -$config->define( "data_vpv2_hexcode=s" ); -$config->define( "data_vpv2_multiply=s" ); -$config->define( "data_vpv2_measure=s" ); -$config->define( "data_vpv2_index=s" ); -$config->define( "data_vpv2_descr=s" ); -$config->define( "data_vpv3_hexcode=s" ); -$config->define( "data_vpv3_multiply=s" ); -$config->define( "data_vpv3_measure=s" ); -$config->define( "data_vpv3_index=s" ); -$config->define( "data_vpv3_descr=s" ); -$config->define( "data_ipv1_hexcode=s" ); -$config->define( "data_ipv1_multiply=s" ); -$config->define( "data_ipv1_measure=s" ); -$config->define( "data_ipv1_index=s" ); -$config->define( "data_ipv1_descr=s" ); -$config->define( "data_ipv2_hexcode=s" ); -$config->define( "data_ipv2_multiply=s" ); -$config->define( "data_ipv2_measure=s" ); -$config->define( "data_ipv2_index=s" ); -$config->define( "data_ipv2_descr=s" ); -$config->define( "data_ipv3_hexcode=s" ); -$config->define( "data_ipv3_multiply=s" ); -$config->define( "data_ipv3_measure=s" ); -$config->define( "data_ipv3_index=s" ); -$config->define( "data_ipv3_descr=s" ); -$config->define( "data_etoday_hexcode=s" ); -$config->define( "data_etoday_multiply=s" ); -$config->define( "data_etoday_measure=s" ); -$config->define( "data_etoday_index=s" ); -$config->define( "data_etoday_descr=s" ); -$config->define( "data_vpv_hexcode=s" ); -$config->define( "data_vpv_multiply=s" ); -$config->define( "data_vpv_measure=s" ); -$config->define( "data_vpv_index=s" ); -$config->define( "data_vpv_descr=s" ); -$config->define( "data_ipv3_hexcode=s" ); -$config->define( "data_ipv3_multiply=s" ); -$config->define( "data_ipv3_measure=s" ); -$config->define( "data_ipv3_index=s" ); -$config->define( "data_ipv3_descr=s" ); -$config->define( "data_iac_hexcode=s" ); -$config->define( "data_iac_multiply=s" ); -$config->define( "data_iac_measure=s" ); -$config->define( "data_iac_index=s" ); -$config->define( "data_iac_descr=s" ); -$config->define( "data_vac_hexcode=s" ); -$config->define( "data_vac_multiply=s" ); -$config->define( "data_vac_measure=s" ); -$config->define( "data_vac_index=s" ); -$config->define( "data_vac_descr=s" ); -$config->define( "data_fac_hexcode=s" ); -$config->define( "data_fac_multiply=s" ); -$config->define( "data_fac_measure=s" ); -$config->define( "data_fac_index=s" ); -$config->define( "data_fac_descr=s" ); -$config->define( "data_pac_hexcode=s" ); -$config->define( "data_pac_multiply=s" ); -$config->define( "data_pac_measure=s" ); -$config->define( "data_pac_index=s" ); -$config->define( "data_pac_descr=s" ); -$config->define( "data_zac_hexcode=s" ); -$config->define( "data_zac_multiply=s" ); -$config->define( "data_zac_measure=s" ); -$config->define( "data_zac_index=s" ); -$config->define( "data_zac_descr=s" ); -$config->define( "data_etotalh_hexcode=s" ); -$config->define( "data_etotalh_multiply=s" ); -$config->define( "data_etotalh_measure=s" ); -$config->define( "data_etotalh_index=s" ); -$config->define( "data_etotalh_descr=s" ); -$config->define( "data_etotall_hexcode=s" ); -$config->define( "data_etotall_multiply=s" ); -$config->define( "data_etotall_measure=s" ); -$config->define( "data_etotall_index=s" ); -$config->define( "data_etotall_descr=s" ); -$config->define( "data_htotalh_hexcode=s" ); -$config->define( "data_htotalh_multiply=s" ); -$config->define( "data_htotalh_measure=s" ); -$config->define( "data_htotalh_index=s" ); -$config->define( "data_htotalh_descr=s" ); -$config->define( "data_htotall_hexcode=s" ); -$config->define( "data_htotall_multiply=s" ); -$config->define( "data_htotall_measure=s" ); -$config->define( "data_htotall_index=s" ); -$config->define( "data_htotall_descr=s" ); -$config->define( "data_mode_hexcode=s" ); -$config->define( "data_mode_multiply=s" ); -$config->define( "data_mode_measure=s" ); -$config->define( "data_mode_index=s" ); -$config->define( "data_mode_descr=s" ); -$config->define( "data_errgv_hexcode=s" ); -$config->define( "data_errgv_multiply=s" ); -$config->define( "data_errgv_measure=s" ); -$config->define( "data_errgv_index=s" ); -$config->define( "data_errgv_descr=s" ); -$config->define( "data_errgf_hexcode=s" ); -$config->define( "data_errgf_multiply=s" ); -$config->define( "data_errgf_measure=s" ); -$config->define( "data_errgf_index=s" ); -$config->define( "data_errgf_descr=s" ); -$config->define( "data_errgz_hexcode=s" ); -$config->define( "data_errgz_multiply=s" ); -$config->define( "data_errgz_measure=s" ); -$config->define( "data_errgz_index=s" ); -$config->define( "data_errgz_descr=s" ); -$config->define( "data_errtemp_hexcode=s" ); -$config->define( "data_errtemp_multiply=s" ); -$config->define( "data_errtemp_measure=s" ); -$config->define( "data_errtemp_index=s" ); -$config->define( "data_errtemp_descr=s" ); -$config->define( "data_errpv1_hexcode=s" ); -$config->define( "data_errpv1_multiply=s" ); -$config->define( "data_errpv1_measure=s" ); -$config->define( "data_errpv1_index=s" ); -$config->define( "data_errpv1_descr=s" ); -$config->define( "data_errgfc1_hexcode=s" ); -$config->define( "data_errgfc1_multiply=s" ); -$config->define( "data_errgfc1_measure=s" ); -$config->define( "data_errgfc1_index=s" ); -$config->define( "data_errgfc1_descr=s" ); -$config->define( "data_errmode_hexcode=s" ); -$config->define( "data_errmode_multiply=s" ); -$config->define( "data_errmode_measure=s" ); -$config->define( "data_errmode_index=s" ); -$config->define( "data_errmode_descr=s" ); - -# fill variables by reading configuration file -$config->file( "data/config.ini" ) || die "FAILED to open and/or read config file: config.ini\n"; - -if ($config->flags_debug) { - print "debug=" . $config->flags_debug ; - print ", use_pvoutput=" . $config->flags_use_pvoutput ; - print ", use_rrdtool=" . $config->flags_use_rrdtool . "\n" ; -} - -# -# inverter parameter format codes (hash of hashes) -# -%HoHparams = ( - 'VPV-START' => { - HEXCODE => $config->param_vpvstart_hexcode, - MULTIPLY => $config->param_vpvstart_multiply, - MEAS => $config->param_vpvstart_measure, - INDEX => $config->param_vpvstart_index, - VALUE => 0, - DESCR => $config->param_vpvstart_descr, - }, - 'T-START' => { - HEXCODE => $config->param_tstart_hexcode, - MULTIPLY => $config->param_tstart_multiply, - MEAS => $config->param_tstart_measure, - INDEX => $config->param_tstart_index, - VALUE => 0, - DESCR => $config->param_tstart_descr, - }, - 'VAC-MIN' => { - HEXCODE => $config->param_vacmin_hexcode, - MULTIPLY => $config->param_vacmin_multiply, - MEAS => $config->param_vacmin_measure, - INDEX => $config->param_vacmin_index, - VALUE => 0, - DESCR => $config->param_vacmin_descr, - }, - 'VAC-MAX' => { - HEXCODE => $config->param_vacmax_hexcode, - MULTIPLY => $config->param_vacmax_multiply, - MEAS => $config->param_vacmax_measure, - INDEX => $config->param_vacmax_index, - VALUE => 0, - DESCR => $config->param_vacmax_descr, - }, - 'FAC-MIN' => { - HEXCODE => $config->param_facmin_hexcode, - MULTIPLY => $config->param_facmin_multiply, - MEAS => $config->param_facmin_measure, - INDEX => $config->param_facmin_index, - VALUE => 0, - DESCR => $config->param_facmin_descr, - }, - 'FAC-MAX' => { - HEXCODE => $config->param_facmax_hexcode, - MULTIPLY => $config->param_facmax_multiply, - MEAS => $config->param_facmax_measure, - INDEX => $config->param_facmax_index, - VALUE => 0, - DESCR => $config->param_facmax_descr, - }, - 'ZAC-MAX' => { - HEXCODE => $config->param_zacmax_hexcode, - MULTIPLY => $config->param_zacmax_multiply, - MEAS => $config->param_zacmax_measure, - INDEX => $config->param_zacmax_index, - VALUE => 0, - DESCR => $config->param_zacmax_descr, - }, - 'DZAC' => { - HEXCODE => $config->param_dzac_hexcode, - MULTIPLY => $config->param_dzac_multiply, - MEAS => $config->param_dzac_measure, - INDEX => $config->param_dzac_index, - VALUE => 0, - DESCR => $config->param_dzac_descr, - }, -); - -# -# inverter data format codes (hash of hashes) -# -%HoH = ( - TEMP => { - HEXCODE => $config->data_temp_hexcode, - MULTIPLY => $config->data_temp_multiply, - MEAS => $config->data_temp_measure, - INDEX => $config->data_temp_index, - VALUE => 0, - DESCR => $config->data_temp_descr, - }, - VPV1 => { - HEXCODE => $config->data_vpv1_hexcode, - MULTIPLY => $config->data_vpv1_multiply, - MEAS => $config->data_vpv1_measure, - INDEX => $config->data_vpv1_index, - VALUE => 0, - DESCR => $config->data_vpv1_descr, - }, - VPV2 => { - HEXCODE => $config->data_vpv2_hexcode, - MULTIPLY => $config->data_vpv2_multiply, - MEAS => $config->data_vpv2_measure, - INDEX => $config->data_vpv2_index, - VALUE => 0, - DESCR => $config->data_vpv2_descr, - }, - VPV3 => { - HEXCODE => $config->data_vpv3_hexcode, - MULTIPLY => $config->data_vpv3_multiply, - MEAS => $config->data_vpv3_measure, - INDEX => $config->data_vpv3_index, - VALUE => 0, - DESCR => $config->data_vpv3_descr, - }, - IPV1 => { - HEXCODE => $config->data_ipv1_hexcode, - MULTIPLY => $config->data_ipv1_multiply, - MEAS => $config->data_ipv1_measure, - INDEX => $config->data_ipv1_index, - VALUE => 0, - DESCR => $config->data_ipv1_descr, - }, - IPV2 => { - HEXCODE => $config->data_ipv2_hexcode, - MULTIPLY => $config->data_ipv2_multiply, - MEAS => $config->data_ipv2_measure, - INDEX => $config->data_ipv2_index, - VALUE => 0, - DESCR => $config->data_ipv2_descr, - }, - IPV3 => { - HEXCODE => $config->data_ipv3_hexcode, - MULTIPLY => $config->data_ipv3_multiply, - MEAS => $config->data_ipv3_measure, - INDEX => $config->data_ipv3_index, - VALUE => 0, - DESCR => $config->data_ipv3_descr, - }, - ETODAY => { - HEXCODE => $config->data_etoday_hexcode, - MULTIPLY => $config->data_etoday_multiply, - MEAS => $config->data_etoday_measure, - INDEX => $config->data_etoday_index, - VALUE => 0, - DESCR => $config->data_etoday_descr, - }, - VPV => { - HEXCODE => $config->data_vpv_hexcode, - MULTIPLY => $config->data_vpv_multiply, - MEAS => $config->data_vpv_measure, - INDEX => $config->data_vpv_index, - VALUE => 0, - DESCR => $config->data_vpv_descr, - }, - IAC => { - HEXCODE => $config->data_iac_hexcode, - MULTIPLY => $config->data_iac_multiply, - MEAS => $config->data_iac_measure, - INDEX => $config->data_iac_index, - VALUE => 0, - DESCR => $config->data_iac_descr, - }, - VAC => { - HEXCODE => $config->data_vac_hexcode, - MULTIPLY => $config->data_vac_multiply, - MEAS => $config->data_vac_measure, - INDEX => $config->data_vac_index, - VALUE => 0, - DESCR => $config->data_vac_descr, - }, - FAC => { - HEXCODE => $config->data_fac_hexcode, - MULTIPLY => $config->data_fac_multiply, - MEAS => $config->data_fac_measure, - INDEX => $config->data_fac_index, - VALUE => 0, - DESCR => $config->data_fac_descr, - }, - PAC => { - HEXCODE => $config->data_pac_hexcode, - MULTIPLY => $config->data_pac_multiply, - MEAS => $config->data_pac_measure, - INDEX => $config->data_pac_index, - VALUE => 0, - DESCR => $config->data_pac_descr, - }, - ZAC => { - HEXCODE => $config->data_zac_hexcode, - MULTIPLY => $config->data_zac_multiply, - MEAS => $config->data_zac_measure, - INDEX => $config->data_zac_index, - VALUE => 0, - DESCR => $config->data_zac_descr, - }, - ETOTALH => { - HEXCODE => $config->data_etotalh_hexcode, - MULTIPLY => $config->data_etotalh_multiply, - MEAS => $config->data_etotalh_measure, - INDEX => $config->data_etotalh_index, - VALUE => 0, - DESCR => $config->data_etotalh_descr, - }, - ETOTALL => { - HEXCODE => $config->data_etotall_hexcode, - MULTIPLY => $config->data_etotall_multiply, - MEAS => $config->data_etotall_measure, - INDEX => $config->data_etotall_index, - VALUE => 0, - DESCR => $config->data_etotall_descr, - }, - HTOTALH => { - HEXCODE => $config->data_htotalh_hexcode, - MULTIPLY => $config->data_htotalh_multiply, - MEAS => $config->data_htotalh_measure, - INDEX => $config->data_htotalh_index, - VALUE => $config->data_htotalh_index, - DESCR => $config->data_htotalh_descr, - }, - HTOTALL => { - HEXCODE => $config->data_htotall_hexcode, - MULTIPLY => $config->data_htotall_multiply, - MEAS => $config->data_htotall_measure, - INDEX => $config->data_htotall_index, - VALUE => 0, - DESCR => $config->data_htotall_descr, - }, - MODE => { - HEXCODE => $config->data_mode_hexcode, - MULTIPLY => $config->data_mode_multiply, - MEAS => $config->data_mode_measure, - INDEX => $config->data_mode_index, - VALUE => 0, - DESCR => $config->data_mode_descr, - }, - ERR_GV => { - HEXCODE => $config->data_errgv_hexcode, - MULTIPLY => $config->data_errgv_multiply, - MEAS => $config->data_errgv_measure, - INDEX => $config->data_errgv_index, - VALUE => 0, - DESCR => $config->data_errgv_descr, - }, - ERR_GF => { - HEXCODE => $config->data_errgf_hexcode, - MULTIPLY => $config->data_errgf_multiply, - MEAS => $config->data_errgf_measure, - INDEX => $config->data_errgf_index, - VALUE => 0, - DESCR => $config->data_errgf_descr, - }, - ERR_GZ => { - HEXCODE => $config->data_errgz_hexcode, - MULTIPLY => $config->data_errgz_multiply, - MEAS => $config->data_errgz_measure, - INDEX => $config->data_errgz_index, - VALUE => 0, - DESCR => $config->data_errgz_descr, - }, - ERR_TEMP => { - HEXCODE => $config->data_errtemp_hexcode, - MULTIPLY => $config->data_errtemp_multiply, - MEAS => $config->data_errtemp_measure, - INDEX => $config->data_errtemp_index, - VALUE => 0, - DESCR => $config->data_errtemp_descr, - }, - ERR_PV1 => { - HEXCODE => $config->data_errpv1_hexcode, - MULTIPLY => $config->data_errpv1_multiply, - MEAS => $config->data_errpv1_measure, - INDEX => $config->data_errpv1_index, - VALUE => 0, - DESCR => $config->data_errpv1_descr, - }, - ERR_GFC1 => { - HEXCODE => $config->data_errgfc1_hexcode, - MULTIPLY => $config->data_errgfc1_multiply, - MEAS => $config->data_errgfc1_measure, - INDEX => $config->data_errgfc1_index, - VALUE => 0, - DESCR => $config->data_errgfc1_descr, - }, - ERR_MODE => { - HEXCODE => $config->data_errmode_hexcode, - MULTIPLY => $config->data_errmode_multiply, - MEAS => $config->data_errmode_measure, - INDEX => $config->data_errmode_index, - VALUE => 0, - DESCR => $config->data_errmode_descr, - }, - UNK10 => { - HEXCODE => "7f", - MULTIPLY => 1, - MEAS => "", - INDEX => -1, - VALUE => 0, - DESCR => "Unknown", - }, - # ---------------- UNKNOWN ---------------------- - UNK11 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "", - INDEX => -1, - VALUE => 0, - DESCR => "Unknown", - }, - UNK12 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "", - INDEX => -1, - VALUE => 0, - DESCR => "Unknown", - }, - UNK13 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "", - INDEX => -1, - VALUE => 0, - DESCR => "Unknown", - }, - UNK14 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "", - INDEX => -1, - VALUE => 0, - DESCR => "Unknown", - }, - IDC1 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "A", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - IDC2 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "A", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - IDC3 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "A", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - IAC1 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "A", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - VAC1 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "V", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - FAC1 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.01, - MEAS => "Hz", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - PDC1 => { - HEXCODE => "zz", # unknown - MULTIPLY => 1, - MEAS => "W", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - IAC2 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "A", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - VAC2 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "V", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - FAC2 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.01, - MEAS => "Hz", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - PDC2 => { - HEXCODE => "zz", # unknown - MULTIPLY => 1, - MEAS => "W", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - IAC3 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "A", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - VAC3 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.1, - MEAS => "V", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - FAC3 => { - HEXCODE => "zz", # unknown - MULTIPLY => 0.01, - MEAS => "Hz", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, - PDC3 => { - HEXCODE => "zz", # unknown - MULTIPLY => 1, - MEAS => "W", - INDEX => -1, - VALUE => 0, - DESCR => "", - }, -# ---------------- UNKNOWN ---------------------- -# PVP1 "W", "PV 1 voltage" -# PVP2 "W", "PV 2 voltage" -# PVP3 "W", "PV 3 voltage" -# IAC1 "A", "PV 1 Grid current" -# IAC2 "A", "PV 2 Grid current" -# IAC3 "A", "PV 3 Grid current" -# VAC1 "V", "PV 1 Grid voltage" -# VAC2 "V", "PV 2 Grid voltage" -# VAC3 "V", "PV 3 Grid voltage" -# TEMP1 "deg C", "External temperature sensor 1" -# TEMP2 "deg C", "External temperature sensor 2" -# RAD1 "W/m2", "Irradiance sensor 1" -# RAD2 "W/m2", "Irradiance sensor 2" -); - - -# -# inverter version information (hash) -# -%HASH = ( - CAPACITY => "", - FIRMWARE => "", - MODEL => "", - MANUF => "", - SERIAL => "", - OTHER => "", -); - -####################################################################### - - - -####################################################################### -# -# Open serial/usb/bluetooth port depending on Operating System -# -sub initialiseSerialPort() { - - print "Initialise Serial Port... "; - if ($^O eq 'MSWin32') { # Win32 (ActivePerl) - eval "use Win32::SerialPort"; - $port = $ARGV[0] || $config->serial_port_win; - - # Open the serial port - $serial = Win32::SerialPort->new ($port, 0, '') || die "Can\'t open $port: $!"; - } - else { # Unix/Linux/other - eval "use Device::SerialPort"; - $port = $ARGV[0] || $config->serial_port_oth; - - # Open the serial port - $serial = Device::SerialPort->new ($port, 0, '') || die "Can\'t open $port: $!"; - } - print "port = $port\n"; - - # - # Open the serial port - # - $serial->error_msg(1); # use built-in hardware error messages like "Framing Error" - $serial->user_msg(1); # use built-in function messages like "Waiting for ..." - #$serial->baudrate($config->serial_baud) || die 'fail setting baudrate, try -b option'; - $serial->{'_L_BAUD'}{$config->serial_baud} = $config->serial_baud; - $serial->parity($config->serial_parity) || die 'fail setting parity'; - $serial->databits($config->serial_databits) || die 'fail setting databits'; - $serial->stopbits($config->serial_stopbits) || die 'fail setting stopbits'; - $serial->handshake($config->serial_handshake) || die 'fail setting handshake'; - $serial->datatype($config->serial_datatype) || die 'fail setting datatype'; - $serial->write_settings || die 'could not write settings'; - $serial->read_char_time(0); # don't wait for each character - $serial->read_const_time(1000); # 1 second per unfulfilled "read" call -} - -####################################################################### -# -# Close serial/usb/bluetooth port -# -sub closeSerialPort() { - $serial->close || warn "*** WARNING Close port failed, connection may have died.\n"; - undef $serial; -} - -####################################################################### -# -# Trim function to remove whitespace from start and end of a string -# -sub trim($) { - my $string = shift; - $string =~ s/^\s+//; - $string =~ s/\s+$//; - return $string; -} - -####################################################################### -# -# Turn raw data from the inverter into a hex string -# -sub convRawToHex() { - my $pstring = shift; - my $hstring = unpack ("H*",$pstring); - return $hstring; -} - -####################################################################### -# -# Turn hex string into raw data for transmission to the inverter -# -sub convHexToRaw() { - my $hstring = shift; - my $pstring = pack (qq{H*},qq{$hstring}); - return $pstring; -} - -####################################################################### -# -# Return Date & Time in format: "DD/MM/YYYY HH:MM:SS" -# -sub getDateTime { - local($time_since_epoch) = @_; - local($sec,$min,$hour,$dayOfMth,$monthOffset,$yearOffset,$dayOfWk,$dayOfYr,$isDST) = localtime($time_since_epoch); - local($year) = 1900 + $yearOffset; - local($month) = 1 + $monthOffset; - return sprintf("%.2d/%.2d/%d %.2d:%.2d:%.2d", $dayOfMth, $month, $year, $hour, $min, $sec); -} - -####################################################################### -# -# Return Date in format: "YYYYMMDD" -# -sub getDate_YYYYMMDD { - local($time_since_epoch) = @_; - local($sec,$min,$hour,$dayOfMth,$monthOffset,$yearOffset,$dayOfWk,$dayOfYr,$isDST) = localtime($time_since_epoch); - local($year) = 1900 + $yearOffset; - local($month) = 1 + $monthOffset; - return sprintf("%d%.2d%.2d", $year, $month, $dayOfMth); -} - -####################################################################### -# -# Return Date in format: "YYYYMM" -# -sub getDate_YYYYMM { - local($time_since_epoch) = @_; - local($sec,$min,$hour,$dayOfMth,$monthOffset,$yearOffset,$dayOfWk,$dayOfYr,$isDST) = localtime($time_since_epoch); - local($year) = 1900 + $yearOffset; - local($month) = 1 + $monthOffset; - return sprintf("%d%.2d", $year, $month); -} - -####################################################################### -# -# Return Time in format: "HH:MM" -# -sub getTime_HHMM { - local($time_since_epoch) = @_; - local($sec,$min,$hour,$dayOfMth,$monthOffset,$yearOffset,$dayOfWk,$dayOfYr,$isDST) = localtime($time_since_epoch); - return sprintf("%.2d:%.2d", $hour, $min); -} - -####################################################################### -# -# Return LogFile Name: [path]/inverter_[serial#]_[yyyymmdd].csv -# -sub getLogFileName { - my $logfile = ""; - - # - # set path - # - if ($^O eq 'MSWin32') { # Win32 (ActivePerl) - $logfile = $config->paths_windows; - } - else { # Unix/Linux/other - $logfile = $config->paths_other; - } - - # - # append filename - # - $logfile .= "/inverter_" . $HASH{SERIAL} . "_" . getDate_YYYYMMDD(time) . ".csv"; - return $logfile; -} - -####################################################################### -# -# Return ErrFile Name: [path]/inverter_err_[serial#]_[yyyymm].log -# -sub getErrFileName { - my $errfile = ""; - - # - # set path - # - if ($^O eq 'MSWin32') { # Win32 (ActivePerl) - $errfile = $config->paths_windows; - } - else { # Unix/Linux/other - $errfile = $config->paths_other; - } - - # - # append filename - # - $errfile .= "/inverter_err_" . $HASH{SERIAL} . "_" . getDate_YYYYMM(time) . ".log"; - return $errfile; -} - -####################################################################### -# -# Return RRD File Name: [path]/inverter_[serial#].rrd -# -sub getRrdFileName(@) { - my $rrdfile = ""; - my $suffix = shift; - - # - # set path - # - if ($^O eq 'MSWin32') { # Win32 (ActivePerl) - $rrdfile = $config->paths_windows; - } - else { # Unix/Linux/other - $rrdfile = $config->paths_other; - } - - # - # append filename - # - $rrdfile .= "/inverter_" . $HASH{SERIAL} . (defined $suffix ? ("_" . $suffix) : "") . ".rrd"; - return $rrdfile; -} - -####################################################################### -# -# Write to the port (the inverter is on) & warn if it fails -# -sub writeToPort() { - my $writeStr = shift; - my $countOut = $serial->write($writeStr); - warn "*** write failed ( $countOut ) ***\n" unless ($countOut); - warn "*** write incomplete ( $countOut ) ***\n" if ( $countOut != length($writeStr) ); - return $countOut; -} - -####################################################################### -# -# Write to serial port then read result from buffer -# until expected read response received or timeout exceeded -# -sub writeReadBuffer() { - my $writeString = shift; - my $readPattern = shift; - my $chars=0; - my $buffer=""; - my $buffer2="x"; - my $timeout = $config->secs_timeout; - my $reinit = 0; - - if ($config->flags_debug) { - print "writeReadBuffer: writeString=$writeString\n"; - print "writeReadBuffer: readPattern=$readPattern\n"; - } - - # - # Write to (Serial) Port - # - &writeToPort(&convHexToRaw($writeString)); - - # sleep for dodgy cables (eg beginner soldering or usb converters) - # sleep 2; - - # - # Read response from buffer until either expected response received or timeout reached - # - while ( $timeout > 0 ) { - - my ($countIn,$stringIn) = $serial->read(255); # will read _up to_ 255 chars - if ($countIn > 0) { - - if ($config->flags_debug) { - print "writeReadBuffer: saw..." . &convRawToHex($stringIn) . "\n"; - } - - $chars += $countIn; - $buffer .= $stringIn; - $hexBuffer = &convRawToHex($buffer); - - # - # Check to see if expected read response is in the $buffer, say "last" if we find it - # - if ( $hexBuffer =~ /$readPattern/ ) { - ($buffer2) = ( $hexBuffer =~ /($readPattern.*$)/ ); - if ($config->flags_debug) { - print "writeReadBuffer: found=$buffer2\n"; - } - last; - } - - } - else { - $timeout--; - } - - # - # check if timeout was reached - # - if ($timeout==0) { - print "Re-Init...\n"; - &closeSerialPort; - &initialiseSerialPort; - - $timeout = $config->secs_timeout; - $reinit++; - - print "Waited " . $config->secs_timeout . " seconds and never saw $readPattern\n"; - #die "Waited " . $config->secs_timeout . " seconds and never saw $readPattern\n"; - } - - # - # check if reinitialise port timeout was reached, if so die - # - if ($config->secs_reinit >= 0 && $reinit > $config->secs_reinit) { - &closeSerialPort; - die "REINIT MAX exceeded, aborted.\n"; - } - - } # end of while loop - - print "Recv <- $buffer2 \n"; - return $buffer2; -} - -####################################################################### -# -# Prepare the REQUEST_CONF_SERIAL packet -# grab serial# from input data, use it to create the response packet, incl checksum in format: -# RESPONSE_CONF_SERIAL_1 + $hexSerial + RESPONSE_CONF_SERIAL_2 + $hexReqChkSum -# -sub calcReqConfSerial() { - my $hexStr = shift; - my $hexSerial = substr($hexStr, $config->hex_confserial_index, $config->hex_serial_length); - my $hexReqRegex = $config->sendhex_conf_serial1 . $hexSerial . $config->sendhex_conf_serial2; - - # - # calculate hex checksum for the request - # - my $rawReq = &convHexToRaw( $hexReqRegex ); - my $rawReqChkSum = unpack ( "%C*", $rawReq ); - my $hexReqChkSum = sprintf ( "%04x ", $rawReqChkSum ); - - # - # join it all together to create the request - # - my $reqConfSerial = $hexReqRegex . $hexReqChkSum; - return($reqConfSerial); -} - -####################################################################### -# -# Initialise Inverter - handshake is done here -# -sub initialiseInverter() { - # - # step 1: Start initial handshake with inverter (reset network) - # - my $rawRequest = &convHexToRaw($config->sendhex_initialise); - print "Send -> req init inverter: " . $config->sendhex_initialise . "\n"; - &writeToPort($rawRequest); - - # - # step 2: request the serial number (query network) - # - print "Send -> req serial: " . $config->sendhex_serial . "\n"; - my $hexResponse = &writeReadBuffer($config->sendhex_serial,$config->recvhex_serial); - - # - # step 3: confirm the serial number - # - my $confSerialRequest = &calcReqConfSerial($hexResponse); - print "Send -> confirm serial: $confSerialRequest \n"; - my $hexResponse2 = &writeReadBuffer($confSerialRequest,$config->recvhex_conf_serial); -} - -####################################################################### -# -# Parse Version/Firmware Data - store in %HASH -# -sub parseVersData() { - print "* Version info:\n"; - my $hexData = shift; - my $asciiVers = ( pack ("H*", $hexData) ); - my $hexLength = length($hexData); - print "asciiVers=$asciiVers\n"; - - # - # convert portions of hex to ascii - # - if ( $config->hex_capacity_length > 0 && $config->hex_capacity_index + $config->hex_capacity_length < $hexLength ) { - $HASH{CAPACITY} = &trim( pack ("H*", substr($hexData, $config->hex_capacity_index, $config->hex_capacity_length)) ); - } - if ( $config->hex_firmware_length > 0 && $config->hex_firmware_index + $config->hex_firmware_length < $hexLength ) { - $HASH{FIRMWARE} = &trim( pack ("H*", substr($hexData, $config->hex_firmware_index, $config->hex_firmware_length)) ); - } - if ( $config->hex_model_length > 0 && $config->hex_model_index + $config->hex_model_length < $hexLength ) { - $HASH{MODEL} = &trim( pack ("H*", substr($hexData, $config->hex_model_index, $config->hex_model_length)) ); - } - if ( $config->hex_manuf_length > 0 && $config->hex_manuf_index + $config->hex_manuf_length < $hexLength ) { - $HASH{MANUF} = &trim( pack ("H*", substr($hexData, $config->hex_manuf_index, $config->hex_manuf_length)) ); - } - if ( $config->hex_serial_length > 0 && $config->hex_serial_index + $config->hex_serial_length < $hexLength ) { - $HASH{SERIAL} = &trim( pack ("H*", substr($hexData, $config->hex_serial_index, $config->hex_serial_length)) ); - } - if ( $config->hex_other_length > 0 && $config->hex_other_index + $config->hex_other_length < $hexLength ) { - $HASH{OTHER} = &trim( pack ("H*", substr($hexData, $config->hex_other_index, $config->hex_other_length)) ); - } - - # - # display version information (in sorted order) - # - for $key ( sort( keys ( %HASH ) ) ) { - printf "%-8s : %s\n", $key, $HASH{$key}; - } -} - -####################################################################### -# -# Parse Parameter Format -# based on $HoHparams{HEXCODE} & store index/position in $HoHparams{INDEX} -# -sub parseParamFmt() { - print "* Parameter Format:\n"; - my $hexData = shift; - if ($hexData eq "") { - print "n/a\n"; - return; - } - - # split hex string into an array of 2char hex strings - @d = ( $hexData =~ m/..?/g ); - - my $dataOffset = $config->hex_data_to_follow_index + 1; - my $dataToFollow = hex($d[$config->hex_data_to_follow_index]); - print "dataToFollow = hex($d[$config->hex_data_to_follow_index]) = $dataToFollow\n"; - - my $i = 0; - for $x ($dataOffset .. $dataOffset + $dataToFollow - 1) { - printf "%2s = %2s", $x, $d[$x] ; - for $key ( keys ( %HoHparams ) ) { - if ( $HoHparams{$key}{HEXCODE} eq $d[$x]) { - $HoHparams{$key}{INDEX} = $i; - printf " = %-10s = %2s = %s", $key, $HoHparams{$key}{INDEX}, $HoHparams{$key}{DESCR} ; - } - } - print "\n"; - $i++; - } -} - -####################################################################### -# -# Parse Parameters -# based on $HoHparams{INDEX} & store value in $HoHparams{VALUE} -# -sub parseParam() { - print "* Parameters:\n"; - my $hexData = shift; - my $dataToFollow = hex( substr( $hexData, $config->hex_data_to_follow_index*2, 2 ) ); - my $startIndex = ( $config->hex_data_to_follow_index + 1 )*2; - my $numOfChars = $dataToFollow * 2; - my $data = substr( $hexData, $startIndex, $numOfChars ); - - # split hex string into an array of 4char hex strings - @d = ( $data =~ m/..?.?.?/g ); - - # display data values - sort %HoH by INDEX - for $key ( sort {$HoHparams{$a}{INDEX} <=> $HoHparams{$b}{INDEX} } keys ( %HoHparams ) ) { - if ( $HoHparams{$key}{INDEX} ne "-1" ) { - $HoHparams{$key}{VALUE} = hex( $d[$HoHparams{$key}{INDEX}] ) * $HoHparams{$key}{MULTIPLY}; - printf "%-10s: %8s %-5s = %s \n", $key, $HoHparams{$key}{VALUE}, $HoHparams{$key}{MEAS}, $HoHparams{$key}{DESCR} ; - } - } -} - -####################################################################### -# -# Set Data Format Manually - if not sure of REQUEST_DATAFMT response break-up yet -# eg: CMS 10000 -# -sub setDataFmt2() { - print "* Data Format2:\n"; - $HoH{TEMP}{INDEX} = 0; - $HoH{VPV}{INDEX} = 1; - $HoH{VPV2}{INDEX} = 2; - $HoH{VPV3}{INDEX} = 3; - $HoH{IDC1}{INDEX} = 4; - $HoH{IDC2}{INDEX} = 5; - $HoH{IDC3}{INDEX} = 6; - $HoH{ETOTALH}{INDEX} = 7; - $HoH{ETOTALL}{INDEX} = 8; - $HoH{HTOTALH}{INDEX} = 9; - $HoH{HTOTALL}{INDEX} = 10; - $HoH{PAC}{INDEX} = 11; - $HoH{MODE}{INDEX} = 12; - $HoH{ETODAY}{INDEX} = 13; - $HoH{ERR_GV}{INDEX} = 14; - $HoH{ERR_GF}{INDEX} = 15; - $HoH{ERR_GZ}{INDEX} = 16; - $HoH{ERR_TEMP}{INDEX} = 17; - $HoH{ERR_PV1}{INDEX} = 18; - $HoH{ERR_GFC1}{INDEX} = 19; - $HoH{ERR_MODE}{INDEX} = 20; - $HoH{IAC1}{INDEX} = 21; - $HoH{VAC1}{INDEX} = 22; - $HoH{FAC1}{INDEX} = 23; - $HoH{PDC1}{INDEX} = 24; - $HoH{UNK10}{INDEX} = 25; - $HoH{UNK11}{INDEX} = 26; - $HoH{UNK12}{INDEX} = 27; - $HoH{UNK13}{INDEX} = 28; - $HoH{IAC2}{INDEX} = 29; - $HoH{VAC2}{INDEX} = 30; - $HoH{FAC2}{INDEX} = 31; - $HoH{PDC2}{INDEX} = 32; - $HoH{UNK14}{INDEX} = 33; - - # - # display data format indexes - sort %HoH by INDEX - # - for $key ( sort {$HoH{$a}{INDEX} <=> $HoH{$b}{INDEX} } keys ( %HoH ) ) { - if ( $HoH{$key}{INDEX} ne "-1" ) { - printf "%-8s = %2s = %s\n", $key, $HoH{$key}{INDEX}, $HoH{$key}{DESCR} ; - } - } -} - -####################################################################### -# -# Parse Data Format -# based on $HoH{HEXCODE} & store index/position in $HoH{INDEX} -# -sub parseDataFmt() { - print "* Data Format:\n"; - my $hexData = shift; - if ($hexData eq "") { - print "n/a\n"; - return; - } - - # split hex string into an array of 2char hex strings - @d = ( $hexData =~ m/..?/g ); - - my $dataOffset = $config->hex_data_to_follow_index + 1; - my $dataToFollow = hex($d[$config->hex_data_to_follow_index]); - print "dataToFollow = hex($d[$config->hex_data_to_follow_index]) = $dataToFollow\n"; - - if ($HASH{MODEL} eq "CMS 10000") { - &setDataFmt2; # temp: until get hold of CMS 10000 protocol & figure out hexcodes & keys - return; - } - - my $i = 0; - for $x ($dataOffset .. $dataOffset + $dataToFollow - 1) { - printf "%2s = %2s", $x, $d[$x] ; - for $key ( keys ( %HoH ) ) { - if ( $HoH{$key}{HEXCODE} eq $d[$x]) { - $HoH{$key}{INDEX} = $i; - printf " = %-8s = %2s = %s", $key, $HoH{$key}{INDEX}, $HoH{$key}{DESCR} ; - } - } - print "\n"; - $i++; - } -} - -####################################################################### -# -# Parse Data -# based on $HoH{INDEX} & store value in $HoH{VALUE} -# -sub parseData() { - print "* Data:\n"; - my $hexData = shift; - my $dataToFollow = hex( substr( $hexData, $config->hex_data_to_follow_index*2, 2 ) ); - my $startIndex = ( $config->hex_data_to_follow_index + 1 )*2; - my $numOfChars = $dataToFollow * 2; - my $data = substr( $hexData, $startIndex, $numOfChars ); - - # split hex string into an array of 4char hex strings - @d = ( $data =~ m/..?.?.?/g ); - - # display data values - sort %HoH by INDEX - for $key ( sort {$HoH{$a}{INDEX} <=> $HoH{$b}{INDEX} } keys ( %HoH ) ) { - if ( $HoH{$key}{INDEX} ne "-1" ) { - $HoH{$key}{VALUE} = hex( $d[$HoH{$key}{INDEX}] ) * $HoH{$key}{MULTIPLY}; - printf "%-8s: %8s %-5s = %s \n", $key, $HoH{$key}{VALUE}, $HoH{$key}{MEAS}, $HoH{$key}{DESCR} ; - } - } - - # - # Sometimes CMS2000 inverter keeps yesterdays ETODAY for first 30mins or more each morning - # hence some logic to use ZERO if hour < 9am and ETODAY > 1.0 kWh - # - if ($HASH{MODEL} eq "CMS 2000") { - my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - if ($hour < 9 && $HoH{ETODAY}{VALUE} > 1.0) { - - # - # open errfile in 'append' mode - # - my $errfile = getErrFileName(); - if ( open(ERRFILE, ">>$errfile") ) { - my $dateTimeStr = getDateTime(time); - my $errLine = "$dateTimeStr - ETODAY=$HoH{ETODAY}{VALUE}, will use 0 instead, as not reset since yesterday."; - print "ERROR logged to: $errfile\n"; - print ERRFILE "$errLine\n"; - close (ERRFILE); - } - $HoH{ETODAY}{VALUE} = 0; - } - } -} - -####################################################################### -# -# Write certain inverter data to a csv file -# -sub writeToFile() { - my $logfile = getLogFileName(); - my $rrdfile = getRrdFileName(); - - # - # open logfile in 'append' mode - # - if ( open(LOGFILE, ">>$logfile") ) { - print "Logging to: $logfile\n"; - - # - # add file header to logfile (if file exists & is empty) - # - if ( -z $logfile ) { -# print LOGFILE "DATE,TIMESTAMP,TEMP,VPV,IAC,VAC,FAC,PAC,ETOTAL,HTOTAL,MODE,ETODAY\n"; - print LOGFILE "DATE,TIMESTAMP,TEMP,VPV,IAC,VAC,FAC,PAC,ETOTAL,HTOTAL,MODE,ETODAY" . - ",ETOTALH,HTOTALH,ERR_GV,ERR_GF,ERR_GZ,ERR_TEMP,ERR_PV1,ERR_GFC1,ERR_MODE,UNK10\n"; - } - - my $etotal = ($HoH{ETOTALL}{VALUE} + $HoH{ETOTALH}{VALUE}); - my $htotal = ($HoH{HTOTALL}{VALUE} + $HoH{HTOTALH}{VALUE}); - if ($config->flags_debug) { - print "etotal=$etotal htotal=$htotal\n"; - } - - # - # write data to logfile & close it - # - my $unixTimeStamp = time; # secs since epoch - my $dateTimeStr = getDateTime($unixTimeStamp); - my $csvLine = "$dateTimeStr," . - "$unixTimeStamp," . - "$HoH{TEMP}{VALUE}," . - "$HoH{VPV}{VALUE}," . - "$HoH{IAC}{VALUE}," . - "$HoH{VAC}{VALUE}," . - "$HoH{FAC}{VALUE}," . - "$HoH{PAC}{VALUE}," . - "$etotal," . - "$htotal," . - "$HoH{MODE}{VALUE}," . - "$HoH{ETODAY}{VALUE}," . - "$HoH{ETOTALH}{VALUE}," . - "$HoH{HTOTALH}{VALUE}," . - "$HoH{ERR_GV}{VALUE}," . - "$HoH{ERR_GF}{VALUE}," . - "$HoH{ERR_GZ}{VALUE}," . - "$HoH{ERR_TEMP}{VALUE}," . - "$HoH{ERR_PV1}{VALUE}," . - "$HoH{ERR_GFC1}{VALUE}," . - "$HoH{ERR_MODE}{VALUE}," . - "$HoH{UNK10}{VALUE}"; - print LOGFILE "$csvLine\n"; - close (LOGFILE); - - # - # write data to rrdtool for graphing - # - if ($config->flags_use_rrdtool) { - - my $rrdexe = $config->scripts_rrdtool_exe_oth; # Unix/Linux/other - if ($^O eq 'MSWin32') { # Win32 (ActivePerl) - $rrdexe = $config->scripts_rrdtool_exe_win; - } - - # - # create rrd file - if it doesn't exist - # - if ( ! -e $rrdfile ) { - print "Ran: " . $config->scripts_create_rrd . " \"$rrdfile\" \"$rrdexe\"\n"; - system ($config->scripts_create_rrd . " \"$rrdfile\" \"$rrdexe\"" ); - } - - # - # update rrd file - # - my $rrdLine = "$unixTimeStamp:" . - "$HoH{TEMP}{VALUE}:" . - "$HoH{VPV}{VALUE}:" . - "$HoH{IAC}{VALUE}:" . - "$HoH{VAC}{VALUE}:" . - "$HoH{FAC}{VALUE}:" . - "$HoH{PAC}{VALUE}:" . - "$etotal:" . - "$HoH{ETODAY}{VALUE}"; - print "Ran: $rrdexe update $rrdfile $rrdLine\n"; - system( "$rrdexe update $rrdfile $rrdLine" ); - - $rrdfile = getRrdFileName("today"); - if (-e $rrdfile) { - $rrdLine = "$unixTimeStamp:" . - "$HoH{PAC}{VALUE}:" . - "$HoH{ETODAY}{VALUE}"; - print "Ran: $rrdexe update $rrdfile $rrdLine\n"; - system( "$rrdexe update $rrdfile $rrdLine" ); - } - } - - } - else { - warn "*** WARNING Could not open logfile: $logfile\n"; - } -} - -####################################################################### -# -# MAIN -# -print "Starting up at " . getDateTime(time) . " running on $^O ...\n"; -my $lastPollTime = 0; -my $nextPollTime = 0; -my $lastPvoutputTime = 0; -my $nextPvoutputTime = 0; - -# -# Initialise Serial Port & Inverter -# -&initialiseSerialPort; -&initialiseInverter; - -# -# Request Inverter Version Information -# -print "Send -> req version: " . $config->sendhex_version . "\n"; -$hexResponse = &writeReadBuffer($config->sendhex_version,$config->recvhex_version); -&parseVersData($hexResponse); - -# -# Request Inverter Parameter Format Information -# -if ( $config->sendhex_paramfmt ne " " ) { - print "Send -> req param format: " . $config->sendhex_paramfmt . "\n"; - $hexResponse = &writeReadBuffer($config->sendhex_paramfmt,$config->recvhex_paramfmt); - &parseParamFmt($hexResponse); -} - -# -# Request Inverter Parameter Information -# -print "Send -> req params: " . $config->sendhex_param . "\n"; -$hexResponse = &writeReadBuffer($config->sendhex_param,$config->recvhex_param); -&parseParam($hexResponse); - -# -# Request Inverter Data Format Information -# -if ( $config->sendhex_datafmt ne " " ) { - print "Send -> req data format: " . $config->sendhex_datafmt . "\n"; - $hexResponse = &writeReadBuffer($config->sendhex_datafmt,$config->recvhex_datafmt); - &parseDataFmt($hexResponse); -} - -# -# The main loop starts here -# -while (1) { - - # - # Request Inverter Data (regular data poll) - # - print "Send -> req data as at " . getDateTime(time) . " : " . $config->sendhex_data . "\n"; - $lastPollTime = time; - $nextPollTime = $lastPollTime + $config->secs_datapoll_freq; - $hexResponse = &writeReadBuffer($config->sendhex_data,$config->recvhex_data); - &parseData($hexResponse); - &writeToFile(); - - # - # Export data to http://pvoutput.org - # - if ($config->flags_use_pvoutput) { - $nextPvoutputTime = $lastPvoutputTime + $config->secs_pvoutput_freq; - if ( $lastPvoutputTime == 0 || $nextPvoutputTime <= time ) { - #my $date = getDate_YYYYMMDD(time); - #my $time = getTime_HHMM(time); - #print "PVOUTPUT as at " . getDateTime(time) . " ...\n"; - #print " ran: " . $config->scripts_pvoutput . " " . ($HoH{ETODAY}{VALUE} * 1000) . " $HoH{PAC}{VALUE} $HoH{VAC}{VALUE} $date $time $HASH{SERIAL}\n"; - #system ($config->scripts_pvoutput . " " . ($HoH{ETODAY}{VALUE} * 1000) . " $HoH{PAC}{VALUE} $HoH{VAC}{VALUE} $date $time $HASH{SERIAL}" ); - print " ran: " . $config->scripts_pvoutput_php . " " . ($HoH{ETODAY}{VALUE} * 1000) . " $HoH{PAC}{VALUE} $HoH{VAC}{VALUE} $HASH{SERIAL}\n"; - system ($config->scripts_pvoutput_php . " " . ($HoH{ETODAY}{VALUE} * 1000) . " $HoH{PAC}{VALUE} $HoH{VAC}{VALUE} $HASH{SERIAL} &"); - $lastPvoutputTime = time; - } - } - - # - # Sleep until next time data needs to be polled (per DATAPOLL_FREQ_SECS constant) - # - $seconds = $nextPollTime - time; - if ( $seconds > 0 ) { - print "Sleeping: $seconds secs as at " . getDateTime(time) . " ...\n"; - sleep $seconds; - } - -} - -####################################################################### +#!/usr/bin/perl -w +# +# AS AT 04May2011 +# +# inverter.pl - polls data from the RS232 port on certain inverters and outputs data to a csv file +# & optionally to http://pvoutput.org, depending on the configuration file settings (config.ini). +# +# Usage examples: +# perl inverter.pl +# perl inverter.pl "COM1" +# perl inverter.pl "/dev/ttyS0" +# +# Arguments: +# $ARGV[0] = OPTIONAL port name (eg: "COM1") if have >1 inverter. See: config.ini for defaults. +# +# Output Filenames +# * inverter_[serial#]_YYYYMMDD.csv +# * inverter_err_[serial#]_YYYYMM.csv +# * inverter_[serial#].rrd +# +####################################################################### +# +# (c) 2010-2011 jinba @ jinba-ittai.net +# Licensed under the GNU GPL version 2 +# +# + editions by shell_l_d: +# + edited to work with ActivePerl (Windows) too +# + added version/firmware checking & combined CMS2k & CMS10k (parseData) versions +# + added data format checking (per findings from JinbaIttai & Ingmar) +# + added %HoH, %HASH +# + added writeToPort() & added warnings to readbuf() +# + edited calc of sleep so dont have to keep DATAPOLL_FREQ_SECS set to 60. +# + edited code so dont have to keep DATAPOLL_FREQ_SECS set to 60. +# + added DESCR to $HoH hash of hashes & used in parseDataFmt() +# + added check if ( $seconds > 0 ) before 'sleep $seconds' +# + added DESCR to parseData() & replaced die with warning in writeToFile() +# + added %HoHparams, closeSerialPort(), parseParamFmt(), parseParam() +# + renamed %HoH items: ETOTAL, HTOTAL, UNK1 through UNK9 +# + edited etotal & htotal calcs in WriteToFile() +# + renamed DIVIDEBY to MULTIPLY & edited their values & replaced / with * in parseParam() & parseData() +# + added rrdtool code +# + edited REINIT_DEFAULT & writeReadBuffer() +# + added warning to closeSerialPort() & edited REINIT_DEFAULT line in writeReadBuffer() +# + added getDate_YYYYMM(), getErrFileName(). +# + edited parseData(). +# + implemented AppConfig & a configuration file (config.ini). +# +# + editions by mmcdon23: +# + added getDateTime_HHMM() & getDate_YYYYMMDD() +# + added date & time strings to writeToFile() +# + added "_YYYYMMDD.csv" to logfile name (suffix) +# + edited parseData() by using 0 for ETODAY in morning if hasn't reset yet +# + moved sleep from parseData() to main +# + moved code from initialise, readbuf & main to writeReadBuffer() +# & altered to continue reading until read pattern matched. +# + added pvoutput code to main & only send to PVoutput every 5 or 10th min per PVOUTPUT_FREQ constant. +# + added calc of sleep seconds to stop the script creeping away from the 00 minute mark. +# + edited added if statement to parseParamFmt() & parseDataFmt() & around the calls to them +# +# + editions by nigol2: +# + added optional port argument in case have more than 1 inverter +# + added serial# to logfile name in case have more than 1 inverter +# +# + editions by slampt: +# + uncommented & edited rrdtool (graphing) code in writeToFile() with help from JinbaIttai +# +####################################################################### +# +# Required to be installed: +# * perl +# * perl AppConfig module +# * perl Win32::SerialPort module (Windows) +# * perl Device::SerialPort module (Unix/Linux) +# +####################################################################### + +#use strict; +use warnings; +use AppConfig; # used to read from a config file + +$| = 1; # don't let Perl buffer I/O + +####################################################################### +# +# Define constants & variables (most from config file) +# + +# create a new AppConfig object & auto-define all variables +my $config = AppConfig->new(); + +# define new variables +$config->define( "flags_debug!" ); +$config->define( "flags_use_pvoutput!" ); +$config->define( "flags_use_rrdtool!" ); +$config->define( "secs_datapoll_freq=s" ); +$config->define( "secs_pvoutput_freq=s" ); +$config->define( "secs_timeout=s" ); +$config->define( "secs_reinit=s" ); +$config->define( "paths_windows=s" ); +$config->define( "paths_other=s" ); +$config->define( "scripts_pvoutput=s" ); +$config->define( "scripts_pvoutput_php=s"); +$config->define( "scripts_create_rrd=s" ); +$config->define( "scripts_rrdtool_exe_win=s" ); +$config->define( "scripts_rrdtool_exe_oth=s" ); +$config->define( "serial_baud=s" ); +$config->define( "serial_port_win=s" ); +$config->define( "serial_port_oth=s" ); +$config->define( "serial_parity=s" ); +$config->define( "serial_databits=s" ); +$config->define( "serial_stopbits=s" ); +$config->define( "serial_handshake=s" ); +$config->define( "serial_datatype=s" ); +$config->define( "hex_data_to_follow_index=s" ); +$config->define( "hex_capacity_index=s" ); +$config->define( "hex_capacity_length=s" ); +$config->define( "hex_firmware_index=s" ); +$config->define( "hex_firmware_length=s" ); +$config->define( "hex_model_index=s" ); +$config->define( "hex_model_length=s" ); +$config->define( "hex_manuf_index=s" ); +$config->define( "hex_manuf_length=s" ); +$config->define( "hex_serial_index=s" ); +$config->define( "hex_serial_length=s" ); +$config->define( "hex_other_index=s" ); +$config->define( "hex_other_length=s" ); +$config->define( "hex_confserial_index=s" ); +$config->define( "sendhex_initialise=s" ); +$config->define( "sendhex_serial=s" ); +$config->define( "sendhex_conf_serial1=s" ); +$config->define( "sendhex_conf_serial2=s" ); +$config->define( "sendhex_version=s" ); +$config->define( "sendhex_paramfmt=s" ); +$config->define( "sendhex_param=s" ); +$config->define( "sendhex_datafmt=s" ); +$config->define( "sendhex_data=s" ); +$config->define( "recvhex_serial=s" ); +$config->define( "recvhex_conf_serial=s" ); +$config->define( "recvhex_version=s" ); +$config->define( "recvhex_paramfmt=s" ); +$config->define( "recvhex_param=s" ); +$config->define( "recvhex_datafmt=s" ); +$config->define( "recvhex_data=s" ); +$config->define( "param_vpvstart_hexcode=s" ); +$config->define( "param_vpvstart_multiply=s" ); +$config->define( "param_vpvstart_measure=s" ); +$config->define( "param_vpvstart_index=s" ); +$config->define( "param_vpvstart_descr=s" ); +$config->define( "param_tstart_hexcode=s" ); +$config->define( "param_tstart_multiply=s" ); +$config->define( "param_tstart_measure=s" ); +$config->define( "param_tstart_index=s" ); +$config->define( "param_tstart_descr=s" ); +$config->define( "param_vacmin_hexcode=s" ); +$config->define( "param_vacmin_multiply=s" ); +$config->define( "param_vacmin_measure=s" ); +$config->define( "param_vacmin_index=s" ); +$config->define( "param_vacmin_descr=s" ); +$config->define( "param_vacmax_hexcode=s" ); +$config->define( "param_vacmax_multiply=s" ); +$config->define( "param_vacmax_measure=s" ); +$config->define( "param_vacmax_index=s" ); +$config->define( "param_vacmax_descr=s" ); +$config->define( "param_facmin_hexcode=s" ); +$config->define( "param_facmin_multiply=s" ); +$config->define( "param_facmin_measure=s" ); +$config->define( "param_facmin_index=s" ); +$config->define( "param_facmin_descr=s" ); +$config->define( "param_facmax_hexcode=s" ); +$config->define( "param_facmax_multiply=s" ); +$config->define( "param_facmax_measure=s" ); +$config->define( "param_facmax_index=s" ); +$config->define( "param_facmax_descr=s" ); +$config->define( "param_zacmax_hexcode=s" ); +$config->define( "param_zacmax_multiply=s" ); +$config->define( "param_zacmax_measure=s" ); +$config->define( "param_zacmax_index=s" ); +$config->define( "param_zacmax_descr=s" ); +$config->define( "param_dzac_hexcode=s" ); +$config->define( "param_dzac_multiply=s" ); +$config->define( "param_dzac_measure=s" ); +$config->define( "param_dzac_index=s" ); +$config->define( "param_dzac_descr=s" ); +$config->define( "data_temp_hexcode=s" ); +$config->define( "data_temp_multiply=s" ); +$config->define( "data_temp_measure=s" ); +$config->define( "data_temp_index=s" ); +$config->define( "data_temp_descr=s" ); +$config->define( "data_vpv1_hexcode=s" ); +$config->define( "data_vpv1_multiply=s" ); +$config->define( "data_vpv1_measure=s" ); +$config->define( "data_vpv1_index=s" ); +$config->define( "data_vpv1_descr=s" ); +$config->define( "data_vpv2_hexcode=s" ); +$config->define( "data_vpv2_multiply=s" ); +$config->define( "data_vpv2_measure=s" ); +$config->define( "data_vpv2_index=s" ); +$config->define( "data_vpv2_descr=s" ); +$config->define( "data_vpv3_hexcode=s" ); +$config->define( "data_vpv3_multiply=s" ); +$config->define( "data_vpv3_measure=s" ); +$config->define( "data_vpv3_index=s" ); +$config->define( "data_vpv3_descr=s" ); +$config->define( "data_ipv1_hexcode=s" ); +$config->define( "data_ipv1_multiply=s" ); +$config->define( "data_ipv1_measure=s" ); +$config->define( "data_ipv1_index=s" ); +$config->define( "data_ipv1_descr=s" ); +$config->define( "data_ipv2_hexcode=s" ); +$config->define( "data_ipv2_multiply=s" ); +$config->define( "data_ipv2_measure=s" ); +$config->define( "data_ipv2_index=s" ); +$config->define( "data_ipv2_descr=s" ); +$config->define( "data_ipv3_hexcode=s" ); +$config->define( "data_ipv3_multiply=s" ); +$config->define( "data_ipv3_measure=s" ); +$config->define( "data_ipv3_index=s" ); +$config->define( "data_ipv3_descr=s" ); +$config->define( "data_etoday_hexcode=s" ); +$config->define( "data_etoday_multiply=s" ); +$config->define( "data_etoday_measure=s" ); +$config->define( "data_etoday_index=s" ); +$config->define( "data_etoday_descr=s" ); +$config->define( "data_vpv_hexcode=s" ); +$config->define( "data_vpv_multiply=s" ); +$config->define( "data_vpv_measure=s" ); +$config->define( "data_vpv_index=s" ); +$config->define( "data_vpv_descr=s" ); +$config->define( "data_ipv3_hexcode=s" ); +$config->define( "data_ipv3_multiply=s" ); +$config->define( "data_ipv3_measure=s" ); +$config->define( "data_ipv3_index=s" ); +$config->define( "data_ipv3_descr=s" ); +$config->define( "data_iac_hexcode=s" ); +$config->define( "data_iac_multiply=s" ); +$config->define( "data_iac_measure=s" ); +$config->define( "data_iac_index=s" ); +$config->define( "data_iac_descr=s" ); +$config->define( "data_vac_hexcode=s" ); +$config->define( "data_vac_multiply=s" ); +$config->define( "data_vac_measure=s" ); +$config->define( "data_vac_index=s" ); +$config->define( "data_vac_descr=s" ); +$config->define( "data_fac_hexcode=s" ); +$config->define( "data_fac_multiply=s" ); +$config->define( "data_fac_measure=s" ); +$config->define( "data_fac_index=s" ); +$config->define( "data_fac_descr=s" ); +$config->define( "data_pac_hexcode=s" ); +$config->define( "data_pac_multiply=s" ); +$config->define( "data_pac_measure=s" ); +$config->define( "data_pac_index=s" ); +$config->define( "data_pac_descr=s" ); +$config->define( "data_zac_hexcode=s" ); +$config->define( "data_zac_multiply=s" ); +$config->define( "data_zac_measure=s" ); +$config->define( "data_zac_index=s" ); +$config->define( "data_zac_descr=s" ); +$config->define( "data_etotalh_hexcode=s" ); +$config->define( "data_etotalh_multiply=s" ); +$config->define( "data_etotalh_measure=s" ); +$config->define( "data_etotalh_index=s" ); +$config->define( "data_etotalh_descr=s" ); +$config->define( "data_etotall_hexcode=s" ); +$config->define( "data_etotall_multiply=s" ); +$config->define( "data_etotall_measure=s" ); +$config->define( "data_etotall_index=s" ); +$config->define( "data_etotall_descr=s" ); +$config->define( "data_htotalh_hexcode=s" ); +$config->define( "data_htotalh_multiply=s" ); +$config->define( "data_htotalh_measure=s" ); +$config->define( "data_htotalh_index=s" ); +$config->define( "data_htotalh_descr=s" ); +$config->define( "data_htotall_hexcode=s" ); +$config->define( "data_htotall_multiply=s" ); +$config->define( "data_htotall_measure=s" ); +$config->define( "data_htotall_index=s" ); +$config->define( "data_htotall_descr=s" ); +$config->define( "data_mode_hexcode=s" ); +$config->define( "data_mode_multiply=s" ); +$config->define( "data_mode_measure=s" ); +$config->define( "data_mode_index=s" ); +$config->define( "data_mode_descr=s" ); +$config->define( "data_errgv_hexcode=s" ); +$config->define( "data_errgv_multiply=s" ); +$config->define( "data_errgv_measure=s" ); +$config->define( "data_errgv_index=s" ); +$config->define( "data_errgv_descr=s" ); +$config->define( "data_errgf_hexcode=s" ); +$config->define( "data_errgf_multiply=s" ); +$config->define( "data_errgf_measure=s" ); +$config->define( "data_errgf_index=s" ); +$config->define( "data_errgf_descr=s" ); +$config->define( "data_errgz_hexcode=s" ); +$config->define( "data_errgz_multiply=s" ); +$config->define( "data_errgz_measure=s" ); +$config->define( "data_errgz_index=s" ); +$config->define( "data_errgz_descr=s" ); +$config->define( "data_errtemp_hexcode=s" ); +$config->define( "data_errtemp_multiply=s" ); +$config->define( "data_errtemp_measure=s" ); +$config->define( "data_errtemp_index=s" ); +$config->define( "data_errtemp_descr=s" ); +$config->define( "data_errpv1_hexcode=s" ); +$config->define( "data_errpv1_multiply=s" ); +$config->define( "data_errpv1_measure=s" ); +$config->define( "data_errpv1_index=s" ); +$config->define( "data_errpv1_descr=s" ); +$config->define( "data_errgfc1_hexcode=s" ); +$config->define( "data_errgfc1_multiply=s" ); +$config->define( "data_errgfc1_measure=s" ); +$config->define( "data_errgfc1_index=s" ); +$config->define( "data_errgfc1_descr=s" ); +$config->define( "data_errmode_hexcode=s" ); +$config->define( "data_errmode_multiply=s" ); +$config->define( "data_errmode_measure=s" ); +$config->define( "data_errmode_index=s" ); +$config->define( "data_errmode_descr=s" ); + +# fill variables by reading configuration file +$config->file( "config.ini" ) || die "FAILED to open and/or read config file: config.ini\n"; + +if ($config->flags_debug) { + print "debug=" . $config->flags_debug ; + print ", use_pvoutput=" . $config->flags_use_pvoutput ; + print ", use_rrdtool=" . $config->flags_use_rrdtool . "\n" ; +} + +# +# inverter parameter format codes (hash of hashes) +# +%HoHparams = ( + 'VPV-START' => { + HEXCODE => $config->param_vpvstart_hexcode, + MULTIPLY => $config->param_vpvstart_multiply, + MEAS => $config->param_vpvstart_measure, + INDEX => $config->param_vpvstart_index, + VALUE => 0, + DESCR => $config->param_vpvstart_descr, + }, + 'T-START' => { + HEXCODE => $config->param_tstart_hexcode, + MULTIPLY => $config->param_tstart_multiply, + MEAS => $config->param_tstart_measure, + INDEX => $config->param_tstart_index, + VALUE => 0, + DESCR => $config->param_tstart_descr, + }, + 'VAC-MIN' => { + HEXCODE => $config->param_vacmin_hexcode, + MULTIPLY => $config->param_vacmin_multiply, + MEAS => $config->param_vacmin_measure, + INDEX => $config->param_vacmin_index, + VALUE => 0, + DESCR => $config->param_vacmin_descr, + }, + 'VAC-MAX' => { + HEXCODE => $config->param_vacmax_hexcode, + MULTIPLY => $config->param_vacmax_multiply, + MEAS => $config->param_vacmax_measure, + INDEX => $config->param_vacmax_index, + VALUE => 0, + DESCR => $config->param_vacmax_descr, + }, + 'FAC-MIN' => { + HEXCODE => $config->param_facmin_hexcode, + MULTIPLY => $config->param_facmin_multiply, + MEAS => $config->param_facmin_measure, + INDEX => $config->param_facmin_index, + VALUE => 0, + DESCR => $config->param_facmin_descr, + }, + 'FAC-MAX' => { + HEXCODE => $config->param_facmax_hexcode, + MULTIPLY => $config->param_facmax_multiply, + MEAS => $config->param_facmax_measure, + INDEX => $config->param_facmax_index, + VALUE => 0, + DESCR => $config->param_facmax_descr, + }, + 'ZAC-MAX' => { + HEXCODE => $config->param_zacmax_hexcode, + MULTIPLY => $config->param_zacmax_multiply, + MEAS => $config->param_zacmax_measure, + INDEX => $config->param_zacmax_index, + VALUE => 0, + DESCR => $config->param_zacmax_descr, + }, + 'DZAC' => { + HEXCODE => $config->param_dzac_hexcode, + MULTIPLY => $config->param_dzac_multiply, + MEAS => $config->param_dzac_measure, + INDEX => $config->param_dzac_index, + VALUE => 0, + DESCR => $config->param_dzac_descr, + }, +); + +# +# inverter data format codes (hash of hashes) +# +%HoH = ( + TEMP => { + HEXCODE => $config->data_temp_hexcode, + MULTIPLY => $config->data_temp_multiply, + MEAS => $config->data_temp_measure, + INDEX => $config->data_temp_index, + VALUE => 0, + DESCR => $config->data_temp_descr, + }, + VPV1 => { + HEXCODE => $config->data_vpv1_hexcode, + MULTIPLY => $config->data_vpv1_multiply, + MEAS => $config->data_vpv1_measure, + INDEX => $config->data_vpv1_index, + VALUE => 0, + DESCR => $config->data_vpv1_descr, + }, + VPV2 => { + HEXCODE => $config->data_vpv2_hexcode, + MULTIPLY => $config->data_vpv2_multiply, + MEAS => $config->data_vpv2_measure, + INDEX => $config->data_vpv2_index, + VALUE => 0, + DESCR => $config->data_vpv2_descr, + }, + VPV3 => { + HEXCODE => $config->data_vpv3_hexcode, + MULTIPLY => $config->data_vpv3_multiply, + MEAS => $config->data_vpv3_measure, + INDEX => $config->data_vpv3_index, + VALUE => 0, + DESCR => $config->data_vpv3_descr, + }, + IPV1 => { + HEXCODE => $config->data_ipv1_hexcode, + MULTIPLY => $config->data_ipv1_multiply, + MEAS => $config->data_ipv1_measure, + INDEX => $config->data_ipv1_index, + VALUE => 0, + DESCR => $config->data_ipv1_descr, + }, + IPV2 => { + HEXCODE => $config->data_ipv2_hexcode, + MULTIPLY => $config->data_ipv2_multiply, + MEAS => $config->data_ipv2_measure, + INDEX => $config->data_ipv2_index, + VALUE => 0, + DESCR => $config->data_ipv2_descr, + }, + IPV3 => { + HEXCODE => $config->data_ipv3_hexcode, + MULTIPLY => $config->data_ipv3_multiply, + MEAS => $config->data_ipv3_measure, + INDEX => $config->data_ipv3_index, + VALUE => 0, + DESCR => $config->data_ipv3_descr, + }, + ETODAY => { + HEXCODE => $config->data_etoday_hexcode, + MULTIPLY => $config->data_etoday_multiply, + MEAS => $config->data_etoday_measure, + INDEX => $config->data_etoday_index, + VALUE => 0, + DESCR => $config->data_etoday_descr, + }, + VPV => { + HEXCODE => $config->data_vpv_hexcode, + MULTIPLY => $config->data_vpv_multiply, + MEAS => $config->data_vpv_measure, + INDEX => $config->data_vpv_index, + VALUE => 0, + DESCR => $config->data_vpv_descr, + }, + IAC => { + HEXCODE => $config->data_iac_hexcode, + MULTIPLY => $config->data_iac_multiply, + MEAS => $config->data_iac_measure, + INDEX => $config->data_iac_index, + VALUE => 0, + DESCR => $config->data_iac_descr, + }, + VAC => { + HEXCODE => $config->data_vac_hexcode, + MULTIPLY => $config->data_vac_multiply, + MEAS => $config->data_vac_measure, + INDEX => $config->data_vac_index, + VALUE => 0, + DESCR => $config->data_vac_descr, + }, + FAC => { + HEXCODE => $config->data_fac_hexcode, + MULTIPLY => $config->data_fac_multiply, + MEAS => $config->data_fac_measure, + INDEX => $config->data_fac_index, + VALUE => 0, + DESCR => $config->data_fac_descr, + }, + PAC => { + HEXCODE => $config->data_pac_hexcode, + MULTIPLY => $config->data_pac_multiply, + MEAS => $config->data_pac_measure, + INDEX => $config->data_pac_index, + VALUE => 0, + DESCR => $config->data_pac_descr, + }, + ZAC => { + HEXCODE => $config->data_zac_hexcode, + MULTIPLY => $config->data_zac_multiply, + MEAS => $config->data_zac_measure, + INDEX => $config->data_zac_index, + VALUE => 0, + DESCR => $config->data_zac_descr, + }, + ETOTALH => { + HEXCODE => $config->data_etotalh_hexcode, + MULTIPLY => $config->data_etotalh_multiply, + MEAS => $config->data_etotalh_measure, + INDEX => $config->data_etotalh_index, + VALUE => 0, + DESCR => $config->data_etotalh_descr, + }, + ETOTALL => { + HEXCODE => $config->data_etotall_hexcode, + MULTIPLY => $config->data_etotall_multiply, + MEAS => $config->data_etotall_measure, + INDEX => $config->data_etotall_index, + VALUE => 0, + DESCR => $config->data_etotall_descr, + }, + HTOTALH => { + HEXCODE => $config->data_htotalh_hexcode, + MULTIPLY => $config->data_htotalh_multiply, + MEAS => $config->data_htotalh_measure, + INDEX => $config->data_htotalh_index, + VALUE => $config->data_htotalh_index, + DESCR => $config->data_htotalh_descr, + }, + HTOTALL => { + HEXCODE => $config->data_htotall_hexcode, + MULTIPLY => $config->data_htotall_multiply, + MEAS => $config->data_htotall_measure, + INDEX => $config->data_htotall_index, + VALUE => 0, + DESCR => $config->data_htotall_descr, + }, + MODE => { + HEXCODE => $config->data_mode_hexcode, + MULTIPLY => $config->data_mode_multiply, + MEAS => $config->data_mode_measure, + INDEX => $config->data_mode_index, + VALUE => 0, + DESCR => $config->data_mode_descr, + }, + ERR_GV => { + HEXCODE => $config->data_errgv_hexcode, + MULTIPLY => $config->data_errgv_multiply, + MEAS => $config->data_errgv_measure, + INDEX => $config->data_errgv_index, + VALUE => 0, + DESCR => $config->data_errgv_descr, + }, + ERR_GF => { + HEXCODE => $config->data_errgf_hexcode, + MULTIPLY => $config->data_errgf_multiply, + MEAS => $config->data_errgf_measure, + INDEX => $config->data_errgf_index, + VALUE => 0, + DESCR => $config->data_errgf_descr, + }, + ERR_GZ => { + HEXCODE => $config->data_errgz_hexcode, + MULTIPLY => $config->data_errgz_multiply, + MEAS => $config->data_errgz_measure, + INDEX => $config->data_errgz_index, + VALUE => 0, + DESCR => $config->data_errgz_descr, + }, + ERR_TEMP => { + HEXCODE => $config->data_errtemp_hexcode, + MULTIPLY => $config->data_errtemp_multiply, + MEAS => $config->data_errtemp_measure, + INDEX => $config->data_errtemp_index, + VALUE => 0, + DESCR => $config->data_errtemp_descr, + }, + ERR_PV1 => { + HEXCODE => $config->data_errpv1_hexcode, + MULTIPLY => $config->data_errpv1_multiply, + MEAS => $config->data_errpv1_measure, + INDEX => $config->data_errpv1_index, + VALUE => 0, + DESCR => $config->data_errpv1_descr, + }, + ERR_GFC1 => { + HEXCODE => $config->data_errgfc1_hexcode, + MULTIPLY => $config->data_errgfc1_multiply, + MEAS => $config->data_errgfc1_measure, + INDEX => $config->data_errgfc1_index, + VALUE => 0, + DESCR => $config->data_errgfc1_descr, + }, + ERR_MODE => { + HEXCODE => $config->data_errmode_hexcode, + MULTIPLY => $config->data_errmode_multiply, + MEAS => $config->data_errmode_measure, + INDEX => $config->data_errmode_index, + VALUE => 0, + DESCR => $config->data_errmode_descr, + }, + UNK10 => { + HEXCODE => "7f", + MULTIPLY => 1, + MEAS => "", + INDEX => -1, + VALUE => 0, + DESCR => "Unknown", + }, + # ---------------- UNKNOWN ---------------------- + UNK11 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "", + INDEX => -1, + VALUE => 0, + DESCR => "Unknown", + }, + UNK12 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "", + INDEX => -1, + VALUE => 0, + DESCR => "Unknown", + }, + UNK13 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "", + INDEX => -1, + VALUE => 0, + DESCR => "Unknown", + }, + UNK14 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "", + INDEX => -1, + VALUE => 0, + DESCR => "Unknown", + }, + IDC1 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "A", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + IDC2 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "A", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + IDC3 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "A", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + IAC1 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "A", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + VAC1 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "V", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + FAC1 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.01, + MEAS => "Hz", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + PDC1 => { + HEXCODE => "zz", # unknown + MULTIPLY => 1, + MEAS => "W", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + IAC2 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "A", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + VAC2 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "V", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + FAC2 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.01, + MEAS => "Hz", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + PDC2 => { + HEXCODE => "zz", # unknown + MULTIPLY => 1, + MEAS => "W", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + IAC3 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "A", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + VAC3 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.1, + MEAS => "V", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + FAC3 => { + HEXCODE => "zz", # unknown + MULTIPLY => 0.01, + MEAS => "Hz", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, + PDC3 => { + HEXCODE => "zz", # unknown + MULTIPLY => 1, + MEAS => "W", + INDEX => -1, + VALUE => 0, + DESCR => "", + }, +# ---------------- UNKNOWN ---------------------- +# PVP1 "W", "PV 1 voltage" +# PVP2 "W", "PV 2 voltage" +# PVP3 "W", "PV 3 voltage" +# IAC1 "A", "PV 1 Grid current" +# IAC2 "A", "PV 2 Grid current" +# IAC3 "A", "PV 3 Grid current" +# VAC1 "V", "PV 1 Grid voltage" +# VAC2 "V", "PV 2 Grid voltage" +# VAC3 "V", "PV 3 Grid voltage" +# TEMP1 "deg C", "External temperature sensor 1" +# TEMP2 "deg C", "External temperature sensor 2" +# RAD1 "W/m2", "Irradiance sensor 1" +# RAD2 "W/m2", "Irradiance sensor 2" +); + + +# +# inverter version information (hash) +# +%HASH = ( + CAPACITY => "", + FIRMWARE => "", + MODEL => "", + MANUF => "", + SERIAL => "", + OTHER => "", +); + +####################################################################### + + + +####################################################################### +# +# Open serial/usb/bluetooth port depending on Operating System +# +sub initialiseSerialPort() { + + print "Initialise Serial Port... "; + if ($^O eq 'MSWin32') { # Win32 (ActivePerl) + eval "use Win32::SerialPort"; + $port = $ARGV[0] || $config->serial_port_win; + + # Open the serial port + $serial = Win32::SerialPort->new ($port, 0, '') || die "Can\'t open $port: $!"; + } + else { # Unix/Linux/other + eval "use Device::SerialPort"; + $port = $ARGV[0] || $config->serial_port_oth; + + # Open the serial port + $serial = Device::SerialPort->new ($port, 0, '') || die "Can\'t open $port: $!"; + } + print "port = $port\n"; + + # + # Open the serial port + # + $serial->error_msg(1); # use built-in hardware error messages like "Framing Error" + $serial->user_msg(1); # use built-in function messages like "Waiting for ..." + #$serial->baudrate($config->serial_baud) || die 'fail setting baudrate, try -b option'; + $serial->{'_L_BAUD'}{$config->serial_baud} = $config->serial_baud; + $serial->parity($config->serial_parity) || die 'fail setting parity'; + $serial->databits($config->serial_databits) || die 'fail setting databits'; + $serial->stopbits($config->serial_stopbits) || die 'fail setting stopbits'; + $serial->handshake($config->serial_handshake) || die 'fail setting handshake'; + $serial->datatype($config->serial_datatype) || die 'fail setting datatype'; + $serial->write_settings || die 'could not write settings'; + $serial->read_char_time(0); # don't wait for each character + $serial->read_const_time(1000); # 1 second per unfulfilled "read" call +} + +####################################################################### +# +# Close serial/usb/bluetooth port +# +sub closeSerialPort() { + $serial->close || warn "*** WARNING Close port failed, connection may have died.\n"; + undef $serial; +} + +####################################################################### +# +# Trim function to remove whitespace from start and end of a string +# +sub trim($) { + my $string = shift; + $string =~ s/^\s+//; + $string =~ s/\s+$//; + return $string; +} + +####################################################################### +# +# Turn raw data from the inverter into a hex string +# +sub convRawToHex() { + my $pstring = shift; + my $hstring = unpack ("H*",$pstring); + return $hstring; +} + +####################################################################### +# +# Turn hex string into raw data for transmission to the inverter +# +sub convHexToRaw() { + my $hstring = shift; + my $pstring = pack (qq{H*},qq{$hstring}); + return $pstring; +} + +####################################################################### +# +# Return Date & Time in format: "DD/MM/YYYY HH:MM:SS" +# +sub getDateTime { + local($time_since_epoch) = @_; + local($sec,$min,$hour,$dayOfMth,$monthOffset,$yearOffset,$dayOfWk,$dayOfYr,$isDST) = localtime($time_since_epoch); + local($year) = 1900 + $yearOffset; + local($month) = 1 + $monthOffset; + return sprintf("%.2d/%.2d/%d %.2d:%.2d:%.2d", $dayOfMth, $month, $year, $hour, $min, $sec); +} + +####################################################################### +# +# Return Date in format: "YYYYMMDD" +# +sub getDate_YYYYMMDD { + local($time_since_epoch) = @_; + local($sec,$min,$hour,$dayOfMth,$monthOffset,$yearOffset,$dayOfWk,$dayOfYr,$isDST) = localtime($time_since_epoch); + local($year) = 1900 + $yearOffset; + local($month) = 1 + $monthOffset; + return sprintf("%d%.2d%.2d", $year, $month, $dayOfMth); +} + +####################################################################### +# +# Return Date in format: "YYYYMM" +# +sub getDate_YYYYMM { + local($time_since_epoch) = @_; + local($sec,$min,$hour,$dayOfMth,$monthOffset,$yearOffset,$dayOfWk,$dayOfYr,$isDST) = localtime($time_since_epoch); + local($year) = 1900 + $yearOffset; + local($month) = 1 + $monthOffset; + return sprintf("%d%.2d", $year, $month); +} + +####################################################################### +# +# Return Time in format: "HH:MM" +# +sub getTime_HHMM { + local($time_since_epoch) = @_; + local($sec,$min,$hour,$dayOfMth,$monthOffset,$yearOffset,$dayOfWk,$dayOfYr,$isDST) = localtime($time_since_epoch); + return sprintf("%.2d:%.2d", $hour, $min); +} + +####################################################################### +# +# Return LogFile Name: [path]/inverter_[serial#]_[yyyymmdd].csv +# +sub getLogFileName { + my $logfile = ""; + + # + # set path + # + if ($^O eq 'MSWin32') { # Win32 (ActivePerl) + $logfile = $config->paths_windows; + } + else { # Unix/Linux/other + $logfile = $config->paths_other; + } + + # + # append filename + # + $logfile .= "/inverter_" . $HASH{SERIAL} . "_" . getDate_YYYYMMDD(time) . ".csv"; + return $logfile; +} + +####################################################################### +# +# Return ErrFile Name: [path]/inverter_err_[serial#]_[yyyymm].log +# +sub getErrFileName { + my $errfile = ""; + + # + # set path + # + if ($^O eq 'MSWin32') { # Win32 (ActivePerl) + $errfile = $config->paths_windows; + } + else { # Unix/Linux/other + $errfile = $config->paths_other; + } + + # + # append filename + # + $errfile .= "/inverter_err_" . $HASH{SERIAL} . "_" . getDate_YYYYMM(time) . ".log"; + return $errfile; +} + +####################################################################### +# +# Return RRD File Name: [path]/inverter_[serial#].rrd +# +sub getRrdFileName(@) { + my $rrdfile = ""; + my $suffix = shift; + + # + # set path + # + if ($^O eq 'MSWin32') { # Win32 (ActivePerl) + $rrdfile = $config->paths_windows; + } + else { # Unix/Linux/other + $rrdfile = $config->paths_other; + } + + # + # append filename + # + $rrdfile .= "/inverter_" . $HASH{SERIAL} . (defined $suffix ? ("_" . $suffix) : "") . ".rrd"; + return $rrdfile; +} + +####################################################################### +# +# Write to the port (the inverter is on) & warn if it fails +# +sub writeToPort() { + my $writeStr = shift; + my $countOut = $serial->write($writeStr); + warn "*** write failed ( $countOut ) ***\n" unless ($countOut); + warn "*** write incomplete ( $countOut ) ***\n" if ( $countOut != length($writeStr) ); + return $countOut; +} + +####################################################################### +# +# Write to serial port then read result from buffer +# until expected read response received or timeout exceeded +# +sub writeReadBuffer() { + my $writeString = shift; + my $readPattern = shift; + my $chars=0; + my $buffer=""; + my $buffer2="x"; + my $timeout = $config->secs_timeout; + my $reinit = 0; + + if ($config->flags_debug) { + print "writeReadBuffer: writeString=$writeString\n"; + print "writeReadBuffer: readPattern=$readPattern\n"; + } + + # + # Write to (Serial) Port + # + &writeToPort(&convHexToRaw($writeString)); + + # sleep for dodgy cables (eg beginner soldering or usb converters) + # sleep 2; + + # + # Read response from buffer until either expected response received or timeout reached + # + while ( $timeout > 0 ) { + + my ($countIn,$stringIn) = $serial->read(255); # will read _up to_ 255 chars + if ($countIn > 0) { + + if ($config->flags_debug) { + print "writeReadBuffer: saw..." . &convRawToHex($stringIn) . "\n"; + } + + $chars += $countIn; + $buffer .= $stringIn; + $hexBuffer = &convRawToHex($buffer); + + # + # Check to see if expected read response is in the $buffer, say "last" if we find it + # + if ( $hexBuffer =~ /$readPattern/ ) { + ($buffer2) = ( $hexBuffer =~ /($readPattern.*$)/ ); + if ($config->flags_debug) { + print "writeReadBuffer: found=$buffer2\n"; + } + last; + } + + } + else { + $timeout--; + } + + # + # check if timeout was reached + # + if ($timeout==0) { + print "Re-Init...\n"; + &closeSerialPort; + &initialiseSerialPort; + + $timeout = $config->secs_timeout; + $reinit++; + + print "Waited " . $config->secs_timeout . " seconds and never saw $readPattern\n"; + #die "Waited " . $config->secs_timeout . " seconds and never saw $readPattern\n"; + } + + # + # check if reinitialise port timeout was reached, if so die + # + if ($config->secs_reinit >= 0 && $reinit > $config->secs_reinit) { + &closeSerialPort; + die "REINIT MAX exceeded, aborted.\n"; + } + + } # end of while loop + + print "Recv <- $buffer2 \n"; + return $buffer2; +} + +####################################################################### +# +# Prepare the REQUEST_CONF_SERIAL packet +# grab serial# from input data, use it to create the response packet, incl checksum in format: +# RESPONSE_CONF_SERIAL_1 + $hexSerial + RESPONSE_CONF_SERIAL_2 + $hexReqChkSum +# +sub calcReqConfSerial() { + my $hexStr = shift; + my $hexSerial = substr($hexStr, $config->hex_confserial_index, $config->hex_serial_length); + my $hexReqRegex = $config->sendhex_conf_serial1 . $hexSerial . $config->sendhex_conf_serial2; + + # + # calculate hex checksum for the request + # + my $rawReq = &convHexToRaw( $hexReqRegex ); + my $rawReqChkSum = unpack ( "%C*", $rawReq ); + my $hexReqChkSum = sprintf ( "%04x ", $rawReqChkSum ); + + # + # join it all together to create the request + # + my $reqConfSerial = $hexReqRegex . $hexReqChkSum; + return($reqConfSerial); +} + +####################################################################### +# +# Initialise Inverter - handshake is done here +# +sub initialiseInverter() { + # + # step 1: Start initial handshake with inverter (reset network) + # + my $rawRequest = &convHexToRaw($config->sendhex_initialise); + print "Send -> req init inverter: " . $config->sendhex_initialise . "\n"; + &writeToPort($rawRequest); + + # + # step 2: request the serial number (query network) + # + print "Send -> req serial: " . $config->sendhex_serial . "\n"; + my $hexResponse = &writeReadBuffer($config->sendhex_serial,$config->recvhex_serial); + + # + # step 3: confirm the serial number + # + my $confSerialRequest = &calcReqConfSerial($hexResponse); + print "Send -> confirm serial: $confSerialRequest \n"; + my $hexResponse2 = &writeReadBuffer($confSerialRequest,$config->recvhex_conf_serial); +} + +####################################################################### +# +# Parse Version/Firmware Data - store in %HASH +# +sub parseVersData() { + print "* Version info:\n"; + my $hexData = shift; + my $asciiVers = ( pack ("H*", $hexData) ); + my $hexLength = length($hexData); + print "asciiVers=$asciiVers\n"; + + # + # convert portions of hex to ascii + # + if ( $config->hex_capacity_length > 0 && $config->hex_capacity_index + $config->hex_capacity_length < $hexLength ) { + $HASH{CAPACITY} = &trim( pack ("H*", substr($hexData, $config->hex_capacity_index, $config->hex_capacity_length)) ); + } + if ( $config->hex_firmware_length > 0 && $config->hex_firmware_index + $config->hex_firmware_length < $hexLength ) { + $HASH{FIRMWARE} = &trim( pack ("H*", substr($hexData, $config->hex_firmware_index, $config->hex_firmware_length)) ); + } + if ( $config->hex_model_length > 0 && $config->hex_model_index + $config->hex_model_length < $hexLength ) { + $HASH{MODEL} = &trim( pack ("H*", substr($hexData, $config->hex_model_index, $config->hex_model_length)) ); + } + if ( $config->hex_manuf_length > 0 && $config->hex_manuf_index + $config->hex_manuf_length < $hexLength ) { + $HASH{MANUF} = &trim( pack ("H*", substr($hexData, $config->hex_manuf_index, $config->hex_manuf_length)) ); + } + if ( $config->hex_serial_length > 0 && $config->hex_serial_index + $config->hex_serial_length < $hexLength ) { + $HASH{SERIAL} = &trim( pack ("H*", substr($hexData, $config->hex_serial_index, $config->hex_serial_length)) ); + } + if ( $config->hex_other_length > 0 && $config->hex_other_index + $config->hex_other_length < $hexLength ) { + $HASH{OTHER} = &trim( pack ("H*", substr($hexData, $config->hex_other_index, $config->hex_other_length)) ); + } + + # + # display version information (in sorted order) + # + for $key ( sort( keys ( %HASH ) ) ) { + printf "%-8s : %s\n", $key, $HASH{$key}; + } +} + +####################################################################### +# +# Parse Parameter Format +# based on $HoHparams{HEXCODE} & store index/position in $HoHparams{INDEX} +# +sub parseParamFmt() { + print "* Parameter Format:\n"; + my $hexData = shift; + if ($hexData eq "") { + print "n/a\n"; + return; + } + + # split hex string into an array of 2char hex strings + @d = ( $hexData =~ m/..?/g ); + + my $dataOffset = $config->hex_data_to_follow_index + 1; + my $dataToFollow = hex($d[$config->hex_data_to_follow_index]); + print "dataToFollow = hex($d[$config->hex_data_to_follow_index]) = $dataToFollow\n"; + + my $i = 0; + for $x ($dataOffset .. $dataOffset + $dataToFollow - 1) { + printf "%2s = %2s", $x, $d[$x] ; + for $key ( keys ( %HoHparams ) ) { + if ( $HoHparams{$key}{HEXCODE} eq $d[$x]) { + $HoHparams{$key}{INDEX} = $i; + printf " = %-10s = %2s = %s", $key, $HoHparams{$key}{INDEX}, $HoHparams{$key}{DESCR} ; + } + } + print "\n"; + $i++; + } +} + +####################################################################### +# +# Parse Parameters +# based on $HoHparams{INDEX} & store value in $HoHparams{VALUE} +# +sub parseParam() { + print "* Parameters:\n"; + my $hexData = shift; + my $dataToFollow = hex( substr( $hexData, $config->hex_data_to_follow_index*2, 2 ) ); + my $startIndex = ( $config->hex_data_to_follow_index + 1 )*2; + my $numOfChars = $dataToFollow * 2; + my $data = substr( $hexData, $startIndex, $numOfChars ); + + # split hex string into an array of 4char hex strings + @d = ( $data =~ m/..?.?.?/g ); + + # display data values - sort %HoH by INDEX + for $key ( sort {$HoHparams{$a}{INDEX} <=> $HoHparams{$b}{INDEX} } keys ( %HoHparams ) ) { + if ( $HoHparams{$key}{INDEX} ne "-1" ) { + $HoHparams{$key}{VALUE} = hex( $d[$HoHparams{$key}{INDEX}] ) * $HoHparams{$key}{MULTIPLY}; + printf "%-10s: %8s %-5s = %s \n", $key, $HoHparams{$key}{VALUE}, $HoHparams{$key}{MEAS}, $HoHparams{$key}{DESCR} ; + } + } +} + +####################################################################### +# +# Set Data Format Manually - if not sure of REQUEST_DATAFMT response break-up yet +# eg: CMS 10000 +# +sub setDataFmt2() { + print "* Data Format2:\n"; + $HoH{TEMP}{INDEX} = 0; + $HoH{VPV}{INDEX} = 1; + $HoH{VPV2}{INDEX} = 2; + $HoH{VPV3}{INDEX} = 3; + $HoH{IDC1}{INDEX} = 4; + $HoH{IDC2}{INDEX} = 5; + $HoH{IDC3}{INDEX} = 6; + $HoH{ETOTALH}{INDEX} = 7; + $HoH{ETOTALL}{INDEX} = 8; + $HoH{HTOTALH}{INDEX} = 9; + $HoH{HTOTALL}{INDEX} = 10; + $HoH{PAC}{INDEX} = 11; + $HoH{MODE}{INDEX} = 12; + $HoH{ETODAY}{INDEX} = 13; + $HoH{ERR_GV}{INDEX} = 14; + $HoH{ERR_GF}{INDEX} = 15; + $HoH{ERR_GZ}{INDEX} = 16; + $HoH{ERR_TEMP}{INDEX} = 17; + $HoH{ERR_PV1}{INDEX} = 18; + $HoH{ERR_GFC1}{INDEX} = 19; + $HoH{ERR_MODE}{INDEX} = 20; + $HoH{IAC1}{INDEX} = 21; + $HoH{VAC1}{INDEX} = 22; + $HoH{FAC1}{INDEX} = 23; + $HoH{PDC1}{INDEX} = 24; + $HoH{UNK10}{INDEX} = 25; + $HoH{UNK11}{INDEX} = 26; + $HoH{UNK12}{INDEX} = 27; + $HoH{UNK13}{INDEX} = 28; + $HoH{IAC2}{INDEX} = 29; + $HoH{VAC2}{INDEX} = 30; + $HoH{FAC2}{INDEX} = 31; + $HoH{PDC2}{INDEX} = 32; + $HoH{UNK14}{INDEX} = 33; + + # + # display data format indexes - sort %HoH by INDEX + # + for $key ( sort {$HoH{$a}{INDEX} <=> $HoH{$b}{INDEX} } keys ( %HoH ) ) { + if ( $HoH{$key}{INDEX} ne "-1" ) { + printf "%-8s = %2s = %s\n", $key, $HoH{$key}{INDEX}, $HoH{$key}{DESCR} ; + } + } +} + +####################################################################### +# +# Parse Data Format +# based on $HoH{HEXCODE} & store index/position in $HoH{INDEX} +# +sub parseDataFmt() { + print "* Data Format:\n"; + my $hexData = shift; + if ($hexData eq "") { + print "n/a\n"; + return; + } + + # split hex string into an array of 2char hex strings + @d = ( $hexData =~ m/..?/g ); + + my $dataOffset = $config->hex_data_to_follow_index + 1; + my $dataToFollow = hex($d[$config->hex_data_to_follow_index]); + print "dataToFollow = hex($d[$config->hex_data_to_follow_index]) = $dataToFollow\n"; + + if ($HASH{MODEL} eq "CMS 10000") { + &setDataFmt2; # temp: until get hold of CMS 10000 protocol & figure out hexcodes & keys + return; + } + + my $i = 0; + for $x ($dataOffset .. $dataOffset + $dataToFollow - 1) { + printf "%2s = %2s", $x, $d[$x] ; + for $key ( keys ( %HoH ) ) { + if ( $HoH{$key}{HEXCODE} eq $d[$x]) { + $HoH{$key}{INDEX} = $i; + printf " = %-8s = %2s = %s", $key, $HoH{$key}{INDEX}, $HoH{$key}{DESCR} ; + } + } + print "\n"; + $i++; + } +} + +####################################################################### +# +# Parse Data +# based on $HoH{INDEX} & store value in $HoH{VALUE} +# +sub parseData() { + print "* Data:\n"; + my $hexData = shift; + my $dataToFollow = hex( substr( $hexData, $config->hex_data_to_follow_index*2, 2 ) ); + my $startIndex = ( $config->hex_data_to_follow_index + 1 )*2; + my $numOfChars = $dataToFollow * 2; + my $data = substr( $hexData, $startIndex, $numOfChars ); + + # split hex string into an array of 4char hex strings + @d = ( $data =~ m/..?.?.?/g ); + + # display data values - sort %HoH by INDEX + for $key ( sort {$HoH{$a}{INDEX} <=> $HoH{$b}{INDEX} } keys ( %HoH ) ) { + if ( $HoH{$key}{INDEX} ne "-1" ) { + $HoH{$key}{VALUE} = hex( $d[$HoH{$key}{INDEX}] ) * $HoH{$key}{MULTIPLY}; + printf "%-8s: %8s %-5s = %s \n", $key, $HoH{$key}{VALUE}, $HoH{$key}{MEAS}, $HoH{$key}{DESCR} ; + } + } + + # + # Sometimes CMS2000 inverter keeps yesterdays ETODAY for first 30mins or more each morning + # hence some logic to use ZERO if hour < 9am and ETODAY > 1.0 kWh + # + if ($HASH{MODEL} eq "CMS 2000") { + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + if ($hour < 9 && $HoH{ETODAY}{VALUE} > 1.0) { + + # + # open errfile in 'append' mode + # + my $errfile = getErrFileName(); + if ( open(ERRFILE, ">>$errfile") ) { + my $dateTimeStr = getDateTime(time); + my $errLine = "$dateTimeStr - ETODAY=$HoH{ETODAY}{VALUE}, will use 0 instead, as not reset since yesterday."; + print "ERROR logged to: $errfile\n"; + print ERRFILE "$errLine\n"; + close (ERRFILE); + } + $HoH{ETODAY}{VALUE} = 0; + } + } +} + +####################################################################### +# +# Write certain inverter data to a csv file +# +sub writeToFile() { + my $logfile = getLogFileName(); + my $rrdfile = getRrdFileName(); + + # + # open logfile in 'append' mode + # + if ( open(LOGFILE, ">>$logfile") ) { + print "Logging to: $logfile\n"; + + # + # add file header to logfile (if file exists & is empty) + # + if ( -z $logfile ) { +# print LOGFILE "DATE,TIMESTAMP,TEMP,VPV,IAC,VAC,FAC,PAC,ETOTAL,HTOTAL,MODE,ETODAY\n"; + print LOGFILE "DATE,TIMESTAMP,TEMP,VPV,IAC,VAC,FAC,PAC,ETOTAL,HTOTAL,MODE,ETODAY" . + ",ETOTALH,HTOTALH,ERR_GV,ERR_GF,ERR_GZ,ERR_TEMP,ERR_PV1,ERR_GFC1,ERR_MODE,UNK10\n"; + } + + my $etotal = ($HoH{ETOTALL}{VALUE} + $HoH{ETOTALH}{VALUE}); + my $htotal = ($HoH{HTOTALL}{VALUE} + $HoH{HTOTALH}{VALUE}); + if ($config->flags_debug) { + print "etotal=$etotal htotal=$htotal\n"; + } + + # + # write data to logfile & close it + # + my $unixTimeStamp = time; # secs since epoch + my $dateTimeStr = getDateTime($unixTimeStamp); + my $csvLine = "$dateTimeStr," . + "$unixTimeStamp," . + "$HoH{TEMP}{VALUE}," . + "$HoH{VPV}{VALUE}," . + "$HoH{IAC}{VALUE}," . + "$HoH{VAC}{VALUE}," . + "$HoH{FAC}{VALUE}," . + "$HoH{PAC}{VALUE}," . + "$etotal," . + "$htotal," . + "$HoH{MODE}{VALUE}," . + "$HoH{ETODAY}{VALUE}," . + "$HoH{ETOTALH}{VALUE}," . + "$HoH{HTOTALH}{VALUE}," . + "$HoH{ERR_GV}{VALUE}," . + "$HoH{ERR_GF}{VALUE}," . + "$HoH{ERR_GZ}{VALUE}," . + "$HoH{ERR_TEMP}{VALUE}," . + "$HoH{ERR_PV1}{VALUE}," . + "$HoH{ERR_GFC1}{VALUE}," . + "$HoH{ERR_MODE}{VALUE}," . + "$HoH{UNK10}{VALUE}"; + print LOGFILE "$csvLine\n"; + close (LOGFILE); + + # + # write data to rrdtool for graphing + # + if ($config->flags_use_rrdtool) { + + my $rrdexe = $config->scripts_rrdtool_exe_oth; # Unix/Linux/other + if ($^O eq 'MSWin32') { # Win32 (ActivePerl) + $rrdexe = $config->scripts_rrdtool_exe_win; + } + + # + # create rrd file - if it doesn't exist + # + if ( ! -e $rrdfile ) { + print "Ran: " . $config->scripts_create_rrd . " \"$rrdfile\" \"$rrdexe\"\n"; + system ($config->scripts_create_rrd . " \"$rrdfile\" \"$rrdexe\"" ); + } + + # + # update rrd file + # + my $rrdLine = "$unixTimeStamp:" . + "$HoH{TEMP}{VALUE}:" . + "$HoH{VPV}{VALUE}:" . + "$HoH{IAC}{VALUE}:" . + "$HoH{VAC}{VALUE}:" . + "$HoH{FAC}{VALUE}:" . + "$HoH{PAC}{VALUE}:" . + "$etotal:" . + "$HoH{ETODAY}{VALUE}"; + print "Ran: $rrdexe update $rrdfile $rrdLine\n"; + system( "$rrdexe update $rrdfile $rrdLine" ); + + $rrdfile = getRrdFileName("today"); + if (-e $rrdfile) { + $rrdLine = "$unixTimeStamp:" . + "$HoH{PAC}{VALUE}:" . + "$HoH{ETODAY}{VALUE}"; + print "Ran: $rrdexe update $rrdfile $rrdLine\n"; + system( "$rrdexe update $rrdfile $rrdLine" ); + } + } + + } + else { + warn "*** WARNING Could not open logfile: $logfile\n"; + } +} + +####################################################################### +# +# MAIN +# +print "Starting up at " . getDateTime(time) . " running on $^O ...\n"; +my $lastPollTime = 0; +my $nextPollTime = 0; +my $lastPvoutputTime = 0; +my $nextPvoutputTime = 0; + +# +# Initialise Serial Port & Inverter +# +&initialiseSerialPort; +&initialiseInverter; + +# +# Request Inverter Version Information +# +print "Send -> req version: " . $config->sendhex_version . "\n"; +$hexResponse = &writeReadBuffer($config->sendhex_version,$config->recvhex_version); +&parseVersData($hexResponse); + +# +# Request Inverter Parameter Format Information +# +if ( $config->sendhex_paramfmt ne " " ) { + print "Send -> req param format: " . $config->sendhex_paramfmt . "\n"; + $hexResponse = &writeReadBuffer($config->sendhex_paramfmt,$config->recvhex_paramfmt); + &parseParamFmt($hexResponse); +} + +# +# Request Inverter Parameter Information +# +print "Send -> req params: " . $config->sendhex_param . "\n"; +$hexResponse = &writeReadBuffer($config->sendhex_param,$config->recvhex_param); +&parseParam($hexResponse); + +# +# Request Inverter Data Format Information +# +if ( $config->sendhex_datafmt ne " " ) { + print "Send -> req data format: " . $config->sendhex_datafmt . "\n"; + $hexResponse = &writeReadBuffer($config->sendhex_datafmt,$config->recvhex_datafmt); + &parseDataFmt($hexResponse); +} + +# +# The main loop starts here +# +while (1) { + + # + # Request Inverter Data (regular data poll) + # + print "Send -> req data as at " . getDateTime(time) . " : " . $config->sendhex_data . "\n"; + $lastPollTime = time; + $nextPollTime = $lastPollTime + $config->secs_datapoll_freq; + $hexResponse = &writeReadBuffer($config->sendhex_data,$config->recvhex_data); + &parseData($hexResponse); + &writeToFile(); + + # + # Export data to http://pvoutput.org + # + if ($config->flags_use_pvoutput) { + $nextPvoutputTime = $lastPvoutputTime + $config->secs_pvoutput_freq; + if ( $lastPvoutputTime == 0 || $nextPvoutputTime <= time ) { + #my $date = getDate_YYYYMMDD(time); + #my $time = getTime_HHMM(time); + #print "PVOUTPUT as at " . getDateTime(time) . " ...\n"; + #print " ran: " . $config->scripts_pvoutput . " " . ($HoH{ETODAY}{VALUE} * 1000) . " $HoH{PAC}{VALUE} $HoH{VAC}{VALUE} $date $time $HASH{SERIAL}\n"; + #system ($config->scripts_pvoutput . " " . ($HoH{ETODAY}{VALUE} * 1000) . " $HoH{PAC}{VALUE} $HoH{VAC}{VALUE} $date $time $HASH{SERIAL}" ); + print " ran: " . $config->scripts_pvoutput_php . " " . ($HoH{ETODAY}{VALUE} * 1000) . " $HoH{PAC}{VALUE} $HoH{VAC}{VALUE} $HASH{SERIAL}\n"; + system ($config->scripts_pvoutput_php . " " . ($HoH{ETODAY}{VALUE} * 1000) . " $HoH{PAC}{VALUE} $HoH{VAC}{VALUE} $HASH{SERIAL} &"); + $lastPvoutputTime = time; + } + } + + # + # Sleep until next time data needs to be polled (per DATAPOLL_FREQ_SECS constant) + # + $seconds = $nextPollTime - time; + if ( $seconds > 0 ) { + print "Sleeping: $seconds secs as at " . getDateTime(time) . " ...\n"; + sleep $seconds; + } + +} + +####################################################################### diff --git a/pvoutput.php b/pvoutput.php index d57ca10..fd6101b 100755 --- a/pvoutput.php +++ b/pvoutput.php @@ -1,4 +1,4 @@ -#!/usr/local/bin/php +#!/usr/bin/php array('16e7a916d69656e354d00461a4da1d2e40cfa4f1', '12419') ); -/* Fake command line for debugging */ -if (count($argv) < 5) { - $argv = array(null, 1.5, 1234, 230, '1206DS0163'); -} - /* Fetch command line arguments */ $fToday = floatval($argv[1]); // Wh $fPower = floatval($argv[2]); // W diff --git a/static/twilight_2012.csv b/static/twilight_2012.csv deleted file mode 100644 index 3e1b934..0000000 --- a/static/twilight_2012.csv +++ /dev/null @@ -1,367 +0,0 @@ -day,rise,noon,set -1,08:52:05,12:44:31,16:37:07 -2,08:51:58,12:44:59,16:38:12 -3,08:51:47,12:45:27,16:39:20 -4,08:51:33,12:45:54,16:40:30 -5,08:51:15,12:46:21,16:41:43 -6,08:50:54,12:46:48,16:42:59 -7,08:50:29,12:47:14,16:44:17 -8,08:50:01,12:47:40,16:45:38 -9,08:49:29,12:48:05,16:47:01 -10,08:48:55,12:48:30,16:48:26 -11,08:48:17,12:48:54,16:49:53 -12,08:47:36,12:49:18,16:51:23 -13,08:46:51,12:49:41,16:52:54 -14,08:46:04,12:50:03,16:54:28 -15,08:45:13,12:50:25,16:56:03 -16,08:44:20,12:50:46,16:57:39 -17,08:43:23,12:51:07,16:59:18 -18,08:42:24,12:51:27,17:00:58 -19,08:41:21,12:51:46,17:02:39 -20,08:40:16,12:52:04,17:04:22 -21,08:39:08,12:52:22,17:06:06 -22,08:37:58,12:52:38,17:07:51 -23,08:36:45,12:52:54,17:09:37 -24,08:35:29,12:53:10,17:11:24 -25,08:34:11,12:53:24,17:13:12 -26,08:32:50,12:53:38,17:15:01 -27,08:31:27,12:53:51,17:16:51 -28,08:30:01,12:54:03,17:18:41 -29,08:28:33,12:54:14,17:20:33 -30,08:27:03,12:54:25,17:22:24 -31,08:25:31,12:54:35,17:24:17 -32,08:23:57,12:54:43,17:26:09 -33,08:22:21,12:54:51,17:28:02 -34,08:20:42,12:54:59,17:29:56 -35,08:19:02,12:55:05,17:31:49 -36,08:17:20,12:55:11,17:33:43 -37,08:15:36,12:55:15,17:35:38 -38,08:13:50,12:55:19,17:37:32 -39,08:12:02,12:55:22,17:39:26 -40,08:10:13,12:55:25,17:41:21 -41,08:08:22,12:55:26,17:43:15 -42,08:06:30,12:55:27,17:45:10 -43,08:04:36,12:55:27,17:47:04 -44,08:02:41,12:55:26,17:48:58 -45,08:00:44,12:55:25,17:50:53 -46,07:58:46,12:55:22,17:52:47 -47,07:56:46,12:55:19,17:54:41 -48,07:54:45,12:55:15,17:56:35 -49,07:52:43,12:55:11,17:58:28 -50,07:50:40,12:55:06,18:00:22 -51,07:48:36,12:55:00,18:02:15 -52,07:46:30,12:54:53,18:04:08 -53,07:44:24,12:54:46,18:06:00 -54,07:42:16,12:54:38,18:07:53 -55,07:40:08,12:54:30,18:09:45 -56,07:37:58,12:54:21,18:11:37 -57,07:35:48,12:54:11,18:13:28 -58,07:33:36,12:54:01,18:15:20 -59,07:31:24,12:53:50,18:17:11 -60,07:29:12,12:53:39,18:19:01 -61,07:26:58,12:53:27,18:20:52 -62,07:24:44,12:53:15,18:22:42 -63,07:22:29,12:53:02,18:24:32 -64,07:20:13,12:52:49,18:26:21 -65,07:17:57,12:52:35,18:28:11 -66,07:15:40,12:52:21,18:30:00 -67,07:13:23,12:52:07,18:31:48 -68,07:11:05,12:51:52,18:33:37 -69,07:08:47,12:51:37,18:35:25 -70,07:06:28,12:51:21,18:37:13 -71,07:04:09,12:51:05,18:39:01 -72,07:01:50,12:50:49,18:40:48 -73,06:59:30,12:50:33,18:42:36 -74,06:57:10,12:50:16,18:44:23 -75,06:54:49,12:49:59,18:46:10 -76,06:52:29,12:49:42,18:47:56 -77,06:50:08,12:49:25,18:49:43 -78,06:47:47,12:49:07,18:51:29 -79,06:45:26,12:48:50,18:53:16 -80,06:43:05,12:48:32,18:55:02 -81,06:40:43,12:48:14,18:56:48 -82,06:38:22,12:47:56,18:58:33 -83,06:36:00,12:47:38,19:00:19 -84,06:33:39,12:47:20,19:02:05 -85,06:31:18,12:47:02,19:03:50 -86,07:28:56,13:46:44,20:05:35 -87,07:26:35,13:46:25,20:07:21 -88,07:24:14,13:46:07,20:09:06 -89,07:21:53,13:45:49,20:10:51 -90,07:19:32,13:45:31,20:12:36 -91,07:17:12,13:45:13,20:14:21 -92,07:14:51,13:44:56,20:16:06 -93,07:12:31,13:44:38,20:17:51 -94,07:10:11,13:44:20,20:19:36 -95,07:07:52,13:44:03,20:21:21 -96,07:05:33,13:43:46,20:23:06 -97,07:03:14,13:43:29,20:24:51 -98,07:00:56,13:43:12,20:26:36 -99,06:58:38,13:42:56,20:28:21 -100,06:56:21,13:42:39,20:30:06 -101,06:54:04,13:42:23,20:31:51 -102,06:51:48,13:42:08,20:33:36 -103,06:49:32,13:41:52,20:35:21 -104,06:47:17,13:41:37,20:37:06 -105,06:45:03,13:41:22,20:38:51 -106,06:42:49,13:41:08,20:40:36 -107,06:40:36,13:40:54,20:42:21 -108,06:38:24,13:40:40,20:44:05 -109,06:36:13,13:40:27,20:45:50 -110,06:34:02,13:40:14,20:47:35 -111,06:31:52,13:40:01,20:49:20 -112,06:29:44,13:39:49,20:51:04 -113,06:27:36,13:39:38,20:52:49 -114,06:25:29,13:39:27,20:54:33 -115,06:23:23,13:39:16,20:56:18 -116,06:21:19,13:39:06,20:58:02 -117,06:19:15,13:38:56,20:59:46 -118,06:17:13,13:38:47,21:01:30 -119,06:15:11,13:38:38,21:03:14 -120,06:13:11,13:38:30,21:04:57 -121,06:11:13,13:38:22,21:06:40 -122,06:09:15,13:38:15,21:08:23 -123,06:07:19,13:38:08,21:10:06 -124,06:05:25,13:38:02,21:11:48 -125,06:03:31,13:37:57,21:13:29 -126,06:01:40,13:37:52,21:15:11 -127,05:59:50,13:37:47,21:16:52 -128,05:58:01,13:37:44,21:18:32 -129,05:56:15,13:37:40,21:20:12 -130,05:54:30,13:37:38,21:21:51 -131,05:52:46,13:37:35,21:23:29 -132,05:51:05,13:37:34,21:25:07 -133,05:49:25,13:37:33,21:26:44 -134,05:47:48,13:37:32,21:28:20 -135,05:46:12,13:37:33,21:29:55 -136,05:44:38,13:37:33,21:31:30 -137,05:43:07,13:37:35,21:33:03 -138,05:41:37,13:37:37,21:34:35 -139,05:40:10,13:37:39,21:36:06 -140,05:38:45,13:37:42,21:37:36 -141,05:37:22,13:37:45,21:39:05 -142,05:36:02,13:37:49,21:40:32 -143,05:34:44,13:37:54,21:41:58 -144,05:33:28,13:37:59,21:43:23 -145,05:32:15,13:38:05,21:44:46 -146,05:31:05,13:38:11,21:46:07 -147,05:29:57,13:38:17,21:47:27 -148,05:28:52,13:38:24,21:48:44 -149,05:27:49,13:38:32,21:50:00 -150,05:26:50,13:38:40,21:51:14 -151,05:25:53,13:38:48,21:52:26 -152,05:24:59,13:38:57,21:53:36 -153,05:24:08,13:39:06,21:54:44 -154,05:23:19,13:39:16,21:55:50 -155,05:22:34,13:39:26,21:56:53 -156,05:21:52,13:39:36,21:57:54 -157,05:21:13,13:39:46,21:58:53 -158,05:20:37,13:39:57,21:59:49 -159,05:20:04,13:40:09,22:00:42 -160,05:19:34,13:40:20,22:01:33 -161,05:19:07,13:40:32,22:02:21 -162,05:18:44,13:40:44,22:03:07 -163,05:18:23,13:40:56,22:03:49 -164,05:18:06,13:41:08,22:04:29 -165,05:17:53,13:41:21,22:05:06 -166,05:17:42,13:41:34,22:05:40 -167,05:17:35,13:41:46,22:06:10 -168,05:17:31,13:41:59,22:06:38 -169,05:17:30,13:42:12,22:07:03 -170,05:17:32,13:42:25,22:07:24 -171,05:17:38,13:42:38,22:07:42 -172,05:17:46,13:42:51,22:07:57 -173,05:17:59,13:43:04,22:08:09 -174,05:18:14,13:43:17,22:08:18 -175,05:18:32,13:43:30,22:08:23 -176,05:18:53,13:43:43,22:08:25 -177,05:19:18,13:43:56,22:08:24 -178,05:19:45,13:44:08,22:08:19 -179,05:20:16,13:44:21,22:08:11 -180,05:20:49,13:44:33,22:08:00 -181,05:21:26,13:44:45,22:07:46 -182,05:22:05,13:44:57,22:07:28 -183,05:22:47,13:45:09,22:07:07 -184,05:23:32,13:45:20,22:06:43 -185,05:24:19,13:45:31,22:06:16 -186,05:25:09,13:45:42,22:05:45 -187,05:26:02,13:45:52,22:05:11 -188,05:26:57,13:46:02,22:04:34 -189,05:27:54,13:46:11,22:03:54 -190,05:28:54,13:46:21,22:03:11 -191,05:29:56,13:46:30,22:02:25 -192,05:31:00,13:46:38,22:01:36 -193,05:32:07,13:46:46,22:00:44 -194,05:33:15,13:46:53,21:59:49 -195,05:34:25,13:47:00,21:58:51 -196,05:35:38,13:47:07,21:57:50 -197,05:36:52,13:47:13,21:56:47 -198,05:38:08,13:47:19,21:55:41 -199,05:39:25,13:47:24,21:54:32 -200,05:40:44,13:47:28,21:53:20 -201,05:42:05,13:47:32,21:52:06 -202,05:43:27,13:47:35,21:50:50 -203,05:44:51,13:47:38,21:49:31 -204,05:46:15,13:47:41,21:48:10 -205,05:47:42,13:47:42,21:46:46 -206,05:49:09,13:47:43,21:45:20 -207,05:50:37,13:47:44,21:43:51 -208,05:52:07,13:47:44,21:42:21 -209,05:53:37,13:47:43,21:40:48 -210,05:55:08,13:47:42,21:39:14 -211,05:56:40,13:47:40,21:37:37 -212,05:58:13,13:47:37,21:35:58 -213,05:59:47,13:47:34,21:34:18 -214,06:01:21,13:47:30,21:32:35 -215,06:02:56,13:47:26,21:30:51 -216,06:04:32,13:47:21,21:29:05 -217,06:06:08,13:47:16,21:27:17 -218,06:07:45,13:47:09,21:25:28 -219,06:09:22,13:47:03,21:23:36 -220,06:11:00,13:46:55,21:21:44 -221,06:12:38,13:46:47,21:19:50 -222,06:14:16,13:46:39,21:17:54 -223,06:15:55,13:46:30,21:15:57 -224,06:17:33,13:46:20,21:13:59 -225,06:19:13,13:46:10,21:11:59 -226,06:20:52,13:45:59,21:09:58 -227,06:22:31,13:45:48,21:07:56 -228,06:24:11,13:45:36,21:05:52 -229,06:25:51,13:45:24,21:03:47 -230,06:27:31,13:45:11,21:01:42 -231,06:29:11,13:44:57,20:59:35 -232,06:30:51,13:44:43,20:57:27 -233,06:32:31,13:44:29,20:55:18 -234,06:34:11,13:44:14,20:53:08 -235,06:35:52,13:43:59,20:50:58 -236,06:37:32,13:43:43,20:48:46 -237,06:39:12,13:43:27,20:46:34 -238,06:40:52,13:43:11,20:44:20 -239,06:42:33,13:42:54,20:42:06 -240,06:44:13,13:42:37,20:39:52 -241,06:45:53,13:42:19,20:37:36 -242,06:47:33,13:42:01,20:35:20 -243,06:49:13,13:41:42,20:33:03 -244,06:50:54,13:41:24,20:30:46 -245,06:52:34,13:41:05,20:28:28 -246,06:54:14,13:40:46,20:26:10 -247,06:55:54,13:40:26,20:23:51 -248,06:57:34,13:40:06,20:21:31 -249,06:59:14,13:39:46,20:19:12 -250,07:00:54,13:39:26,20:16:51 -251,07:02:34,13:39:06,20:14:31 -252,07:04:14,13:38:45,20:12:10 -253,07:05:54,13:38:24,20:09:49 -254,07:07:34,13:38:03,20:07:27 -255,07:09:14,13:37:42,20:05:05 -256,07:10:54,13:37:21,20:02:43 -257,07:12:34,13:37:00,20:00:21 -258,07:14:14,13:36:38,19:57:59 -259,07:15:54,13:36:17,19:55:36 -260,07:17:34,13:35:56,19:53:13 -261,07:19:15,13:35:34,19:50:51 -262,07:20:55,13:35:13,19:48:28 -263,07:22:35,13:34:52,19:46:05 -264,07:24:16,13:34:30,19:43:42 -265,07:25:56,13:34:09,19:41:19 -266,07:27:37,13:33:48,19:38:57 -267,07:29:18,13:33:27,19:36:34 -268,07:30:59,13:33:06,19:34:11 -269,07:32:40,13:32:45,19:31:49 -270,07:34:22,13:32:24,19:29:27 -271,07:36:03,13:32:04,19:27:05 -272,07:37:45,13:31:44,19:24:43 -273,07:39:27,13:31:24,19:22:21 -274,07:41:09,13:31:04,19:20:00 -275,07:42:51,13:30:45,19:17:39 -276,07:44:34,13:30:26,19:15:19 -277,07:46:17,13:30:07,19:12:59 -278,07:48:00,13:29:48,19:10:39 -279,07:49:43,13:29:30,19:08:20 -280,07:51:27,13:29:12,19:06:01 -281,07:53:11,13:28:55,19:03:42 -282,07:54:55,13:28:38,19:01:25 -283,07:56:40,13:28:21,18:59:08 -284,07:58:24,13:28:05,18:56:51 -285,08:00:10,13:27:50,18:54:35 -286,08:01:55,13:27:35,18:52:20 -287,08:03:41,13:27:20,18:50:06 -288,08:05:27,13:27:06,18:47:52 -289,08:07:13,13:26:52,18:45:39 -290,08:09:00,13:26:40,18:43:27 -291,08:10:47,13:26:27,18:41:16 -292,08:12:34,13:26:15,18:39:05 -293,08:14:21,13:26:04,18:36:56 -294,08:16:09,13:25:54,18:34:48 -295,08:17:58,13:25:44,18:32:41 -296,08:19:46,13:25:35,18:30:34 -297,08:21:35,13:25:27,18:28:29 -298,08:23:24,13:25:19,18:26:25 -299,08:25:13,13:25:12,18:24:23 -300,08:27:02,13:25:06,18:22:21 -301,08:28:52,13:25:00,18:20:21 -302,07:30:42,12:24:55,17:18:22 -303,07:32:32,12:24:51,17:16:25 -304,07:34:22,12:24:48,17:14:29 -305,07:36:12,12:24:46,17:12:34 -306,07:38:02,12:24:44,17:10:41 -307,07:39:53,12:24:43,17:08:50 -308,07:41:43,12:24:43,17:07:00 -309,07:43:34,12:24:44,17:05:12 -310,07:45:24,12:24:46,17:03:26 -311,07:47:14,12:24:49,17:01:42 -312,07:49:04,12:24:52,16:59:59 -313,07:50:54,12:24:56,16:58:18 -314,07:52:44,12:25:02,16:56:40 -315,07:54:33,12:25:08,16:55:03 -316,07:56:22,12:25:14,16:53:28 -317,07:58:11,12:25:22,16:51:56 -318,07:59:59,12:25:31,16:50:26 -319,08:01:47,12:25:40,16:48:58 -320,08:03:34,12:25:50,16:47:32 -321,08:05:20,12:26:02,16:46:08 -322,08:07:06,12:26:14,16:44:47 -323,08:08:51,12:26:26,16:43:29 -324,08:10:35,12:26:40,16:42:13 -325,08:12:18,12:26:55,16:41:00 -326,08:14:00,12:27:10,16:39:49 -327,08:15:41,12:27:26,16:38:41 -328,08:17:21,12:27:43,16:37:36 -329,08:18:59,12:28:00,16:36:33 -330,08:20:37,12:28:19,16:35:34 -331,08:22:12,12:28:38,16:34:37 -332,08:23:46,12:28:58,16:33:44 -333,08:25:19,12:29:18,16:32:53 -334,08:26:50,12:29:39,16:32:06 -335,08:28:19,12:30:01,16:31:22 -336,08:29:46,12:30:24,16:30:41 -337,08:31:11,12:30:47,16:30:03 -338,08:32:34,12:31:11,16:29:28 -339,08:33:55,12:31:35,16:28:57 -340,08:35:13,12:32:00,16:28:29 -341,08:36:30,12:32:25,16:28:05 -342,08:37:43,12:32:51,16:27:44 -343,08:38:55,12:33:18,16:27:27 -344,08:40:03,12:33:45,16:27:13 -345,08:41:09,12:34:12,16:27:02 -346,08:42:13,12:34:39,16:26:55 -347,08:43:13,12:35:07,16:26:52 -348,08:44:11,12:35:36,16:26:52 -349,08:45:05,12:36:04,16:26:56 -350,08:45:56,12:36:33,16:27:03 -351,08:46:45,12:37:02,16:27:14 -352,08:47:30,12:37:31,16:27:29 -353,08:48:12,12:38:01,16:27:47 -354,08:48:50,12:38:30,16:28:08 -355,08:49:26,12:39:00,16:28:33 -356,08:49:58,12:39:30,16:29:02 -357,08:50:26,12:40:00,16:29:34 -358,08:50:51,12:40:29,16:30:10 -359,08:51:13,12:40:59,16:30:49 -360,08:51:31,12:41:29,16:31:31 -361,08:51:46,12:41:58,16:32:16 -362,08:51:57,12:42:28,16:33:05 -363,08:52:04,12:42:57,16:33:57 -364,08:52:09,12:43:26,16:34:52 -365,08:52:09,12:43:55,16:35:51 -366,08:52:06,12:44:23,16:36:52 diff --git a/static/twilight_2013.csv b/static/twilight_2013.csv deleted file mode 100644 index a7f859a..0000000 --- a/static/twilight_2013.csv +++ /dev/null @@ -1,367 +0,0 @@ -day,rise,noon,set -1,08:51:59,12:44:52,16:37:56 -2,08:51:49,12:45:20,16:39:03 -3,08:51:36,12:45:47,16:40:13 -4,08:51:19,12:46:15,16:41:25 -5,08:50:58,12:46:41,16:42:40 -6,08:50:35,12:47:08,16:43:58 -7,08:50:07,12:47:34,16:45:18 -8,08:49:37,12:47:59,16:46:41 -9,08:49:03,12:48:24,16:48:05 -10,08:48:26,12:48:48,16:49:32 -11,08:47:45,12:49:12,16:51:01 -12,08:47:02,12:49:35,16:52:32 -13,08:46:15,12:49:58,16:54:05 -14,08:45:25,12:50:20,16:55:39 -15,08:44:32,12:50:41,16:57:16 -16,08:43:37,12:51:02,16:58:54 -17,08:42:38,12:51:22,17:00:33 -18,08:41:36,12:51:41,17:02:14 -19,08:40:32,12:51:59,17:03:57 -20,08:39:25,12:52:17,17:05:40 -21,08:38:15,12:52:34,17:07:25 -22,08:37:02,12:52:50,17:09:11 -23,08:35:47,12:53:06,17:10:58 -24,08:34:29,12:53:21,17:12:46 -25,08:33:09,12:53:35,17:14:35 -26,08:31:47,12:53:48,17:16:24 -27,08:30:22,12:54:00,17:18:15 -28,08:28:55,12:54:12,17:20:06 -29,08:27:25,12:54:22,17:21:57 -30,08:25:53,12:54:32,17:23:49 -31,08:24:20,12:54:41,17:25:42 -32,08:22:44,12:54:49,17:27:35 -33,08:21:06,12:54:57,17:29:28 -34,08:19:26,12:55:03,17:31:22 -35,08:17:44,12:55:09,17:33:16 -36,08:16:01,12:55:14,17:35:10 -37,08:14:15,12:55:18,17:37:04 -38,08:12:28,12:55:22,17:38:58 -39,08:10:40,12:55:24,17:40:53 -40,08:08:49,12:55:26,17:42:47 -41,08:06:57,12:55:27,17:44:42 -42,08:05:04,12:55:27,17:46:36 -43,08:03:09,12:55:26,17:48:31 -44,08:01:12,12:55:25,17:50:25 -45,07:59:14,12:55:23,17:52:19 -46,07:57:15,12:55:20,17:54:13 -47,07:55:15,12:55:16,17:56:07 -48,07:53:13,12:55:12,17:58:00 -49,07:51:10,12:55:07,17:59:54 -50,07:49:06,12:55:01,18:01:47 -51,07:47:01,12:54:55,18:03:40 -52,07:44:54,12:54:48,18:05:33 -53,07:42:47,12:54:40,18:07:25 -54,07:40:39,12:54:32,18:09:18 -55,07:38:29,12:54:23,18:11:09 -56,07:36:19,12:54:14,18:13:01 -57,07:34:08,12:54:04,18:14:52 -58,07:31:56,12:53:53,18:16:44 -59,07:29:44,12:53:42,18:18:34 -60,07:27:30,12:53:30,18:20:25 -61,07:25:16,12:53:18,18:22:15 -62,07:23:01,12:53:05,18:24:05 -63,07:20:46,12:52:52,18:25:55 -64,07:18:30,12:52:39,18:27:44 -65,07:16:13,12:52:25,18:29:33 -66,07:13:56,12:52:10,18:31:22 -67,07:11:38,12:51:56,18:33:10 -68,07:09:20,12:51:40,18:34:59 -69,07:07:02,12:51:25,18:36:47 -70,07:04:43,12:51:09,18:38:35 -71,07:02:23,12:50:53,18:40:22 -72,07:00:04,12:50:37,18:42:10 -73,06:57:44,12:50:20,18:43:57 -74,06:55:23,12:50:03,18:45:44 -75,06:53:03,12:49:46,18:47:30 -76,06:50:42,12:49:29,18:49:17 -77,06:48:21,12:49:11,18:51:03 -78,06:46:00,12:48:54,18:52:50 -79,06:43:39,12:48:36,18:54:36 -80,06:41:18,12:48:18,18:56:22 -81,06:38:56,12:48:00,18:58:08 -82,06:36:35,12:47:42,18:59:53 -83,06:34:13,12:47:24,19:01:39 -84,06:31:52,12:47:06,19:03:24 -85,06:29:31,12:46:48,19:05:10 -86,06:27:09,12:46:30,19:06:55 -87,06:24:48,12:46:12,19:08:40 -88,06:22:27,12:45:54,19:10:25 -89,06:20:06,12:45:36,19:12:11 -90,06:17:46,12:45:18,19:13:56 -91,07:15:25,13:45:00,20:15:41 -92,07:13:05,13:44:42,20:17:26 -93,07:10:45,13:44:25,20:19:11 -94,07:08:26,13:44:07,20:20:56 -95,07:06:07,13:43:50,20:22:41 -96,07:03:48,13:43:33,20:24:26 -97,07:01:30,13:43:16,20:26:11 -98,06:59:12,13:43:00,20:27:55 -99,06:56:54,13:42:43,20:29:40 -100,06:54:37,13:42:27,20:31:25 -101,06:52:21,13:42:11,20:33:10 -102,06:50:05,13:41:56,20:34:55 -103,06:47:50,13:41:41,20:36:40 -104,06:45:36,13:41:26,20:38:25 -105,06:43:22,13:41:11,20:40:10 -106,06:41:09,13:40:57,20:41:55 -107,06:38:56,13:40:43,20:43:40 -108,06:36:45,13:40:30,20:45:25 -109,06:34:34,13:40:17,20:47:09 -110,06:32:24,13:40:04,20:48:54 -111,06:30:15,13:39:52,20:50:39 -112,06:28:07,13:39:41,20:52:23 -113,06:26:00,13:39:29,20:54:08 -114,06:23:54,13:39:18,20:55:52 -115,06:21:49,13:39:08,20:57:37 -116,06:19:45,13:38:58,20:59:21 -117,06:17:42,13:38:49,21:01:05 -118,06:15:41,13:38:40,21:02:48 -119,06:13:41,13:38:32,21:04:32 -120,06:11:42,13:38:24,21:06:15 -121,06:09:44,13:38:17,21:07:58 -122,06:07:47,13:38:10,21:09:41 -123,06:05:53,13:38:04,21:11:23 -124,06:03:59,13:37:58,21:13:05 -125,06:02:07,13:37:53,21:14:46 -126,06:00:17,13:37:48,21:16:27 -127,05:58:28,13:37:45,21:18:07 -128,05:56:41,13:37:41,21:19:47 -129,05:54:55,13:37:38,21:21:27 -130,05:53:12,13:37:36,21:23:05 -131,05:51:30,13:37:34,21:24:43 -132,05:49:50,13:37:33,21:26:20 -133,05:48:11,13:37:33,21:27:57 -134,05:46:35,13:37:33,21:29:32 -135,05:45:01,13:37:33,21:31:07 -136,05:43:29,13:37:34,21:32:40 -137,05:41:59,13:37:36,21:34:13 -138,05:40:31,13:37:38,21:35:44 -139,05:39:06,13:37:41,21:37:14 -140,05:37:42,13:37:45,21:38:43 -141,05:36:22,13:37:48,21:40:11 -142,05:35:03,13:37:53,21:41:37 -143,05:33:47,13:37:58,21:43:02 -144,05:32:33,13:38:03,21:44:25 -145,05:31:22,13:38:09,21:45:47 -146,05:30:14,13:38:16,21:47:07 -147,05:29:08,13:38:23,21:48:25 -148,05:28:05,13:38:30,21:49:42 -149,05:27:04,13:38:38,21:50:56 -150,05:26:07,13:38:46,21:52:09 -151,05:25:12,13:38:55,21:53:20 -152,05:24:20,13:39:04,21:54:28 -153,05:23:31,13:39:13,21:55:34 -154,05:22:45,13:39:23,21:56:38 -155,05:22:02,13:39:33,21:57:40 -156,05:21:22,13:39:44,21:58:39 -157,05:20:46,13:39:55,21:59:35 -158,05:20:12,13:40:06,22:00:29 -159,05:19:41,13:40:17,22:01:21 -160,05:19:14,13:40:29,22:02:10 -161,05:18:50,13:40:41,22:02:56 -162,05:18:29,13:40:53,22:03:39 -163,05:18:11,13:41:05,22:04:19 -164,05:17:56,13:41:18,22:04:57 -165,05:17:45,13:41:31,22:05:31 -166,05:17:37,13:41:43,22:06:03 -167,05:17:32,13:41:56,22:06:31 -168,05:17:30,13:42:09,22:06:57 -169,05:17:32,13:42:22,22:07:19 -170,05:17:37,13:42:35,22:07:38 -171,05:17:45,13:42:48,22:07:54 -172,05:17:56,13:43:01,22:08:06 -173,05:18:10,13:43:14,22:08:16 -174,05:18:28,13:43:27,22:08:22 -175,05:18:48,13:43:40,22:08:25 -176,05:19:12,13:43:53,22:08:24 -177,05:19:39,13:44:06,22:08:20 -178,05:20:09,13:44:18,22:08:13 -179,05:20:42,13:44:30,22:08:03 -180,05:21:17,13:44:42,22:07:49 -181,05:21:56,13:44:54,22:07:33 -182,05:22:37,13:45:06,22:07:12 -183,05:23:21,13:45:17,22:06:49 -184,05:24:08,13:45:28,22:06:22 -185,05:24:57,13:45:39,22:05:52 -186,05:25:49,13:45:50,22:05:19 -187,05:26:44,13:46:00,22:04:43 -188,05:27:40,13:46:09,22:04:04 -189,05:28:40,13:46:19,22:03:22 -190,05:29:41,13:46:28,22:02:36 -191,05:30:45,13:46:36,22:01:48 -192,05:31:51,13:46:44,22:00:57 -193,05:32:59,13:46:52,22:00:02 -194,05:34:09,13:46:59,21:59:05 -195,05:35:20,13:47:06,21:58:05 -196,05:36:34,13:47:12,21:57:02 -197,05:37:50,13:47:17,21:55:57 -198,05:39:07,13:47:23,21:54:49 -199,05:40:25,13:47:27,21:53:38 -200,05:41:46,13:47:31,21:52:24 -201,05:43:08,13:47:35,21:51:08 -202,05:44:31,13:47:38,21:49:50 -203,05:45:55,13:47:40,21:48:29 -204,05:47:21,13:47:42,21:47:06 -205,05:48:48,13:47:43,21:45:41 -206,05:50:16,13:47:44,21:44:13 -207,05:51:45,13:47:44,21:42:43 -208,05:53:15,13:47:43,21:41:11 -209,05:54:46,13:47:42,21:39:37 -210,05:56:18,13:47:40,21:38:00 -211,05:57:51,13:47:38,21:36:22 -212,05:59:25,13:47:35,21:34:42 -213,06:00:59,13:47:31,21:33:00 -214,06:02:34,13:47:27,21:31:16 -215,06:04:09,13:47:22,21:29:31 -216,06:05:45,13:47:17,21:27:43 -217,06:07:22,13:47:11,21:25:54 -218,06:08:59,13:47:04,21:24:03 -219,06:10:36,13:46:57,21:22:11 -220,06:12:14,13:46:49,21:20:17 -221,06:13:52,13:46:41,21:18:22 -222,06:15:31,13:46:32,21:16:25 -223,06:17:10,13:46:23,21:14:27 -224,06:18:49,13:46:12,21:12:28 -225,06:20:28,13:46:02,21:10:27 -226,06:22:07,13:45:51,21:08:25 -227,06:23:47,13:45:39,21:06:22 -228,06:25:27,13:45:27,21:04:18 -229,06:27:07,13:45:14,21:02:12 -230,06:28:47,13:45:01,21:00:06 -231,06:30:27,13:44:47,20:57:58 -232,06:32:07,13:44:33,20:55:49 -233,06:33:47,13:44:18,20:53:40 -234,06:35:27,13:44:03,20:51:29 -235,06:37:08,13:43:47,20:49:18 -236,06:38:48,13:43:31,20:47:06 -237,06:40:28,13:43:15,20:44:53 -238,06:42:08,13:42:58,20:42:39 -239,06:43:49,13:42:41,20:40:24 -240,06:45:29,13:42:23,20:38:09 -241,06:47:09,13:42:05,20:35:53 -242,06:48:49,13:41:47,20:33:37 -243,06:50:29,13:41:28,20:31:19 -244,06:52:10,13:41:09,20:29:02 -245,06:53:50,13:40:50,20:26:43 -246,06:55:30,13:40:31,20:24:25 -247,06:57:10,13:40:11,20:22:05 -248,06:58:50,13:39:51,20:19:46 -249,07:00:30,13:39:31,20:17:26 -250,07:02:10,13:39:11,20:15:05 -251,07:03:50,13:38:50,20:12:44 -252,07:05:30,13:38:29,20:10:23 -253,07:07:10,13:38:08,20:08:01 -254,07:08:50,13:37:47,20:05:40 -255,07:10:30,13:37:26,20:03:18 -256,07:12:10,13:37:05,20:00:56 -257,07:13:50,13:36:44,19:58:33 -258,07:15:30,13:36:22,19:56:11 -259,07:17:10,13:36:01,19:53:48 -260,07:18:50,13:35:40,19:51:25 -261,07:20:31,13:35:18,19:49:02 -262,07:22:11,13:34:57,19:46:40 -263,07:23:51,13:34:35,19:44:17 -264,07:25:32,13:34:14,19:41:54 -265,07:27:13,13:33:53,19:39:31 -266,07:28:54,13:33:32,19:37:09 -267,07:30:35,13:33:11,19:34:46 -268,07:32:16,13:32:50,19:32:24 -269,07:33:57,13:32:29,19:30:01 -270,07:35:39,13:32:09,19:27:39 -271,07:37:20,13:31:49,19:25:17 -272,07:39:02,13:31:29,19:22:56 -273,07:40:44,13:31:09,19:20:35 -274,07:42:27,13:30:49,19:18:14 -275,07:44:09,13:30:30,19:15:53 -276,07:45:52,13:30:11,19:13:33 -277,07:47:35,13:29:53,19:11:13 -278,07:49:18,13:29:34,19:08:53 -279,07:51:02,13:29:17,19:06:35 -280,07:52:46,13:28:59,19:04:16 -281,07:54:30,13:28:42,19:01:58 -282,07:56:14,13:28:25,18:59:41 -283,07:57:59,13:28:09,18:57:24 -284,07:59:44,13:27:53,18:55:08 -285,08:01:29,13:27:38,18:52:53 -286,08:03:15,13:27:24,18:50:38 -287,08:05:01,13:27:09,18:48:24 -288,08:06:47,13:26:56,18:46:11 -289,08:08:34,13:26:43,18:43:59 -290,08:10:21,13:26:30,18:41:48 -291,08:12:08,13:26:18,18:39:37 -292,08:13:55,13:26:07,18:37:28 -293,08:15:43,13:25:56,18:35:19 -294,08:17:31,13:25:46,18:33:11 -295,08:19:19,13:25:37,18:31:05 -296,08:21:08,13:25:29,18:29:00 -297,08:22:57,13:25:21,18:26:55 -298,08:24:46,13:25:13,18:24:52 -299,08:26:35,13:25:07,18:22:51 -300,07:28:25,12:25:01,17:20:50 -301,07:30:15,12:24:56,17:18:51 -302,07:32:05,12:24:52,17:16:53 -303,07:33:55,12:24:49,17:14:57 -304,07:35:45,12:24:46,17:13:02 -305,07:37:35,12:24:44,17:11:09 -306,07:39:26,12:24:43,17:09:17 -307,07:41:16,12:24:43,17:07:27 -308,07:43:07,12:24:44,17:05:39 -309,07:44:57,12:24:46,17:03:52 -310,07:46:47,12:24:48,17:02:07 -311,07:48:37,12:24:51,17:00:24 -312,07:50:27,12:24:55,16:58:43 -313,07:52:17,12:25:00,16:57:04 -314,07:54:06,12:25:06,16:55:27 -315,07:55:56,12:25:13,16:53:51 -316,07:57:44,12:25:20,16:52:18 -317,07:59:33,12:25:29,16:50:48 -318,08:01:20,12:25:38,16:49:19 -319,08:03:08,12:25:48,16:47:53 -320,08:04:54,12:25:59,16:46:29 -321,08:06:40,12:26:11,16:45:07 -322,08:08:25,12:26:23,16:43:48 -323,08:10:10,12:26:37,16:42:31 -324,08:11:53,12:26:51,16:41:17 -325,08:13:35,12:27:06,16:40:06 -326,08:15:16,12:27:22,16:38:58 -327,08:16:56,12:27:39,16:37:52 -328,08:18:35,12:27:56,16:36:49 -329,08:20:13,12:28:14,16:35:48 -330,08:21:49,12:28:33,16:34:51 -331,08:23:23,12:28:53,16:33:57 -332,08:24:56,12:29:13,16:33:06 -333,08:26:27,12:29:34,16:32:17 -334,08:27:57,12:29:56,16:31:32 -335,08:29:24,12:30:18,16:30:51 -336,08:30:50,12:30:41,16:30:12 -337,08:32:14,12:31:05,16:29:37 -338,08:33:35,12:31:29,16:29:05 -339,08:34:54,12:31:54,16:28:36 -340,08:36:11,12:32:19,16:28:11 -341,08:37:25,12:32:45,16:27:49 -342,08:38:37,12:33:11,16:27:31 -343,08:39:47,12:33:38,16:27:16 -344,08:40:53,12:34:05,16:27:05 -345,08:41:57,12:34:33,16:26:57 -346,08:42:58,12:35:00,16:26:52 -347,08:43:56,12:35:29,16:26:52 -348,08:44:52,12:35:57,16:26:55 -349,08:45:44,12:36:26,16:27:01 -350,08:46:33,12:36:55,16:27:11 -351,08:47:19,12:37:24,16:27:25 -352,08:48:01,12:37:54,16:27:42 -353,08:48:41,12:38:23,16:28:03 -354,08:49:17,12:38:53,16:28:27 -355,08:49:50,12:39:23,16:28:55 -356,08:50:19,12:39:52,16:29:26 -357,08:50:45,12:40:22,16:30:01 -358,08:51:08,12:40:52,16:30:39 -359,08:51:27,12:41:21,16:31:20 -360,08:51:42,12:41:51,16:32:05 -361,08:51:54,12:42:21,16:32:53 -362,08:52:03,12:42:50,16:33:45 -363,08:52:07,12:43:19,16:34:39 -364,08:52:09,12:43:48,16:35:36 -365,08:52:07,12:44:16,16:36:37 -366,08:51:59,12:44:52,16:37:56 diff --git a/static/twilight_2014.csv b/static/twilight_2014.csv deleted file mode 100644 index a13f769..0000000 --- a/static/twilight_2014.csv +++ /dev/null @@ -1,367 +0,0 @@ -day,rise,noon,set -1,08:52:01,12:44:45,16:37:40 -2,08:51:52,12:45:13,16:38:47 -3,08:51:39,12:45:40,16:39:56 -4,08:51:23,12:46:08,16:41:08 -5,08:51:03,12:46:35,16:42:22 -6,08:50:40,12:47:01,16:43:39 -7,08:50:14,12:47:27,16:44:59 -8,08:49:44,12:47:53,16:46:20 -9,08:49:11,12:48:18,16:47:45 -10,08:48:35,12:48:42,16:49:11 -11,08:47:55,12:49:06,16:50:39 -12,08:47:12,12:49:29,16:52:10 -13,08:46:26,12:49:52,16:53:42 -14,08:45:37,12:50:14,16:55:16 -15,08:44:45,12:50:36,16:56:52 -16,08:43:50,12:50:57,16:58:30 -17,08:42:52,12:51:17,17:00:09 -18,08:41:51,12:51:36,17:01:50 -19,08:40:47,12:51:55,17:03:32 -20,08:39:41,12:52:13,17:05:15 -21,08:38:32,12:52:30,17:06:59 -22,08:37:20,12:52:46,17:08:45 -23,08:36:05,12:53:02,17:10:32 -24,08:34:48,12:53:17,17:12:20 -25,08:33:29,12:53:31,17:14:08 -26,08:32:07,12:53:44,17:15:58 -27,08:30:42,12:53:57,17:17:48 -28,08:29:16,12:54:09,17:19:38 -29,08:27:47,12:54:20,17:21:30 -30,08:26:16,12:54:30,17:23:22 -31,08:24:42,12:54:39,17:25:14 -32,08:23:07,12:54:47,17:27:07 -33,08:21:30,12:54:55,17:29:01 -34,08:19:50,12:55:02,17:30:54 -35,08:18:09,12:55:08,17:32:48 -36,08:16:26,12:55:13,17:34:42 -37,08:14:41,12:55:17,17:36:36 -38,08:12:54,12:55:21,17:38:31 -39,08:11:06,12:55:23,17:40:25 -40,08:09:16,12:55:25,17:42:19 -41,08:07:24,12:55:26,17:44:14 -42,08:05:31,12:55:27,17:46:08 -43,08:03:37,12:55:26,17:48:03 -44,08:01:40,12:55:25,17:49:57 -45,07:59:43,12:55:23,17:51:51 -46,07:57:44,12:55:21,17:53:45 -47,07:55:44,12:55:17,17:55:39 -48,07:53:42,12:55:13,17:57:33 -49,07:51:40,12:55:08,17:59:26 -50,07:49:36,12:55:03,18:01:20 -51,07:47:31,12:54:56,18:03:13 -52,07:45:25,12:54:50,18:05:05 -53,07:43:18,12:54:42,18:06:58 -54,07:41:10,12:54:34,18:08:50 -55,07:39:01,12:54:25,18:10:42 -56,07:36:51,12:54:16,18:12:34 -57,07:34:40,12:54:06,18:14:25 -58,07:32:28,12:53:55,18:16:16 -59,07:30:16,12:53:44,18:18:07 -60,07:28:03,12:53:33,18:19:58 -61,07:25:49,12:53:21,18:21:48 -62,07:23:34,12:53:08,18:23:38 -63,07:21:19,12:52:55,18:25:28 -64,07:19:03,12:52:42,18:27:17 -65,07:16:47,12:52:28,18:29:06 -66,07:14:29,12:52:14,18:30:55 -67,07:12:12,12:51:59,18:32:44 -68,07:09:54,12:51:44,18:34:32 -69,07:07:35,12:51:29,18:36:20 -70,07:05:17,12:51:13,18:38:08 -71,07:02:57,12:50:57,18:39:56 -72,07:00:38,12:50:41,18:41:43 -73,06:58:18,12:50:24,18:43:31 -74,06:55:58,12:50:07,18:45:18 -75,06:53:37,12:49:50,18:47:04 -76,06:51:16,12:49:33,18:48:51 -77,06:48:55,12:49:16,18:50:37 -78,06:46:34,12:48:58,18:52:24 -79,06:44:13,12:48:40,18:54:10 -80,06:41:52,12:48:23,18:55:56 -81,06:39:31,12:48:05,18:57:42 -82,06:37:09,12:47:47,18:59:27 -83,06:34:48,12:47:29,19:01:13 -84,06:32:26,12:47:10,19:02:59 -85,06:30:05,12:46:52,19:04:44 -86,06:27:44,12:46:34,19:06:29 -87,06:25:23,12:46:16,19:08:15 -88,06:23:02,12:45:58,19:10:00 -89,06:20:41,12:45:40,19:11:45 -90,07:18:20,13:45:22,20:13:30 -91,07:16:00,13:45:04,20:15:15 -92,07:13:39,13:44:47,20:17:00 -93,07:11:19,13:44:29,20:18:45 -94,07:09:00,13:44:11,20:20:30 -95,07:06:41,13:43:54,20:22:15 -96,07:04:22,13:43:37,20:24:00 -97,07:02:03,13:43:20,20:25:45 -98,06:59:45,13:43:04,20:27:30 -99,06:57:28,13:42:47,20:29:15 -100,06:55:11,13:42:31,20:31:00 -101,06:52:54,13:42:15,20:32:45 -102,06:50:38,13:42:00,20:34:30 -103,06:48:23,13:41:44,20:36:15 -104,06:46:08,13:41:29,20:38:00 -105,06:43:54,13:41:15,20:39:44 -106,06:41:41,13:41:01,20:41:29 -107,06:39:29,13:40:47,20:43:14 -108,06:37:17,13:40:33,20:44:59 -109,06:35:06,13:40:20,20:46:44 -110,06:32:56,13:40:07,20:48:29 -111,06:30:47,13:39:55,20:50:13 -112,06:28:38,13:39:43,20:51:58 -113,06:26:31,13:39:32,20:53:43 -114,06:24:25,13:39:21,20:55:27 -115,06:22:19,13:39:11,20:57:11 -116,06:20:15,13:39:01,20:58:55 -117,06:18:12,13:38:51,21:00:39 -118,06:16:11,13:38:42,21:02:23 -119,06:14:10,13:38:34,21:04:07 -120,06:12:11,13:38:26,21:05:50 -121,06:10:13,13:38:18,21:07:33 -122,06:08:16,13:38:12,21:09:16 -123,06:06:21,13:38:05,21:10:58 -124,06:04:27,13:38:00,21:12:40 -125,06:02:34,13:37:54,21:14:21 -126,06:00:44,13:37:50,21:16:02 -127,05:58:54,13:37:46,21:17:43 -128,05:57:07,13:37:42,21:19:23 -129,05:55:21,13:37:39,21:21:02 -130,05:53:37,13:37:37,21:22:41 -131,05:51:55,13:37:35,21:24:19 -132,05:50:14,13:37:34,21:25:57 -133,05:48:35,13:37:33,21:27:33 -134,05:46:59,13:37:33,21:29:09 -135,05:45:24,13:37:33,21:30:44 -136,05:43:52,13:37:34,21:32:18 -137,05:42:21,13:37:36,21:33:50 -138,05:40:53,13:37:38,21:35:22 -139,05:39:27,13:37:41,21:36:53 -140,05:38:03,13:37:44,21:38:22 -141,05:36:41,13:37:48,21:39:50 -142,05:35:22,13:37:52,21:41:16 -143,05:34:05,13:37:57,21:42:42 -144,05:32:51,13:38:02,21:44:05 -145,05:31:40,13:38:08,21:45:27 -146,05:30:30,13:38:14,21:46:48 -147,05:29:24,13:38:21,21:48:06 -148,05:28:20,13:38:28,21:49:23 -149,05:27:19,13:38:36,21:50:38 -150,05:26:21,13:38:44,21:51:51 -151,05:25:26,13:38:53,21:53:02 -152,05:24:33,13:39:02,21:54:11 -153,05:23:43,13:39:11,21:55:18 -154,05:22:57,13:39:21,21:56:23 -155,05:22:13,13:39:31,21:57:25 -156,05:21:32,13:39:42,21:58:24 -157,05:20:55,13:39:52,21:59:22 -158,05:20:20,13:40:03,22:00:16 -159,05:19:49,13:40:15,22:01:09 -160,05:19:21,13:40:26,22:01:58 -161,05:18:56,13:40:38,22:02:45 -162,05:18:34,13:40:50,22:03:29 -163,05:18:15,13:41:03,22:04:10 -164,05:18:00,13:41:15,22:04:48 -165,05:17:48,13:41:28,22:05:23 -166,05:17:39,13:41:40,22:05:55 -167,05:17:33,13:41:53,22:06:25 -168,05:17:31,13:42:06,22:06:51 -169,05:17:31,13:42:19,22:07:14 -170,05:17:36,13:42:32,22:07:33 -171,05:17:43,13:42:45,22:07:50 -172,05:17:53,13:42:58,22:08:03 -173,05:18:07,13:43:11,22:08:14 -174,05:18:24,13:43:24,22:08:21 -175,05:18:44,13:43:37,22:08:24 -176,05:19:07,13:43:50,22:08:24 -177,05:19:33,13:44:03,22:08:21 -178,05:20:02,13:44:15,22:08:15 -179,05:20:34,13:44:28,22:08:06 -180,05:21:09,13:44:40,22:07:53 -181,05:21:47,13:44:52,22:07:37 -182,05:22:27,13:45:03,22:07:17 -183,05:23:11,13:45:15,22:06:55 -184,05:23:57,13:45:26,22:06:29 -185,05:24:45,13:45:37,22:06:00 -186,05:25:37,13:45:47,22:05:28 -187,05:26:31,13:45:57,22:04:52 -188,05:27:27,13:46:07,22:04:14 -189,05:28:26,13:46:17,22:03:32 -190,05:29:26,13:46:26,22:02:47 -191,05:30:30,13:46:34,22:02:00 -192,05:31:35,13:46:42,22:01:09 -193,05:32:42,13:46:50,22:00:16 -194,05:33:52,13:46:57,21:59:19 -195,05:35:03,13:47:04,21:58:20 -196,05:36:16,13:47:10,21:57:18 -197,05:37:31,13:47:16,21:56:13 -198,05:38:48,13:47:22,21:55:05 -199,05:40:07,13:47:26,21:53:55 -200,05:41:26,13:47:30,21:52:42 -201,05:42:48,13:47:34,21:51:27 -202,05:44:11,13:47:37,21:50:09 -203,05:45:35,13:47:40,21:48:49 -204,05:47:00,13:47:42,21:47:26 -205,05:48:27,13:47:43,21:46:02 -206,05:49:55,13:47:44,21:44:34 -207,05:51:24,13:47:44,21:43:05 -208,05:52:54,13:47:44,21:41:33 -209,05:54:24,13:47:43,21:40:00 -210,05:55:56,13:47:41,21:38:24 -211,05:57:29,13:47:39,21:36:46 -212,05:59:02,13:47:36,21:35:07 -213,06:00:36,13:47:32,21:33:25 -214,06:02:11,13:47:28,21:31:42 -215,06:03:46,13:47:24,21:29:56 -216,06:05:22,13:47:18,21:28:09 -217,06:06:59,13:47:13,21:26:21 -218,06:08:35,13:47:06,21:24:30 -219,06:10:13,13:46:59,21:22:39 -220,06:11:51,13:46:51,21:20:45 -221,06:13:29,13:46:43,21:18:50 -222,06:15:07,13:46:34,21:16:54 -223,06:16:46,13:46:25,21:14:56 -224,06:18:25,13:46:15,21:12:57 -225,06:20:04,13:46:05,21:10:57 -226,06:21:43,13:45:53,21:08:55 -227,06:23:23,13:45:42,21:06:52 -228,06:25:03,13:45:30,21:04:48 -229,06:26:43,13:45:17,21:02:43 -230,06:28:23,13:45:04,21:00:37 -231,06:30:03,13:44:50,20:58:29 -232,06:31:43,13:44:36,20:56:21 -233,06:33:23,13:44:22,20:54:11 -234,06:35:03,13:44:07,20:52:01 -235,06:36:43,13:43:51,20:49:50 -236,06:38:24,13:43:35,20:47:38 -237,06:40:04,13:43:19,20:45:25 -238,06:41:44,13:43:02,20:43:12 -239,06:43:24,13:42:45,20:40:57 -240,06:45:05,13:42:28,20:38:42 -241,06:46:45,13:42:10,20:36:26 -242,06:48:25,13:41:52,20:34:10 -243,06:50:05,13:41:33,20:31:53 -244,06:51:45,13:41:14,20:29:35 -245,06:53:25,13:40:55,20:27:17 -246,06:55:05,13:40:36,20:24:58 -247,06:56:45,13:40:16,20:22:39 -248,06:58:25,13:39:56,20:20:20 -249,07:00:05,13:39:36,20:18:00 -250,07:01:45,13:39:16,20:15:39 -251,07:03:25,13:38:55,20:13:18 -252,07:05:05,13:38:34,20:10:57 -253,07:06:45,13:38:13,20:08:36 -254,07:08:25,13:37:52,20:06:14 -255,07:10:05,13:37:31,20:03:52 -256,07:11:45,13:37:10,20:01:30 -257,07:13:25,13:36:49,19:59:08 -258,07:15:06,13:36:28,19:56:45 -259,07:16:46,13:36:06,19:54:23 -260,07:18:26,13:35:45,19:52:00 -261,07:20:06,13:35:23,19:49:37 -262,07:21:47,13:35:02,19:47:14 -263,07:23:27,13:34:41,19:44:52 -264,07:25:08,13:34:19,19:42:29 -265,07:26:48,13:33:58,19:40:06 -266,07:28:29,13:33:37,19:37:43 -267,07:30:10,13:33:16,19:35:21 -268,07:31:51,13:32:55,19:32:58 -269,07:33:32,13:32:34,19:30:36 -270,07:35:14,13:32:14,19:28:14 -271,07:36:55,13:31:54,19:25:52 -272,07:38:37,13:31:34,19:23:30 -273,07:40:19,13:31:14,19:21:09 -274,07:42:02,13:30:54,19:18:48 -275,07:43:44,13:30:35,19:16:27 -276,07:45:27,13:30:16,19:14:07 -277,07:47:10,13:29:57,19:11:47 -278,07:48:53,13:29:39,19:09:27 -279,07:50:37,13:29:21,19:07:08 -280,07:52:20,13:29:03,19:04:50 -281,07:54:04,13:28:46,19:02:32 -282,07:55:49,13:28:29,19:00:14 -283,07:57:33,13:28:13,18:57:58 -284,07:59:18,13:27:57,18:55:41 -285,08:01:03,13:27:42,18:53:26 -286,08:02:49,13:27:27,18:51:11 -287,08:04:35,13:27:13,18:48:57 -288,08:06:21,13:26:59,18:46:44 -289,08:08:08,13:26:46,18:44:31 -290,08:09:54,13:26:33,18:42:20 -291,08:11:41,13:26:21,18:40:09 -292,08:13:29,13:26:10,18:37:59 -293,08:15:17,13:25:59,18:35:50 -294,08:17:05,13:25:49,18:33:43 -295,08:18:53,13:25:39,18:31:36 -296,08:20:41,13:25:31,18:29:30 -297,08:22:30,13:25:22,18:27:26 -298,08:24:19,13:25:15,18:25:22 -299,07:26:09,12:25:08,17:23:20 -300,07:27:58,12:25:03,17:21:20 -301,07:29:48,12:24:57,17:19:20 -302,07:31:38,12:24:53,17:17:22 -303,07:33:28,12:24:50,17:15:25 -304,07:35:18,12:24:47,17:13:30 -305,07:37:08,12:24:45,17:11:37 -306,07:38:59,12:24:44,17:09:44 -307,07:40:49,12:24:43,17:07:54 -308,07:42:39,12:24:44,17:06:05 -309,07:44:30,12:24:45,17:04:18 -310,07:46:20,12:24:47,17:02:33 -311,07:48:10,12:24:50,17:00:49 -312,07:50:00,12:24:54,16:59:08 -313,07:51:50,12:24:59,16:57:28 -314,07:53:40,12:25:04,16:55:50 -315,07:55:29,12:25:11,16:54:15 -316,07:57:18,12:25:18,16:52:41 -317,07:59:06,12:25:26,16:51:10 -318,08:00:54,12:25:35,16:49:40 -319,08:02:41,12:25:45,16:48:14 -320,08:04:28,12:25:56,16:46:49 -321,08:06:14,12:26:08,16:45:27 -322,08:08:00,12:26:20,16:44:07 -323,08:09:44,12:26:33,16:42:50 -324,08:11:28,12:26:47,16:41:35 -325,08:13:10,12:27:02,16:40:23 -326,08:14:52,12:27:18,16:39:14 -327,08:16:32,12:27:34,16:38:08 -328,08:18:11,12:27:52,16:37:04 -329,08:19:49,12:28:10,16:36:03 -330,08:21:25,12:28:28,16:35:05 -331,08:23:00,12:28:48,16:34:10 -332,08:24:33,12:29:08,16:33:18 -333,08:26:05,12:29:29,16:32:29 -334,08:27:35,12:29:50,16:31:43 -335,08:29:03,12:30:13,16:31:01 -336,08:30:29,12:30:36,16:30:21 -337,08:31:53,12:30:59,16:29:45 -338,08:33:15,12:31:23,16:29:12 -339,08:34:35,12:31:48,16:28:43 -340,08:35:52,12:32:13,16:28:17 -341,08:37:07,12:32:39,16:27:54 -342,08:38:20,12:33:05,16:27:35 -343,08:39:30,12:33:31,16:27:19 -344,08:40:37,12:33:58,16:27:07 -345,08:41:41,12:34:26,16:26:58 -346,08:42:43,12:34:54,16:26:53 -347,08:43:42,12:35:22,16:26:52 -348,08:44:38,12:35:50,16:26:54 -349,08:45:31,12:36:19,16:26:59 -350,08:46:21,12:36:48,16:27:09 -351,08:47:08,12:37:17,16:27:21 -352,08:47:51,12:37:46,16:27:38 -353,08:48:31,12:38:16,16:27:58 -354,08:49:08,12:38:45,16:28:21 -355,08:49:42,12:39:15,16:28:48 -356,08:50:12,12:39:45,16:29:18 -357,08:50:39,12:40:15,16:29:52 -358,08:51:02,12:40:44,16:30:30 -359,08:51:22,12:41:14,16:31:10 -360,08:51:38,12:41:44,16:31:54 -361,08:51:51,12:42:13,16:32:41 -362,08:52:00,12:42:43,16:33:32 -363,08:52:06,12:43:12,16:34:25 -364,08:52:08,12:43:41,16:35:22 -365,08:52:07,12:44:09,16:36:22 -366,08:52:01,12:44:45,16:37:40 diff --git a/static/twilight_2015.csv b/static/twilight_2015.csv deleted file mode 100644 index 2c0e7c2..0000000 --- a/static/twilight_2015.csv +++ /dev/null @@ -1,367 +0,0 @@ -day,rise,noon,set -1,08:52:02,12:44:38,16:37:25 -2,08:51:54,12:45:06,16:38:30 -3,08:51:42,12:45:34,16:39:39 -4,08:51:27,12:46:01,16:40:50 -5,08:51:08,12:46:28,16:42:04 -6,08:50:46,12:46:55,16:43:20 -7,08:50:20,12:47:21,16:44:39 -8,08:49:51,12:47:46,16:46:00 -9,08:49:19,12:48:12,16:47:24 -10,08:48:44,12:48:36,16:48:50 -11,08:48:05,12:49:00,16:50:18 -12,08:47:23,12:49:24,16:51:48 -13,08:46:38,12:49:47,16:53:19 -14,08:45:49,12:50:09,16:54:53 -15,08:44:58,12:50:30,16:56:29 -16,08:44:04,12:50:51,16:58:06 -17,08:43:06,12:51:12,16:59:45 -18,08:42:06,12:51:31,17:01:25 -19,08:41:03,12:51:50,17:03:07 -20,08:39:57,12:52:08,17:04:50 -21,08:38:49,12:52:26,17:06:34 -22,08:37:37,12:52:42,17:08:19 -23,08:36:23,12:52:58,17:10:06 -24,08:35:07,12:53:13,17:11:53 -25,08:33:48,12:53:28,17:13:42 -26,08:32:27,12:53:41,17:15:31 -27,08:31:03,12:53:54,17:17:21 -28,08:29:37,12:54:06,17:19:11 -29,08:28:08,12:54:17,17:21:03 -30,08:26:38,12:54:27,17:22:55 -31,08:25:05,12:54:37,17:24:47 -32,08:23:30,12:54:45,17:26:40 -33,08:21:53,12:54:53,17:28:33 -34,08:20:14,12:55:00,17:30:26 -35,08:18:34,12:55:06,17:32:20 -36,08:16:51,12:55:12,17:34:14 -37,08:15:07,12:55:16,17:36:08 -38,08:13:20,12:55:20,17:38:03 -39,08:11:32,12:55:23,17:39:57 -40,08:09:43,12:55:25,17:41:51 -41,08:07:52,12:55:26,17:43:46 -42,08:05:59,12:55:27,17:45:40 -43,08:04:04,12:55:26,17:47:35 -44,08:02:09,12:55:25,17:49:29 -45,08:00:11,12:55:24,17:51:23 -46,07:58:13,12:55:21,17:53:17 -47,07:56:13,12:55:18,17:55:11 -48,07:54:12,12:55:14,17:57:05 -49,07:52:10,12:55:09,17:58:59 -50,07:50:06,12:55:04,18:00:52 -51,07:48:01,12:54:58,18:02:45 -52,07:45:56,12:54:51,18:04:38 -53,07:43:49,12:54:44,18:06:30 -54,07:41:41,12:54:36,18:08:23 -55,07:39:32,12:54:27,18:10:15 -56,07:37:23,12:54:18,18:12:07 -57,07:35:12,12:54:08,18:13:58 -58,07:33:00,12:53:58,18:15:49 -59,07:30:48,12:53:47,18:17:40 -60,07:28:35,12:53:36,18:19:31 -61,07:26:21,12:53:24,18:21:21 -62,07:24:07,12:53:11,18:23:11 -63,07:21:52,12:52:58,18:25:01 -64,07:19:36,12:52:45,18:26:51 -65,07:17:20,12:52:31,18:28:40 -66,07:15:03,12:52:17,18:30:29 -67,07:12:45,12:52:03,18:32:17 -68,07:10:28,12:51:48,18:34:06 -69,07:08:09,12:51:32,18:35:54 -70,07:05:50,12:51:17,18:37:42 -71,07:03:31,12:51:01,18:39:30 -72,07:01:12,12:50:45,18:41:17 -73,06:58:52,12:50:28,18:43:04 -74,06:56:32,12:50:11,18:44:51 -75,06:54:11,12:49:54,18:46:38 -76,06:51:51,12:49:37,18:48:25 -77,06:49:30,12:49:20,18:50:11 -78,06:47:09,12:49:02,18:51:58 -79,06:44:48,12:48:45,18:53:44 -80,06:42:26,12:48:27,18:55:30 -81,06:40:05,12:48:09,18:57:16 -82,06:37:44,12:47:51,18:59:02 -83,06:35:22,12:47:33,19:00:47 -84,06:33:01,12:47:15,19:02:33 -85,06:30:39,12:46:57,19:04:18 -86,06:28:18,12:46:39,19:06:04 -87,06:25:57,12:46:20,19:07:49 -88,06:23:36,12:46:02,19:09:34 -89,06:21:15,12:45:44,19:11:19 -90,07:18:54,13:45:26,20:13:04 -91,07:16:34,13:45:09,20:14:49 -92,07:14:14,13:44:51,20:16:34 -93,07:11:54,13:44:33,20:18:19 -94,07:09:34,13:44:16,20:20:04 -95,07:07:15,13:43:58,20:21:49 -96,07:04:56,13:43:41,20:23:34 -97,07:02:37,13:43:24,20:25:19 -98,07:00:19,13:43:08,20:27:04 -99,06:58:01,13:42:51,20:28:49 -100,06:55:44,13:42:35,20:30:34 -101,06:53:28,13:42:19,20:32:19 -102,06:51:11,13:42:03,20:34:04 -103,06:48:56,13:41:48,20:35:49 -104,06:46:41,13:41:33,20:37:34 -105,06:44:27,13:41:18,20:39:19 -106,06:42:14,13:41:04,20:41:04 -107,06:40:01,13:40:50,20:42:49 -108,06:37:49,13:40:37,20:44:34 -109,06:35:38,13:40:23,20:46:18 -110,06:33:27,13:40:11,20:48:03 -111,06:31:18,13:39:58,20:49:48 -112,06:29:10,13:39:46,20:51:32 -113,06:27:02,13:39:35,20:53:17 -114,06:24:55,13:39:24,20:55:01 -115,06:22:50,13:39:13,20:56:46 -116,06:20:46,13:39:03,20:58:30 -117,06:18:42,13:38:54,21:00:14 -118,06:16:40,13:38:44,21:01:58 -119,06:14:39,13:38:36,21:03:41 -120,06:12:40,13:38:28,21:05:25 -121,06:10:41,13:38:20,21:07:08 -122,06:08:44,13:38:13,21:08:51 -123,06:06:49,13:38:07,21:10:33 -124,06:04:55,13:38:01,21:12:15 -125,06:03:02,13:37:56,21:13:57 -126,06:01:11,13:37:51,21:15:38 -127,05:59:21,13:37:47,21:17:19 -128,05:57:33,13:37:43,21:18:59 -129,05:55:47,13:37:40,21:20:38 -130,05:54:02,13:37:37,21:22:17 -131,05:52:19,13:37:35,21:23:56 -132,05:50:39,13:37:34,21:25:33 -133,05:48:59,13:37:33,21:27:10 -134,05:47:22,13:37:33,21:28:46 -135,05:45:47,13:37:33,21:30:21 -136,05:44:14,13:37:34,21:31:55 -137,05:42:43,13:37:35,21:33:28 -138,05:41:14,13:37:37,21:35:00 -139,05:39:48,13:37:40,21:36:31 -140,05:38:23,13:37:43,21:38:00 -141,05:37:01,13:37:47,21:39:29 -142,05:35:41,13:37:51,21:40:55 -143,05:34:24,13:37:56,21:42:21 -144,05:33:09,13:38:01,21:43:45 -145,05:31:57,13:38:07,21:45:08 -146,05:30:47,13:38:13,21:46:28 -147,05:29:40,13:38:19,21:47:47 -148,05:28:36,13:38:27,21:49:05 -149,05:27:34,13:38:34,21:50:20 -150,05:26:35,13:38:42,21:51:34 -151,05:25:39,13:38:51,21:52:45 -152,05:24:46,13:39:00,21:53:55 -153,05:23:55,13:39:09,21:55:02 -154,05:23:08,13:39:19,21:56:07 -155,05:22:24,13:39:29,21:57:10 -156,05:21:42,13:39:39,21:58:10 -157,05:21:04,13:39:50,21:59:08 -158,05:20:29,13:40:01,22:00:03 -159,05:19:57,13:40:12,22:00:56 -160,05:19:28,13:40:24,22:01:46 -161,05:19:02,13:40:35,22:02:34 -162,05:18:39,13:40:48,22:03:18 -163,05:18:20,13:41:00,22:04:00 -164,05:18:04,13:41:12,22:04:39 -165,05:17:51,13:41:25,22:05:15 -166,05:17:41,13:41:37,22:05:48 -167,05:17:34,13:41:50,22:06:18 -168,05:17:31,13:42:03,22:06:45 -169,05:17:31,13:42:16,22:07:08 -170,05:17:35,13:42:29,22:07:29 -171,05:17:41,13:42:42,22:07:46 -172,05:17:51,13:42:55,22:08:00 -173,05:18:04,13:43:08,22:08:11 -174,05:18:20,13:43:21,22:08:19 -175,05:18:39,13:43:34,22:08:24 -176,05:19:01,13:43:47,22:08:25 -177,05:19:26,13:44:00,22:08:23 -178,05:19:55,13:44:12,22:08:17 -179,05:20:26,13:44:25,22:08:08 -180,05:21:00,13:44:37,22:07:56 -181,05:21:37,13:44:49,22:07:41 -182,05:22:17,13:45:01,22:07:22 -183,05:23:00,13:45:12,22:07:01 -184,05:23:46,13:45:23,22:06:36 -185,05:24:34,13:45:34,22:06:07 -186,05:25:24,13:45:45,22:05:36 -187,05:26:18,13:45:55,22:05:01 -188,05:27:13,13:46:05,22:04:23 -189,05:28:11,13:46:14,22:03:43 -190,05:29:12,13:46:24,22:02:59 -191,05:30:14,13:46:32,22:02:12 -192,05:31:19,13:46:41,22:01:22 -193,05:32:26,13:46:48,22:00:29 -194,05:33:35,13:46:56,21:59:33 -195,05:34:46,13:47:03,21:58:34 -196,05:35:59,13:47:09,21:57:33 -197,05:37:13,13:47:15,21:56:29 -198,05:38:30,13:47:20,21:55:22 -199,05:39:48,13:47:25,21:54:12 -200,05:41:07,13:47:30,21:53:00 -201,05:42:28,13:47:33,21:51:46 -202,05:43:51,13:47:37,21:50:28 -203,05:45:15,13:47:39,21:49:09 -204,05:46:40,13:47:41,21:47:47 -205,05:48:06,13:47:43,21:46:22 -206,05:49:34,13:47:44,21:44:56 -207,05:51:02,13:47:44,21:43:27 -208,05:52:32,13:47:44,21:41:56 -209,05:54:02,13:47:43,21:40:23 -210,05:55:34,13:47:42,21:38:47 -211,05:57:06,13:47:39,21:37:10 -212,05:58:39,13:47:37,21:35:31 -213,06:00:13,13:47:33,21:33:50 -214,06:01:48,13:47:30,21:32:07 -215,06:03:23,13:47:25,21:30:22 -216,06:04:59,13:47:20,21:28:36 -217,06:06:35,13:47:14,21:26:47 -218,06:08:12,13:47:08,21:24:57 -219,06:09:49,13:47:01,21:23:06 -220,06:11:27,13:46:53,21:21:13 -221,06:13:05,13:46:45,21:19:18 -222,06:14:43,13:46:37,21:17:22 -223,06:16:22,13:46:27,21:15:25 -224,06:18:01,13:46:18,21:13:26 -225,06:19:40,13:46:07,21:11:26 -226,06:21:19,13:45:56,21:09:25 -227,06:22:59,13:45:45,21:07:22 -228,06:24:39,13:45:33,21:05:18 -229,06:26:19,13:45:20,21:03:13 -230,06:27:58,13:45:07,21:01:07 -231,06:29:38,13:44:54,20:59:00 -232,06:31:19,13:44:40,20:56:52 -233,06:32:59,13:44:25,20:54:43 -234,06:34:39,13:44:10,20:52:33 -235,06:36:19,13:43:55,20:50:22 -236,06:37:59,13:43:39,20:48:10 -237,06:39:40,13:43:23,20:45:58 -238,06:41:20,13:43:06,20:43:44 -239,06:43:00,13:42:49,20:41:30 -240,06:44:40,13:42:32,20:39:15 -241,06:46:21,13:42:14,20:36:59 -242,06:48:01,13:41:56,20:34:43 -243,06:49:41,13:41:38,20:32:26 -244,06:51:21,13:41:19,20:30:09 -245,06:53:01,13:41:00,20:27:51 -246,06:54:41,13:40:40,20:25:32 -247,06:56:21,13:40:21,20:23:13 -248,06:58:01,13:40:01,20:20:54 -249,06:59:41,13:39:41,20:18:34 -250,07:01:21,13:39:21,20:16:13 -251,07:03:01,13:39:00,20:13:53 -252,07:04:41,13:38:39,20:11:32 -253,07:06:21,13:38:19,20:09:10 -254,07:08:01,13:37:58,20:06:49 -255,07:09:41,13:37:37,20:04:27 -256,07:11:21,13:37:15,20:02:05 -257,07:13:01,13:36:54,19:59:43 -258,07:14:41,13:36:33,19:57:20 -259,07:16:21,13:36:11,19:54:57 -260,07:18:01,13:35:50,19:52:35 -261,07:19:42,13:35:29,19:50:12 -262,07:21:22,13:35:07,19:47:49 -263,07:23:03,13:34:46,19:45:26 -264,07:24:43,13:34:25,19:43:04 -265,07:26:24,13:34:03,19:40:41 -266,07:28:05,13:33:42,19:38:18 -267,07:29:45,13:33:21,19:35:55 -268,07:31:26,13:33:00,19:33:33 -269,07:33:08,13:32:40,19:31:11 -270,07:34:49,13:32:19,19:28:48 -271,07:36:31,13:31:59,19:26:27 -272,07:38:12,13:31:38,19:24:05 -273,07:39:54,13:31:19,19:21:43 -274,07:41:37,13:30:59,19:19:22 -275,07:43:19,13:30:40,19:17:01 -276,07:45:02,13:30:20,19:14:41 -277,07:46:45,13:30:02,19:12:21 -278,07:48:28,13:29:43,19:10:01 -279,07:50:11,13:29:25,19:07:42 -280,07:51:55,13:29:08,19:05:24 -281,07:53:39,13:28:50,19:03:05 -282,07:55:23,13:28:33,19:00:48 -283,07:57:08,13:28:17,18:58:31 -284,07:58:53,13:28:01,18:56:15 -285,08:00:38,13:27:46,18:53:59 -286,08:02:23,13:27:31,18:51:44 -287,08:04:09,13:27:16,18:49:30 -288,08:05:55,13:27:02,18:47:16 -289,08:07:42,13:26:49,18:45:03 -290,08:09:28,13:26:36,18:42:52 -291,08:11:15,13:26:24,18:40:41 -292,08:13:03,13:26:12,18:38:31 -293,08:14:50,13:26:01,18:36:22 -294,08:16:38,13:25:51,18:34:14 -295,08:18:26,13:25:42,18:32:07 -296,08:20:15,13:25:33,18:30:01 -297,08:22:04,13:25:24,18:27:56 -298,08:23:53,13:25:17,18:25:52 -299,07:25:42,12:25:10,17:23:50 -300,07:27:31,12:25:04,17:21:49 -301,07:29:21,12:24:59,17:19:49 -302,07:31:11,12:24:54,17:17:51 -303,07:33:01,12:24:50,17:15:54 -304,07:34:51,12:24:47,17:13:58 -305,07:36:41,12:24:45,17:12:04 -306,07:38:32,12:24:44,17:10:12 -307,07:40:22,12:24:43,17:08:21 -308,07:42:12,12:24:44,17:06:32 -309,07:44:03,12:24:45,17:04:44 -310,07:45:53,12:24:47,17:02:58 -311,07:47:43,12:24:49,17:01:14 -312,07:49:33,12:24:53,16:59:32 -313,07:51:23,12:24:58,16:57:52 -314,07:53:13,12:25:03,16:56:14 -315,07:55:02,12:25:09,16:54:38 -316,07:56:51,12:25:16,16:53:04 -317,07:58:40,12:25:24,16:51:32 -318,08:00:28,12:25:33,16:50:02 -319,08:02:15,12:25:43,16:48:35 -320,08:04:02,12:25:53,16:47:10 -321,08:05:48,12:26:05,16:45:47 -322,08:07:34,12:26:17,16:44:26 -323,08:09:18,12:26:30,16:43:09 -324,08:11:02,12:26:44,16:41:53 -325,08:12:45,12:26:58,16:40:41 -326,08:14:27,12:27:14,16:39:31 -327,08:16:07,12:27:30,16:38:24 -328,08:17:47,12:27:47,16:37:19 -329,08:19:25,12:28:05,16:36:18 -330,08:21:02,12:28:24,16:35:19 -331,08:22:37,12:28:43,16:34:23 -332,08:24:11,12:29:03,16:33:30 -333,08:25:43,12:29:24,16:32:41 -334,08:27:13,12:29:45,16:31:54 -335,08:28:42,12:30:07,16:31:11 -336,08:30:08,12:30:30,16:30:31 -337,08:31:33,12:30:53,16:29:54 -338,08:32:55,12:31:17,16:29:20 -339,08:34:15,12:31:42,16:28:50 -340,08:35:33,12:32:07,16:28:23 -341,08:36:49,12:32:32,16:27:59 -342,08:38:02,12:32:58,16:27:39 -343,08:39:13,12:33:25,16:27:23 -344,08:40:21,12:33:52,16:27:10 -345,08:41:26,12:34:19,16:27:00 -346,08:42:28,12:34:47,16:26:54 -347,08:43:28,12:35:15,16:26:52 -348,08:44:25,12:35:43,16:26:53 -349,08:45:18,12:36:12,16:26:58 -350,08:46:09,12:36:41,16:27:06 -351,08:46:56,12:37:10,16:27:18 -352,08:47:41,12:37:39,16:27:33 -353,08:48:22,12:38:09,16:27:52 -354,08:48:59,12:38:38,16:28:15 -355,08:49:34,12:39:08,16:28:41 -356,08:50:05,12:39:38,16:29:11 -357,08:50:32,12:40:07,16:29:44 -358,08:50:57,12:40:37,16:30:20 -359,08:51:17,12:41:07,16:31:00 -360,08:51:34,12:41:36,16:31:43 -361,08:51:48,12:42:06,16:32:30 -362,08:51:58,12:42:35,16:33:19 -363,08:52:05,12:43:05,16:34:12 -364,08:52:08,12:43:34,16:35:08 -365,08:52:08,12:44:02,16:36:07 -,,, diff --git a/static/twilight_2016.csv b/static/twilight_2016.csv deleted file mode 100644 index 9468174..0000000 --- a/static/twilight_2016.csv +++ /dev/null @@ -1,367 +0,0 @@ -day,rise,noon,set -1,08:52:04,12:44:31,16:37:09 -2,08:51:56,12:44:59,16:38:14 -3,08:51:45,12:45:27,16:39:22 -4,08:51:31,12:45:54,16:40:32 -5,08:51:13,12:46:21,16:41:45 -6,08:50:52,12:46:48,16:43:01 -7,08:50:27,12:47:14,16:44:20 -8,08:49:59,12:47:40,16:45:40 -9,08:49:27,12:48:05,16:47:03 -10,08:48:52,12:48:30,16:48:28 -11,08:48:14,12:48:54,16:49:56 -12,08:47:33,12:49:18,16:51:25 -13,08:46:49,12:49:41,16:52:57 -14,08:46:01,12:50:03,16:54:30 -15,08:45:11,12:50:25,16:56:05 -16,08:44:17,12:50:46,16:57:42 -17,08:43:20,12:51:07,16:59:20 -18,08:42:21,12:51:26,17:01:00 -19,08:41:18,12:51:46,17:02:42 -20,08:40:13,12:52:04,17:04:24 -21,08:39:05,12:52:21,17:06:08 -22,08:37:55,12:52:38,17:07:53 -23,08:36:41,12:52:54,17:09:40 -24,08:35:26,12:53:10,17:11:27 -25,08:34:07,12:53:24,17:13:15 -26,08:32:47,12:53:38,17:15:04 -27,08:31:23,12:53:51,17:16:54 -28,08:29:58,12:54:03,17:18:44 -29,08:28:30,12:54:14,17:20:35 -30,08:27:00,12:54:25,17:22:27 -31,08:25:28,12:54:34,17:24:19 -32,08:23:53,12:54:43,17:26:12 -33,08:22:17,12:54:51,17:28:05 -34,08:20:39,12:54:58,17:29:58 -35,08:18:58,12:55:05,17:31:52 -36,08:17:16,12:55:10,17:33:46 -37,08:15:32,12:55:15,17:35:40 -38,08:13:46,12:55:19,17:37:35 -39,08:11:59,12:55:22,17:39:29 -40,08:10:09,12:55:24,17:41:23 -41,08:08:19,12:55:26,17:43:18 -42,08:06:26,12:55:26,17:45:12 -43,08:04:32,12:55:26,17:47:07 -44,08:02:37,12:55:26,17:49:01 -45,08:00:40,12:55:24,17:50:55 -46,07:58:42,12:55:22,17:52:49 -47,07:56:42,12:55:19,17:54:43 -48,07:54:42,12:55:15,17:56:37 -49,07:52:39,12:55:10,17:58:31 -50,07:50:36,12:55:05,18:00:24 -51,07:48:32,12:54:59,18:02:17 -52,07:46:26,12:54:53,18:04:10 -53,07:44:20,12:54:46,18:06:03 -54,07:42:12,12:54:38,18:07:55 -55,07:40:04,12:54:29,18:09:47 -56,07:37:54,12:54:20,18:11:39 -57,07:35:44,12:54:11,18:13:31 -58,07:33:33,12:54:00,18:15:22 -59,07:31:20,12:53:50,18:17:13 -60,07:29:08,12:53:38,18:19:04 -61,07:26:54,12:53:27,18:20:54 -62,07:24:40,12:53:14,18:22:44 -63,07:22:25,12:53:01,18:24:34 -64,07:20:09,12:52:48,18:26:24 -65,07:17:53,12:52:35,18:28:13 -66,07:15:36,12:52:21,18:30:02 -67,07:13:19,12:52:06,18:31:51 -68,07:11:01,12:51:51,18:33:39 -69,07:08:43,12:51:36,18:35:28 -70,07:06:24,12:51:20,18:37:16 -71,07:04:05,12:51:05,18:39:03 -72,07:01:46,12:50:48,18:40:51 -73,06:59:26,12:50:32,18:42:38 -74,06:57:06,12:50:15,18:44:25 -75,06:54:45,12:49:58,18:46:12 -76,06:52:25,12:49:41,18:47:59 -77,06:50:04,12:49:24,18:49:45 -78,06:47:43,12:49:07,18:51:32 -79,06:45:22,12:48:49,18:53:18 -80,06:43:01,12:48:31,18:55:04 -81,06:40:39,12:48:13,18:56:50 -82,06:38:18,12:47:55,18:58:36 -83,06:35:57,12:47:37,19:00:21 -84,06:33:35,12:47:19,19:02:07 -85,06:31:14,12:47:01,19:03:52 -86,06:28:53,12:46:43,19:05:38 -87,06:26:31,12:46:25,19:07:23 -88,06:24:10,12:46:07,19:09:08 -89,06:21:49,12:45:49,19:10:54 -90,06:19:29,12:45:31,19:12:39 -91,07:17:08,13:45:13,20:14:24 -92,07:14:48,13:44:55,20:16:09 -93,07:12:28,13:44:37,20:17:54 -94,07:10:08,13:44:20,20:19:39 -95,07:07:48,13:44:03,20:21:24 -96,07:05:29,13:43:45,20:23:09 -97,07:03:11,13:43:28,20:24:54 -98,07:00:53,13:43:12,20:26:39 -99,06:58:35,13:42:55,20:28:24 -100,06:56:18,13:42:39,20:30:09 -101,06:54:01,13:42:23,20:31:53 -102,06:51:45,13:42:07,20:33:38 -103,06:49:29,13:41:52,20:35:23 -104,06:47:14,13:41:37,20:37:08 -105,06:45:00,13:41:22,20:38:53 -106,06:42:46,13:41:08,20:40:38 -107,06:40:33,13:40:53,20:42:23 -108,06:38:21,13:40:40,20:44:08 -109,06:36:10,13:40:27,20:45:53 -110,06:33:59,13:40:14,20:47:38 -111,06:31:50,13:40:01,20:49:22 -112,06:29:41,13:39:49,20:51:07 -113,06:27:33,13:39:38,20:52:52 -114,06:25:26,13:39:26,20:54:36 -115,06:23:21,13:39:16,20:56:20 -116,06:21:16,13:39:06,20:58:05 -117,06:19:12,13:38:56,20:59:49 -118,06:17:10,13:38:47,21:01:32 -119,06:15:09,13:38:38,21:03:16 -120,06:13:09,13:38:30,21:05:00 -121,06:11:10,13:38:22,21:06:43 -122,06:09:13,13:38:15,21:08:26 -123,06:07:17,13:38:08,21:10:08 -124,06:05:22,13:38:02,21:11:50 -125,06:03:29,13:37:57,21:13:32 -126,06:01:38,13:37:52,21:15:13 -127,05:59:48,13:37:48,21:16:54 -128,05:57:59,13:37:44,21:18:34 -129,05:56:13,13:37:41,21:20:14 -130,05:54:28,13:37:38,21:21:53 -131,05:52:44,13:37:36,21:23:32 -132,05:51:03,13:37:34,21:25:09 -133,05:49:24,13:37:33,21:26:46 -134,05:47:46,13:37:33,21:28:23 -135,05:46:10,13:37:33,21:29:58 -136,05:44:37,13:37:34,21:31:32 -137,05:43:05,13:37:35,21:33:05 -138,05:41:36,13:37:37,21:34:38 -139,05:40:09,13:37:39,21:36:09 -140,05:38:44,13:37:42,21:37:39 -141,05:37:21,13:37:46,21:39:07 -142,05:36:01,13:37:50,21:40:35 -143,05:34:43,13:37:55,21:42:00 -144,05:33:27,13:38:00,21:43:25 -145,05:32:15,13:38:05,21:44:48 -146,05:31:04,13:38:11,21:46:09 -147,05:29:56,13:38:18,21:47:28 -148,05:28:51,13:38:25,21:48:46 -149,05:27:49,13:38:32,21:50:02 -150,05:26:49,13:38:40,21:51:16 -151,05:25:53,13:38:49,21:52:28 -152,05:24:59,13:38:58,21:53:38 -153,05:24:08,13:39:07,21:54:46 -154,05:23:19,13:39:16,21:55:52 -155,05:22:34,13:39:26,21:56:55 -156,05:21:52,13:39:37,21:57:56 -157,05:21:13,13:39:47,21:58:54 -158,05:20:37,13:39:58,21:59:50 -159,05:20:04,13:40:09,22:00:44 -160,05:19:34,13:40:21,22:01:34 -161,05:19:08,13:40:33,22:02:22 -162,05:18:45,13:40:45,22:03:08 -163,05:18:24,13:40:57,22:03:50 -164,05:18:07,13:41:09,22:04:30 -165,05:17:54,13:41:22,22:05:07 -166,05:17:43,13:41:35,22:05:40 -167,05:17:36,13:41:47,22:06:11 -168,05:17:32,13:42:00,22:06:38 -169,05:17:31,13:42:13,22:07:03 -170,05:17:34,13:42:26,22:07:24 -171,05:17:39,13:42:39,22:07:42 -172,05:17:48,13:42:52,22:07:57 -173,05:18:00,13:43:05,22:08:09 -174,05:18:16,13:43:18,22:08:18 -175,05:18:34,13:43:31,22:08:23 -176,05:18:56,13:43:44,22:08:25 -177,05:19:20,13:43:57,22:08:23 -178,05:19:48,13:44:09,22:08:19 -179,05:20:18,13:44:22,22:08:11 -180,05:20:52,13:44:34,22:08:00 -181,05:21:28,13:44:46,22:07:45 -182,05:22:08,13:44:58,22:07:27 -183,05:22:50,13:45:09,22:07:06 -184,05:23:34,13:45:21,22:06:42 -185,05:24:22,13:45:32,22:06:15 -186,05:25:12,13:45:42,22:05:44 -187,05:26:05,13:45:53,22:05:10 -188,05:27:00,13:46:03,22:04:33 -189,05:27:57,13:46:12,22:03:53 -190,05:28:57,13:46:22,22:03:10 -191,05:29:59,13:46:30,22:02:23 -192,05:31:03,13:46:39,22:01:34 -193,05:32:10,13:46:47,22:00:42 -194,05:33:18,13:46:54,21:59:47 -195,05:34:29,13:47:01,21:58:49 -196,05:35:41,13:47:08,21:57:48 -197,05:36:55,13:47:14,21:56:45 -198,05:38:11,13:47:19,21:55:39 -199,05:39:29,13:47:24,21:54:30 -200,05:40:48,13:47:29,21:53:18 -201,05:42:08,13:47:33,21:52:04 -202,05:43:31,13:47:36,21:50:48 -203,05:44:54,13:47:39,21:49:29 -204,05:46:19,13:47:41,21:48:07 -205,05:47:45,13:47:43,21:46:43 -206,05:49:12,13:47:44,21:45:17 -207,05:50:41,13:47:44,21:43:49 -208,05:52:10,13:47:44,21:42:18 -209,05:53:40,13:47:43,21:40:46 -210,05:55:12,13:47:42,21:39:11 -211,05:56:44,13:47:40,21:37:34 -212,05:58:17,13:47:38,21:35:55 -213,05:59:51,13:47:34,21:34:15 -214,06:01:25,13:47:31,21:32:32 -215,06:03:00,13:47:26,21:30:48 -216,06:04:36,13:47:21,21:29:02 -217,06:06:12,13:47:16,21:27:14 -218,06:07:49,13:47:10,21:25:24 -219,06:09:26,13:47:03,21:23:33 -220,06:11:03,13:46:55,21:21:41 -221,06:12:41,13:46:47,21:19:46 -222,06:14:19,13:46:39,21:17:51 -223,06:15:58,13:46:30,21:15:54 -224,06:17:37,13:46:20,21:13:55 -225,06:19:16,13:46:10,21:11:56 -226,06:20:55,13:45:59,21:09:54 -227,06:22:35,13:45:48,21:07:52 -228,06:24:15,13:45:36,21:05:49 -229,06:25:54,13:45:24,21:03:44 -230,06:27:34,13:45:11,21:01:38 -231,06:29:14,13:44:57,20:59:31 -232,06:30:54,13:44:43,20:57:24 -233,06:32:34,13:44:29,20:55:15 -234,06:34:15,13:44:14,20:53:05 -235,06:35:55,13:43:59,20:50:54 -236,06:37:35,13:43:43,20:48:42 -237,06:39:15,13:43:27,20:46:30 -238,06:40:56,13:43:11,20:44:17 -239,06:42:36,13:42:54,20:42:03 -240,06:44:16,13:42:36,20:39:48 -241,06:45:56,13:42:19,20:37:33 -242,06:47:36,13:42:01,20:35:16 -243,06:49:17,13:41:42,20:33:00 -244,06:50:57,13:41:23,20:30:42 -245,06:52:37,13:41:04,20:28:25 -246,06:54:17,13:40:45,20:26:06 -247,06:55:57,13:40:26,20:23:47 -248,06:57:37,13:40:06,20:21:28 -249,06:59:17,13:39:46,20:19:08 -250,07:00:57,13:39:26,20:16:48 -251,07:02:37,13:39:05,20:14:27 -252,07:04:17,13:38:45,20:12:06 -253,07:05:57,13:38:24,20:09:45 -254,07:07:37,13:38:03,20:07:23 -255,07:09:17,13:37:42,20:05:01 -256,07:10:57,13:37:21,20:02:39 -257,07:12:37,13:36:59,20:00:17 -258,07:14:17,13:36:38,19:57:55 -259,07:15:57,13:36:17,19:55:32 -260,07:17:37,13:35:55,19:53:10 -261,07:19:17,13:35:34,19:50:47 -262,07:20:58,13:35:12,19:48:24 -263,07:22:38,13:34:51,19:46:01 -264,07:24:19,13:34:30,19:43:38 -265,07:25:59,13:34:08,19:41:16 -266,07:27:40,13:33:47,19:38:53 -267,07:29:21,13:33:26,19:36:30 -268,07:31:02,13:33:05,19:34:08 -269,07:32:43,13:32:45,19:31:45 -270,07:34:24,13:32:24,19:29:23 -271,07:36:06,13:32:04,19:27:01 -272,07:37:48,13:31:43,19:24:39 -273,07:39:30,13:31:23,19:22:18 -274,07:41:12,13:31:04,19:19:57 -275,07:42:54,13:30:44,19:17:36 -276,07:44:37,13:30:25,19:15:15 -277,07:46:20,13:30:06,19:12:55 -278,07:48:03,13:29:48,19:10:35 -279,07:49:46,13:29:30,19:08:16 -280,07:51:30,13:29:12,19:05:57 -281,07:53:14,13:28:54,19:03:39 -282,07:54:58,13:28:37,19:01:21 -283,07:56:42,13:28:21,18:59:04 -284,07:58:27,13:28:05,18:56:48 -285,08:00:12,13:27:49,18:54:32 -286,08:01:57,13:27:34,18:52:17 -287,08:03:43,13:27:20,18:50:02 -288,08:05:29,13:27:06,18:47:49 -289,08:07:16,13:26:52,18:45:36 -290,08:09:02,13:26:39,18:43:24 -291,08:10:49,13:26:27,18:41:13 -292,08:12:36,13:26:15,18:39:02 -293,08:14:24,13:26:04,18:36:53 -294,08:16:12,13:25:54,18:34:45 -295,08:18:00,13:25:44,18:32:37 -296,08:19:48,13:25:35,18:30:31 -297,08:21:37,13:25:26,18:28:26 -298,08:23:26,13:25:19,18:26:22 -299,08:25:15,13:25:12,18:24:20 -300,07:27:05,12:25:05,17:22:18 -301,07:28:54,12:25:00,17:20:18 -302,07:30:44,12:24:55,17:18:19 -303,07:32:34,12:24:51,17:16:22 -304,07:34:24,12:24:48,17:14:26 -305,07:36:14,12:24:46,17:12:32 -306,07:38:05,12:24:44,17:10:39 -307,07:39:55,12:24:43,17:08:48 -308,07:41:45,12:24:43,17:06:58 -309,07:43:36,12:24:44,17:05:10 -310,07:45:26,12:24:46,17:03:24 -311,07:47:16,12:24:49,17:01:39 -312,07:49:06,12:24:52,16:59:57 -313,07:50:56,12:24:56,16:58:16 -314,07:52:46,12:25:02,16:56:38 -315,07:54:35,12:25:08,16:55:01 -316,07:56:24,12:25:14,16:53:26 -317,07:58:13,12:25:22,16:51:54 -318,08:00:01,12:25:31,16:50:24 -319,08:01:49,12:25:40,16:48:56 -320,08:03:36,12:25:51,16:47:30 -321,08:05:22,12:26:02,16:46:07 -322,08:07:08,12:26:14,16:44:46 -323,08:08:53,12:26:27,16:43:27 -324,08:10:37,12:26:40,16:42:11 -325,08:12:20,12:26:55,16:40:58 -326,08:14:02,12:27:10,16:39:48 -327,08:15:43,12:27:26,16:38:40 -328,08:17:23,12:27:43,16:37:35 -329,08:19:01,12:28:01,16:36:32 -330,08:20:38,12:28:19,16:35:33 -331,08:22:14,12:28:38,16:34:36 -332,08:23:48,12:28:58,16:33:43 -333,08:25:20,12:29:18,16:32:52 -334,08:26:51,12:29:40,16:32:05 -335,08:28:20,12:30:02,16:31:21 -336,08:29:47,12:30:24,16:30:40 -337,08:31:12,12:30:47,16:30:02 -338,08:32:35,12:31:11,16:29:28 -339,08:33:56,12:31:35,16:28:57 -340,08:35:14,12:32:00,16:28:29 -341,08:36:31,12:32:26,16:28:05 -342,08:37:44,12:32:52,16:27:44 -343,08:38:56,12:33:18,16:27:26 -344,08:40:04,12:33:45,16:27:13 -345,08:41:10,12:34:12,16:27:02 -346,08:42:13,12:34:40,16:26:55 -347,08:43:14,12:35:08,16:26:52 -348,08:44:11,12:35:36,16:26:52 -349,08:45:05,12:36:05,16:26:56 -350,08:45:57,12:36:33,16:27:04 -351,08:46:45,12:37:03,16:27:15 -352,08:47:30,12:37:32,16:27:29 -353,08:48:12,12:38:01,16:27:47 -354,08:48:50,12:38:31,16:28:09 -355,08:49:26,12:39:01,16:28:34 -356,08:49:57,12:39:30,16:29:03 -357,08:50:26,12:40:00,16:29:35 -358,08:50:51,12:40:30,16:30:11 -359,08:51:12,12:40:59,16:30:50 -360,08:51:31,12:41:29,16:31:32 -361,08:51:45,12:41:59,16:32:18 -362,08:51:56,12:42:28,16:33:07 -363,08:52:04,12:42:57,16:33:59 -364,08:52:08,12:43:26,16:34:54 -365,08:52:08,12:43:55,16:35:52 -366,08:52:05,12:44:24,16:36:54 diff --git a/static/twilight_2017.csv b/static/twilight_2017.csv deleted file mode 100644 index 1b9245c..0000000 --- a/static/twilight_2017.csv +++ /dev/null @@ -1 +0,0 @@ -day,rise,noon,set 1,08:51:58,12:44:52,16:37:58 2,08:51:48,12:45:20,16:39:05 3,08:51:35,12:45:48,16:40:15 4,08:51:18,12:46:15,16:41:27 5,08:50:57,12:46:42,16:42:42 6,08:50:33,12:47:08,16:44:00 7,08:50:06,12:47:34,16:45:20 8,08:49:35,12:47:59,16:46:43 9,08:49:01,12:48:24,16:48:07 10,08:48:24,12:48:48,16:49:34 11,08:47:43,12:49:12,16:51:03 12,08:47:00,12:49:35,16:52:34 13,08:46:13,12:49:58,16:54:07 14,08:45:23,12:50:20,16:55:42 15,08:44:30,12:50:41,16:57:18 16,08:43:34,12:51:02,16:58:56 17,08:42:36,12:51:22,17:00:36 18,08:41:34,12:51:41,17:02:17 19,08:40:29,12:51:59,17:03:59 20,08:39:22,12:52:17,17:05:43 21,08:38:12,12:52:34,17:07:27 22,08:37:00,12:52:50,17:09:13 23,08:35:44,12:53:06,17:11:00 24,08:34:27,12:53:21,17:12:48 25,08:33:06,12:53:34,17:14:37 26,08:31:44,12:53:48,17:16:27 27,08:30:19,12:54:00,17:18:17 28,08:28:52,12:54:11,17:20:08 29,08:27:22,12:54:22,17:22:00 30,08:25:50,12:54:32,17:23:52 31,08:24:17,12:54:41,17:25:44 32,08:22:41,12:54:49,17:27:37 33,08:21:03,12:54:56,17:29:31 34,08:19:23,12:55:03,17:31:24 35,08:17:41,12:55:09,17:33:18 36,08:15:58,12:55:14,17:35:12 37,08:14:12,12:55:18,17:37:07 38,08:12:25,12:55:21,17:39:01 39,08:10:36,12:55:24,17:40:55 40,08:08:46,12:55:25,17:42:50 41,08:06:54,12:55:26,17:44:44 42,08:05:00,12:55:26,17:46:39 43,08:03:05,12:55:26,17:48:33 44,08:01:09,12:55:24,17:50:27 45,07:59:11,12:55:22,17:52:21 46,07:57:12,12:55:19,17:54:15 47,07:55:11,12:55:16,17:56:09 48,07:53:09,12:55:11,17:58:03 49,07:51:06,12:55:06,17:59:56 50,07:49:02,12:55:01,18:01:50 51,07:46:57,12:54:54,18:03:42 52,07:44:51,12:54:47,18:05:35 53,07:42:43,12:54:40,18:07:28 54,07:40:35,12:54:31,18:09:20 55,07:38:26,12:54:22,18:11:12 56,07:36:16,12:54:13,18:13:03 57,07:34:05,12:54:03,18:14:55 58,07:31:53,12:53:52,18:16:46 59,07:29:40,12:53:41,18:18:37 60,07:27:27,12:53:29,18:20:27 61,07:25:12,12:53:17,18:22:17 62,07:22:58,12:53:05,18:24:07 63,07:20:42,12:52:51,18:25:57 64,07:18:26,12:52:38,18:27:46 65,07:16:10,12:52:24,18:29:35 66,07:13:52,12:52:10,18:31:24 67,07:11:35,12:51:55,18:33:13 68,07:09:17,12:51:40,18:35:01 69,07:06:58,12:51:24,18:36:49 70,07:04:39,12:51:08,18:38:37 71,07:02:20,12:50:52,18:40:25 72,07:00:00,12:50:36,18:42:12 73,06:57:40,12:50:19,18:43:59 74,06:55:20,12:50:03,18:45:46 75,06:52:59,12:49:45,18:47:33 76,06:50:38,12:49:28,18:49:19 77,06:48:17,12:49:11,18:51:06 78,06:45:56,12:48:53,18:52:52 79,06:43:35,12:48:35,18:54:38 80,06:41:14,12:48:18,18:56:24 81,06:38:52,12:48:00,18:58:10 82,06:36:31,12:47:42,18:59:56 83,06:34:10,12:47:24,19:01:41 84,06:31:48,12:47:05,19:03:27 85,06:29:27,12:46:47,19:05:12 86,06:27:06,12:46:29,19:06:57 87,06:24:45,12:46:11,19:08:43 88,06:22:24,12:45:53,19:10:28 89,06:20:03,12:45:35,19:12:13 90,07:17:42,13:45:17,20:13:58 91,07:15:22,13:44:59,20:15:43 92,07:13:02,13:44:42,20:17:28 93,07:10:42,13:44:24,20:19:13 94,07:08:22,13:44:07,20:20:58 95,07:06:03,13:43:50,20:22:43 96,07:03:45,13:43:33,20:24:28 97,07:01:26,13:43:16,20:26:13 98,06:59:08,13:42:59,20:27:58 99,06:56:51,13:42:43,20:29:43 100,06:54:34,13:42:27,20:31:28 101,06:52:18,13:42:11,20:33:13 102,06:50:02,13:41:56,20:34:58 103,06:47:47,13:41:40,20:36:43 104,06:45:32,13:41:26,20:38:28 105,06:43:19,13:41:11,20:40:13 106,06:41:05,13:40:57,20:41:58 107,06:38:53,13:40:43,20:43:42 108,06:36:42,13:40:30,20:45:27 109,06:34:31,13:40:17,20:47:12 110,06:32:21,13:40:04,20:48:57 111,06:30:12,13:39:52,20:50:42 112,06:28:04,13:39:40,20:52:26 113,06:25:57,13:39:29,20:54:11 114,06:23:51,13:39:18,20:55:55 115,06:21:46,13:39:08,20:57:39 116,06:19:42,13:38:58,20:59:23 117,06:17:40,13:38:49,21:01:07 118,06:15:38,13:38:40,21:02:51 119,06:13:38,13:38:32,21:04:34 120,06:11:39,13:38:24,21:06:18 121,06:09:41,13:38:17,21:08:01 122,06:07:45,13:38:10,21:09:43 123,06:05:50,13:38:04,21:11:25 124,06:03:57,13:37:58,21:13:07 125,06:02:05,13:37:53,21:14:49 126,06:00:14,13:37:49,21:16:30 127,05:58:26,13:37:45,21:18:10 128,05:56:38,13:37:41,21:19:50 129,05:54:53,13:37:39,21:21:29 130,05:53:09,13:37:36,21:23:08 131,05:51:28,13:37:35,21:24:46 132,05:49:48,13:37:34,21:26:23 133,05:48:10,13:37:33,21:27:59 134,05:46:33,13:37:33,21:29:35 135,05:44:59,13:37:34,21:31:09 136,05:43:27,13:37:35,21:32:43 137,05:41:57,13:37:37,21:34:15 138,05:40:30,13:37:39,21:35:47 139,05:39:04,13:37:42,21:37:17 140,05:37:41,13:37:45,21:38:46 141,05:36:20,13:37:49,21:40:14 142,05:35:02,13:37:53,21:41:40 143,05:33:46,13:37:58,21:43:05 144,05:32:32,13:38:04,21:44:28 145,05:31:21,13:38:10,21:45:49 146,05:30:13,13:38:16,21:47:09 147,05:29:07,13:38:23,21:48:28 148,05:28:04,13:38:31,21:49:44 149,05:27:04,13:38:39,21:50:59 150,05:26:06,13:38:47,21:52:11 151,05:25:12,13:38:56,21:53:22 152,05:24:20,13:39:05,21:54:30 153,05:23:31,13:39:14,21:55:36 154,05:22:45,13:39:24,21:56:40 155,05:22:02,13:39:34,21:57:41 156,05:21:22,13:39:45,21:58:40 157,05:20:46,13:39:56,21:59:37 158,05:20:12,13:40:07,22:00:31 159,05:19:41,13:40:18,22:01:23 160,05:19:14,13:40:30,22:02:11 161,05:18:50,13:40:42,22:02:57 162,05:18:29,13:40:54,22:03:40 163,05:18:11,13:41:06,22:04:21 164,05:17:57,13:41:19,22:04:58 165,05:17:45,13:41:32,22:05:33 166,05:17:37,13:41:44,22:06:04 167,05:17:33,13:41:57,22:06:32 168,05:17:31,13:42:10,22:06:58 169,05:17:33,13:42:23,22:07:20 170,05:17:38,13:42:36,22:07:39 171,05:17:46,13:42:49,22:07:54 172,05:17:57,13:43:02,22:08:07 173,05:18:12,13:43:15,22:08:16 174,05:18:29,13:43:28,22:08:22 175,05:18:50,13:43:41,22:08:25 176,05:19:14,13:43:54,22:08:24 177,05:19:41,13:44:07,22:08:21 178,05:20:11,13:44:19,22:08:13 179,05:20:43,13:44:31,22:08:03 180,05:21:19,13:44:43,22:07:49 181,05:21:58,13:44:55,22:07:32 182,05:22:39,13:45:07,22:07:12 183,05:23:23,13:45:18,22:06:48 184,05:24:10,13:45:29,22:06:22 185,05:25:00,13:45:40,22:05:52 186,05:25:52,13:45:50,22:05:19 187,05:26:46,13:46:00,22:04:43 188,05:27:43,13:46:10,22:04:03 189,05:28:42,13:46:19,22:03:21 190,05:29:44,13:46:28,22:02:35 191,05:30:48,13:46:37,22:01:47 192,05:31:54,13:46:45,22:00:55 193,05:33:02,13:46:53,22:00:01 194,05:34:11,13:47:00,21:59:04 195,05:35:23,13:47:06,21:58:04 196,05:36:37,13:47:13,21:57:01 197,05:37:53,13:47:18,21:55:55 198,05:39:10,13:47:23,21:54:47 199,05:40:28,13:47:28,21:53:36 200,05:41:49,13:47:32,21:52:23 201,05:43:11,13:47:35,21:51:07 202,05:44:34,13:47:38,21:49:48 203,05:45:58,13:47:41,21:48:27 204,05:47:24,13:47:43,21:47:04 205,05:48:51,13:47:44,21:45:39 206,05:50:19,13:47:44,21:44:11 207,05:51:48,13:47:44,21:42:41 208,05:53:18,13:47:44,21:41:09 209,05:54:50,13:47:43,21:39:34 210,05:56:21,13:47:41,21:37:58 211,05:57:54,13:47:38,21:36:20 212,05:59:28,13:47:35,21:34:40 213,06:01:02,13:47:32,21:32:57 214,06:02:37,13:47:28,21:31:14 215,06:04:12,13:47:23,21:29:28 216,06:05:48,13:47:17,21:27:40 217,06:07:25,13:47:11,21:25:51 218,06:09:02,13:47:05,21:24:01 219,06:10:40,13:46:57,21:22:08 220,06:12:17,13:46:50,21:20:15 221,06:13:56,13:46:41,21:18:19 222,06:15:34,13:46:32,21:16:23 223,06:17:13,13:46:23,21:14:24 224,06:18:52,13:46:13,21:12:25 225,06:20:31,13:46:02,21:10:24 226,06:22:11,13:45:51,21:08:22 227,06:23:50,13:45:39,21:06:19 228,06:25:30,13:45:27,21:04:15 229,06:27:10,13:45:14,21:02:09 230,06:28:50,13:45:01,21:00:02 231,06:30:30,13:44:47,20:57:55 232,06:32:10,13:44:33,20:55:46 233,06:33:50,13:44:18,20:53:37 234,06:35:31,13:44:03,20:51:26 235,06:37:11,13:43:47,20:49:15 236,06:38:51,13:43:31,20:47:02 237,06:40:31,13:43:15,20:44:49 238,06:42:11,13:42:58,20:42:36 239,06:43:52,13:42:41,20:40:21 240,06:45:32,13:42:23,20:38:06 241,06:47:12,13:42:05,20:35:50 242,06:48:52,13:41:47,20:33:33 243,06:50:32,13:41:28,20:31:16 244,06:52:12,13:41:09,20:28:58 245,06:53:53,13:40:50,20:26:40 246,06:55:33,13:40:30,20:24:21 247,06:57:13,13:40:11,20:22:02 248,06:58:53,13:39:51,20:19:42 249,07:00:33,13:39:31,20:17:22 250,07:02:13,13:39:10,20:15:01 251,07:03:53,13:38:50,20:12:41 252,07:05:32,13:38:29,20:10:19 253,07:07:12,13:38:08,20:07:58 254,07:08:52,13:37:47,20:05:36 255,07:10:32,13:37:26,20:03:14 256,07:12:12,13:37:05,20:00:52 257,07:13:52,13:36:43,19:58:30 258,07:15:33,13:36:22,19:56:07 259,07:17:13,13:36:00,19:53:44 260,07:18:53,13:35:39,19:51:22 261,07:20:33,13:35:18,19:48:59 262,07:22:14,13:34:56,19:46:36 263,07:23:54,13:34:35,19:44:13 264,07:25:35,13:34:14,19:41:50 265,07:27:15,13:33:52,19:39:28 266,07:28:56,13:33:31,19:37:05 267,07:30:37,13:33:10,19:34:42 268,07:32:18,13:32:50,19:32:20 269,07:34:00,13:32:29,19:29:58 270,07:35:41,13:32:08,19:27:36 271,07:37:23,13:31:48,19:25:14 272,07:39:05,13:31:28,19:22:52 273,07:40:47,13:31:08,19:20:31 274,07:42:29,13:30:49,19:18:10 275,07:44:12,13:30:30,19:15:49 276,07:45:54,13:30:11,19:13:29 277,07:47:37,13:29:52,19:11:09 278,07:49:21,13:29:34,19:08:50 279,07:51:04,13:29:16,19:06:31 280,07:52:48,13:28:59,19:04:13 281,07:54:32,13:28:42,19:01:55 282,07:56:17,13:28:25,18:59:37 283,07:58:01,13:28:09,18:57:21 284,07:59:46,13:27:53,18:55:05 285,08:01:32,13:27:38,18:52:49 286,08:03:17,13:27:23,18:50:35 287,08:05:03,13:27:09,18:48:21 288,08:06:50,13:26:55,18:46:08 289,08:08:36,13:26:42,18:43:56 290,08:10:23,13:26:30,18:41:44 291,08:12:10,13:26:18,18:39:34 292,08:13:58,13:26:07,18:37:24 293,08:15:45,13:25:56,18:35:16 294,08:17:34,13:25:46,18:33:08 295,08:19:22,13:25:37,18:31:02 296,08:21:10,13:25:28,18:28:57 297,08:22:59,13:25:20,18:26:52 298,08:24:49,13:25:13,18:24:49 299,07:26:38,12:25:07,17:22:48 300,07:28:27,12:25:01,17:20:47 301,07:30:17,12:24:56,17:18:48 302,07:32:07,12:24:52,17:16:50 303,07:33:57,12:24:49,17:14:54 304,07:35:47,12:24:46,17:12:59 305,07:37:38,12:24:44,17:11:06 306,07:39:28,12:24:43,17:09:14 307,07:41:19,12:24:43,17:07:24 308,07:43:09,12:24:44,17:05:36 309,07:44:59,12:24:45,17:03:49 310,07:46:50,12:24:48,17:02:05 311,07:48:40,12:24:51,17:00:22 312,07:50:30,12:24:55,16:58:40 313,07:52:19,12:25:00,16:57:01 314,07:54:09,12:25:06,16:55:24 315,07:55:58,12:25:13,16:53:49 316,07:57:47,12:25:20,16:52:16 317,07:59:35,12:25:29,16:50:45 318,08:01:23,12:25:38,16:49:17 319,08:03:10,12:25:48,16:47:51 320,08:04:56,12:25:59,16:46:27 321,08:06:42,12:26:11,16:45:05 322,08:08:27,12:26:23,16:43:46 323,08:10:12,12:26:37,16:42:30 324,08:11:55,12:26:51,16:41:16 325,08:13:37,12:27:06,16:40:04 326,08:15:18,12:27:22,16:38:56 327,08:16:58,12:27:39,16:37:50 328,08:18:37,12:27:56,16:36:47 329,08:20:15,12:28:14,16:35:47 330,08:21:51,12:28:33,16:34:50 331,08:23:25,12:28:53,16:33:55 332,08:24:58,12:29:13,16:33:04 333,08:26:29,12:29:34,16:32:16 334,08:27:59,12:29:56,16:31:31 335,08:29:26,12:30:19,16:30:49 336,08:30:52,12:30:42,16:30:11 337,08:32:15,12:31:05,16:29:36 338,08:33:36,12:31:29,16:29:04 339,08:34:55,12:31:54,16:28:35 340,08:36:12,12:32:19,16:28:10 341,08:37:27,12:32:45,16:27:48 342,08:38:38,12:33:12,16:27:30 343,08:39:48,12:33:38,16:27:15 344,08:40:54,12:34:05,16:27:04 345,08:41:58,12:34:33,16:26:56 346,08:42:59,12:35:01,16:26:52 347,08:43:57,12:35:29,16:26:52 348,08:44:52,12:35:58,16:26:55 349,08:45:44,12:36:26,16:27:01 350,08:46:33,12:36:55,16:27:11 351,08:47:19,12:37:25,16:27:25 352,08:48:02,12:37:54,16:27:42 353,08:48:41,12:38:24,16:28:03 354,08:49:17,12:38:53,16:28:28 355,08:49:50,12:39:23,16:28:55 356,08:50:19,12:39:53,16:29:27 357,08:50:45,12:40:22,16:30:02 358,08:51:08,12:40:52,16:30:40 359,08:51:27,12:41:22,16:31:21 360,08:51:42,12:41:51,16:32:06 361,08:51:54,12:42:21,16:32:54 362,08:52:02,12:42:50,16:33:46 363,08:52:07,12:43:19,16:34:40 364,08:52:08,12:43:48,16:35:38 365,08:52:06,12:44:17,16:36:38 366,08:51:58,12:44:52,16:37:58 diff --git a/static/twilight_2018.csv b/static/twilight_2018.csv old mode 100644 new mode 100755 index 1492e6d..8b943c6 --- a/static/twilight_2018.csv +++ b/static/twilight_2018.csv @@ -1 +1,367 @@ -day,rise,noon,set 1,08:52:00,12:44:45,16:37:42 2,08:51:51,12:45:13,16:38:48 3,08:51:38,12:45:41,16:39:57 4,08:51:22,12:46:08,16:41:09 5,08:51:02,12:46:35,16:42:24 6,08:50:39,12:47:01,16:43:41 7,08:50:13,12:47:27,16:45:00 8,08:49:43,12:47:53,16:46:22 9,08:49:10,12:48:18,16:47:46 10,08:48:33,12:48:42,16:49:13 11,08:47:54,12:49:06,16:50:41 12,08:47:11,12:49:30,16:52:12 13,08:46:25,12:49:52,16:53:44 14,08:45:36,12:50:14,16:55:18 15,08:44:43,12:50:36,16:56:54 16,08:43:48,12:50:57,16:58:32 17,08:42:50,12:51:17,17:00:11 18,08:41:49,12:51:36,17:01:52 19,08:40:45,12:51:55,17:03:34 20,08:39:39,12:52:13,17:05:17 21,08:38:30,12:52:30,17:07:02 22,08:37:18,12:52:46,17:08:47 23,08:36:03,12:53:02,17:10:34 24,08:34:46,12:53:17,17:12:22 25,08:33:26,12:53:31,17:14:10 26,08:32:04,12:53:44,17:16:00 27,08:30:40,12:53:57,17:17:50 28,08:29:13,12:54:08,17:19:41 29,08:27:44,12:54:19,17:21:32 30,08:26:13,12:54:29,17:23:24 31,08:24:40,12:54:39,17:25:17 32,08:23:04,12:54:47,17:27:09 33,08:21:27,12:54:55,17:29:03 34,08:19:47,12:55:01,17:30:56 35,08:18:06,12:55:07,17:32:50 36,08:16:23,12:55:12,17:34:44 37,08:14:38,12:55:17,17:36:38 38,08:12:51,12:55:20,17:38:33 39,08:11:03,12:55:23,17:40:27 40,08:09:13,12:55:25,17:42:22 41,08:07:21,12:55:26,17:44:16 42,08:05:28,12:55:26,17:46:11 43,08:03:33,12:55:26,17:48:05 44,08:01:37,12:55:25,17:49:59 45,07:59:40,12:55:23,17:51:53 46,07:57:41,12:55:20,17:53:47 47,07:55:41,12:55:17,17:55:41 48,07:53:39,12:55:12,17:57:35 49,07:51:36,12:55:08,17:59:29 50,07:49:33,12:55:02,18:01:22 51,07:47:28,12:54:56,18:03:15 52,07:45:22,12:54:49,18:05:08 53,07:43:14,12:54:41,18:07:00 54,07:41:06,12:54:33,18:08:52 55,07:38:57,12:54:25,18:10:44 56,07:36:47,12:54:15,18:12:36 57,07:34:37,12:54:05,18:14:28 58,07:32:25,12:53:55,18:16:19 59,07:30:12,12:53:44,18:18:10 60,07:27:59,12:53:32,18:20:00 61,07:25:45,12:53:20,18:21:50 62,07:23:31,12:53:08,18:23:40 63,07:21:15,12:52:55,18:25:30 64,07:18:59,12:52:41,18:27:20 65,07:16:43,12:52:27,18:29:09 66,07:14:26,12:52:13,18:30:58 67,07:12:08,12:51:58,18:32:46 68,07:09:50,12:51:43,18:34:35 69,07:07:32,12:51:28,18:36:23 70,07:05:13,12:51:12,18:38:11 71,07:02:54,12:50:56,18:39:58 72,07:00:34,12:50:40,18:41:46 73,06:58:14,12:50:23,18:43:33 74,06:55:54,12:50:07,18:45:20 75,06:53:33,12:49:50,18:47:07 76,06:51:13,12:49:32,18:48:53 77,06:48:52,12:49:15,18:50:40 78,06:46:31,12:48:57,18:52:26 79,06:44:09,12:48:40,18:54:12 80,06:41:48,12:48:22,18:55:58 81,06:39:27,12:48:04,18:57:44 82,06:37:05,12:47:46,18:59:30 83,06:34:44,12:47:28,19:01:15 84,06:32:23,12:47:10,19:03:01 85,06:30:01,12:46:52,19:04:46 86,06:27:40,12:46:34,19:06:32 87,06:25:19,12:46:15,19:08:17 88,06:22:58,12:45:57,19:10:02 89,06:20:37,12:45:39,19:11:47 90,07:18:16,13:45:21,20:13:32 91,07:15:56,13:45:04,20:15:18 92,07:13:36,13:44:46,20:17:03 93,07:11:16,13:44:28,20:18:48 94,07:08:56,13:44:11,20:20:33 95,07:06:37,13:43:54,20:22:18 96,07:04:18,13:43:37,20:24:03 97,07:02:00,13:43:20,20:25:47 98,06:59:42,13:43:03,20:27:32 99,06:57:24,13:42:47,20:29:17 100,06:55:07,13:42:31,20:31:02 101,06:52:51,13:42:15,20:32:47 102,06:50:35,13:41:59,20:34:32 103,06:48:20,13:41:44,20:36:17 104,06:46:05,13:41:29,20:38:02 105,06:43:51,13:41:14,20:39:47 106,06:41:38,13:41:00,20:41:32 107,06:39:25,13:40:46,20:43:17 108,06:37:13,13:40:33,20:45:02 109,06:35:03,13:40:20,20:46:47 110,06:32:52,13:40:07,20:48:31 111,06:30:43,13:39:55,20:50:16 112,06:28:35,13:39:43,20:52:01 113,06:26:28,13:39:32,20:53:45 114,06:24:22,13:39:21,20:55:30 115,06:22:16,13:39:10,20:57:14 116,06:20:12,13:39:01,20:58:58 117,06:18:09,13:38:51,21:00:42 118,06:16:07,13:38:42,21:02:26 119,06:14:07,13:38:34,21:04:09 120,06:12:08,13:38:26,21:05:53 121,06:10:10,13:38:18,21:07:36 122,06:08:13,13:38:12,21:09:18 123,06:06:18,13:38:05,21:11:01 124,06:04:24,13:38:00,21:12:43 125,06:02:32,13:37:54,21:14:24 126,06:00:41,13:37:50,21:16:05 127,05:58:52,13:37:46,21:17:46 128,05:57:04,13:37:42,21:19:26 129,05:55:18,13:37:39,21:21:05 130,05:53:34,13:37:37,21:22:44 131,05:51:52,13:37:35,21:24:22 132,05:50:12,13:37:34,21:26:00 133,05:48:33,13:37:33,21:27:36 134,05:46:57,13:37:33,21:29:12 135,05:45:22,13:37:34,21:30:47 136,05:43:49,13:37:35,21:32:20 137,05:42:19,13:37:36,21:33:53 138,05:40:51,13:37:38,21:35:25 139,05:39:25,13:37:41,21:36:55 140,05:38:01,13:37:44,21:38:25 141,05:36:40,13:37:48,21:39:53 142,05:35:20,13:37:52,21:41:19 143,05:34:04,13:37:57,21:42:44 144,05:32:50,13:38:03,21:44:08 145,05:31:38,13:38:09,21:45:30 146,05:30:29,13:38:15,21:46:50 147,05:29:23,13:38:22,21:48:09 148,05:28:19,13:38:29,21:49:26 149,05:27:18,13:38:37,21:50:41 150,05:26:20,13:38:45,21:51:54 151,05:25:24,13:38:54,21:53:05 152,05:24:32,13:39:03,21:54:14 153,05:23:42,13:39:12,21:55:20 154,05:22:56,13:39:22,21:56:25 155,05:22:12,13:39:32,21:57:27 156,05:21:32,13:39:42,21:58:27 157,05:20:54,13:39:53,21:59:24 158,05:20:20,13:40:04,22:00:19 159,05:19:49,13:40:16,22:01:11 160,05:19:20,13:40:27,22:02:00 161,05:18:55,13:40:39,22:02:47 162,05:18:34,13:40:51,22:03:31 163,05:18:15,13:41:04,22:04:12 164,05:18:00,13:41:16,22:04:50 165,05:17:48,13:41:29,22:05:25 166,05:17:39,13:41:41,22:05:57 167,05:17:33,13:41:54,22:06:26 168,05:17:31,13:42:07,22:06:52 169,05:17:32,13:42:20,22:07:15 170,05:17:36,13:42:33,22:07:35 171,05:17:44,13:42:46,22:07:51 172,05:17:54,13:42:59,22:08:04 173,05:18:08,13:43:12,22:08:15 174,05:18:25,13:43:25,22:08:21 175,05:18:45,13:43:38,22:08:25 176,05:19:08,13:43:51,22:08:25 177,05:19:34,13:44:04,22:08:22 178,05:20:03,13:44:16,22:08:16 179,05:20:35,13:44:28,22:08:06 180,05:21:10,13:44:41,22:07:53 181,05:21:48,13:44:53,22:07:37 182,05:22:29,13:45:04,22:07:18 183,05:23:12,13:45:16,22:06:55 184,05:23:58,13:45:27,22:06:29 185,05:24:47,13:45:38,22:06:00 186,05:25:39,13:45:48,22:05:27 187,05:26:33,13:45:58,22:04:52 188,05:27:29,13:46:08,22:04:13 189,05:28:28,13:46:17,22:03:32 190,05:29:29,13:46:26,22:02:47 191,05:30:32,13:46:35,22:01:59 192,05:31:37,13:46:43,22:01:08 193,05:32:45,13:46:51,22:00:15 194,05:33:54,13:46:58,21:59:18 195,05:35:06,13:47:05,21:58:19 196,05:36:19,13:47:11,21:57:17 197,05:37:34,13:47:17,21:56:12 198,05:38:51,13:47:22,21:55:04 199,05:40:09,13:47:27,21:53:54 200,05:41:29,13:47:31,21:52:41 201,05:42:51,13:47:35,21:51:26 202,05:44:13,13:47:38,21:50:08 203,05:45:38,13:47:40,21:48:48 204,05:47:03,13:47:42,21:47:25 205,05:48:30,13:47:44,21:46:00 206,05:49:58,13:47:44,21:44:33 207,05:51:27,13:47:45,21:43:03 208,05:52:56,13:47:44,21:41:31 209,05:54:27,13:47:43,21:39:58 210,05:55:59,13:47:41,21:38:22 211,05:57:32,13:47:39,21:36:44 212,05:59:05,13:47:36,21:35:04 213,06:00:39,13:47:33,21:33:23 214,06:02:14,13:47:29,21:31:39 215,06:03:49,13:47:24,21:29:54 216,06:05:25,13:47:19,21:28:07 217,06:07:02,13:47:13,21:26:18 218,06:08:38,13:47:06,21:24:28 219,06:10:16,13:46:59,21:22:36 220,06:11:54,13:46:52,21:20:43 221,06:13:32,13:46:43,21:18:48 222,06:15:10,13:46:35,21:16:51 223,06:16:49,13:46:25,21:14:53 224,06:18:28,13:46:15,21:12:54 225,06:20:07,13:46:05,21:10:54 226,06:21:47,13:45:54,21:08:52 227,06:23:26,13:45:42,21:06:49 228,06:25:06,13:45:30,21:04:45 229,06:26:46,13:45:17,21:02:40 230,06:28:26,13:45:04,21:00:34 231,06:30:06,13:44:50,20:58:26 232,06:31:46,13:44:36,20:56:18 233,06:33:26,13:44:22,20:54:08 234,06:35:06,13:44:07,20:51:58 235,06:36:46,13:43:51,20:49:47 236,06:38:27,13:43:35,20:47:35 237,06:40:07,13:43:19,20:45:22 238,06:41:47,13:43:02,20:43:08 239,06:43:27,13:42:45,20:40:54 240,06:45:08,13:42:27,20:38:39 241,06:46:48,13:42:10,20:36:23 242,06:48:28,13:41:51,20:34:07 243,06:50:08,13:41:33,20:31:49 244,06:51:48,13:41:14,20:29:32 245,06:53:28,13:40:55,20:27:14 246,06:55:08,13:40:35,20:24:55 247,06:56:48,13:40:16,20:22:36 248,06:58:28,13:39:56,20:20:16 249,07:00:08,13:39:36,20:17:56 250,07:01:48,13:39:15,20:15:36 251,07:03:28,13:38:55,20:13:15 252,07:05:08,13:38:34,20:10:54 253,07:06:48,13:38:13,20:08:32 254,07:08:28,13:37:52,20:06:11 255,07:10:08,13:37:31,20:03:49 256,07:11:48,13:37:10,20:01:27 257,07:13:28,13:36:48,19:59:04 258,07:15:08,13:36:27,19:56:42 259,07:16:48,13:36:06,19:54:19 260,07:18:29,13:35:44,19:51:56 261,07:20:09,13:35:23,19:49:34 262,07:21:49,13:35:01,19:47:11 263,07:23:30,13:34:40,19:44:48 264,07:25:10,13:34:19,19:42:25 265,07:26:51,13:33:58,19:40:02 266,07:28:32,13:33:37,19:37:40 267,07:30:13,13:33:16,19:35:17 268,07:31:54,13:32:55,19:32:55 269,07:33:35,13:32:34,19:30:32 270,07:35:17,13:32:13,19:28:10 271,07:36:58,13:31:53,19:25:48 272,07:38:40,13:31:33,19:23:27 273,07:40:22,13:31:13,19:21:05 274,07:42:04,13:30:54,19:18:44 275,07:43:47,13:30:34,19:16:23 276,07:45:29,13:30:15,19:14:03 277,07:47:12,13:29:57,19:11:43 278,07:48:56,13:29:38,19:09:24 279,07:50:39,13:29:20,19:07:05 280,07:52:23,13:29:03,19:04:46 281,07:54:07,13:28:46,19:02:28 282,07:55:51,13:28:29,19:00:11 283,07:57:36,13:28:13,18:57:54 284,07:59:21,13:27:57,18:55:38 285,08:01:06,13:27:41,18:53:22 286,08:02:52,13:27:27,18:51:07 287,08:04:38,13:27:12,18:48:53 288,08:06:24,13:26:58,18:46:40 289,08:08:10,13:26:45,18:44:28 290,08:09:57,13:26:33,18:42:16 291,08:11:44,13:26:21,18:40:05 292,08:13:31,13:26:09,18:37:56 293,08:15:19,13:25:58,18:35:47 294,08:17:07,13:25:48,18:33:39 295,08:18:55,13:25:39,18:31:32 296,08:20:44,13:25:30,18:29:27 297,08:22:33,13:25:22,18:27:22 298,08:24:22,13:25:15,18:25:19 299,07:26:11,12:25:08,17:23:17 300,07:28:01,12:25:02,17:21:16 301,07:29:51,12:24:57,17:19:17 302,07:31:40,12:24:53,17:17:19 303,07:33:30,12:24:49,17:15:22 304,07:35:21,12:24:46,17:13:27 305,07:37:11,12:24:44,17:11:33 306,07:39:01,12:24:43,17:09:41 307,07:40:52,12:24:43,17:07:51 308,07:42:42,12:24:44,17:06:02 309,07:44:32,12:24:45,17:04:15 310,07:46:23,12:24:47,17:02:30 311,07:48:13,12:24:50,17:00:46 312,07:50:03,12:24:54,16:59:05 313,07:51:53,12:24:59,16:57:25 314,07:53:42,12:25:04,16:55:47 315,07:55:31,12:25:11,16:54:12 316,07:57:20,12:25:18,16:52:38 317,07:59:09,12:25:26,16:51:07 318,08:00:57,12:25:35,16:49:38 319,08:02:44,12:25:45,16:48:11 320,08:04:31,12:25:56,16:46:47 321,08:06:17,12:26:08,16:45:24 322,08:08:02,12:26:20,16:44:05 323,08:09:46,12:26:33,16:42:48 324,08:11:30,12:26:47,16:41:33 325,08:13:12,12:27:02,16:40:21 326,08:14:54,12:27:18,16:39:12 327,08:16:34,12:27:34,16:38:05 328,08:18:13,12:27:52,16:37:02 329,08:19:51,12:28:10,16:36:01 330,08:21:27,12:28:28,16:35:03 331,08:23:02,12:28:48,16:34:08 332,08:24:36,12:29:08,16:33:16 333,08:26:07,12:29:29,16:32:27 334,08:27:37,12:29:51,16:31:42 335,08:29:05,12:30:13,16:30:59 336,08:30:31,12:30:36,16:30:20 337,08:31:55,12:30:59,16:29:44 338,08:33:17,12:31:23,16:29:11 339,08:34:37,12:31:48,16:28:42 340,08:35:54,12:32:13,16:28:16 341,08:37:09,12:32:39,16:27:53 342,08:38:21,12:33:05,16:27:34 343,08:39:31,12:33:32,16:27:18 344,08:40:38,12:33:59,16:27:06 345,08:41:43,12:34:26,16:26:58 346,08:42:45,12:34:54,16:26:53 347,08:43:43,12:35:22,16:26:51 348,08:44:39,12:35:50,16:26:53 349,08:45:32,12:36:19,16:26:59 350,08:46:22,12:36:48,16:27:08 351,08:47:09,12:37:17,16:27:21 352,08:47:52,12:37:47,16:27:37 353,08:48:32,12:38:16,16:27:57 354,08:49:09,12:38:46,16:28:21 355,08:49:43,12:39:16,16:28:48 356,08:50:13,12:39:45,16:29:18 357,08:50:39,12:40:15,16:29:52 358,08:51:03,12:40:45,16:30:30 359,08:51:22,12:41:14,16:31:10 360,08:51:39,12:41:44,16:31:55 361,08:51:51,12:42:14,16:32:42 362,08:52:01,12:42:43,16:33:32 363,08:52:06,12:43:12,16:34:26 364,08:52:08,12:43:41,16:35:23 365,08:52:07,12:44:10,16:36:23 366,08:52:00,12:44:45,16:37:42 +day,rise,noon,set +1,08:52:00,12:44:45,16:37:42 +2,08:51:51,12:45:13,16:38:48 +3,08:51:38,12:45:41,16:39:57 +4,08:51:22,12:46:08,16:41:09 +5,08:51:02,12:46:35,16:42:24 +6,08:50:39,12:47:01,16:43:41 +7,08:50:13,12:47:27,16:45:00 +8,08:49:43,12:47:53,16:46:22 +9,08:49:10,12:48:18,16:47:46 +10,08:48:33,12:48:42,16:49:13 +11,08:47:54,12:49:06,16:50:41 +12,08:47:11,12:49:30,16:52:12 +13,08:46:25,12:49:52,16:53:44 +14,08:45:36,12:50:14,16:55:18 +15,08:44:43,12:50:36,16:56:54 +16,08:43:48,12:50:57,16:58:32 +17,08:42:50,12:51:17,17:00:11 +18,08:41:49,12:51:36,17:01:52 +19,08:40:45,12:51:55,17:03:34 +20,08:39:39,12:52:13,17:05:17 +21,08:38:30,12:52:30,17:07:02 +22,08:37:18,12:52:46,17:08:47 +23,08:36:03,12:53:02,17:10:34 +24,08:34:46,12:53:17,17:12:22 +25,08:33:26,12:53:31,17:14:10 +26,08:32:04,12:53:44,17:16:00 +27,08:30:40,12:53:57,17:17:50 +28,08:29:13,12:54:08,17:19:41 +29,08:27:44,12:54:19,17:21:32 +30,08:26:13,12:54:29,17:23:24 +31,08:24:40,12:54:39,17:25:17 +32,08:23:04,12:54:47,17:27:09 +33,08:21:27,12:54:55,17:29:03 +34,08:19:47,12:55:01,17:30:56 +35,08:18:06,12:55:07,17:32:50 +36,08:16:23,12:55:12,17:34:44 +37,08:14:38,12:55:17,17:36:38 +38,08:12:51,12:55:20,17:38:33 +39,08:11:03,12:55:23,17:40:27 +40,08:09:13,12:55:25,17:42:22 +41,08:07:21,12:55:26,17:44:16 +42,08:05:28,12:55:26,17:46:11 +43,08:03:33,12:55:26,17:48:05 +44,08:01:37,12:55:25,17:49:59 +45,07:59:40,12:55:23,17:51:53 +46,07:57:41,12:55:20,17:53:47 +47,07:55:41,12:55:17,17:55:41 +48,07:53:39,12:55:12,17:57:35 +49,07:51:36,12:55:08,17:59:29 +50,07:49:33,12:55:02,18:01:22 +51,07:47:28,12:54:56,18:03:15 +52,07:45:22,12:54:49,18:05:08 +53,07:43:14,12:54:41,18:07:00 +54,07:41:06,12:54:33,18:08:52 +55,07:38:57,12:54:25,18:10:44 +56,07:36:47,12:54:15,18:12:36 +57,07:34:37,12:54:05,18:14:28 +58,07:32:25,12:53:55,18:16:19 +59,07:30:12,12:53:44,18:18:10 +60,07:27:59,12:53:32,18:20:00 +61,07:25:45,12:53:20,18:21:50 +62,07:23:31,12:53:08,18:23:40 +63,07:21:15,12:52:55,18:25:30 +64,07:18:59,12:52:41,18:27:20 +65,07:16:43,12:52:27,18:29:09 +66,07:14:26,12:52:13,18:30:58 +67,07:12:08,12:51:58,18:32:46 +68,07:09:50,12:51:43,18:34:35 +69,07:07:32,12:51:28,18:36:23 +70,07:05:13,12:51:12,18:38:11 +71,07:02:54,12:50:56,18:39:58 +72,07:00:34,12:50:40,18:41:46 +73,06:58:14,12:50:23,18:43:33 +74,06:55:54,12:50:07,18:45:20 +75,06:53:33,12:49:50,18:47:07 +76,06:51:13,12:49:32,18:48:53 +77,06:48:52,12:49:15,18:50:40 +78,06:46:31,12:48:57,18:52:26 +79,06:44:09,12:48:40,18:54:12 +80,06:41:48,12:48:22,18:55:58 +81,06:39:27,12:48:04,18:57:44 +82,06:37:05,12:47:46,18:59:30 +83,06:34:44,12:47:28,19:01:15 +84,06:32:23,12:47:10,19:03:01 +85,06:30:01,12:46:52,19:04:46 +86,06:27:40,12:46:34,19:06:32 +87,06:25:19,12:46:15,19:08:17 +88,06:22:58,12:45:57,19:10:02 +89,06:20:37,12:45:39,19:11:47 +90,07:18:16,13:45:21,20:13:32 +91,07:15:56,13:45:04,20:15:18 +92,07:13:36,13:44:46,20:17:03 +93,07:11:16,13:44:28,20:18:48 +94,07:08:56,13:44:11,20:20:33 +95,07:06:37,13:43:54,20:22:18 +96,07:04:18,13:43:37,20:24:03 +97,07:02:00,13:43:20,20:25:47 +98,06:59:42,13:43:03,20:27:32 +99,06:57:24,13:42:47,20:29:17 +100,06:55:07,13:42:31,20:31:02 +101,06:52:51,13:42:15,20:32:47 +102,06:50:35,13:41:59,20:34:32 +103,06:48:20,13:41:44,20:36:17 +104,06:46:05,13:41:29,20:38:02 +105,06:43:51,13:41:14,20:39:47 +106,06:41:38,13:41:00,20:41:32 +107,06:39:25,13:40:46,20:43:17 +108,06:37:13,13:40:33,20:45:02 +109,06:35:03,13:40:20,20:46:47 +110,06:32:52,13:40:07,20:48:31 +111,06:30:43,13:39:55,20:50:16 +112,06:28:35,13:39:43,20:52:01 +113,06:26:28,13:39:32,20:53:45 +114,06:24:22,13:39:21,20:55:30 +115,06:22:16,13:39:10,20:57:14 +116,06:20:12,13:39:01,20:58:58 +117,06:18:09,13:38:51,21:00:42 +118,06:16:07,13:38:42,21:02:26 +119,06:14:07,13:38:34,21:04:09 +120,06:12:08,13:38:26,21:05:53 +121,06:10:10,13:38:18,21:07:36 +122,06:08:13,13:38:12,21:09:18 +123,06:06:18,13:38:05,21:11:01 +124,06:04:24,13:38:00,21:12:43 +125,06:02:32,13:37:54,21:14:24 +126,06:00:41,13:37:50,21:16:05 +127,05:58:52,13:37:46,21:17:46 +128,05:57:04,13:37:42,21:19:26 +129,05:55:18,13:37:39,21:21:05 +130,05:53:34,13:37:37,21:22:44 +131,05:51:52,13:37:35,21:24:22 +132,05:50:12,13:37:34,21:26:00 +133,05:48:33,13:37:33,21:27:36 +134,05:46:57,13:37:33,21:29:12 +135,05:45:22,13:37:34,21:30:47 +136,05:43:49,13:37:35,21:32:20 +137,05:42:19,13:37:36,21:33:53 +138,05:40:51,13:37:38,21:35:25 +139,05:39:25,13:37:41,21:36:55 +140,05:38:01,13:37:44,21:38:25 +141,05:36:40,13:37:48,21:39:53 +142,05:35:20,13:37:52,21:41:19 +143,05:34:04,13:37:57,21:42:44 +144,05:32:50,13:38:03,21:44:08 +145,05:31:38,13:38:09,21:45:30 +146,05:30:29,13:38:15,21:46:50 +147,05:29:23,13:38:22,21:48:09 +148,05:28:19,13:38:29,21:49:26 +149,05:27:18,13:38:37,21:50:41 +150,05:26:20,13:38:45,21:51:54 +151,05:25:24,13:38:54,21:53:05 +152,05:24:32,13:39:03,21:54:14 +153,05:23:42,13:39:12,21:55:20 +154,05:22:56,13:39:22,21:56:25 +155,05:22:12,13:39:32,21:57:27 +156,05:21:32,13:39:42,21:58:27 +157,05:20:54,13:39:53,21:59:24 +158,05:20:20,13:40:04,22:00:19 +159,05:19:49,13:40:16,22:01:11 +160,05:19:20,13:40:27,22:02:00 +161,05:18:55,13:40:39,22:02:47 +162,05:18:34,13:40:51,22:03:31 +163,05:18:15,13:41:04,22:04:12 +164,05:18:00,13:41:16,22:04:50 +165,05:17:48,13:41:29,22:05:25 +166,05:17:39,13:41:41,22:05:57 +167,05:17:33,13:41:54,22:06:26 +168,05:17:31,13:42:07,22:06:52 +169,05:17:32,13:42:20,22:07:15 +170,05:17:36,13:42:33,22:07:35 +171,05:17:44,13:42:46,22:07:51 +172,05:17:54,13:42:59,22:08:04 +173,05:18:08,13:43:12,22:08:15 +174,05:18:25,13:43:25,22:08:21 +175,05:18:45,13:43:38,22:08:25 +176,05:19:08,13:43:51,22:08:25 +177,05:19:34,13:44:04,22:08:22 +178,05:20:03,13:44:16,22:08:16 +179,05:20:35,13:44:28,22:08:06 +180,05:21:10,13:44:41,22:07:53 +181,05:21:48,13:44:53,22:07:37 +182,05:22:29,13:45:04,22:07:18 +183,05:23:12,13:45:16,22:06:55 +184,05:23:58,13:45:27,22:06:29 +185,05:24:47,13:45:38,22:06:00 +186,05:25:39,13:45:48,22:05:27 +187,05:26:33,13:45:58,22:04:52 +188,05:27:29,13:46:08,22:04:13 +189,05:28:28,13:46:17,22:03:32 +190,05:29:29,13:46:26,22:02:47 +191,05:30:32,13:46:35,22:01:59 +192,05:31:37,13:46:43,22:01:08 +193,05:32:45,13:46:51,22:00:15 +194,05:33:54,13:46:58,21:59:18 +195,05:35:06,13:47:05,21:58:19 +196,05:36:19,13:47:11,21:57:17 +197,05:37:34,13:47:17,21:56:12 +198,05:38:51,13:47:22,21:55:04 +199,05:40:09,13:47:27,21:53:54 +200,05:41:29,13:47:31,21:52:41 +201,05:42:51,13:47:35,21:51:26 +202,05:44:13,13:47:38,21:50:08 +203,05:45:38,13:47:40,21:48:48 +204,05:47:03,13:47:42,21:47:25 +205,05:48:30,13:47:44,21:46:00 +206,05:49:58,13:47:44,21:44:33 +207,05:51:27,13:47:45,21:43:03 +208,05:52:56,13:47:44,21:41:31 +209,05:54:27,13:47:43,21:39:58 +210,05:55:59,13:47:41,21:38:22 +211,05:57:32,13:47:39,21:36:44 +212,05:59:05,13:47:36,21:35:04 +213,06:00:39,13:47:33,21:33:23 +214,06:02:14,13:47:29,21:31:39 +215,06:03:49,13:47:24,21:29:54 +216,06:05:25,13:47:19,21:28:07 +217,06:07:02,13:47:13,21:26:18 +218,06:08:38,13:47:06,21:24:28 +219,06:10:16,13:46:59,21:22:36 +220,06:11:54,13:46:52,21:20:43 +221,06:13:32,13:46:43,21:18:48 +222,06:15:10,13:46:35,21:16:51 +223,06:16:49,13:46:25,21:14:53 +224,06:18:28,13:46:15,21:12:54 +225,06:20:07,13:46:05,21:10:54 +226,06:21:47,13:45:54,21:08:52 +227,06:23:26,13:45:42,21:06:49 +228,06:25:06,13:45:30,21:04:45 +229,06:26:46,13:45:17,21:02:40 +230,06:28:26,13:45:04,21:00:34 +231,06:30:06,13:44:50,20:58:26 +232,06:31:46,13:44:36,20:56:18 +233,06:33:26,13:44:22,20:54:08 +234,06:35:06,13:44:07,20:51:58 +235,06:36:46,13:43:51,20:49:47 +236,06:38:27,13:43:35,20:47:35 +237,06:40:07,13:43:19,20:45:22 +238,06:41:47,13:43:02,20:43:08 +239,06:43:27,13:42:45,20:40:54 +240,06:45:08,13:42:27,20:38:39 +241,06:46:48,13:42:10,20:36:23 +242,06:48:28,13:41:51,20:34:07 +243,06:50:08,13:41:33,20:31:49 +244,06:51:48,13:41:14,20:29:32 +245,06:53:28,13:40:55,20:27:14 +246,06:55:08,13:40:35,20:24:55 +247,06:56:48,13:40:16,20:22:36 +248,06:58:28,13:39:56,20:20:16 +249,07:00:08,13:39:36,20:17:56 +250,07:01:48,13:39:15,20:15:36 +251,07:03:28,13:38:55,20:13:15 +252,07:05:08,13:38:34,20:10:54 +253,07:06:48,13:38:13,20:08:32 +254,07:08:28,13:37:52,20:06:11 +255,07:10:08,13:37:31,20:03:49 +256,07:11:48,13:37:10,20:01:27 +257,07:13:28,13:36:48,19:59:04 +258,07:15:08,13:36:27,19:56:42 +259,07:16:48,13:36:06,19:54:19 +260,07:18:29,13:35:44,19:51:56 +261,07:20:09,13:35:23,19:49:34 +262,07:21:49,13:35:01,19:47:11 +263,07:23:30,13:34:40,19:44:48 +264,07:25:10,13:34:19,19:42:25 +265,07:26:51,13:33:58,19:40:02 +266,07:28:32,13:33:37,19:37:40 +267,07:30:13,13:33:16,19:35:17 +268,07:31:54,13:32:55,19:32:55 +269,07:33:35,13:32:34,19:30:32 +270,07:35:17,13:32:13,19:28:10 +271,07:36:58,13:31:53,19:25:48 +272,07:38:40,13:31:33,19:23:27 +273,07:40:22,13:31:13,19:21:05 +274,07:42:04,13:30:54,19:18:44 +275,07:43:47,13:30:34,19:16:23 +276,07:45:29,13:30:15,19:14:03 +277,07:47:12,13:29:57,19:11:43 +278,07:48:56,13:29:38,19:09:24 +279,07:50:39,13:29:20,19:07:05 +280,07:52:23,13:29:03,19:04:46 +281,07:54:07,13:28:46,19:02:28 +282,07:55:51,13:28:29,19:00:11 +283,07:57:36,13:28:13,18:57:54 +284,07:59:21,13:27:57,18:55:38 +285,08:01:06,13:27:41,18:53:22 +286,08:02:52,13:27:27,18:51:07 +287,08:04:38,13:27:12,18:48:53 +288,08:06:24,13:26:58,18:46:40 +289,08:08:10,13:26:45,18:44:28 +290,08:09:57,13:26:33,18:42:16 +291,08:11:44,13:26:21,18:40:05 +292,08:13:31,13:26:09,18:37:56 +293,08:15:19,13:25:58,18:35:47 +294,08:17:07,13:25:48,18:33:39 +295,08:18:55,13:25:39,18:31:32 +296,08:20:44,13:25:30,18:29:27 +297,08:22:33,13:25:22,18:27:22 +298,08:24:22,13:25:15,18:25:19 +299,07:26:11,12:25:08,17:23:17 +300,07:28:01,12:25:02,17:21:16 +301,07:29:51,12:24:57,17:19:17 +302,07:31:40,12:24:53,17:17:19 +303,07:33:30,12:24:49,17:15:22 +304,07:35:21,12:24:46,17:13:27 +305,07:37:11,12:24:44,17:11:33 +306,07:39:01,12:24:43,17:09:41 +307,07:40:52,12:24:43,17:07:51 +308,07:42:42,12:24:44,17:06:02 +309,07:44:32,12:24:45,17:04:15 +310,07:46:23,12:24:47,17:02:30 +311,07:48:13,12:24:50,17:00:46 +312,07:50:03,12:24:54,16:59:05 +313,07:51:53,12:24:59,16:57:25 +314,07:53:42,12:25:04,16:55:47 +315,07:55:31,12:25:11,16:54:12 +316,07:57:20,12:25:18,16:52:38 +317,07:59:09,12:25:26,16:51:07 +318,08:00:57,12:25:35,16:49:38 +319,08:02:44,12:25:45,16:48:11 +320,08:04:31,12:25:56,16:46:47 +321,08:06:17,12:26:08,16:45:24 +322,08:08:02,12:26:20,16:44:05 +323,08:09:46,12:26:33,16:42:48 +324,08:11:30,12:26:47,16:41:33 +325,08:13:12,12:27:02,16:40:21 +326,08:14:54,12:27:18,16:39:12 +327,08:16:34,12:27:34,16:38:05 +328,08:18:13,12:27:52,16:37:02 +329,08:19:51,12:28:10,16:36:01 +330,08:21:27,12:28:28,16:35:03 +331,08:23:02,12:28:48,16:34:08 +332,08:24:36,12:29:08,16:33:16 +333,08:26:07,12:29:29,16:32:27 +334,08:27:37,12:29:51,16:31:42 +335,08:29:05,12:30:13,16:30:59 +336,08:30:31,12:30:36,16:30:20 +337,08:31:55,12:30:59,16:29:44 +338,08:33:17,12:31:23,16:29:11 +339,08:34:37,12:31:48,16:28:42 +340,08:35:54,12:32:13,16:28:16 +341,08:37:09,12:32:39,16:27:53 +342,08:38:21,12:33:05,16:27:34 +343,08:39:31,12:33:32,16:27:18 +344,08:40:38,12:33:59,16:27:06 +345,08:41:43,12:34:26,16:26:58 +346,08:42:45,12:34:54,16:26:53 +347,08:43:43,12:35:22,16:26:51 +348,08:44:39,12:35:50,16:26:53 +349,08:45:32,12:36:19,16:26:59 +350,08:46:22,12:36:48,16:27:08 +351,08:47:09,12:37:17,16:27:21 +352,08:47:52,12:37:47,16:27:37 +353,08:48:32,12:38:16,16:27:57 +354,08:49:09,12:38:46,16:28:21 +355,08:49:43,12:39:16,16:28:48 +356,08:50:13,12:39:45,16:29:18 +357,08:50:39,12:40:15,16:29:52 +358,08:51:03,12:40:45,16:30:30 +359,08:51:22,12:41:14,16:31:10 +360,08:51:39,12:41:44,16:31:55 +361,08:51:51,12:42:14,16:32:42 +362,08:52:01,12:42:43,16:33:32 +363,08:52:06,12:43:12,16:34:26 +364,08:52:08,12:43:41,16:35:23 +365,08:52:07,12:44:10,16:36:23 +366,08:52:00,12:44:45,16:37:42 diff --git a/static/twilight_2019.csv b/static/twilight_2019.csv old mode 100644 new mode 100755 index f31c4ef..59d8dc8 --- a/static/twilight_2019.csv +++ b/static/twilight_2019.csv @@ -1 +1,367 @@ -day,rise,noon,set 1,08:52:02,12:44:38,16:37:26 2,08:51:54,12:45:06,16:38:31 3,08:51:42,12:45:34,16:39:40 4,08:51:26,12:46:01,16:40:51 5,08:51:08,12:46:28,16:42:05 6,08:50:45,12:46:55,16:43:21 7,08:50:20,12:47:21,16:44:40 8,08:49:51,12:47:47,16:46:02 9,08:49:18,12:48:12,16:47:25 10,08:48:43,12:48:36,16:48:51 11,08:48:04,12:49:00,16:50:19 12,08:47:22,12:49:24,16:51:49 13,08:46:36,12:49:47,16:53:21 14,08:45:48,12:50:09,16:54:55 15,08:44:57,12:50:31,16:56:30 16,08:44:02,12:50:52,16:58:08 17,08:43:05,12:51:12,16:59:46 18,08:42:04,12:51:31,17:01:27 19,08:41:01,12:51:50,17:03:08 20,08:39:55,12:52:08,17:04:51 21,08:38:47,12:52:26,17:06:36 22,08:37:35,12:52:42,17:08:21 23,08:36:21,12:52:58,17:10:08 24,08:35:05,12:53:13,17:11:55 25,08:33:46,12:53:28,17:13:43 26,08:32:24,12:53:41,17:15:33 27,08:31:01,12:53:54,17:17:23 28,08:29:34,12:54:06,17:19:13 29,08:28:06,12:54:17,17:21:05 30,08:26:35,12:54:27,17:22:57 31,08:25:03,12:54:36,17:24:49 32,08:23:28,12:54:45,17:26:42 33,08:21:51,12:54:53,17:28:35 34,08:20:12,12:55:00,17:30:28 35,08:18:31,12:55:06,17:32:22 36,08:16:48,12:55:11,17:34:16 37,08:15:04,12:55:16,17:36:10 38,08:13:18,12:55:19,17:38:05 39,08:11:30,12:55:22,17:39:59 40,08:09:40,12:55:24,17:41:54 41,08:07:49,12:55:26,17:43:48 42,08:05:56,12:55:26,17:45:43 43,08:04:01,12:55:26,17:47:37 44,08:02:06,12:55:25,17:49:31 45,08:00:08,12:55:23,17:51:25 46,07:58:10,12:55:21,17:53:20 47,07:56:10,12:55:17,17:55:13 48,07:54:09,12:55:13,17:57:07 49,07:52:06,12:55:09,17:59:01 50,07:50:03,12:55:03,18:00:54 51,07:47:58,12:54:57,18:02:47 52,07:45:52,12:54:51,18:04:40 53,07:43:45,12:54:43,18:06:33 54,07:41:38,12:54:35,18:08:25 55,07:39:29,12:54:27,18:10:17 56,07:37:19,12:54:17,18:12:09 57,07:35:08,12:54:08,18:14:00 58,07:32:57,12:53:57,18:15:52 59,07:30:45,12:53:46,18:17:42 60,07:28:32,12:53:35,18:19:33 61,07:26:18,12:53:23,18:21:23 62,07:24:03,12:53:11,18:23:14 63,07:21:48,12:52:58,18:25:03 64,07:19:32,12:52:44,18:26:53 65,07:17:16,12:52:31,18:28:42 66,07:14:59,12:52:16,18:30:31 67,07:12:42,12:52:02,18:32:20 68,07:10:24,12:51:47,18:34:08 69,07:08:05,12:51:32,18:35:56 70,07:05:47,12:51:16,18:37:44 71,07:03:27,12:51:00,18:39:32 72,07:01:08,12:50:44,18:41:19 73,06:58:48,12:50:27,18:43:07 74,06:56:28,12:50:11,18:44:54 75,06:54:07,12:49:54,18:46:41 76,06:51:47,12:49:36,18:48:27 77,06:49:26,12:49:19,18:50:14 78,06:47:05,12:49:02,18:52:00 79,06:44:44,12:48:44,18:53:46 80,06:42:23,12:48:26,18:55:32 81,06:40:01,12:48:08,18:57:18 82,06:37:40,12:47:50,18:59:04 83,06:35:18,12:47:32,19:00:50 84,06:32:57,12:47:14,19:02:35 85,06:30:36,12:46:56,19:04:21 86,06:28:14,12:46:38,19:06:06 87,06:25:53,12:46:20,19:07:51 88,06:23:32,12:46:02,19:09:37 89,06:21:11,12:45:44,19:11:22 90,07:18:50,13:45:26,20:13:07 91,07:16:30,13:45:08,20:14:52 92,07:14:10,13:44:50,20:16:37 93,07:11:50,13:44:33,20:18:22 94,07:09:30,13:44:15,20:20:07 95,07:07:11,13:43:58,20:21:52 96,07:04:52,13:43:41,20:23:37 97,07:02:33,13:43:24,20:25:22 98,07:00:15,13:43:07,20:27:07 99,06:57:58,13:42:51,20:28:52 100,06:55:40,13:42:35,20:30:37 101,06:53:24,13:42:19,20:32:22 102,06:51:08,13:42:03,20:34:07 103,06:48:52,13:41:48,20:35:52 104,06:46:37,13:41:33,20:37:37 105,06:44:23,13:41:18,20:39:22 106,06:42:10,13:41:04,20:41:07 107,06:39:57,13:40:50,20:42:52 108,06:37:45,13:40:36,20:44:36 109,06:35:34,13:40:23,20:46:21 110,06:33:24,13:40:10,20:48:06 111,06:31:14,13:39:58,20:49:51 112,06:29:06,13:39:46,20:51:35 113,06:26:58,13:39:35,20:53:20 114,06:24:52,13:39:23,20:55:04 115,06:22:47,13:39:13,20:56:49 116,06:20:42,13:39:03,20:58:33 117,06:18:39,13:38:53,21:00:17 118,06:16:37,13:38:44,21:02:01 119,06:14:36,13:38:36,21:03:44 120,06:12:36,13:38:28,21:05:28 121,06:10:38,13:38:20,21:07:11 122,06:08:41,13:38:13,21:08:54 123,06:06:45,13:38:07,21:10:36 124,06:04:51,13:38:01,21:12:18 125,06:02:59,13:37:56,21:14:00 126,06:01:08,13:37:51,21:15:41 127,05:59:18,13:37:47,21:17:22 128,05:57:30,13:37:43,21:19:02 129,05:55:44,13:37:40,21:20:42 130,05:53:59,13:37:37,21:22:20 131,05:52:17,13:37:35,21:23:59 132,05:50:36,13:37:34,21:25:36 133,05:48:57,13:37:33,21:27:13 134,05:47:20,13:37:33,21:28:49 135,05:45:45,13:37:33,21:30:24 136,05:44:12,13:37:34,21:31:58 137,05:42:41,13:37:36,21:33:31 138,05:41:12,13:37:38,21:35:03 139,05:39:45,13:37:40,21:36:34 140,05:38:21,13:37:44,21:38:03 141,05:36:59,13:37:47,21:39:32 142,05:35:39,13:37:51,21:40:59 143,05:34:22,13:37:56,21:42:24 144,05:33:07,13:38:01,21:43:48 145,05:31:55,13:38:07,21:45:11 146,05:30:45,13:38:13,21:46:31 147,05:29:38,13:38:20,21:47:51 148,05:28:34,13:38:27,21:49:08 149,05:27:32,13:38:35,21:50:23 150,05:26:34,13:38:43,21:51:37 151,05:25:37,13:38:51,21:52:48 152,05:24:44,13:39:00,21:53:58 153,05:23:54,13:39:10,21:55:05 154,05:23:07,13:39:19,21:56:10 155,05:22:22,13:39:29,21:57:12 156,05:21:41,13:39:40,21:58:13 157,05:21:03,13:39:51,21:59:11 158,05:20:28,13:40:02,22:00:06 159,05:19:56,13:40:13,22:00:59 160,05:19:27,13:40:25,22:01:49 161,05:19:01,13:40:36,22:02:36 162,05:18:39,13:40:48,22:03:21 163,05:18:19,13:41:01,22:04:02 164,05:18:03,13:41:13,22:04:41 165,05:17:50,13:41:26,22:05:17 166,05:17:41,13:41:38,22:05:50 167,05:17:34,13:41:51,22:06:20 168,05:17:31,13:42:04,22:06:46 169,05:17:31,13:42:17,22:07:10 170,05:17:35,13:42:30,22:07:31 171,05:17:41,13:42:43,22:07:48 172,05:17:51,13:42:56,22:08:02 173,05:18:04,13:43:09,22:08:13 174,05:18:20,13:43:22,22:08:20 175,05:18:39,13:43:35,22:08:25 176,05:19:02,13:43:48,22:08:26 177,05:19:27,13:44:01,22:08:24 178,05:19:56,13:44:13,22:08:18 179,05:20:27,13:44:26,22:08:09 180,05:21:01,13:44:38,22:07:57 181,05:21:39,13:44:50,22:07:42 182,05:22:19,13:45:02,22:07:23 183,05:23:01,13:45:13,22:07:01 184,05:23:47,13:45:24,22:06:36 185,05:24:35,13:45:35,22:06:08 186,05:25:26,13:45:46,22:05:36 187,05:26:19,13:45:56,22:05:01 188,05:27:15,13:46:06,22:04:23 189,05:28:13,13:46:15,22:03:42 190,05:29:14,13:46:24,22:02:58 191,05:30:16,13:46:33,22:02:11 192,05:31:21,13:46:41,22:01:21 193,05:32:28,13:46:49,22:00:28 194,05:33:37,13:46:57,21:59:33 195,05:34:48,13:47:04,21:58:34 196,05:36:01,13:47:10,21:57:32 197,05:37:16,13:47:16,21:56:28 198,05:38:32,13:47:21,21:55:21 199,05:39:50,13:47:26,21:54:12 200,05:41:10,13:47:30,21:52:59 201,05:42:31,13:47:34,21:51:45 202,05:43:53,13:47:37,21:50:27 203,05:45:17,13:47:40,21:49:08 204,05:46:42,13:47:42,21:47:45 205,05:48:09,13:47:44,21:46:21 206,05:49:36,13:47:44,21:44:54 207,05:51:05,13:47:45,21:43:25 208,05:52:35,13:47:44,21:41:54 209,05:54:05,13:47:44,21:40:21 210,05:55:37,13:47:42,21:38:46 211,05:57:09,13:47:40,21:37:08 212,05:58:42,13:47:37,21:35:29 213,06:00:16,13:47:34,21:33:48 214,06:01:51,13:47:30,21:32:05 215,06:03:26,13:47:25,21:30:20 216,06:05:02,13:47:20,21:28:33 217,06:06:38,13:47:15,21:26:45 218,06:08:15,13:47:08,21:24:55 219,06:09:52,13:47:01,21:23:04 220,06:11:30,13:46:54,21:21:11 221,06:13:08,13:46:46,21:19:16 222,06:14:46,13:46:37,21:17:20 223,06:16:25,13:46:28,21:15:22 224,06:18:04,13:46:18,21:13:24 225,06:19:43,13:46:07,21:11:23 226,06:21:22,13:45:56,21:09:22 227,06:23:02,13:45:45,21:07:19 228,06:24:42,13:45:33,21:05:16 229,06:26:22,13:45:20,21:03:11 230,06:28:01,13:45:07,21:01:05 231,06:29:41,13:44:54,20:58:57 232,06:31:22,13:44:40,20:56:49 233,06:33:02,13:44:25,20:54:40 234,06:34:42,13:44:10,20:52:30 235,06:36:22,13:43:55,20:50:19 236,06:38:02,13:43:39,20:48:07 237,06:39:43,13:43:23,20:45:54 238,06:41:23,13:43:06,20:43:41 239,06:43:03,13:42:49,20:41:27 240,06:44:43,13:42:32,20:39:12 241,06:46:24,13:42:14,20:36:56 242,06:48:04,13:41:56,20:34:40 243,06:49:44,13:41:37,20:32:23 244,06:51:24,13:41:19,20:30:05 245,06:53:04,13:41:00,20:27:47 246,06:54:44,13:40:40,20:25:29 247,06:56:24,13:40:21,20:23:10 248,06:58:04,13:40:01,20:20:50 249,06:59:44,13:39:41,20:18:30 250,07:01:24,13:39:20,20:16:10 251,07:03:04,13:39:00,20:13:49 252,07:04:44,13:38:39,20:11:28 253,07:06:24,13:38:18,20:09:07 254,07:08:04,13:37:57,20:06:45 255,07:09:44,13:37:36,20:04:23 256,07:11:24,13:37:15,20:02:01 257,07:13:04,13:36:54,19:59:39 258,07:14:44,13:36:32,19:57:16 259,07:16:24,13:36:11,19:54:54 260,07:18:04,13:35:50,19:52:31 261,07:19:45,13:35:28,19:50:08 262,07:21:25,13:35:07,19:47:45 263,07:23:05,13:34:45,19:45:23 264,07:24:46,13:34:24,19:43:00 265,07:26:27,13:34:03,19:40:37 266,07:28:07,13:33:42,19:38:14 267,07:29:48,13:33:21,19:35:52 268,07:31:29,13:33:00,19:33:29 269,07:33:11,13:32:39,19:31:07 270,07:34:52,13:32:18,19:28:45 271,07:36:33,13:31:58,19:26:23 272,07:38:15,13:31:38,19:24:01 273,07:39:57,13:31:18,19:21:40 274,07:41:39,13:30:58,19:19:18 275,07:43:22,13:30:39,19:16:58 276,07:45:05,13:30:20,19:14:37 277,07:46:47,13:30:01,19:12:17 278,07:48:31,13:29:43,19:09:57 279,07:50:14,13:29:25,19:07:38 280,07:51:58,13:29:07,19:05:20 281,07:53:42,13:28:50,19:03:02 282,07:55:26,13:28:33,19:00:44 283,07:57:11,13:28:16,18:58:27 284,07:58:55,13:28:00,18:56:11 285,08:00:41,13:27:45,18:53:55 286,08:02:26,13:27:30,18:51:40 287,08:04:12,13:27:16,18:49:26 288,08:05:58,13:27:02,18:47:12 289,08:07:44,13:26:48,18:45:00 290,08:09:31,13:26:36,18:42:48 291,08:11:18,13:26:23,18:40:37 292,08:13:05,13:26:12,18:38:27 293,08:14:53,13:26:01,18:36:18 294,08:16:41,13:25:51,18:34:10 295,08:18:29,13:25:41,18:32:03 296,08:20:18,13:25:32,18:29:57 297,08:22:06,13:25:24,18:27:52 298,08:23:55,13:25:16,18:25:49 299,07:25:45,12:25:10,17:23:46 300,07:27:34,12:25:04,17:21:45 301,07:29:24,12:24:58,17:19:46 302,07:31:14,12:24:54,17:17:47 303,07:33:04,12:24:50,17:15:50 304,07:34:54,12:24:47,17:13:55 305,07:36:44,12:24:45,17:12:01 306,07:38:35,12:24:43,17:10:08 307,07:40:25,12:24:43,17:08:17 308,07:42:15,12:24:43,17:06:28 309,07:44:06,12:24:44,17:04:41 310,07:45:56,12:24:46,17:02:55 311,07:47:46,12:24:49,17:01:11 312,07:49:36,12:24:53,16:59:29 313,07:51:26,12:24:57,16:57:49 314,07:53:16,12:25:03,16:56:11 315,07:55:05,12:25:09,16:54:35 316,07:56:54,12:25:16,16:53:01 317,07:58:42,12:25:24,16:51:29 318,08:00:30,12:25:33,16:49:59 319,08:02:18,12:25:43,16:48:32 320,08:04:05,12:25:53,16:47:07 321,08:05:51,12:26:05,16:45:44 322,08:07:37,12:26:17,16:44:24 323,08:09:21,12:26:30,16:43:06 324,08:11:05,12:26:44,16:41:51 325,08:12:48,12:26:58,16:40:38 326,08:14:29,12:27:14,16:39:28 327,08:16:10,12:27:30,16:38:21 328,08:17:49,12:27:47,16:37:17 329,08:19:28,12:28:05,16:36:15 330,08:21:04,12:28:24,16:35:16 331,08:22:40,12:28:43,16:34:21 332,08:24:13,12:29:03,16:33:28 333,08:25:45,12:29:24,16:32:39 334,08:27:15,12:29:45,16:31:52 335,08:28:44,12:30:07,16:31:09 336,08:30:10,12:30:30,16:30:29 337,08:31:35,12:30:53,16:29:52 338,08:32:57,12:31:17,16:29:18 339,08:34:18,12:31:42,16:28:48 340,08:35:35,12:32:07,16:28:21 341,08:36:51,12:32:32,16:27:58 342,08:38:04,12:32:58,16:27:38 343,08:39:15,12:33:25,16:27:21 344,08:40:22,12:33:52,16:27:08 345,08:41:28,12:34:19,16:26:59 346,08:42:30,12:34:47,16:26:53 347,08:43:30,12:35:15,16:26:51 348,08:44:26,12:35:43,16:26:52 349,08:45:20,12:36:12,16:26:57 350,08:46:10,12:36:41,16:27:05 351,08:46:58,12:37:10,16:27:17 352,08:47:42,12:37:39,16:27:33 353,08:48:23,12:38:09,16:27:52 354,08:49:01,12:38:39,16:28:14 355,08:49:35,12:39:08,16:28:41 356,08:50:06,12:39:38,16:29:10 357,08:50:33,12:40:08,16:29:43 358,08:50:57,12:40:37,16:30:20 359,08:51:18,12:41:07,16:31:00 360,08:51:35,12:41:37,16:31:43 361,08:51:49,12:42:06,16:32:30 362,08:51:59,12:42:36,16:33:19 363,08:52:05,12:43:05,16:34:12 364,08:52:08,12:43:34,16:35:08 365,08:52:08,12:44:03,16:36:08 366,08:52:02,12:44:38,16:37:26 +day,rise,noon,set +1,08:52:02,12:44:38,16:37:26 +2,08:51:54,12:45:06,16:38:31 +3,08:51:42,12:45:34,16:39:40 +4,08:51:26,12:46:01,16:40:51 +5,08:51:08,12:46:28,16:42:05 +6,08:50:45,12:46:55,16:43:21 +7,08:50:20,12:47:21,16:44:40 +8,08:49:51,12:47:47,16:46:02 +9,08:49:18,12:48:12,16:47:25 +10,08:48:43,12:48:36,16:48:51 +11,08:48:04,12:49:00,16:50:19 +12,08:47:22,12:49:24,16:51:49 +13,08:46:36,12:49:47,16:53:21 +14,08:45:48,12:50:09,16:54:55 +15,08:44:57,12:50:31,16:56:30 +16,08:44:02,12:50:52,16:58:08 +17,08:43:05,12:51:12,16:59:46 +18,08:42:04,12:51:31,17:01:27 +19,08:41:01,12:51:50,17:03:08 +20,08:39:55,12:52:08,17:04:51 +21,08:38:47,12:52:26,17:06:36 +22,08:37:35,12:52:42,17:08:21 +23,08:36:21,12:52:58,17:10:08 +24,08:35:05,12:53:13,17:11:55 +25,08:33:46,12:53:28,17:13:43 +26,08:32:24,12:53:41,17:15:33 +27,08:31:01,12:53:54,17:17:23 +28,08:29:34,12:54:06,17:19:13 +29,08:28:06,12:54:17,17:21:05 +30,08:26:35,12:54:27,17:22:57 +31,08:25:03,12:54:36,17:24:49 +32,08:23:28,12:54:45,17:26:42 +33,08:21:51,12:54:53,17:28:35 +34,08:20:12,12:55:00,17:30:28 +35,08:18:31,12:55:06,17:32:22 +36,08:16:48,12:55:11,17:34:16 +37,08:15:04,12:55:16,17:36:10 +38,08:13:18,12:55:19,17:38:05 +39,08:11:30,12:55:22,17:39:59 +40,08:09:40,12:55:24,17:41:54 +41,08:07:49,12:55:26,17:43:48 +42,08:05:56,12:55:26,17:45:43 +43,08:04:01,12:55:26,17:47:37 +44,08:02:06,12:55:25,17:49:31 +45,08:00:08,12:55:23,17:51:25 +46,07:58:10,12:55:21,17:53:20 +47,07:56:10,12:55:17,17:55:13 +48,07:54:09,12:55:13,17:57:07 +49,07:52:06,12:55:09,17:59:01 +50,07:50:03,12:55:03,18:00:54 +51,07:47:58,12:54:57,18:02:47 +52,07:45:52,12:54:51,18:04:40 +53,07:43:45,12:54:43,18:06:33 +54,07:41:38,12:54:35,18:08:25 +55,07:39:29,12:54:27,18:10:17 +56,07:37:19,12:54:17,18:12:09 +57,07:35:08,12:54:08,18:14:00 +58,07:32:57,12:53:57,18:15:52 +59,07:30:45,12:53:46,18:17:42 +60,07:28:32,12:53:35,18:19:33 +61,07:26:18,12:53:23,18:21:23 +62,07:24:03,12:53:11,18:23:14 +63,07:21:48,12:52:58,18:25:03 +64,07:19:32,12:52:44,18:26:53 +65,07:17:16,12:52:31,18:28:42 +66,07:14:59,12:52:16,18:30:31 +67,07:12:42,12:52:02,18:32:20 +68,07:10:24,12:51:47,18:34:08 +69,07:08:05,12:51:32,18:35:56 +70,07:05:47,12:51:16,18:37:44 +71,07:03:27,12:51:00,18:39:32 +72,07:01:08,12:50:44,18:41:19 +73,06:58:48,12:50:27,18:43:07 +74,06:56:28,12:50:11,18:44:54 +75,06:54:07,12:49:54,18:46:41 +76,06:51:47,12:49:36,18:48:27 +77,06:49:26,12:49:19,18:50:14 +78,06:47:05,12:49:02,18:52:00 +79,06:44:44,12:48:44,18:53:46 +80,06:42:23,12:48:26,18:55:32 +81,06:40:01,12:48:08,18:57:18 +82,06:37:40,12:47:50,18:59:04 +83,06:35:18,12:47:32,19:00:50 +84,06:32:57,12:47:14,19:02:35 +85,06:30:36,12:46:56,19:04:21 +86,06:28:14,12:46:38,19:06:06 +87,06:25:53,12:46:20,19:07:51 +88,06:23:32,12:46:02,19:09:37 +89,06:21:11,12:45:44,19:11:22 +90,07:18:50,13:45:26,20:13:07 +91,07:16:30,13:45:08,20:14:52 +92,07:14:10,13:44:50,20:16:37 +93,07:11:50,13:44:33,20:18:22 +94,07:09:30,13:44:15,20:20:07 +95,07:07:11,13:43:58,20:21:52 +96,07:04:52,13:43:41,20:23:37 +97,07:02:33,13:43:24,20:25:22 +98,07:00:15,13:43:07,20:27:07 +99,06:57:58,13:42:51,20:28:52 +100,06:55:40,13:42:35,20:30:37 +101,06:53:24,13:42:19,20:32:22 +102,06:51:08,13:42:03,20:34:07 +103,06:48:52,13:41:48,20:35:52 +104,06:46:37,13:41:33,20:37:37 +105,06:44:23,13:41:18,20:39:22 +106,06:42:10,13:41:04,20:41:07 +107,06:39:57,13:40:50,20:42:52 +108,06:37:45,13:40:36,20:44:36 +109,06:35:34,13:40:23,20:46:21 +110,06:33:24,13:40:10,20:48:06 +111,06:31:14,13:39:58,20:49:51 +112,06:29:06,13:39:46,20:51:35 +113,06:26:58,13:39:35,20:53:20 +114,06:24:52,13:39:23,20:55:04 +115,06:22:47,13:39:13,20:56:49 +116,06:20:42,13:39:03,20:58:33 +117,06:18:39,13:38:53,21:00:17 +118,06:16:37,13:38:44,21:02:01 +119,06:14:36,13:38:36,21:03:44 +120,06:12:36,13:38:28,21:05:28 +121,06:10:38,13:38:20,21:07:11 +122,06:08:41,13:38:13,21:08:54 +123,06:06:45,13:38:07,21:10:36 +124,06:04:51,13:38:01,21:12:18 +125,06:02:59,13:37:56,21:14:00 +126,06:01:08,13:37:51,21:15:41 +127,05:59:18,13:37:47,21:17:22 +128,05:57:30,13:37:43,21:19:02 +129,05:55:44,13:37:40,21:20:42 +130,05:53:59,13:37:37,21:22:20 +131,05:52:17,13:37:35,21:23:59 +132,05:50:36,13:37:34,21:25:36 +133,05:48:57,13:37:33,21:27:13 +134,05:47:20,13:37:33,21:28:49 +135,05:45:45,13:37:33,21:30:24 +136,05:44:12,13:37:34,21:31:58 +137,05:42:41,13:37:36,21:33:31 +138,05:41:12,13:37:38,21:35:03 +139,05:39:45,13:37:40,21:36:34 +140,05:38:21,13:37:44,21:38:03 +141,05:36:59,13:37:47,21:39:32 +142,05:35:39,13:37:51,21:40:59 +143,05:34:22,13:37:56,21:42:24 +144,05:33:07,13:38:01,21:43:48 +145,05:31:55,13:38:07,21:45:11 +146,05:30:45,13:38:13,21:46:31 +147,05:29:38,13:38:20,21:47:51 +148,05:28:34,13:38:27,21:49:08 +149,05:27:32,13:38:35,21:50:23 +150,05:26:34,13:38:43,21:51:37 +151,05:25:37,13:38:51,21:52:48 +152,05:24:44,13:39:00,21:53:58 +153,05:23:54,13:39:10,21:55:05 +154,05:23:07,13:39:19,21:56:10 +155,05:22:22,13:39:29,21:57:12 +156,05:21:41,13:39:40,21:58:13 +157,05:21:03,13:39:51,21:59:11 +158,05:20:28,13:40:02,22:00:06 +159,05:19:56,13:40:13,22:00:59 +160,05:19:27,13:40:25,22:01:49 +161,05:19:01,13:40:36,22:02:36 +162,05:18:39,13:40:48,22:03:21 +163,05:18:19,13:41:01,22:04:02 +164,05:18:03,13:41:13,22:04:41 +165,05:17:50,13:41:26,22:05:17 +166,05:17:41,13:41:38,22:05:50 +167,05:17:34,13:41:51,22:06:20 +168,05:17:31,13:42:04,22:06:46 +169,05:17:31,13:42:17,22:07:10 +170,05:17:35,13:42:30,22:07:31 +171,05:17:41,13:42:43,22:07:48 +172,05:17:51,13:42:56,22:08:02 +173,05:18:04,13:43:09,22:08:13 +174,05:18:20,13:43:22,22:08:20 +175,05:18:39,13:43:35,22:08:25 +176,05:19:02,13:43:48,22:08:26 +177,05:19:27,13:44:01,22:08:24 +178,05:19:56,13:44:13,22:08:18 +179,05:20:27,13:44:26,22:08:09 +180,05:21:01,13:44:38,22:07:57 +181,05:21:39,13:44:50,22:07:42 +182,05:22:19,13:45:02,22:07:23 +183,05:23:01,13:45:13,22:07:01 +184,05:23:47,13:45:24,22:06:36 +185,05:24:35,13:45:35,22:06:08 +186,05:25:26,13:45:46,22:05:36 +187,05:26:19,13:45:56,22:05:01 +188,05:27:15,13:46:06,22:04:23 +189,05:28:13,13:46:15,22:03:42 +190,05:29:14,13:46:24,22:02:58 +191,05:30:16,13:46:33,22:02:11 +192,05:31:21,13:46:41,22:01:21 +193,05:32:28,13:46:49,22:00:28 +194,05:33:37,13:46:57,21:59:33 +195,05:34:48,13:47:04,21:58:34 +196,05:36:01,13:47:10,21:57:32 +197,05:37:16,13:47:16,21:56:28 +198,05:38:32,13:47:21,21:55:21 +199,05:39:50,13:47:26,21:54:12 +200,05:41:10,13:47:30,21:52:59 +201,05:42:31,13:47:34,21:51:45 +202,05:43:53,13:47:37,21:50:27 +203,05:45:17,13:47:40,21:49:08 +204,05:46:42,13:47:42,21:47:45 +205,05:48:09,13:47:44,21:46:21 +206,05:49:36,13:47:44,21:44:54 +207,05:51:05,13:47:45,21:43:25 +208,05:52:35,13:47:44,21:41:54 +209,05:54:05,13:47:44,21:40:21 +210,05:55:37,13:47:42,21:38:46 +211,05:57:09,13:47:40,21:37:08 +212,05:58:42,13:47:37,21:35:29 +213,06:00:16,13:47:34,21:33:48 +214,06:01:51,13:47:30,21:32:05 +215,06:03:26,13:47:25,21:30:20 +216,06:05:02,13:47:20,21:28:33 +217,06:06:38,13:47:15,21:26:45 +218,06:08:15,13:47:08,21:24:55 +219,06:09:52,13:47:01,21:23:04 +220,06:11:30,13:46:54,21:21:11 +221,06:13:08,13:46:46,21:19:16 +222,06:14:46,13:46:37,21:17:20 +223,06:16:25,13:46:28,21:15:22 +224,06:18:04,13:46:18,21:13:24 +225,06:19:43,13:46:07,21:11:23 +226,06:21:22,13:45:56,21:09:22 +227,06:23:02,13:45:45,21:07:19 +228,06:24:42,13:45:33,21:05:16 +229,06:26:22,13:45:20,21:03:11 +230,06:28:01,13:45:07,21:01:05 +231,06:29:41,13:44:54,20:58:57 +232,06:31:22,13:44:40,20:56:49 +233,06:33:02,13:44:25,20:54:40 +234,06:34:42,13:44:10,20:52:30 +235,06:36:22,13:43:55,20:50:19 +236,06:38:02,13:43:39,20:48:07 +237,06:39:43,13:43:23,20:45:54 +238,06:41:23,13:43:06,20:43:41 +239,06:43:03,13:42:49,20:41:27 +240,06:44:43,13:42:32,20:39:12 +241,06:46:24,13:42:14,20:36:56 +242,06:48:04,13:41:56,20:34:40 +243,06:49:44,13:41:37,20:32:23 +244,06:51:24,13:41:19,20:30:05 +245,06:53:04,13:41:00,20:27:47 +246,06:54:44,13:40:40,20:25:29 +247,06:56:24,13:40:21,20:23:10 +248,06:58:04,13:40:01,20:20:50 +249,06:59:44,13:39:41,20:18:30 +250,07:01:24,13:39:20,20:16:10 +251,07:03:04,13:39:00,20:13:49 +252,07:04:44,13:38:39,20:11:28 +253,07:06:24,13:38:18,20:09:07 +254,07:08:04,13:37:57,20:06:45 +255,07:09:44,13:37:36,20:04:23 +256,07:11:24,13:37:15,20:02:01 +257,07:13:04,13:36:54,19:59:39 +258,07:14:44,13:36:32,19:57:16 +259,07:16:24,13:36:11,19:54:54 +260,07:18:04,13:35:50,19:52:31 +261,07:19:45,13:35:28,19:50:08 +262,07:21:25,13:35:07,19:47:45 +263,07:23:05,13:34:45,19:45:23 +264,07:24:46,13:34:24,19:43:00 +265,07:26:27,13:34:03,19:40:37 +266,07:28:07,13:33:42,19:38:14 +267,07:29:48,13:33:21,19:35:52 +268,07:31:29,13:33:00,19:33:29 +269,07:33:11,13:32:39,19:31:07 +270,07:34:52,13:32:18,19:28:45 +271,07:36:33,13:31:58,19:26:23 +272,07:38:15,13:31:38,19:24:01 +273,07:39:57,13:31:18,19:21:40 +274,07:41:39,13:30:58,19:19:18 +275,07:43:22,13:30:39,19:16:58 +276,07:45:05,13:30:20,19:14:37 +277,07:46:47,13:30:01,19:12:17 +278,07:48:31,13:29:43,19:09:57 +279,07:50:14,13:29:25,19:07:38 +280,07:51:58,13:29:07,19:05:20 +281,07:53:42,13:28:50,19:03:02 +282,07:55:26,13:28:33,19:00:44 +283,07:57:11,13:28:16,18:58:27 +284,07:58:55,13:28:00,18:56:11 +285,08:00:41,13:27:45,18:53:55 +286,08:02:26,13:27:30,18:51:40 +287,08:04:12,13:27:16,18:49:26 +288,08:05:58,13:27:02,18:47:12 +289,08:07:44,13:26:48,18:45:00 +290,08:09:31,13:26:36,18:42:48 +291,08:11:18,13:26:23,18:40:37 +292,08:13:05,13:26:12,18:38:27 +293,08:14:53,13:26:01,18:36:18 +294,08:16:41,13:25:51,18:34:10 +295,08:18:29,13:25:41,18:32:03 +296,08:20:18,13:25:32,18:29:57 +297,08:22:06,13:25:24,18:27:52 +298,08:23:55,13:25:16,18:25:49 +299,07:25:45,12:25:10,17:23:46 +300,07:27:34,12:25:04,17:21:45 +301,07:29:24,12:24:58,17:19:46 +302,07:31:14,12:24:54,17:17:47 +303,07:33:04,12:24:50,17:15:50 +304,07:34:54,12:24:47,17:13:55 +305,07:36:44,12:24:45,17:12:01 +306,07:38:35,12:24:43,17:10:08 +307,07:40:25,12:24:43,17:08:17 +308,07:42:15,12:24:43,17:06:28 +309,07:44:06,12:24:44,17:04:41 +310,07:45:56,12:24:46,17:02:55 +311,07:47:46,12:24:49,17:01:11 +312,07:49:36,12:24:53,16:59:29 +313,07:51:26,12:24:57,16:57:49 +314,07:53:16,12:25:03,16:56:11 +315,07:55:05,12:25:09,16:54:35 +316,07:56:54,12:25:16,16:53:01 +317,07:58:42,12:25:24,16:51:29 +318,08:00:30,12:25:33,16:49:59 +319,08:02:18,12:25:43,16:48:32 +320,08:04:05,12:25:53,16:47:07 +321,08:05:51,12:26:05,16:45:44 +322,08:07:37,12:26:17,16:44:24 +323,08:09:21,12:26:30,16:43:06 +324,08:11:05,12:26:44,16:41:51 +325,08:12:48,12:26:58,16:40:38 +326,08:14:29,12:27:14,16:39:28 +327,08:16:10,12:27:30,16:38:21 +328,08:17:49,12:27:47,16:37:17 +329,08:19:28,12:28:05,16:36:15 +330,08:21:04,12:28:24,16:35:16 +331,08:22:40,12:28:43,16:34:21 +332,08:24:13,12:29:03,16:33:28 +333,08:25:45,12:29:24,16:32:39 +334,08:27:15,12:29:45,16:31:52 +335,08:28:44,12:30:07,16:31:09 +336,08:30:10,12:30:30,16:30:29 +337,08:31:35,12:30:53,16:29:52 +338,08:32:57,12:31:17,16:29:18 +339,08:34:18,12:31:42,16:28:48 +340,08:35:35,12:32:07,16:28:21 +341,08:36:51,12:32:32,16:27:58 +342,08:38:04,12:32:58,16:27:38 +343,08:39:15,12:33:25,16:27:21 +344,08:40:22,12:33:52,16:27:08 +345,08:41:28,12:34:19,16:26:59 +346,08:42:30,12:34:47,16:26:53 +347,08:43:30,12:35:15,16:26:51 +348,08:44:26,12:35:43,16:26:52 +349,08:45:20,12:36:12,16:26:57 +350,08:46:10,12:36:41,16:27:05 +351,08:46:58,12:37:10,16:27:17 +352,08:47:42,12:37:39,16:27:33 +353,08:48:23,12:38:09,16:27:52 +354,08:49:01,12:38:39,16:28:14 +355,08:49:35,12:39:08,16:28:41 +356,08:50:06,12:39:38,16:29:10 +357,08:50:33,12:40:08,16:29:43 +358,08:50:57,12:40:37,16:30:20 +359,08:51:18,12:41:07,16:31:00 +360,08:51:35,12:41:37,16:31:43 +361,08:51:49,12:42:06,16:32:30 +362,08:51:59,12:42:36,16:33:19 +363,08:52:05,12:43:05,16:34:12 +364,08:52:08,12:43:34,16:35:08 +365,08:52:08,12:44:03,16:36:08 +366,08:52:02,12:44:38,16:37:26 diff --git a/static/twilight_2020.csv b/static/twilight_2020.csv old mode 100644 new mode 100755 index e36192b..09d6132 --- a/static/twilight_2020.csv +++ b/static/twilight_2020.csv @@ -1 +1,367 @@ -day,rise,noon,set 1,08:52:04,12:44:31,16:37:10 2,08:51:56,12:44:59,16:38:15 3,08:51:45,12:45:27,16:39:22 4,08:51:31,12:45:55,16:40:33 5,08:51:13,12:46:22,16:41:46 6,08:50:51,12:46:48,16:43:02 7,08:50:26,12:47:15,16:44:20 8,08:49:58,12:47:40,16:45:41 9,08:49:27,12:48:06,16:47:04 10,08:48:52,12:48:30,16:48:30 11,08:48:14,12:48:55,16:49:57 12,08:47:32,12:49:18,16:51:27 13,08:46:48,12:49:41,16:52:58 14,08:46:00,12:50:04,16:54:31 15,08:45:10,12:50:25,16:56:07 16,08:44:16,12:50:46,16:57:43 17,08:43:19,12:51:07,16:59:22 18,08:42:20,12:51:27,17:01:02 19,08:41:17,12:51:46,17:02:43 20,08:40:12,12:52:04,17:04:26 21,08:39:04,12:52:21,17:06:10 22,08:37:53,12:52:38,17:07:55 23,08:36:40,12:52:54,17:09:41 24,08:35:24,12:53:10,17:11:29 25,08:34:06,12:53:24,17:13:17 26,08:32:45,12:53:38,17:15:06 27,08:31:21,12:53:51,17:16:56 28,08:29:56,12:54:03,17:18:46 29,08:28:28,12:54:14,17:20:37 30,08:26:58,12:54:24,17:22:29 31,08:25:25,12:54:34,17:24:21 32,08:23:51,12:54:43,17:26:14 33,08:22:15,12:54:51,17:28:07 34,08:20:36,12:54:58,17:30:01 35,08:18:56,12:55:04,17:31:54 36,08:17:14,12:55:10,17:33:48 37,08:15:29,12:55:15,17:35:42 38,08:13:44,12:55:19,17:37:37 39,08:11:56,12:55:22,17:39:31 40,08:10:07,12:55:24,17:41:26 41,08:08:16,12:55:25,17:43:20 42,08:06:23,12:55:26,17:45:14 43,08:04:29,12:55:26,17:47:09 44,08:02:34,12:55:25,17:49:03 45,08:00:37,12:55:24,17:50:57 46,07:58:39,12:55:21,17:52:52 47,07:56:39,12:55:18,17:54:46 48,07:54:38,12:55:14,17:56:39 49,07:52:36,12:55:10,17:58:33 50,07:50:33,12:55:05,18:00:26 51,07:48:29,12:54:59,18:02:19 52,07:46:23,12:54:52,18:04:12 53,07:44:16,12:54:45,18:06:05 54,07:42:09,12:54:37,18:07:57 55,07:40:00,12:54:29,18:09:50 56,07:37:51,12:54:20,18:11:41 57,07:35:40,12:54:10,18:13:33 58,07:33:29,12:54:00,18:15:24 59,07:31:17,12:53:49,18:17:15 60,07:29:04,12:53:38,18:19:06 61,07:26:50,12:53:26,18:20:57 62,07:24:36,12:53:14,18:22:47 63,07:22:21,12:53:01,18:24:37 64,07:20:05,12:52:48,18:26:26 65,07:17:49,12:52:34,18:28:15 66,07:15:32,12:52:20,18:30:04 67,07:13:15,12:52:05,18:31:53 68,07:10:57,12:51:51,18:33:42 69,07:08:39,12:51:35,18:35:30 70,07:06:20,12:51:20,18:37:18 71,07:04:01,12:51:04,18:39:06 72,07:01:42,12:50:48,18:40:53 73,06:59:22,12:50:31,18:42:41 74,06:57:02,12:50:15,18:44:28 75,06:54:42,12:49:58,18:46:15 76,06:52:21,12:49:41,18:48:01 77,06:50:00,12:49:23,18:49:48 78,06:47:39,12:49:06,18:51:34 79,06:45:18,12:48:48,18:53:21 80,06:42:57,12:48:30,18:55:07 81,06:40:35,12:48:13,18:56:53 82,06:38:14,12:47:55,18:58:38 83,06:35:53,12:47:37,19:00:24 84,06:33:31,12:47:18,19:02:10 85,06:31:10,12:47:00,19:03:55 86,06:28:49,12:46:42,19:05:40 87,06:26:27,12:46:24,19:07:26 88,06:24:06,12:46:06,19:09:11 89,06:21:45,12:45:48,19:10:56 90,06:19:24,12:45:30,19:12:41 91,07:17:04,13:45:12,20:14:26 92,07:14:44,13:44:54,20:16:12 93,07:12:24,13:44:37,20:17:57 94,07:10:04,13:44:19,20:19:42 95,07:07:44,13:44:02,20:21:27 96,07:05:25,13:43:45,20:23:12 97,07:03:07,13:43:28,20:24:57 98,07:00:49,13:43:11,20:26:42 99,06:58:31,13:42:55,20:28:26 100,06:56:13,13:42:38,20:30:11 101,06:53:57,13:42:22,20:31:56 102,06:51:41,13:42:07,20:33:41 103,06:49:25,13:41:51,20:35:26 104,06:47:10,13:41:36,20:37:11 105,06:44:56,13:41:21,20:38:56 106,06:42:42,13:41:07,20:40:41 107,06:40:29,13:40:53,20:42:26 108,06:38:17,13:40:39,20:44:11 109,06:36:06,13:40:26,20:45:56 110,06:33:55,13:40:13,20:47:41 111,06:31:46,13:40:01,20:49:26 112,06:29:37,13:39:49,20:51:10 113,06:27:29,13:39:37,20:52:55 114,06:25:22,13:39:26,20:54:39 115,06:23:17,13:39:15,20:56:24 116,06:21:12,13:39:05,20:58:08 117,06:19:09,13:38:56,20:59:52 118,06:17:06,13:38:46,21:01:36 119,06:15:05,13:38:38,21:03:20 120,06:13:05,13:38:30,21:05:03 121,06:11:06,13:38:22,21:06:46 122,06:09:09,13:38:15,21:08:29 123,06:07:13,13:38:08,21:10:12 124,06:05:19,13:38:02,21:11:54 125,06:03:26,13:37:57,21:13:35 126,06:01:34,13:37:52,21:15:17 127,05:59:44,13:37:48,21:16:58 128,05:57:56,13:37:44,21:18:38 129,05:56:09,13:37:41,21:20:18 130,05:54:24,13:37:38,21:21:57 131,05:52:41,13:37:36,21:23:35 132,05:51:00,13:37:34,21:25:13 133,05:49:20,13:37:33,21:26:50 134,05:47:43,13:37:33,21:28:26 135,05:46:07,13:37:33,21:30:01 136,05:44:34,13:37:34,21:31:36 137,05:43:02,13:37:35,21:33:09 138,05:41:33,13:37:37,21:34:41 139,05:40:06,13:37:40,21:36:12 140,05:38:41,13:37:43,21:37:42 141,05:37:18,13:37:46,21:39:11 142,05:35:58,13:37:50,21:40:38 143,05:34:40,13:37:55,21:42:04 144,05:33:25,13:38:00,21:43:28 145,05:32:12,13:38:06,21:44:51 146,05:31:02,13:38:12,21:46:12 147,05:29:54,13:38:18,21:47:32 148,05:28:49,13:38:26,21:48:50 149,05:27:47,13:38:33,21:50:06 150,05:26:47,13:38:41,21:51:20 151,05:25:51,13:38:49,21:52:31 152,05:24:57,13:38:58,21:53:41 153,05:24:06,13:39:08,21:54:49 154,05:23:18,13:39:17,21:55:55 155,05:22:33,13:39:27,21:56:58 156,05:21:51,13:39:37,21:57:59 157,05:21:12,13:39:48,21:58:57 158,05:20:36,13:39:59,21:59:53 159,05:20:03,13:40:10,22:00:46 160,05:19:33,13:40:22,22:01:37 161,05:19:07,13:40:34,22:02:25 162,05:18:43,13:40:46,22:03:10 163,05:18:23,13:40:58,22:03:53 164,05:18:07,13:41:10,22:04:32 165,05:17:53,13:41:23,22:05:09 166,05:17:43,13:41:35,22:05:43 167,05:17:35,13:41:48,22:06:13 168,05:17:31,13:42:01,22:06:41 169,05:17:31,13:42:14,22:07:05 170,05:17:33,13:42:27,22:07:26 171,05:17:39,13:42:40,22:07:44 172,05:17:48,13:42:53,22:07:59 173,05:18:00,13:43:06,22:08:11 174,05:18:16,13:43:19,22:08:19 175,05:18:34,13:43:32,22:08:25 176,05:18:56,13:43:45,22:08:26 177,05:19:21,13:43:58,22:08:25 178,05:19:48,13:44:10,22:08:20 179,05:20:19,13:44:23,22:08:12 180,05:20:53,13:44:35,22:08:01 181,05:21:29,13:44:47,22:07:46 182,05:22:08,13:44:59,22:07:28 183,05:22:51,13:45:10,22:07:07 184,05:23:36,13:45:22,22:06:43 185,05:24:23,13:45:33,22:06:15 186,05:25:13,13:45:43,22:05:44 187,05:26:06,13:45:54,22:05:10 188,05:27:01,13:46:04,22:04:33 189,05:27:59,13:46:13,22:03:53 190,05:28:59,13:46:22,22:03:10 191,05:30:01,13:46:31,22:02:24 192,05:31:05,13:46:40,22:01:34 193,05:32:12,13:46:48,22:00:42 194,05:33:20,13:46:55,21:59:47 195,05:34:31,13:47:02,21:58:49 196,05:35:43,13:47:09,21:57:48 197,05:36:57,13:47:15,21:56:44 198,05:38:13,13:47:20,21:55:38 199,05:39:31,13:47:25,21:54:29 200,05:40:50,13:47:30,21:53:17 201,05:42:11,13:47:33,21:52:03 202,05:43:33,13:47:37,21:50:47 203,05:44:57,13:47:40,21:49:27 204,05:46:21,13:47:42,21:48:06 205,05:47:48,13:47:43,21:46:42 206,05:49:15,13:47:44,21:45:16 207,05:50:43,13:47:45,21:43:47 208,05:52:13,13:47:45,21:42:17 209,05:53:43,13:47:44,21:40:44 210,05:55:14,13:47:43,21:39:09 211,05:56:47,13:47:41,21:37:32 212,05:58:20,13:47:38,21:35:54 213,05:59:53,13:47:35,21:34:13 214,06:01:28,13:47:31,21:32:30 215,06:03:03,13:47:27,21:30:46 216,06:04:39,13:47:22,21:29:00 217,06:06:15,13:47:16,21:27:12 218,06:07:51,13:47:10,21:25:22 219,06:09:29,13:47:03,21:23:31 220,06:11:06,13:46:56,21:21:38 221,06:12:44,13:46:48,21:19:44 222,06:14:22,13:46:39,21:17:48 223,06:16:01,13:46:30,21:15:51 224,06:17:40,13:46:20,21:13:53 225,06:19:19,13:46:10,21:11:53 226,06:20:58,13:45:59,21:09:52 227,06:22:38,13:45:48,21:07:49 228,06:24:18,13:45:36,21:05:46 229,06:25:57,13:45:24,21:03:41 230,06:27:37,13:45:11,21:01:35 231,06:29:17,13:44:57,20:59:28 232,06:30:57,13:44:43,20:57:21 233,06:32:37,13:44:29,20:55:12 234,06:34:18,13:44:14,20:53:02 235,06:35:58,13:43:59,20:50:51 236,06:37:38,13:43:43,20:48:39 237,06:39:18,13:43:27,20:46:27 238,06:40:59,13:43:10,20:44:14 239,06:42:39,13:42:53,20:42:00 240,06:44:19,13:42:36,20:39:45 241,06:45:59,13:42:18,20:37:29 242,06:47:39,13:42:00,20:35:13 243,06:49:20,13:41:42,20:32:56 244,06:51:00,13:41:23,20:30:39 245,06:52:40,13:41:04,20:28:21 246,06:54:20,13:40:45,20:26:03 247,06:56:00,13:40:25,20:23:44 248,06:57:40,13:40:06,20:21:24 249,06:59:20,13:39:46,20:19:04 250,07:01:00,13:39:25,20:16:44 251,07:02:40,13:39:05,20:14:23 252,07:04:20,13:38:44,20:12:02 253,07:06:00,13:38:23,20:09:41 254,07:07:40,13:38:02,20:07:20 255,07:09:20,13:37:41,20:04:58 256,07:11:00,13:37:20,20:02:36 257,07:12:40,13:36:59,20:00:13 258,07:14:20,13:36:38,19:57:51 259,07:16:00,13:36:16,19:55:28 260,07:17:40,13:35:55,19:53:06 261,07:19:20,13:35:33,19:50:43 262,07:21:01,13:35:12,19:48:20 263,07:22:41,13:34:51,19:45:57 264,07:24:22,13:34:29,19:43:34 265,07:26:02,13:34:08,19:41:12 266,07:27:43,13:33:47,19:38:49 267,07:29:24,13:33:26,19:36:26 268,07:31:05,13:33:05,19:34:04 269,07:32:46,13:32:44,19:31:41 270,07:34:27,13:32:23,19:29:19 271,07:36:09,13:32:03,19:26:57 272,07:37:51,13:31:43,19:24:35 273,07:39:33,13:31:23,19:22:14 274,07:41:15,13:31:03,19:19:53 275,07:42:57,13:30:44,19:17:32 276,07:44:40,13:30:24,19:15:11 277,07:46:23,13:30:06,19:12:51 278,07:48:06,13:29:47,19:10:31 279,07:49:49,13:29:29,19:08:12 280,07:51:33,13:29:11,19:05:53 281,07:53:17,13:28:54,19:03:35 282,07:55:01,13:28:37,19:01:17 283,07:56:45,13:28:20,18:59:00 284,07:58:30,13:28:04,18:56:44 285,08:00:15,13:27:49,18:54:28 286,08:02:00,13:27:34,18:52:13 287,08:03:46,13:27:19,18:49:58 288,08:05:32,13:27:05,18:47:44 289,08:07:19,13:26:52,18:45:32 290,08:09:05,13:26:39,18:43:20 291,08:10:52,13:26:26,18:41:08 292,08:12:39,13:26:15,18:38:58 293,08:14:27,13:26:03,18:36:49 294,08:16:15,13:25:53,18:34:41 295,08:18:03,13:25:43,18:32:33 296,08:19:51,13:25:34,18:30:27 297,08:21:40,13:25:26,18:28:22 298,08:23:29,13:25:18,18:26:18 299,08:25:18,13:25:11,18:24:16 300,07:27:08,12:25:05,17:22:14 301,07:28:57,12:24:59,17:20:14 302,07:30:47,12:24:55,17:18:16 303,07:32:37,12:24:51,17:16:18 304,07:34:27,12:24:48,17:14:22 305,07:36:18,12:24:45,17:12:28 306,07:38:08,12:24:44,17:10:35 307,07:39:58,12:24:43,17:08:44 308,07:41:49,12:24:43,17:06:54 309,07:43:39,12:24:44,17:05:06 310,07:45:29,12:24:46,17:03:20 311,07:47:20,12:24:48,17:01:36 312,07:49:10,12:24:52,16:59:53 313,07:51:00,12:24:56,16:58:13 314,07:52:49,12:25:01,16:56:34 315,07:54:39,12:25:07,16:54:57 316,07:56:28,12:25:14,16:53:23 317,07:58:16,12:25:22,16:51:50 318,08:00:04,12:25:31,16:50:20 319,08:01:52,12:25:40,16:48:52 320,08:03:39,12:25:50,16:47:27 321,08:05:25,12:26:02,16:46:03 322,08:07:11,12:26:14,16:44:43 323,08:08:56,12:26:26,16:43:24 324,08:10:40,12:26:40,16:42:08 325,08:12:23,12:26:55,16:40:55 326,08:14:05,12:27:10,16:39:45 327,08:15:46,12:27:26,16:38:37 328,08:17:26,12:27:43,16:37:32 329,08:19:04,12:28:01,16:36:29 330,08:20:41,12:28:19,16:35:30 331,08:22:17,12:28:38,16:34:34 332,08:23:51,12:28:58,16:33:40 333,08:25:23,12:29:19,16:32:50 334,08:26:54,12:29:40,16:32:03 335,08:28:23,12:30:02,16:31:19 336,08:29:50,12:30:24,16:30:38 337,08:31:15,12:30:48,16:30:00 338,08:32:38,12:31:11,16:29:26 339,08:33:58,12:31:36,16:28:55 340,08:35:17,12:32:01,16:28:27 341,08:36:33,12:32:26,16:28:03 342,08:37:47,12:32:52,16:27:42 343,08:38:58,12:33:18,16:27:25 344,08:40:06,12:33:45,16:27:11 345,08:41:12,12:34:12,16:27:01 346,08:42:15,12:34:40,16:26:54 347,08:43:16,12:35:08,16:26:51 348,08:44:13,12:35:36,16:26:51 349,08:45:07,12:36:05,16:26:55 350,08:45:59,12:36:34,16:27:02 351,08:46:47,12:37:03,16:27:14 352,08:47:32,12:37:32,16:27:28 353,08:48:13,12:38:02,16:27:46 354,08:48:52,12:38:31,16:28:08 355,08:49:27,12:39:01,16:28:34 356,08:49:59,12:39:31,16:29:02 357,08:50:27,12:40:00,16:29:35 358,08:50:52,12:40:30,16:30:10 359,08:51:14,12:41:00,16:30:49 360,08:51:32,12:41:29,16:31:32 361,08:51:46,12:41:59,16:32:18 362,08:51:57,12:42:28,16:33:07 363,08:52:04,12:42:58,16:33:59 364,08:52:08,12:43:27,16:34:54 365,08:52:09,12:43:56,16:35:52 366,08:52:05,12:44:24,16:36:54 +day,rise,noon,set +1,08:52:04,12:44:31,16:37:10 +2,08:51:56,12:44:59,16:38:15 +3,08:51:45,12:45:27,16:39:22 +4,08:51:31,12:45:55,16:40:33 +5,08:51:13,12:46:22,16:41:46 +6,08:50:51,12:46:48,16:43:02 +7,08:50:26,12:47:15,16:44:20 +8,08:49:58,12:47:40,16:45:41 +9,08:49:27,12:48:06,16:47:04 +10,08:48:52,12:48:30,16:48:30 +11,08:48:14,12:48:55,16:49:57 +12,08:47:32,12:49:18,16:51:27 +13,08:46:48,12:49:41,16:52:58 +14,08:46:00,12:50:04,16:54:31 +15,08:45:10,12:50:25,16:56:07 +16,08:44:16,12:50:46,16:57:43 +17,08:43:19,12:51:07,16:59:22 +18,08:42:20,12:51:27,17:01:02 +19,08:41:17,12:51:46,17:02:43 +20,08:40:12,12:52:04,17:04:26 +21,08:39:04,12:52:21,17:06:10 +22,08:37:53,12:52:38,17:07:55 +23,08:36:40,12:52:54,17:09:41 +24,08:35:24,12:53:10,17:11:29 +25,08:34:06,12:53:24,17:13:17 +26,08:32:45,12:53:38,17:15:06 +27,08:31:21,12:53:51,17:16:56 +28,08:29:56,12:54:03,17:18:46 +29,08:28:28,12:54:14,17:20:37 +30,08:26:58,12:54:24,17:22:29 +31,08:25:25,12:54:34,17:24:21 +32,08:23:51,12:54:43,17:26:14 +33,08:22:15,12:54:51,17:28:07 +34,08:20:36,12:54:58,17:30:01 +35,08:18:56,12:55:04,17:31:54 +36,08:17:14,12:55:10,17:33:48 +37,08:15:29,12:55:15,17:35:42 +38,08:13:44,12:55:19,17:37:37 +39,08:11:56,12:55:22,17:39:31 +40,08:10:07,12:55:24,17:41:26 +41,08:08:16,12:55:25,17:43:20 +42,08:06:23,12:55:26,17:45:14 +43,08:04:29,12:55:26,17:47:09 +44,08:02:34,12:55:25,17:49:03 +45,08:00:37,12:55:24,17:50:57 +46,07:58:39,12:55:21,17:52:52 +47,07:56:39,12:55:18,17:54:46 +48,07:54:38,12:55:14,17:56:39 +49,07:52:36,12:55:10,17:58:33 +50,07:50:33,12:55:05,18:00:26 +51,07:48:29,12:54:59,18:02:19 +52,07:46:23,12:54:52,18:04:12 +53,07:44:16,12:54:45,18:06:05 +54,07:42:09,12:54:37,18:07:57 +55,07:40:00,12:54:29,18:09:50 +56,07:37:51,12:54:20,18:11:41 +57,07:35:40,12:54:10,18:13:33 +58,07:33:29,12:54:00,18:15:24 +59,07:31:17,12:53:49,18:17:15 +60,07:29:04,12:53:38,18:19:06 +61,07:26:50,12:53:26,18:20:57 +62,07:24:36,12:53:14,18:22:47 +63,07:22:21,12:53:01,18:24:37 +64,07:20:05,12:52:48,18:26:26 +65,07:17:49,12:52:34,18:28:15 +66,07:15:32,12:52:20,18:30:04 +67,07:13:15,12:52:05,18:31:53 +68,07:10:57,12:51:51,18:33:42 +69,07:08:39,12:51:35,18:35:30 +70,07:06:20,12:51:20,18:37:18 +71,07:04:01,12:51:04,18:39:06 +72,07:01:42,12:50:48,18:40:53 +73,06:59:22,12:50:31,18:42:41 +74,06:57:02,12:50:15,18:44:28 +75,06:54:42,12:49:58,18:46:15 +76,06:52:21,12:49:41,18:48:01 +77,06:50:00,12:49:23,18:49:48 +78,06:47:39,12:49:06,18:51:34 +79,06:45:18,12:48:48,18:53:21 +80,06:42:57,12:48:30,18:55:07 +81,06:40:35,12:48:13,18:56:53 +82,06:38:14,12:47:55,18:58:38 +83,06:35:53,12:47:37,19:00:24 +84,06:33:31,12:47:18,19:02:10 +85,06:31:10,12:47:00,19:03:55 +86,06:28:49,12:46:42,19:05:40 +87,06:26:27,12:46:24,19:07:26 +88,06:24:06,12:46:06,19:09:11 +89,06:21:45,12:45:48,19:10:56 +90,06:19:24,12:45:30,19:12:41 +91,07:17:04,13:45:12,20:14:26 +92,07:14:44,13:44:54,20:16:12 +93,07:12:24,13:44:37,20:17:57 +94,07:10:04,13:44:19,20:19:42 +95,07:07:44,13:44:02,20:21:27 +96,07:05:25,13:43:45,20:23:12 +97,07:03:07,13:43:28,20:24:57 +98,07:00:49,13:43:11,20:26:42 +99,06:58:31,13:42:55,20:28:26 +100,06:56:13,13:42:38,20:30:11 +101,06:53:57,13:42:22,20:31:56 +102,06:51:41,13:42:07,20:33:41 +103,06:49:25,13:41:51,20:35:26 +104,06:47:10,13:41:36,20:37:11 +105,06:44:56,13:41:21,20:38:56 +106,06:42:42,13:41:07,20:40:41 +107,06:40:29,13:40:53,20:42:26 +108,06:38:17,13:40:39,20:44:11 +109,06:36:06,13:40:26,20:45:56 +110,06:33:55,13:40:13,20:47:41 +111,06:31:46,13:40:01,20:49:26 +112,06:29:37,13:39:49,20:51:10 +113,06:27:29,13:39:37,20:52:55 +114,06:25:22,13:39:26,20:54:39 +115,06:23:17,13:39:15,20:56:24 +116,06:21:12,13:39:05,20:58:08 +117,06:19:09,13:38:56,20:59:52 +118,06:17:06,13:38:46,21:01:36 +119,06:15:05,13:38:38,21:03:20 +120,06:13:05,13:38:30,21:05:03 +121,06:11:06,13:38:22,21:06:46 +122,06:09:09,13:38:15,21:08:29 +123,06:07:13,13:38:08,21:10:12 +124,06:05:19,13:38:02,21:11:54 +125,06:03:26,13:37:57,21:13:35 +126,06:01:34,13:37:52,21:15:17 +127,05:59:44,13:37:48,21:16:58 +128,05:57:56,13:37:44,21:18:38 +129,05:56:09,13:37:41,21:20:18 +130,05:54:24,13:37:38,21:21:57 +131,05:52:41,13:37:36,21:23:35 +132,05:51:00,13:37:34,21:25:13 +133,05:49:20,13:37:33,21:26:50 +134,05:47:43,13:37:33,21:28:26 +135,05:46:07,13:37:33,21:30:01 +136,05:44:34,13:37:34,21:31:36 +137,05:43:02,13:37:35,21:33:09 +138,05:41:33,13:37:37,21:34:41 +139,05:40:06,13:37:40,21:36:12 +140,05:38:41,13:37:43,21:37:42 +141,05:37:18,13:37:46,21:39:11 +142,05:35:58,13:37:50,21:40:38 +143,05:34:40,13:37:55,21:42:04 +144,05:33:25,13:38:00,21:43:28 +145,05:32:12,13:38:06,21:44:51 +146,05:31:02,13:38:12,21:46:12 +147,05:29:54,13:38:18,21:47:32 +148,05:28:49,13:38:26,21:48:50 +149,05:27:47,13:38:33,21:50:06 +150,05:26:47,13:38:41,21:51:20 +151,05:25:51,13:38:49,21:52:31 +152,05:24:57,13:38:58,21:53:41 +153,05:24:06,13:39:08,21:54:49 +154,05:23:18,13:39:17,21:55:55 +155,05:22:33,13:39:27,21:56:58 +156,05:21:51,13:39:37,21:57:59 +157,05:21:12,13:39:48,21:58:57 +158,05:20:36,13:39:59,21:59:53 +159,05:20:03,13:40:10,22:00:46 +160,05:19:33,13:40:22,22:01:37 +161,05:19:07,13:40:34,22:02:25 +162,05:18:43,13:40:46,22:03:10 +163,05:18:23,13:40:58,22:03:53 +164,05:18:07,13:41:10,22:04:32 +165,05:17:53,13:41:23,22:05:09 +166,05:17:43,13:41:35,22:05:43 +167,05:17:35,13:41:48,22:06:13 +168,05:17:31,13:42:01,22:06:41 +169,05:17:31,13:42:14,22:07:05 +170,05:17:33,13:42:27,22:07:26 +171,05:17:39,13:42:40,22:07:44 +172,05:17:48,13:42:53,22:07:59 +173,05:18:00,13:43:06,22:08:11 +174,05:18:16,13:43:19,22:08:19 +175,05:18:34,13:43:32,22:08:25 +176,05:18:56,13:43:45,22:08:26 +177,05:19:21,13:43:58,22:08:25 +178,05:19:48,13:44:10,22:08:20 +179,05:20:19,13:44:23,22:08:12 +180,05:20:53,13:44:35,22:08:01 +181,05:21:29,13:44:47,22:07:46 +182,05:22:08,13:44:59,22:07:28 +183,05:22:51,13:45:10,22:07:07 +184,05:23:36,13:45:22,22:06:43 +185,05:24:23,13:45:33,22:06:15 +186,05:25:13,13:45:43,22:05:44 +187,05:26:06,13:45:54,22:05:10 +188,05:27:01,13:46:04,22:04:33 +189,05:27:59,13:46:13,22:03:53 +190,05:28:59,13:46:22,22:03:10 +191,05:30:01,13:46:31,22:02:24 +192,05:31:05,13:46:40,22:01:34 +193,05:32:12,13:46:48,22:00:42 +194,05:33:20,13:46:55,21:59:47 +195,05:34:31,13:47:02,21:58:49 +196,05:35:43,13:47:09,21:57:48 +197,05:36:57,13:47:15,21:56:44 +198,05:38:13,13:47:20,21:55:38 +199,05:39:31,13:47:25,21:54:29 +200,05:40:50,13:47:30,21:53:17 +201,05:42:11,13:47:33,21:52:03 +202,05:43:33,13:47:37,21:50:47 +203,05:44:57,13:47:40,21:49:27 +204,05:46:21,13:47:42,21:48:06 +205,05:47:48,13:47:43,21:46:42 +206,05:49:15,13:47:44,21:45:16 +207,05:50:43,13:47:45,21:43:47 +208,05:52:13,13:47:45,21:42:17 +209,05:53:43,13:47:44,21:40:44 +210,05:55:14,13:47:43,21:39:09 +211,05:56:47,13:47:41,21:37:32 +212,05:58:20,13:47:38,21:35:54 +213,05:59:53,13:47:35,21:34:13 +214,06:01:28,13:47:31,21:32:30 +215,06:03:03,13:47:27,21:30:46 +216,06:04:39,13:47:22,21:29:00 +217,06:06:15,13:47:16,21:27:12 +218,06:07:51,13:47:10,21:25:22 +219,06:09:29,13:47:03,21:23:31 +220,06:11:06,13:46:56,21:21:38 +221,06:12:44,13:46:48,21:19:44 +222,06:14:22,13:46:39,21:17:48 +223,06:16:01,13:46:30,21:15:51 +224,06:17:40,13:46:20,21:13:53 +225,06:19:19,13:46:10,21:11:53 +226,06:20:58,13:45:59,21:09:52 +227,06:22:38,13:45:48,21:07:49 +228,06:24:18,13:45:36,21:05:46 +229,06:25:57,13:45:24,21:03:41 +230,06:27:37,13:45:11,21:01:35 +231,06:29:17,13:44:57,20:59:28 +232,06:30:57,13:44:43,20:57:21 +233,06:32:37,13:44:29,20:55:12 +234,06:34:18,13:44:14,20:53:02 +235,06:35:58,13:43:59,20:50:51 +236,06:37:38,13:43:43,20:48:39 +237,06:39:18,13:43:27,20:46:27 +238,06:40:59,13:43:10,20:44:14 +239,06:42:39,13:42:53,20:42:00 +240,06:44:19,13:42:36,20:39:45 +241,06:45:59,13:42:18,20:37:29 +242,06:47:39,13:42:00,20:35:13 +243,06:49:20,13:41:42,20:32:56 +244,06:51:00,13:41:23,20:30:39 +245,06:52:40,13:41:04,20:28:21 +246,06:54:20,13:40:45,20:26:03 +247,06:56:00,13:40:25,20:23:44 +248,06:57:40,13:40:06,20:21:24 +249,06:59:20,13:39:46,20:19:04 +250,07:01:00,13:39:25,20:16:44 +251,07:02:40,13:39:05,20:14:23 +252,07:04:20,13:38:44,20:12:02 +253,07:06:00,13:38:23,20:09:41 +254,07:07:40,13:38:02,20:07:20 +255,07:09:20,13:37:41,20:04:58 +256,07:11:00,13:37:20,20:02:36 +257,07:12:40,13:36:59,20:00:13 +258,07:14:20,13:36:38,19:57:51 +259,07:16:00,13:36:16,19:55:28 +260,07:17:40,13:35:55,19:53:06 +261,07:19:20,13:35:33,19:50:43 +262,07:21:01,13:35:12,19:48:20 +263,07:22:41,13:34:51,19:45:57 +264,07:24:22,13:34:29,19:43:34 +265,07:26:02,13:34:08,19:41:12 +266,07:27:43,13:33:47,19:38:49 +267,07:29:24,13:33:26,19:36:26 +268,07:31:05,13:33:05,19:34:04 +269,07:32:46,13:32:44,19:31:41 +270,07:34:27,13:32:23,19:29:19 +271,07:36:09,13:32:03,19:26:57 +272,07:37:51,13:31:43,19:24:35 +273,07:39:33,13:31:23,19:22:14 +274,07:41:15,13:31:03,19:19:53 +275,07:42:57,13:30:44,19:17:32 +276,07:44:40,13:30:24,19:15:11 +277,07:46:23,13:30:06,19:12:51 +278,07:48:06,13:29:47,19:10:31 +279,07:49:49,13:29:29,19:08:12 +280,07:51:33,13:29:11,19:05:53 +281,07:53:17,13:28:54,19:03:35 +282,07:55:01,13:28:37,19:01:17 +283,07:56:45,13:28:20,18:59:00 +284,07:58:30,13:28:04,18:56:44 +285,08:00:15,13:27:49,18:54:28 +286,08:02:00,13:27:34,18:52:13 +287,08:03:46,13:27:19,18:49:58 +288,08:05:32,13:27:05,18:47:44 +289,08:07:19,13:26:52,18:45:32 +290,08:09:05,13:26:39,18:43:20 +291,08:10:52,13:26:26,18:41:08 +292,08:12:39,13:26:15,18:38:58 +293,08:14:27,13:26:03,18:36:49 +294,08:16:15,13:25:53,18:34:41 +295,08:18:03,13:25:43,18:32:33 +296,08:19:51,13:25:34,18:30:27 +297,08:21:40,13:25:26,18:28:22 +298,08:23:29,13:25:18,18:26:18 +299,08:25:18,13:25:11,18:24:16 +300,07:27:08,12:25:05,17:22:14 +301,07:28:57,12:24:59,17:20:14 +302,07:30:47,12:24:55,17:18:16 +303,07:32:37,12:24:51,17:16:18 +304,07:34:27,12:24:48,17:14:22 +305,07:36:18,12:24:45,17:12:28 +306,07:38:08,12:24:44,17:10:35 +307,07:39:58,12:24:43,17:08:44 +308,07:41:49,12:24:43,17:06:54 +309,07:43:39,12:24:44,17:05:06 +310,07:45:29,12:24:46,17:03:20 +311,07:47:20,12:24:48,17:01:36 +312,07:49:10,12:24:52,16:59:53 +313,07:51:00,12:24:56,16:58:13 +314,07:52:49,12:25:01,16:56:34 +315,07:54:39,12:25:07,16:54:57 +316,07:56:28,12:25:14,16:53:23 +317,07:58:16,12:25:22,16:51:50 +318,08:00:04,12:25:31,16:50:20 +319,08:01:52,12:25:40,16:48:52 +320,08:03:39,12:25:50,16:47:27 +321,08:05:25,12:26:02,16:46:03 +322,08:07:11,12:26:14,16:44:43 +323,08:08:56,12:26:26,16:43:24 +324,08:10:40,12:26:40,16:42:08 +325,08:12:23,12:26:55,16:40:55 +326,08:14:05,12:27:10,16:39:45 +327,08:15:46,12:27:26,16:38:37 +328,08:17:26,12:27:43,16:37:32 +329,08:19:04,12:28:01,16:36:29 +330,08:20:41,12:28:19,16:35:30 +331,08:22:17,12:28:38,16:34:34 +332,08:23:51,12:28:58,16:33:40 +333,08:25:23,12:29:19,16:32:50 +334,08:26:54,12:29:40,16:32:03 +335,08:28:23,12:30:02,16:31:19 +336,08:29:50,12:30:24,16:30:38 +337,08:31:15,12:30:48,16:30:00 +338,08:32:38,12:31:11,16:29:26 +339,08:33:58,12:31:36,16:28:55 +340,08:35:17,12:32:01,16:28:27 +341,08:36:33,12:32:26,16:28:03 +342,08:37:47,12:32:52,16:27:42 +343,08:38:58,12:33:18,16:27:25 +344,08:40:06,12:33:45,16:27:11 +345,08:41:12,12:34:12,16:27:01 +346,08:42:15,12:34:40,16:26:54 +347,08:43:16,12:35:08,16:26:51 +348,08:44:13,12:35:36,16:26:51 +349,08:45:07,12:36:05,16:26:55 +350,08:45:59,12:36:34,16:27:02 +351,08:46:47,12:37:03,16:27:14 +352,08:47:32,12:37:32,16:27:28 +353,08:48:13,12:38:02,16:27:46 +354,08:48:52,12:38:31,16:28:08 +355,08:49:27,12:39:01,16:28:34 +356,08:49:59,12:39:31,16:29:02 +357,08:50:27,12:40:00,16:29:35 +358,08:50:52,12:40:30,16:30:10 +359,08:51:14,12:41:00,16:30:49 +360,08:51:32,12:41:29,16:31:32 +361,08:51:46,12:41:59,16:32:18 +362,08:51:57,12:42:28,16:33:07 +363,08:52:04,12:42:58,16:33:59 +364,08:52:08,12:43:27,16:34:54 +365,08:52:09,12:43:56,16:35:52 +366,08:52:05,12:44:24,16:36:54 diff --git a/wunderground.php b/wunderground.php index 1e8ab37..6e51b71 100755 --- a/wunderground.php +++ b/wunderground.php @@ -1,5 +1,5 @@