Hauptmenü

Wenn dann schleife mit DOIF

Begonnen von rico5588, 10 März 2016, 19:38:48

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: rico5588 am 20 März 2016, 18:51:12
Die sachen mal schnell umgesetzt.
Ergebniss
Stufe 1,2 und 3 gehen super nur 0 wird nicht als stufe erkannt (alles OFF)
CODE
([Input16:"on"])DOELSEIF([Input17:"on"])DOELSEIF([Input18:"on"])DOELSEIF([Input17:"off"]and[Input18:"off"]and[Input16:"off"])

Ich hoffe du meindest den Eventmonitor mit LIST?  (Und mach mal ein list auf IST.)
2016-03-20 18:48:17 DOIF IST cmd_nr: 2
2016-03-20 18:48:17 DOIF IST cmd_event: Input17
2016-03-20 18:48:17 DOIF IST 2
2016-03-20 18:48:19 DOIF IST cmd_nr: 3
2016-03-20 18:48:19 DOIF IST cmd_event: Input18
2016-03-20 18:48:19 DOIF IST 3
2016-03-20 18:48:29 DOIF IST cmd_nr: 1
2016-03-20 18:48:29 DOIF IST cmd_event: Input16
2016-03-20 18:48:29 DOIF IST 1
2016-03-20 18:48:31 DOIF IST cmd_nr: 2
2016-03-20 18:48:31 DOIF IST cmd_event: Input17
2016-03-20 18:48:31 DOIF IST 2
2016-03-20 18:48:32 DOIF IST cmd_nr: 3
2016-03-20 18:48:32 DOIF IST cmd_event: Input18
2016-03-20 18:48:32 DOIF IST 3


Hier noch der Fehler vom IST DOIF
perl error in condition: EventDoIf('Input17',$hash,'off',1)andEventDoIf('Input18',$hash,'off',1)andEventDoIf('Input16',$hash,'off',1): syntax error at (eval 1528) line 1, near ")andEventDoIf"

Leerzeichen zwischen den Operatoren sind nicht nur für die Lesbarkeit gut, sondern auch in Perl wie in jeder anderen höheren Sprache erforderlich, daher:

([Input16:"on"]) DOELSEIF ([Input17:"on"]) DOELSEIF ([Input18:"on"]) DOELSEIF ([Input17:"off"] and [Input18:"off"] and [Input16:"off"])

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rico5588

OK der Perl error ist nun weg aber den state 0 bei alles off habe ich noch nich nicht erreicht.
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Damian

Zitat von: rico5588 am 20 März 2016, 19:17:06
OK der Perl error ist nun weg aber den state 0 bei alles off habe ich noch nich nicht erreicht.
Zitat aus der Commandref zu DOIF:

ZitatDie logische Verknüpfung "and" mehrerer Ereignisse ist nicht sinnvoll, da zu einem Zeitpunkt immer nur ein Ereignis zutreffen kann.

Daher kann bei dir

([Input17:"off"] and [Input18:"off"] and [Input16:"off"])

nie wahr werden.

evtl. hilft schon den Status abfragen:

([Input17] eq "off" and [Input18] eq "off" and [Input16] eq "off")

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Das mit den Leerzeichen wollte ich auch schreiben, man erkennt es gut an der in der Fehlermeldung fehlenden Trennung.

Zitat von: Damian am 20 März 2016, 19:11:04sondern auch in Perl wie in jeder anderen höheren Sprache erforderlich
Viele Sprachen nehmen auch "Sonderzeichen" als Trennung. Das ist bei Perl etwas spezieller (RegEx!).

rico5588

Hab den IST DOIF wie folgt angepasst und der geht jetzt auch einwandfrei
([Input16] eq "on" and [Input17] eq "off" and [Input18] eq "off") DOELSEIF ([Input16] eq "off" and [Input17] eq "on" and [Input18] eq "off") DOELSEIF ([Input16] eq "off" and [Input17] eq "off" and [Input18] eq "on") DOELSEIF ([Input16] eq "off" and [Input17] eq "off" and [Input18] eq "off")
allerdings geht mein Luefter DOIF noch nicht so richtig
([stufe] > [IST]) (set Relais3 on) (set Relais3 off) (set Relais2 off) DOELSEIF ([stufe] < [IST]) (set Relais2 on) (set Relais2 off) (set Relais3 off)DOELSEIF ([stufe] = [IST]) (set Relais3 off) (set Relais2 off)
Habe verschiedene möglichkeiten versucht.
Wenn ich repeatcmd 1 reinmache läuft er endlos durch, las ich ihn weg kann ich nicht von der stufe 3 auf die stufe 1 oder von 1 auf 3. Er bleibt dann immer beim ersten stufenwechsel stehen und muss danach wieder initialized werden.

an dieser stelle schon mal ein Dank an euch beiden für die Hilfe bisher  ;)
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Per

Statt
(set Relais3 on) (set Relais3 off) (set Relais2 off)
besser
(set Relais3 off) (set Relais3 on) (set Relais3 off)

Und dann mal do always testen.

Per

Fällt mir gerade ein: mit
set Relais3 on-for-timer 1
wärst du unabhängig vom DOIF-Durchlauf und immer auf der sicheren Seite.
wait wird dann auf
wait 2:2
verkürzt.
Allerdings kenne ich die Arduino-Module nicht und mangels einem kann ich auch keins zum Nachschauen definieren.

rico5588

Könntest du mir das noch etwas genauer beschreiben.
"Fällt mir gerade ein: mit
set Relais3 on-for-timer 1
wärst du unabhängig vom DOIF-Durchlauf und immer auf der sicheren Seite.
wait wird dann auf
wait 2:2"

Habe noch ein Problem mit dem Arduino Sketch, das Ding stürzt immer nach ein paar Stunden ab. Beim Reset sagt er mir "error
   
Unhandled sysex command"

Ich war der Annahme das das Sketch zu groß ist für das Dino Board, bin aber mittlerweile bei 67% Speicherauslastung...das kann es bald nicht mehr sein. UDP habe ich rausgenommen und der Rest läuft auf minimal Konfiguration. Bin für weiteres Tipps Dankbar. zum Glück ist Ostern, da habsch mal Zeit zum Basteln. MFG
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Per

Zitat von: rico5588 am 24 März 2016, 15:45:58Könntest du mir das noch etwas genauer beschreiben.
Wenn ein neuer Trigger kommt, beendet DOIF den vorhergehenden Commandzweig, auch wenn es, wg. wait, noch nicht bis zum letzten Befehlsblock (Klammernpaar) gekommen ist.
Damit kann (!) es passieren, dass der letzte set Relais_xy off nicht mehr ausgeführt wird. Deshalb habe ich ihn am Anfang wiederholt.
Durch on-for-timer wird set Relais_xy off IMMER ausgeführt, weil es ein geräteinterner (oder entsprechend simulierter) Befehl ist und von DOIF halt unabhängig ausgeführt wird. Für sleep müsste man trixen ({fhem("sleep 1;set ..."}) und at finde ich hier zu oversized.
Und weil es statt 2 bzw. 3 Klammerpaaren nur noch eins ist, wird wait auch entsprechend "verkleinert".


Zum Arduino darfst du von mir keine Hilfe erwarten.

Per

Hm, hat das nun geklappt oder bist du ohne Heizung erfroren?

rico5588

Hallo Per,

das DOIF geht mit dem On for timer recht gut, nur um genaueres zu sagen müsste mein Arduino erstmal stabil laufen.
Ich kämpfe nach wie vor daran das mir dieses kleine S......... Ding immer wieder nach ein paar Stunden abstürzt. Genauer gesagt es zeigt mir keine Eingänge und auf Relais schaltvorgänge in Fhem reagiert es auch nicht.Ein Neustart oder USB anschließen Hilft meistens schon damit er wieder reagiert.
Bin jetzt auf ein Sketch vom Hersteller zurück gegangen wo es funktioniert. Nachteil hier es ist web basierend. und damit müsste ich in fhem alle paar Sekunden eine abfrage über den zustand der Eingänge und Relais machen. Da war mir die Firmata Version wo mir der Arduino meldet  wenn sich was ändert lieber....
das so weit zum Aktuellen stand.
Gibt es eine Möglichkeit den internen Ablauf zu loggen um herauszubekommen. wann er wo sich aufhängt?
Mein Sketch ist eigentlich nur ca.65% vom Speicher groß - das sollte doch ausreichend platz sein oder?

MFG Rico
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

rico5588

Hallo alle miteinander,

ich bin wieder ein Stück weiter um nicht zu sagen Fertig mit dieser Baustelle.
Mein DOIF sieht momentan so aus.
([stufe] != [IST] and [lueftunghauptschalter] eq "on") (set Relais2 on-for-timer 1)
Im prinzip so --> Schalte Relais 2 so lange an und aus bis stufe und ist den gleichen Wert haben.

Alles andere kommt immer wieder durcheinander und endet meist in einer Endlosschleife.
Mein Absturzfehler konnte ich zumindest gut umgehen.
Erst war ich ja der Meinung das es am Netzteil liegt, aber nach dem 6 Netzteil konnte es das nicht sein. Habe dann verschiedene Firmata Verisonen getestet, aber alles ohne Erfolg.
Bis ich dann, warum auch immer, 1 Relais im 1 minuten Takt an und aus gehen lassen habe, um heraus zu bekommen wie lange er durchhält bis er abstürzt. Nach 3 Tagen dauer klick-klack und einigen Forumsstunden habe ich dann den Tip gefunden, dass man in einem bestimmten Zeitfenster ein Befehl senden muss, da er bei zu großer Pause sich aufhängt?!?!
Habe nun als Lösung ein pin als Relais den es so gar nicht gibt. aller 1 Stunde an und aus gehen lassen und seit dem Läuft er ohne Probleme durch.

Thema ist dennoch gelöst..
Habe gleich noch einen DOIF gepastelt, vielleicht hilft es jemandem.
Es geht darum die Lüftungsanlage nach einem Muster Automatisch ein und auszuschalten.
([test3] > 1200 and [10:00-15:00|8] and [Luma] == 1 or [11:30-12:00] and [Luma] == 1 or [test3] > 1200 and [10:00-12:00|7] and [Luma] == 1 or [test3] > 1200 and [14:00-16:00|7] and [Luma] == 1) (set stufe 4)
DOELSEIF ([Luma] == 4) (set stufe 4, set Luma 1)
DOELSEIF ([Luma] == 3) (set stufe 3, set Luma 1)
DOELSEIF ([Luma] == 2) (set stufe 2, set Luma 1)
DOELSE (set stufe 1)
#([test3] > 1200 and [10:00-15:00|8] or [11:30-12:00] or [test3] > 1200 and [10:00-12:00|7] or [test3] > 1200 and [14:00-16:00|7]) (set stufe 4) DOELSE (set stufe 1)
# [10:00-15:00|8] ==  0-8 entspricht: 0-Sonntag, 1-Montag, ... bis 6-Samstag sowie 7 für Wochenende und Feiertage (entspricht $we) und 8 für Arbeitstage (entspricht !$we)
##(Luma = Lüfterstufe manuel (1=Auto,2=Stufe1,3=Stufe2,4=Stufe3,5=Stufeoff)
##(stufe = direkte stufe der Lüftungsanalge (1=off, 2=Stufe1, 3=Stufe2 und 4=Stufe3)
##An Bedingung --> (Luma = Rc Lüftermanuel, [test3]=Solarüberschuss)
## Solar über 1200 Watt überschuss + Werktag von 10:00-15:00 Uhr + Luma 1
## Solar über 1200 Watt überschuss + Wochenende von 10:00-12:00 Uhr + Luma 1
## Solar über 1200 Watt überschuss + Wochenende von 14:00-16:00 Uhr + Luma 1
## jeden Tag von 11:30 bis 12:00 + Luma 1
##mit attr wait 0:2,1800:2,1800:2,1800:900
## Luma = 4 --> Stufe 4 für 30 min --> dann luma set 1
## Luma = 3 --> Stufe 3 für 30 min --> dann luma set 1
## Luma = 2 --> Stufe 2 für 30 min --> dann luma set 1


Bis bald Rico
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly