Forumite Members › General Topics › Tech › Software Talk › Python – Sun Position Calculator
- This topic has 0 replies, 1 voice, and was last updated 7 years ago by
Ed P.
-
AuthorPosts
-
March 8, 2019 at 11:26 am #31428
I was being plagued by Pigeons nesting under my solar panels, so I set up a Pi 3A and a powered speaker in my loft to play loud scary pigeon sounds – predators, shotgun blasts and pigeon wing flaps. As may be appreciated I did not want anything human-audible at night so I used Audacity to phase shift the sounds and required a program that knew when it was night, twilight etc. The Python libraries contain a beautiful little script called Astral that does all the hard grunt for you. Obviously this sort of program has utility if you need to switch on IR lights for your security camera etc.
Although this example uses Python it is quite possible to call the Astral program from C/C++:
See https://docs.python.org/2.5/ext/callingPython.html
I stripped the code for posting so feel free to modify and use for your own purposes.
=======================================================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# PigeonScarer.py
#
# Copyright 2019 ed <ed@Mint-Tara>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
##Just one prerequisite:-
# pip install astral
# Astral documentation can be found on Github https://github.com/sffjunkie/astra
# If running via SSH and want to fire and forget, do not forget to use nohupfrom astral import *
import datetime
from datetime import time
import time as t
from time import sleepimport subprocess
from subprocess import check_output
import sys, types, os# Add some required defs
def Sun_period(tdata):
caldate = tdata.year
thour = tdata.hour
tminute = tdata.minute
a = Astral()
location = a[‘London’]
timezone = location.timezone
d = tdata
l = Location()
# add edited location data
l.name = ‘Your Town’
l.region = ‘England’
l.timezone = ‘Europe/London’
l.latitude = 5*.*****
l.longitude = *.***** #Negative if west of Greenwich
l.sun()sun = location.sun(local=True, date=d)
dusk_d = dusk_now = sun[‘dusk’]
sunset_d = sun[‘sunset’]
dawn_d = sun[‘dawn’]
sunrise_d = sun[‘sunrise’]
noon_d = sun[‘noon’]moon_phase = a.moon_phase(date=d)
# All this casting required as Python does not allow objects with/wothout time zone to be compared.
# after this everything is a time object
dawn_thms = time(dawn_d.hour, dawn_d.minute, dawn_d.second)
sunrise_thms = time(sunrise_d.hour, sunrise_d.minute, sunrise_d.second)
dusk_thms = time(dusk_d.hour, dusk_d.minute, dusk_d.second)
sunset_thms = time(sunset_d.hour, sunset_d.minute, sunset_d.second)
noon_thms = time(noon_d.hour, noon_d.minute, noon_d.second)
thms = time(d.hour, d.minute, d.second)if (((thms >=dawn_thms) and (thms<=sunrise_thms)) or ((thms>=sunset_thms) and (thms<=dusk_thms))):
tperiod = ‘Twilight’ # Twilight action
if ((thms>dusk_thms) or (thms<dawn_thms)):
tperiod = ‘Night’ # Night action
if ((thms>sunrise_thms) and (thms<sunset_thms)):
tperiod = ‘Daylight’ #return tperiod
def main(args):
# A trivial program loop that runs for ever and allows different actions based
# on the position of sun
while True:
d = datetime.datetime.now()
today = datetime.date.today()
one_day = datetime.timedelta(days=1)
offsethour = datetime.timedelta(hours=1)
yesterday = today – one_day
tomorrow = today + one_day
hourearlier = d – offsethour
hourlater = d + offsethourtperiod = Sun_period(d)
nperiod = Sun_period(hourlater)
pperiod = Sun_period(hourearlier)
print (‘The Current Period is:’, tperiod)if ((tperiod==’Night’) and (nperiod == ‘Night’)):
subprocess.call(“mpg123 ./Sounds/NightSound.mp3”, shell=True)
t.sleep(60)
if (tperiod==’Twilight’):
subprocess.call(“mpg123 ./Sounds/TwilightSound.mp3”, shell=True)
t.sleep(19)
if (tperiod == ‘Daylight’):
# may need to check time to sunset
R = randint(1,8)
S = randint(30,120)
if R== 1:
# could be a random action
subprocess.call(“mpg123 ./Sounds/DaySounds.mp3”, shell=True)if R== 2: etc
return 0
if __name__ == ‘__main__’:
import sys
sys.exit(main(sys.argv)) -
AuthorPosts
- You must be logged in to reply to this topic.
