Ljusstyrning ver #3

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
Share