Ljuset är uppdelat på sju reläer (då mitt reläkort har åtta portar och en används till värmaren):
#1 på GPIO2 (pinne 3): 2 st Royal Blue (445nm), används som månljus men är även tända med de andra för växternas skull.
#2 på GPIO3 (pinne 5): 1 st röd (660nm) och 1 st vit (6500K)
#3 på GPIO17 (pinne 11): 1 st röd (660nm) och 1 st vit (6500K)
#4 på GPIO27 (pinne 13): 1 st vit (6500K)
#5 på GPIO10 (pinne 19): 1 st vit (6500K)
#6 på GPIO9 (pinne 21): 1 st vit (6500K)
#7 på GPIO11 (pinne 23): 1 st vit (6500K)
Dags för lite styrning! Först går månljuset på, sedan kommer en soluppgång. I slutet på dagen kommer en solnedgång som avslutas med en stunds månljus.
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import datetime
import syslog
import smtplib
from time import strftime
syslog.openlog('aqua-light')
syslog.syslog('Aqua-light started')
# Definiera tider
moon_on = datetime.datetime(2020, 1, 1, 10, 00)
sunrise_on = datetime.datetime(2020, 1, 1, 10, 30)
sunset_on = datetime.datetime(2020, 1, 1, 21, 00)
moon_off = datetime.datetime(2020, 1, 1, 22, 00)
# Klasser
class sunClass:
def __init__(self):
self.sun = [3,17,27,10,9,11]
self.sunLength = len(self.sun)
def init(self):
syslog.syslog('sunClass.init called')
for x in range (0, self.sunLength):
GPIO.setup(self.sun[x], GPIO.OUT)
def off(self):
syslog.syslog('sunClass.off called')
for x in range (0, self.sunLength):
GPIO.output(self.sun[x], LEDOff)
def sunrise(self, runtime):
syslog.syslog('Sunrise started')
for x in range (0, self.sunLength):
GPIO.output(self.sun[x], LEDOn)
if x != self.sunLength - 1: time.sleep(runtime/(self.sunLength-1))
syslog.syslog('Sunrise ended')
def sunset(self, runtime):
syslog.syslog('Sunset started')
for x in range (self.sunLength-1,-1,-1):
GPIO.output(self.sun[x], LEDOff)
if x != 0: time.sleep(runtime/(self.sunLength-1))
syslog.syslog('Sunset ended')
class moonClass:
def __init__(self):
self.moon = 2
def init(self):
syslog.syslog('moonClass.init called')
GPIO.setup(self.moon, GPIO.OUT)
def off(self):
syslog.syslog('moonClass.off called')
GPIO.output(self.moon, LEDOff)
def on(self):
syslog.syslog('moonClass.on called')
GPIO.output(self.moon, LEDOn)
# Variabler
sun = sunClass()
moon = moonClass()
LEDOn = 0
LEDOff = 1
# Funktioner
# Initiera GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
sun.init()
moon.init()
syslog.syslog('GPIO initialized')
# Initiera state
now = datetime.datetime.now()
sun.off()
moon.off()
state = 0
if now.time() > moon_on.time(): state = 1
if now.time() > sunrise_on.time(): state = 2
if now.time() > sunset_on.time(): state = 3
if now.time() > moon_off.time(): state = 0
if state == 1 or state == 3:
moon.on()
elif state != 0:
moon.on()
sun.sunrise(10)
syslog.syslog('Initial state is %d' % state)
# Huvudloop
while True:
now = datetime.datetime.now()
if state == 0:
# Night mode, wait for morning moon
if now.time() > moon_on.time() and now.time() < moon_off.time():
state = 1
syslog.syslog('Entering state 1')
moon.on()
elif state == 1:
# Morning moon, wait for sunrise
if now.time() > sunrise_on.time():
state = 2
syslog.syslog('Entering state 2')
sun.sunrise(1800)
elif state == 2:
# Daytime, wait for sunset
if now.time() > sunset_on.time():
state = 3
syslog.syslog('Entering state 3')
sun.sunset(1800)
elif state == 3:
# evening moon, wait for night
if now.time() > moon_off.time():
state = 0
syslog.syslog('Entering state 0')
moon.off()
time.sleep(60)
För att skriptet ska starta automatiskt behöver man skapa filen aqua-light.service i /lib/systemd/system med följande innehåll:
[Unit]
Description=Aqua-Light
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/local/bin/aquacontrol/aqua-light.py
[Install]
WantedBy=multi-user.target
Kör sedan
sudo chmod +x /usr/local/bin/aquacontrol/aqua-light.py
sudo chmod 644 /lib/systemd/system/aqua-light.service
sudo systemctl daemon-reload
sudo systemctl enable aqua-light.service
så ska det starta automatiskt vid omstart. Det är praktiskt att få loggen som skapas till en egen fil. Skapa filen /etc/rsyslog.d/aqua-light.conf med innehållet
if $programname == 'aqua-light' then /var/log/aqua-light.log