Kellerluft Steuerung
Verfasst: Mittwoch 5. April 2017, 18:28
Hallo,
ich habe seit kurzer Zeit mir auch mal einen PI zugelegt ohne zu ahnen das Linux und die Programmiersprachen Python PHP so kompliziert sind mag wohl daran liegen das ich zuvor nur mit Windows gearbeitet habe und ein wenig in C# programmiert habe.
Das Auslesen von Gaszähler, Stromzähler, Wasserzähler funktionier wunderbar auch Daten aus der Heizung auslesen und in die MySQLdb schreiben geht einwandfrei.
Mein neuestes Projekt ist die Luft im Keller zu steuern bzw das Fenster und den Lüfter.
Wie gesagt da ich Blutiger Anfänger bin mir die Syntax schwer fällt ich nicht unbedingt Python studieren möchte hoffe ich hier ein paar Tipps zubekommen was an meinem Code alles so falsch ist.
Ich habe einen Sensor im Keller und eine Außen die Werte schreibe ich Minütlich in eine MySQLdb das funktioniert. Jetzt möchte ich anhand der Werte gucken wo die Luft besser bzw. trockner ist um das Fenster und den Lüfter dementsprechend zu schalten.
Ich habe einen Ketten Motor am Fenster montiert der leider von alleine sehr spät abschaltet so das er mir den Rahmen am Fenster verzieht deswegen darf der nur 8 Sekunden laufen. Also 8 Sekunden für auf und 8 Sekunden für zu.
Leider hat Python manchmal das Problem obwohl in der Datenbank der Wert AUF steht trotzdem das Fenster versucht zu öffnen somit sich wieder mein Rahmen am Fenster verzieht.
Leider hat Python nicht so eine schöne IDE wie Visual Studio und somit kann ich nicht wirklich sehen wo es da hakt???
Dann habe ich noch eine Frage wie könnte ich noch einbauen das der Lüfter nicht immer an ist sondern z.B. 30min an 30min aus???
Kann mir vielleicht einer Helfen.
Vielen Dank vorab
Gruß
ich habe seit kurzer Zeit mir auch mal einen PI zugelegt ohne zu ahnen das Linux und die Programmiersprachen Python PHP so kompliziert sind mag wohl daran liegen das ich zuvor nur mit Windows gearbeitet habe und ein wenig in C# programmiert habe.
Das Auslesen von Gaszähler, Stromzähler, Wasserzähler funktionier wunderbar auch Daten aus der Heizung auslesen und in die MySQLdb schreiben geht einwandfrei.
Mein neuestes Projekt ist die Luft im Keller zu steuern bzw das Fenster und den Lüfter.
Wie gesagt da ich Blutiger Anfänger bin mir die Syntax schwer fällt ich nicht unbedingt Python studieren möchte hoffe ich hier ein paar Tipps zubekommen was an meinem Code alles so falsch ist.
Ich habe einen Sensor im Keller und eine Außen die Werte schreibe ich Minütlich in eine MySQLdb das funktioniert. Jetzt möchte ich anhand der Werte gucken wo die Luft besser bzw. trockner ist um das Fenster und den Lüfter dementsprechend zu schalten.
Ich habe einen Ketten Motor am Fenster montiert der leider von alleine sehr spät abschaltet so das er mir den Rahmen am Fenster verzieht deswegen darf der nur 8 Sekunden laufen. Also 8 Sekunden für auf und 8 Sekunden für zu.
Leider hat Python manchmal das Problem obwohl in der Datenbank der Wert AUF steht trotzdem das Fenster versucht zu öffnen somit sich wieder mein Rahmen am Fenster verzieht.
Leider hat Python nicht so eine schöne IDE wie Visual Studio und somit kann ich nicht wirklich sehen wo es da hakt???
Dann habe ich noch eine Frage wie könnte ich noch einbauen das der Lüfter nicht immer an ist sondern z.B. 30min an 30min aus???
Kann mir vielleicht einer Helfen.
Vielen Dank vorab
Gruß
Code: Alles auswählen
#-*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import datetime
import MySQLdb
import math
TempK="20"
TempA="20"
HydroK="0.0"
HydroA="0.0"
bedingung = "Status"
fensterstatus = 0
luefterstatus = 0
entfeuchterstatus = 0
fensterbewegung = 0
luft=0
#GPIO fuer Steuerung
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(True)
#GPIO definieren
RELAI_FensterAuf = 33
RELAI_FensterZu = 35
RELAI_Luefter = 22
RELAI_Entfeuchter = 29
#GPIO als Ausgang
GPIO.setup(RELAI_FensterAuf, GPIO.OUT)
GPIO.setup(RELAI_FensterZu, GPIO.OUT)
GPIO.setup(RELAI_Luefter, GPIO.OUT)
GPIO.setup(RELAI_Entfeuchter, GPIO.OUT)
#GPIO als Eingang für Kellerfensterschalter (11) GPIO17
GPIO.setup(11,GPIO.IN,pull_up_down = GPIO.PUD_DOWN)
#Status aus Datenbank lesen
def getStatus():
global fensterstatus
global luefterstatus
global entfeuchterstatus
db = MySQLdb.connect(host="localhost", user="root", passwd="2012", db="Haus")
cursor = db.cursor()
cursor.execute("""SELECT Fenster, Luefter, Luftentfeuchter FROM Kellerstatus ORDER BY zeitstempel DESC LIMIT 1""")
result2 = cursor.fetchall()
for data in result2:
fensterstatus=data[0]
luefterstatus=data[1]
entfeuchterstatus=data[2]
cursor.close()
print("Status aus Datenbank eingelesen " + str(fensterstatus)+str(luefterstatus)+str(entfeuchterstatus))
return fensterstatus, luefterstatus, entfeuchterstatus
#Temperatur und Luftfeuchte einlenen aus Kellerdatenbank
def getWerte():
global TempK
global TempA
global HydroA
global HydroK
db = MySQLdb.connect(host="localhost", user="root", passwd="2012", db="Haus")
cursor = db.cursor()
cursor.execute("""SELECT temperatur, hydro, temperaturauss, hydroauss FROM keller ORDER BY zeitstempel DESC LIMIT 1""")
AB = cursor.fetchall()
for data in AB:
TempK=data[0]
TempA=data[2]
HydroK=data[1]
HydroA=data[3]
cursor.close()
print("Werte aus Kellerdatenbank eingelesen " + str(TempK) + str(TempA)+ str(HydroA) + str(HydroK))
return TempK, TempA, HydroK, HydroA
#Status in Datenbank schreiben
def setStatus(fs,ls,es,bd):
global fensterstatus
global luefterstatus
global entfeuchterstatus
db = MySQLdb.connect(host="localhost", user="root", passwd="2012", db="Haus")
cursor = db.cursor()
cursor.execute("UPDATE Kellerstatus SET Fenster=%s, Luefter=%s, Luftentfeuchter=%s, bedingung=%s, zeitstempel=CURRENT_TIMESTAMP",(fs,ls,es,bd))
db.commit()
cursor.close()
fensterstatus=fs
luefterstatus=ls
entfeuchterstatus=es
print("Werte in Datenbank geschrieben " + str(fensterstatus) + str(luefterstatus) + str(entfeuchterstatus))
return fensterstatus, luefterstatus, entfeuchterstatus, bedingung
#Taupunktberechnung
def Taupunkt(t, h):
a1 = 7.45
b1 = 235
dp = float(t)
fw = float(h)
x1=(a1*dp)/(b1+dp)
e1=6.1*math.exp(x1*2.3025851)
e2=e1*fw/100
x2=e2/6.1
x3=0.434292289*math.log(x2)
dew=(235*x3)/(7.45-x3)*100
dew=math.floor(dew)/100
hum=(216.7*e2)/(273.15+dp)*100
hum=round(hum)/100
dew = "%02.2f" % (dew)
hum = "%02.2f" % (hum)
dew = '{: >5}'.format(dew)
hum = '{: >5}'.format(hum)
#print("dewpoint: "+dew+" °C (condensing)")
#print("feu: "+hum+" (g water per 1m³ air)")
return dew,hum
#Fennstermotor steuern
def fenster(x):
print("Fenster " + str(x))
global fensterbewegung
global RELAI_FensterAuf
global RELAI_FensterZu
global fensterstatus
if x == 1:
if fensterbewegung == 0:
if fensterstatus == 0:
fensterbewegung = 1
GPIO.output(RELAI_FensterAuf, GPIO.HIGH)
time.sleep(8)
GPIO.output(RELAI_FensterAuf,GPIO.LOW)
fensterbewegung = 0
setStatus(1,luefterstatus,entfeuchterstatus,bedingung)
print("Fenster ist AUF")
elif x == 0:
if fensterbewegung == 0:
fensterbewegung = 1
GPIO.output(RELAI_FensterZu, GPIO.HIGH)
time.sleep(8)
GPIO.output(RELAI_FensterZu, GPIO.LOW)
fensterbewegung = 0
setStatus(0,luefterstatus, entfeuchterstatus, bedingung)
print("Fenster ist ZU")
return fensterstatus
def luefter(z):
global luefterstatus
print("Lüfter " + str(z))
if z == 1:
GPIO.output(RELAI_Luefter, GPIO.HIGH)
setStatus(fensterstatus,1,entfeuchterstatus,bedingung)
elif z == 0:
GPIO.output(RELAI_Luefter,GPIO.LOW)
setStatus(fensterstatus,0,entfeuchterstatus,bedingung)
return z
def entfeuchter(y):
global entfeuchterstatus
print("entfeuchter " + str(y))
if y == 1:
GPIO.output(RELAI_Entfeuchter, GPIO.HIGH)
setStatus(fensterstatus,luefterstatus,1,bedingung)
elif y == 0:
GPIO.output(RELAI_Entfeuchter, GPIO.LOW)
setStatus(fensterstatus,luefterstatus,0,bedingung)
return y
def lueften(x):
global fensterstatus
global luefterstatus
if x == 1:
if fensterstatus == 0 and luefterstatus == 0:
luft=1
print("Lüfter = AUS und Fenster = ZU")
luefter(1)
print("Lüfter eingeschaltet")
fenster(1)
print("Fenster geöffnet")
print("Lüften")
for i in range(0,60):
print(str(60 - i) + " Sekunden")
time.sleep(1)
print("Lüften beenden")
luefter(0)
print("Lüfter ausgeschaltet")
fenster(0)
print("Fenster geschlossen")
luft = 0
elif fensterstatus == 1 and luefterstatus == 0:
luft = 1
print("Fenster = AUF und Lüfter = AUS")
luefter(1)
print("Lüfter eingeschaltet")
print("Lüften")
for i in range(0,60):
print(str(60 - i) + " Sekunden")
time.sleep(1)
print("Lüften beenden")
luefter(0)
print("Lüfter ausgeschaltet")
luft = 0
elif fensterstatus == 0 and luefterstatus == 1:
luft = 1
print("Fenster = ZU und Lüfter = AN")
fenster(1)
print("Fenster geöffnet")
print("Lüften")
for i in range(0,60):
print(str(60 - i) + " Sekunden")
time.sleep(1)
print("Lüften beenden")
fenster(0)
print("Fenster geschlossen")
luft = 0
elif fensterstatus == 1 and luefterstatus == 1:
print("Alles AN bzw AUF")
elif x == 0:
if fensterstatus == 1:
print("Fenster ist AUF und wird geschlossen")
fenster(0)
print("Fenster geschlossen")
if luefterstatus == 1:
print("Lüfter ist AN und wird ausgeschaltet")
luefter(0)
print("Lüfter ist AUS")
luft = 0
return x
def doIfHigh(channel):
if GPIO.input(channel) == GPIO.HIGH:
getStatus()
print("Taster gedrückt == HIGH")
#if luft == 0:
#lueften(1)
#print("Lüften EIN gedrückt")
#elif luft == 1:
#print("Lüften AUS gedrückt")
#lueften(0)
getStatus()
GPIO.output(RELAI_FensterZu,0)
GPIO.output(RELAI_FensterAuf,0)
GPIO.output(RELAI_Luefter, luefterstatus)
GPIO.output(RELAI_Entfeuchter, entfeuchterstatus)
#Taster
GPIO.add_event_detect(11,GPIO.BOTH,callback=doIfHigh,bouncetime =200)
try:
print("Fensterstatus " + str(fensterstatus))
print("Lüfterstatus " + str(luefterstatus))
print("entfeuchterstatus " + str(entfeuchterstatus))
while True:
getWerte()
getStatus()
#wertA_Alt = wertA_Neu
#wertK_Alt = wertK_Neu
wertA_Neu = Taupunkt(TempA,HydroA)
wertK_Neu = Taupunkt(TempK,HydroK)
if HydroK >= 55 and HydroK <=68:
bedingung = "Luft Keller >= 55 und <= 68"
if HydroA < (HydroK - 10):
bedingung = "Aussenfeuchte min 10 % besser"
if wertA_Neu[1] < wertK_Neu[1]:
bedingung = "Wassergehalt Außen auch besser"
if TempK >= 8 and TempK <= 25:
bedingung = "Kellertemperatur zwischen 8 und 25 Grad"
if luefterstatus == 0 and fensterstatus == 0:
bedingung = "Luft Außen ist besser 0 0"
luefter(1)
fenster(1)
entfeuchter(0)
elif luefterstatus == 1 and fensterstatus == 0:
bedingung = "Luft Außen ist besser 1 0"
fenster(1)
entfeuchter(0)
elif luefterstatus == 0 and fensterstatus == 1:
bedingung = "Luft Außen ist besser 0 1"
luefter(1)
entfeuchter(0)
else:
bedingung = "Temperatur Keller nicht zwischen 8 und 25 Grad"
if fensterstatus == 1:
fenster(0)
if luefterstatus == 1:
luefter(0)
if entfeuchterstatus == 0:
entfeuchter(1)
else:
bedingung ="Wassergehalt Außen höher"
if fensterstatus == 1:
fenster(0)
if luefterstatus == 1:
luefter(0)
if entfeuchterstatus == 0:
entfeuchter(1)
else:
bedingung ="Luftfeuchte Außen ist höher"
if fensterstatus == 1:
fenster(0)
if luefterstatus == 1:
luefter(0)
if entfeuchterstatus == 1:
entfeuchter(0)
elif HydroK > 68:
bedingung = "Luftfeuchte über 68"
if fensterstatus == 1:
fenster(0)
if luefterstatus == 1:
luefter(0)
if entfeuchterstatus == 0:
entfeuchter(1)
elif HydroK <= 52:
if HydroA < HydroK - 15:
bedingung = "Luft Außen Super"
if entfeuchterstatus == 1:
entfeuchter(0)
if luefterstatus == 1:
luefter(0)
elif luefterstatus == 0:
luefter(1)
if fensterstatus == 0:
fenster(1)
time.sleep(600)
print("Schleife 10 Minuten")
print(time.strftime("%H:%M:%S"))
except KeyboardInterrupt:
GPIO.cleanup()