Kobus de haan begint ’s ochtends al vroeg te kraaien. Het nachtgedeelte van ons kippenhok is geïsoleerd met piepschuim en dubbelwandig. Dit houdt licht, geluid en kou wel buiten, maar het luikje van het nachthok wilde ik automatisch open en dicht doen. Open elke dag om 9:00 uur, en dicht als de kippen naar binnen zijn, dat doen ze zelf wel, dus als het zonsondergang is geweest kan het luikje wel dicht.

automatisch kippendeurtje met Raspberry Pi

Om dit voor elkaar te krijgen heb ik natuurlijk stroom aangelegd naar het kippenhok, een schuifluikje gemaakt van een plaatje triplex die tussen twee balkjes (ingevreesd) schuift. Boven het luikje heb ik een Raspberry Pi computertje met WiFi en relay gemonteerd op een 3D-geprint houdertje. De relay zit er op zodat ik de 12 volt stroom voor motor en motordriver kan schakelen. Op het luikje zit een magneet die boven en onder een magneetsensor (sluitcontact) kan schakelen om de motor op het juiste moment te stoppen. Ook heb ik inmiddels een IR-sluis gemaakt zodat bij een in de weg zittende kip (soms zitten ze op een mooie zomeravond nog wat in de opening) het dichtgaan gepauzeerd wordt.

In een eerdere versie liet ik het allemaal op die ene Pi regelen, via een api haalde deze op internet de zonsondergangtijd op. Maar ik heb ook een Pi in de meterkast die met behulp van Domoticz allerlei andere zaken regelt (lampen schakelen, rookmelders, stroom- en gasverbruik meet). Deze kun je ook op basis van een vaste tijd of bijvoorbeeld op zonsop- of zonsondergang devices laten schakelen. Ook zijn er meerdere apps voor smartphones te vinden waarmee je handmatig devices kunt sturen.

domoticz kippenluikje

In Domoticz heb ik nu een virtual switch gemaakt die python-scripts (open en dicht) op de andere pi kan starten. Om dat mogelijk te maken moet de ene Pi de andere wel vertrouwen, dmv keys kun je dat regelen zonder dat je wachtwoorden e.d. in je script hoeft mee te sturen. Ik kan nu dus met mijn iPhone of een webbrowser ook het luikje open en dicht doen.

Om 9:00 open, drie kwartier na zonsondergang dicht:

#! /bin/sh
ssh -i xxx/.ssh/id_rsa pi@192.168.xxx.xxx python3 /home/pi/python/deur_open.py > /dev/null 2>&1 &

Het kan nog wel wat efficiënter, maar dit werkt al enige tijd probleemloos.

#luikje openen
import RPi.GPIO as GPIO 
import time 
import requests
import json
import datetime
import logging
from urllib.request import urlopen
logging.basicConfig(level=logging.DEBUG, filename='/home/pi/log/luikje.log', format='%(asctime)s %(message)s')
t = 0
url = "http://192.168.xxx.xxx:yy/json.htm?type=command&param=updateuservariable&vname=luikje&vtype=2&vvalue=Opening" #set Domoticz variabele
data = requests.get(url).json

GPIO.setmode(GPIO.BOARD)

def relay_on():
        GPIO.setup(37,GPIO.OUT) #relay
        GPIO.output(37,GPIO.LOW) #relay aan
        url="http://192.168.xxx.xxx:yy/json.htm?type=command&param=updateuservariable&vname=l298n&vtype=2&vvalue=On"
        data=requests.get(url).json
        time.sleep(3)

def relay_off():
        GPIO.setup(37,GPIO.OUT) #relay
        GPIO.output(37,GPIO.HIGH) #relay uit
        url="http://192.168.xxx.xxx:yy/json.htm?type=command&param=updateuservariable&vname=l298n&vtype=2&vvalue=Off"
        data=requests.get(url).json
        time.sleep(3)

def UsVal_check(x): #status Domoticz variabelen
        urlOpen=urlopen("http://192.168.xxx.xxx:yy/json.htm?type=command&param=getuservariables")
        jData=json.loads(urlOpen.read())
        UsVal=(jData['result'][x]['Value'])
        return(UsVal)

def UsDev_check(x): #status Domoticz device
        urlOpen=urlopen("http://192.168.xxx.xxx:yy/json.htm?type=devices&rid=" + str(x))
        jData=json.loads(urlOpen.read())
        UsDev=(jData['result'][0]['Status'])
        return(UsDev)

def UsVal_status(x): #set status Domoticz variabele luikje
        url = "http://192.168.xxx.xxx:yy/json.htm?type=command&param=updateuservariable&vname=luikje&vtype=2&vvalue=" + x
        data = requests.get(url).json

def forward(x): #motor aan voor x seconden
    GPIO.output(15, GPIO.HIGH)
    time.sleep(x)

def pauze(x):
    GPIO.output(15, GPIO.LOW)
    time.sleep(x)

if UsVal_check(3)=="Off": #Er draait ook een fan die de relay schakelt
	relay_on()

GPIO.setup(32, GPIO.IN, pull_up_down=GPIO.PUD_UP) #magneetsensor
GPIO.setup(15, GPIO.OUT) #motor bw
GPIO.output(15, GPIO.LOW) #motor bw uit
time.sleep(2)

forward(3)

while GPIO.input(32) == 1:
    forward(0.2)

GPIO.output(15, GPIO.LOW) #motor uit
UsVal_status("Open")
if UsVal_check(3)=="Off": #als de fan ook uit is dan relay uitzetten
	relay_off()

GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(32, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#schrijf logging
if GPIO.input(12) == 0 and UsVal_check(1) == 'Closed'  and UsDev_check(15) == 'Closed':
        logtxt = "  Kippenluikje: Closed - sensor up(" + str(GPIO.input(32)) + ") sensor down(" + str(GPIO.input(12)) + ")Domoticz status: (" +  UsVal_check(1) + ") Device status: (" + UsDev_check(15) + ")"
        logging.debug(logtxt)
        if UsVal_check(1) != "Closed":
                UsVal_status("Closed") #set Domoticz variabele
elif GPIO.input(32) == 0 and UsVal_check(1) == 'Open' and UsDev_check(15) == 'Open':
        logtxt = "  Kippenluikje: Open - sensor up(" + str(GPIO.input(32)) + ") sensor down(" + str(GPIO.input(12)) + ")Domoticz status: (" +  UsVal_check(1) + ") Device status: (" + UsDev_check(15) + ")"
        logging.debug(logtxt)
        if UsVal_check(1) != "Open":
        	UsVal_status("Open") #set Domoticz variabele
else:
        logtxt = "  Kippenluikje: Error - sensor up(" + str(GPIO.input(32)) + ") sensor down(" + str(GPIO.input(12)) + ")Domoticz status: (" +  UsVal_check(1) + ") Device status: (" + UsDev_check(15) + ")"
        logging.debug(logtxt)
        	UsVal_status("Error") #set Domoticz variabele

GPIO.cleanup()

#! /bin/sh
ssh -i xxx/.ssh/id_rsa pi@192.168.xxx.xxx python3 /home/pi/python/deur_close.py > /dev/null 2>&1 &

Het sluiten is iets ingewikkelder, als de magneet bij de sensor is is het luikje nog niet helemaal dicht en laat ik hem 2 seconden door lopen. Bovendien zit er een pauze in als de IR-sensor geblokkeerd wordt.

import RPi.GPIO as GPIO 
import time 
import requests
import json
import datetime
import logging
from urllib.request import urlopen
logging.basicConfig(level=logging.DEBUG, filename='/home/pi/log/luikje.log', format='%(asctime)s %(message)s')
t = 0
direction=0

GPIO.setmode(GPIO.BOARD)

def relay_on():
        GPIO.setup(37,GPIO.OUT) #relay
        GPIO.output(37,GPIO.LOW) #relay aan
        url="http://192.168.xxx.xxx:xxxx/json.htm?type=command&param=updateuservariable&vname=l298n&vtype=2&vvalue=On" #set Domoticz variabele
        data=requests.get(url).json
        time.sleep(3)

def relay_off():
        GPIO.setup(37,GPIO.OUT) #relay
        GPIO.output(37,GPIO.HIGH) #relay uit
        url="http://192.168.xxx.xxx:xxxx/json.htm?type=command&param=updateuservariable&vname=l298n&vtype=2&vvalue=Off" #set Domoticz variabele
        data=requests.get(url).json
        time.sleep(3)

def UsVal_check(x): #check Domoticz variabele
        urlOpen=urlopen("http://192.168.xxx.xxx:xxxx/json.htm?type=command&param=getuservariables")
        jData=json.loads(urlOpen.read())
        UsVal=(jData['result'][x]['Value'])
        return(UsVal)

def UsVal_status(x):
	url = "http://192.168.xxx.xxx:xxxx/json.htm?type=command&param=updateuservariable&vname=luikje&vtype=2&vvalue=" + x #set Domoticz variabele
	data = requests.get(url).json

def UsDev_check(x): #check Domoticz device
        urlOpen=urlopen("http://192.168.xxx.xxx:xxxx/json.htm?type=devices&rid=" + str(x))
        jData=json.loads(urlOpen.read())
        UsDev=(jData['result'][0]['Status'])
        return(UsDev)

def forward(x):
    GPIO.output(13, GPIO.HIGH)
    time.sleep(x)

def backward(x):
    GPIO.output(15, GPIO.HIGH)
    time.sleep(x)

def pauze(x):
    GPIO.output(13, GPIO.LOW)
    time.sleep(x)

UsVal_status("Closing")

if UsVal_check(3)=="Off":
	relay_on()

GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP) #sensor onder
GPIO.setup(13, GPIO.OUT) #motor fw
GPIO.output(13, GPIO.LOW) #motor fw uit

GPIO.setup(32, GPIO.IN, pull_up_down=GPIO.PUD_UP) #sensor boven
GPIO.setup(15, GPIO.OUT) #motor bw
GPIO.output(15, GPIO.LOW) #motor bw uit

GPIO.setup(33, GPIO.IN, pull_up_down=GPIO.PUD_UP) #ir-sensor

time.sleep(2)
forward(3) 

while GPIO.input(33)==0: #ir-sensor geblokkeerd dan wachten
	pauze(60)

while GPIO.input(12) == 1 and direction==0:
	forward(0.2)
#sensor reageert iets eerder dan dat het luikje helemaal dicht is, twee seconden extra sluiten
time.sleep(2)
#motor uit
GPIO.output(13, GPIO.LOW)

#set logging
if GPIO.input(12) == 0 and UsVal_check(1) == 'Closed'  and UsDev_check(15) == 'Closed':
        logtxt = "  Kippenluikje: Closed - sensor up(" + str(GPIO.input(32)) + ") sensor down(" + str(GPIO.input(12)) + ") Domoticz status: (" +  UsVal_check(1) + ") Device status: (" + UsDev_check(15) + ")"
        logging.debug(logtxt)
        if UsVal_check(1) != "Closed":
                UsVal_status("Closed") #set status Domoticz variabele
elif GPIO.input(32) == 0 and UsVal_check(1) == 'Open' and UsDev_check(15) == 'Open':
        logtxt = "  Kippenluikje: Open - sensor up(" + str(GPIO.input(32)) + ") sensor down(" + str(GPIO.input(12)) + ") Domoticz status: (" +  UsVal_check(1) + ") Device status: (" + UsDev_check(15) + ")"
        logging.debug(logtxt)
        if UsVal_check(1) != "Open":
                UsVal_status("Open") #set status Domoticz variabele
else:
        logtxt = "  Kippenluikje: Error - sensor up(" + str(GPIO.input(32)) + ") sensor down(" + str(GPIO.input(12)) + ") Domoticz status: (" +  UsVal_check(1) + ") Device status: (" + UsDev_check(15) + ")"
        logging.debug(logtxt)
                UsVal_status("Error") #set status Domoticz variabele

time.sleep(1)

if UsVal_check(3)=="Off": #check de fan
	relay_off()
GPIO.cleanup()

Aan het eind schrijft het script de status van devices en sensoren weg in de logging. Mocht er iets niet goed staan, dan wordt de variabele luikje in Labosys omgezet in ‘Error’. Domoticz stuurt dan een signaal naar mijn app op mijn iPhone. Alhoewel ik steeds meer met scripts doe in Domoticz had ik deze in Blockly gemaakt. Ik maak zelf gebruik van de Pilot app die een api heeft die je vanuit Domoticz kunt aanroepen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *