Hauptmenü

DOIF Zeit und wait

Begonnen von beddo, 10 November 2017, 09:06:28

Vorheriges Thema - Nächstes Thema

beddo

Hallo Community,
Ich bin noch Anfänger und habe zwei Probleme mit einer DOIF Schleife und ich hoffe ihr könnt mir ein paar Tipps geben. Vermutlich beides Banal, aber ich suche jetzt schon eine weile im Forum ind in der Commandref und finde keine Lösung.

Zielsetzung:
Steuerung einer Lüftungsanlage über ein Relais an den GPIOs am PI.
Nachts läuft die Anlage auf Stufe 1, Tagsüber dann auf Stufe 2.
Ich möchte nun erreichen dass Nachts bei unterschreiten einer bestimmten Luftqualität (gemessen über einen Rehau Co20 (wie höher der Voc, je schlechter die Luft) die Anlage für 30 Minuten in Stufe 2 wechselt. In meinem Fall also GPIO17 on

Folgenden Code nutze ich
([[7:00]-[19:00]]) (set GPIO17 on) DOELSEIF ([[19:01]-[6:59]] and [co20_innenluft:voc] > 1500)(set GPIO17 on) DOELSE (set GPIO17 off)

attr do always

Mein erstes Problem ist: Tagsüber ist das Script immer in cmd_3, da die Timer wie folgt aussehen
timer_01_c01 11.11.2017 07:00:00
timer_02_c01 10.11.2017 19:00:00
timer_03_c02 10.11.2017 19:01:00
timer_04_c02 11.11.2017 06:59:00
Somit ist cmd_3 ja logisch, da die Timer dies ja aussagen, das tritt auch nur auf wenn der Timer für den aktuellen Tag in der Vergangenheit liegt.
Frage: Wie bekomme ich FHEM dazu, dass ich die Zeit 7:00 eintragen kann, ohne um 6:00 aufzustehen und den Code zu posten?

Mein 2. Problem. Wenn Nachts in cmd_2 der VOC Wert über 1500, springt die Anlage auf Stufe 2, das funktioniert. Ich suche nun einen Weg die Anlage auf jeden Fall unabhängig der Prüfung (auf >1500) 30 Minuten laufen zu lassen.
"attr wait 0,0,1800,0"kann ja nicht funktionieren, da die Prüfung ja den waittimer unterbricht.  (Habe ich versucht, ist auch so ;-)
Gibt es Alternativen um den Code in cmd_2 nach der Aktivierung von "GPIO17 on" den Code für den gewünschten Zeitraum 1800 Sek zu pausieren? Also unabhängig ob der Luftwert über 1500 bleibt oder Absinkt (was ja der gewünschte Effekt ist)

Danke Euch

Amenophis86

#1
1. [7:00] = [07:00]
2. Wenn du von bis haben willst, dann hast du einmal [] zu viel => ([07:00]-[19:00]) deswegen ist er auch in cmd3 und nicht in 1, wenn er in 1 sein soll.
2. Die Timer besagen, wann DOIF sich selbst aktivieren muss und eine Prüfung durchführt, daher stimmt das schon so
3. Wegen der 30 Minuten kannst du mit cmdpause (https://fhem.de/commandref_DE.html#DOIF_cmdpause) und auch am besten noch https://fhem.de/commandref_DE.html#DOIF_repeatcmd lesen ;)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Otto123

Also 2. muss so aussehen [07:00 - 19:00] da liegt ihr beide etwas daneben.

Obwohl beddo sein Konstrukt vielleicht sogar geht, das nimmt man doch eigentlich wenn die Zeit aus dummies kommt?
[[d1]-[d2]]

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Amenophis86

Lol Otto, du hast recht. Habe mich von seinem Fehler anstecken lassen und nicht genau nachgedacht. Danke
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

beddo

#4
Hallo Zusammen,
Danke erstmal für Eure Hilfe.
Ih glaube mein erstes Problem ist  ein anderes. Konnte es etwas eingrenzen. Das Konstrukt mit den doppelten Klammern läuft nicht. Hatte da auch erst Variablen drin und vergessen das vor dem posten rauszunehmen *Hüstel*
Das Problem ist wohl folgendes. Die Schleife wird durchlaufen und bei erreichen des ersten Wertes des Zeitfensters auch normal auf True gesetzt.
Das Device nach dem DOELSEIF sendet alle 60 Minuten einen Wert (ist auch so gewollt). Sobald das Device nun den neuen Wert hat, läuft die Schleife nochmal durch, dann befindet sich der Schaltzeitpunkt in der Vergangenheit und es wir DOELSE aktiviert
Bsp
07:00 Bedingung 1 geht auf true
07:01 co20_innenluft hat einen neuen VOC Wert -> Schleife läuft neu, Bedingung 1 ist falsch, da er ja nur den Schaltzeitpunkt abfragt  und nicht den eigentlichen Zeitraum. Habt ihr einen Tipp wie ich das umgehen kann?

cmdpause habe ich mir mal zu gemühte geführt. Habe es so verstanden cmdpause pausiert das script um die angegebenen Sekunden mit : trenne ich die cmds. Richtig?
sollte ja in meinem Beispiel mit cmdpause 0:1800:0 gehen.



Pfriemler

RPI_GPIO unterstützt doch die set-extensions, also auch on-for-timer:

([07:00]) (set GPIO17 on)
DOELSEIF ([19:00]) (set GPIO17 off)
DOELSEIF ([co20_innenluft:voc] > 1500 and [?19:01-6:59]) (set GPIO17 on-for-timer 1800)

do always, aber kein DOELSE.
- um 7 Uhr wird eingeschaltet, immer
- um 19 Uhr wird ausgeschaltet, immer
- ist voc>1500 und die Zeit zwischen 19:01 und 6:59, wird für 30 min eingeschaltet.

Ist voc > 1500 und es ist zwischen 7 und 19 Uhr, bleibt das DOIF im letzten Status, ebenso wenn es kleiner ist.

Schönheitsfehler: Ist voc>1500 um 19 Uhr, geht die Lüftung trotzdem runter. Aber das nächste Update von voc schaltet ggf. wieder ein.

Nicht geprüft.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."