Hehe
Danke für den Hinweis, werde ich zukünftig versuchen "richtig" zu machen.. Auf Anfrage gibt es jetzt hier meinen Code für die Sonnenstandssteuerung. Ich muss dazu sagen, dass das Ganze eher laienhaft unterwegs ist... ab und an macht die Jalousie auch zu, obwohl ich das nicht will - kann aber an den zu geringen Thresholds für die Wetterwerte liegen. Here we go - sollte was Olles oder Kompliziertes auffallen, bitte melden. Optimierungspotenzial gibt es sicher massig:
Item.conf:
logic.conf:
Die sonne.py:
jalousien.py - zum Aktivieren der Automatik auf Knopfdruck

Item.conf:
Code:
[Sonne] [[aufgang]] type = foo visu_acl = r enforce_updates = true [[untergang]] type = foo visu_acl = r enforce_updates = true [[position]] type = foo visu = yes visu_acl = r knx_dpt = 16 enforce_updates = true ['sicherheitjalousien'] type = bool visu_acl = r enforce_updates = yes knx_dpt = 1 knx_send = 0/1/22 ['sicherheitscreens'] type = bool visu_acl = r enforce_updates = yes knx_dpt = 1 knx_send = 0/1/23 ['jalousien'] [['automatik']] type = bool visu_acl = rw enforce_updates = yes knx_dpt = 1 cache = True ['osten'] [['j5_wohnen']] [[['hoehe']]] knx_send = 3/1/16 knx_dpt = 5 visu_acl = rw type = num knx_init =3/1/32 cache = True sqlite = init enforce_updates = yes beschattung = 75 | 110 | 20 | 254 | 24 | 4 | 500 # Die Werte fuer Beschattung: azimut-start | azimut-stop | min altitude | jalousienhoehe | temperatur (Wunderground) | UV Wert (Wunderground) | Solarwert (Wunderground) usw.
Code:
[Wunderground] # Wunderground Setup siehe Beitrag zu entsprechender Logik im Forum filename = wunderground.py visu_acl = yes crontab = init cycle = 600 [Sonne] filename = sonne.py crontab = init cycle = 600 [Jalousien] filename = jalousien.py watch_item = jalousien.automatik
Code:
#!/usr/bin/python3.2 # Sicherheit abhaengig von Windgeschwindigkeit von naechstgelegener Wunderground Station. Eigene Wetterstation waere besser ;) limitjalousien = 35 limitscreens = 50 if sh.Wetter.Windgeschwindigkeit.kmh() >= limitjalousien: sh.sicherheitjalousien(1) logger.error("Windgeschwindigkeit liegt bei {0} und somit ueber {1}, daher Jalousien gesperrt".format(sh.Wetter.Windgeschwindigkeit.kmh(),limitjalousien)) else: if sh.sicherheitjalousien() == 1: sh.sicherheitjalousien(0) logger.warning("Windgeschwindigkeit liegt bei {0} und somit unter {1}, daher Jalousiesperre aufgehoben".format(sh.Wetter.Windgeschwindigkeit.kmh(),limitjalousien)) if sh.Wetter.Windgeschwindigkeit.kmh() >= limitscreens: sh.sicherheitscreens(1) logger.error("Windgeschwindigkeit liegt bei {0} und somit ueber {1}, daher Screens gesperrt".format(sh.Wetter.Windgeschwindigkeit.kmh(),limitscreens)) else: if sh.sicherheitscreens() == 1: sh.sicherheitscreens(0) logger.warning("Windgeschwindigkeit liegt bei {0} und somit unter {1}, daher Screensperre aufgehoben".format(sh.Wetter.Windgeschwindigkeit.kmh(),limitscreens)) # aktuelle Sonnenposition sh.Sonne.position(sh.sun.pos(degree=True)) azimut, altitude = sh.Sonne.position() # Zeiten fuer Reset sonnenaufgang = sh.sun.rise(-6).astimezone(sh.tzinfo()).time() sonnenaufgang2 = sh.sun.rise().astimezone(sh.tzinfo()).time() jetzt = sh.now().astimezone(sh.tzinfo()).time() # RESET am Morgen if jetzt >=sonnenaufgang and jetzt <=sonnenaufgang2: sh.jalousien.automatik(1) logger.warning("Jalousienautomatik aktiviert, da es Morgen ist") # Sofern Gesamtautomatik aktiviert ist... if sh.jalousien.automatik() == 1: for jalousie in sh.find_items('beschattung'): # Auslesen der Jalousiewerte fuer die Beschattung start = int(jalousie.conf['beschattung'][0]) stop = int(jalousie.conf['beschattung'][1]) hoehe = int(jalousie.conf['beschattung'][2]) # Das war mal dafuer gedacht, dass manche Objekte erst nach Sonnenuntergang triggern. Kann aber auch durch das "Nacht"-Objekt geloest werden, siehe unten. if hoehe <=0: hoehe2 = hoehe else: hoehe2 = -90 zufahren = jalousie.conf['beschattung'][3] temperatur = int(jalousie.conf['beschattung'][4]) uv = int(jalousie.conf['beschattung'][5]) solar = int(jalousie.conf['beschattung'][6]) try: # Wenn noch ein weiterer Wert in der item.conf angegeben ist, dann wird dieser Wert angefahren, sobald Nacht ist - unabhaengig also vom Wetter. nacht = int(jalousie.conf['beschattung'][7]) logger.debug("Wert fuer Nacht gefunden: {0}".format(nacht)) except: # Wenn kein Nachtwert angegeben ist, dann ist er auf Null gesetzt. nacht = 0 try: # Eventuell koennte man das Ganze auch zweigleisig fahren. Also dass man nochmals verschiedene Werte fuer eine weitere Phase angibt. Wuerde Sinn machen, wenn auf eine Fensterfront zB bei Azimut 100-150 Sonne faellt und dann bei 200-250 wieder, dazwischen aber nicht (Baum oder so..) start2 = int(jalousie.conf['beschattung'][8]) stop2 = int(jalousie.conf['beschattung'][9]) temperatur2 = int(jalousie.conf['beschattung'][10]) uv2 = int(jalousie.conf['beschattung'][11]) solar2 = int(jalousie.conf['beschattung'][12]) hoehe3 = int(jalousie.conf['beschattung'][13]) except: # Und wenn es die oberen Werte nicht gibt, werden sie auf quasi auf unendlich gesetzt, damit sie in unterer Abfrage ignoriert werden. start2 = 1000 stop2 = -1000 temperatur2 = 1000 uv2 = 1000 solar2 = 10000000 hoehe3 = 1000 logger.debug("Nacht ist auf Wert: {0}. Laut Smarthome ist Nacht auf {1}".format(nacht,sh.env.location.night())) # Wenn die Jalousie nicht mittels KNX-Taster oder Visualisierung geaendert wurde, wird sie durch die Automatik geaendert... if not (jalousie.changed_by().startswith('KNX') or jalousie.changed_by().startswith('Visu')): # Abfrage ob Nacht ist und ein Nachtwert gesetzt wurde. Ausserdem Alternativabfrage, ob die in der item.conf angegeben Werte derzeit wahr sind. Wenn ja, dann fahren die Jalousien automatisch. if (sh.env.location.night() and not nacht == 0) or (azimut >= start and azimut <= stop and sh.Wetter.Temperatur() >=temperatur and (sh.Wetter.UV() >=uv or sh.Wetter.Solar() >=solar) and (altitude >= hoehe or altitude <= hoehe2)) or (azimut >= start2 and azimut <= stop2 and sh.Wetter.Temperatur() >=temperatur2 and (sh.Wetter.UV() >=uv2 or sh.Wetter.Solar() >=solar2) and altitude >= hoehe3): # Wenn Nacht und Jalousie einen Nachtwert hat, wird auf diesen Nachtwert gefahren if sh.env.location.night() and not nacht == 0: jalousie(nacht) logger.info("Fahre Jalousie {0} auf Wert {1} zu, weil Nachsituation aktiviert.".format(jalousie, nacht)) # Ansonsten wird auf den in der item.conf angegeben Wert gefahren. else: jalousie(zufahren) logger.info("Fahre Jalousie {0} auf Wert {1} zu.".format(jalousie, zufahren)) # Wenn die Mindestwerte fuer Temperatur, Azimut, etc. nicht erreicht sind, faehrt die Jalousie hoch. Wir moechten ja Sonne ins Zimmer lassen. else: jalousie(0) logger.info("Fahre Jalousie {0} auf Wert 0.".format(jalousie)) # Und falls die Jalousie seit dem Morgen manuell betaetigt wurde, wird sie nicht mehr veraendert. So lange, bis die Gesamtautomatik wieder aktiviert wird. else: logger.info("Jalousie {0} zuletzt manuell durch {1} geaendert, daher kein Automatikbetrieb".format(jalousie,jalousie.changed_by()))
Code:
#!/usr/bin/python3.2 logger.info(trigger) if sh.jalousien.automatik() == 1: logger.warning("Jalousienautomatik aktiv") for jalousie in sh.find_items('beschattung'): fahren = jalousie() # Dies bewirkt, dass die letzte Aenderung fuer die Jalousie von der Logik kommt und nicht mehr vom KNX-Taster oder der Visualisierung. Alles wird wieder nach Sonnenstand gesteuert. jalousie(fahren+1) logger.debug("Fahre Jalousie {0} auf Wert {1} zu.".format(jalousie,fahren))
Kommentar