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
Privacy Overview
Elofs projekt

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.

Necessary

Strictly Necessary Cookie should be enabled at all times so that we can save your preferences for cookie settings.