Hauptmenü

Wenn dann schleife mit DOIF

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

Vorheriges Thema - Nächstes Thema

rico5588

Hallo Ihr,

ich benötige etwas Hilfe bei bei einer kleinen Schaltung. Bin mir aber noch nichtmal sicher ob DOIF die richtige Wahl ist.
Was habe ich vor:
Ich möchte eine Fernbedienung für meine Belüftungsanlage bauen.
Dazu habe ich mir einen Arduino Dino zugelegt, dieser hat 4 Opto Digital In und 4 Relais zum schalten.Alles bereits in fhem integriert.
An 2 von den Relais hänge ich die Schalter meiner Belüftungsanlage. Diese hat 4 Stufen die ich mittels der Schalter vorwärts oder Rückwärts durchschalten kann. Ein Relais muss also 1 mal an und wieder aus gehen um eine stufe höher oder runter zuschalten. Also 0 - 1 - 2 - 3 und umgekehrt.
An den 4 Digitalen Eingängen kommt die Rückmeldung der Anlage in welche Stufe sie sich befindet.
Ich benötige nun ein Define der mir solang das Relais 1 an und aus Schaltet bis die gewünschte stufe erreicht ist.
zb. Define Stufe1 DOIF ([tastertest1] eq "on" and [input1] eq "off" (set Relais1 on, sleep 1, Relais1 off, sleep 1) Doelseif ([input1] eq "on")
Define Stufe2 DOIF ([tastertest2] eq "on" and [input2] eq "off" (set Relais1 on, sleep 1, Relais1 off, sleep 1) Doelseif ([input2] eq "on")
Ich hoffe jemand versteht meinen Gedankengang und kann mir weiterhelfen, das das hier so nicht funktionert

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

Per

#1
define Soll dummy
set Soll 0/1/2/3

define Luefter DOIF ([Soll] > [Luefter])(set Relais1 on)(set Relais1 off) \
DOELSEIF ([Soll] < [Luefter])(set Relais2 on)(set Relais2 off)
attr Luefter wait 1,1:1,1


Die Umsetzung der 4 Eingänge in eine Zahl sollte für den Arduino einfacher sein als die Richtungswahl für DOIF.

rico5588

#2
Wäre es möglich das etwas genauer zu beschreiben, damit ich es besser nachvollziehen/nachbauen kann.

define Soll Dummy
set Soll 0/1/2/3
Hier wähle ich meine gewünschte Stufe aus.

Das verstehe ich nicht so recht, vermute das das so gemeint ist.
"define Luefter DOIF ([Soll] > [Luefter])(set Relais1 on)(set Relais1 off)"
Wenn wert von Soll =1 (z.b.)  dann das Relais1 an und wieder aus,

DOELSEIF ([Soll] < [Luefter])(set Relais2 on)(set Relais2 off)
aber was bedeutet das dann alles nach doelseif?
wenn nicht dann rückwärts durchschalten?!
Wo oder wie nutze ich den die Eingänge.

Die Richtung kann man auch ignorieren, da es immer fortwährend durchschaltet.
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

Habe mal den "Zeilenumbruch" angefügt.
Der erste Teil (DOIF) prüft, ob Soll größer als Ist ist, falls ja, wird das Relais 1 für 1s angesteuert.
Damit wird Ist geändert und erzeugt ein neues Ereignis, die Prüfung erfolgt von vorn, bis Soll gleich Ist.
Im DOELSEIF-Zweig erfolgt das Gleiche, nur nach "unten" mit Relais 2.

rico5588

Ich glaub ich brauch noch mehr Hilfe

ich habe folgende Eingänge in Fhem vom Arduino integriert.
Input1, Input2, Input3 und Input4.
Wie muss dann der Doif Befehl aussehen damit das ganze Funktioniert.
Mit dem Bisherigen schaltet mein Relais endlos...
Ziel ist es das wenn ich zum Beispiel den Schalter "Stufe1" drücke er mir solange das Relais an und aus schaltet, bis Input1 angeht, etc.


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

IF Input1 then Soll = 1
IF Input2 then Soll = 2
IF Input3 then Soll = 3
IF Input4 then Soll = 4
Du kannst die Abfrage auch in das DOIF machen, ich finde es aber nicht sinnvoll, erst auf Stufe 4 zu schalten, wenn du von 2 auf 1 willst.
Zumal du ja auch einen Hoch- UND einen Runter-Eingang hast.

rico5588

Ich könnte verzweifeln...
wäre es dir möglich mir das ganze Paket im Klartext nieder zuschreiben.
Also mit DOIF, den benötigten notifys usw.
Vieleicht erklärt sich es mir dann wie es gehen soll.
Hier mal noch der Auszug aus der fhem.cfg
define Relais1 FRM_OUT 7
attr Relais1 IODev DINo
attr Relais1 room Arduino
attr Relais1 stateFormat value
attr Relais1 webCmd on:off:toggle
define Relais2 FRM_OUT 6
attr Relais2 IODev DINo
attr Relais2 room Arduino
attr Relais2 stateFormat value
define Relais3 FRM_OUT 5
attr Relais3 IODev DINo
attr Relais3 room Arduino
attr Relais3 stateFormat value
attr Relais3 webCmd on:off:toggle
define Relais4 FRM_OUT 8
attr Relais4 IODev DINo
attr Relais4 room Arduino
attr Relais4 stateFormat value
define Input16 FRM_IN 16
attr Input16 IODev DINo
attr Input16 room Arduino
attr Input16 stateFormat reading
define Input17 FRM_IN 17
attr Input17 IODev DINo
attr Input17 event-min-interval 5
attr Input17 room Arduino
attr Input17 stateFormat reading
define Input18 FRM_IN 18
attr Input18 IODev DINo
attr Input18 event-min-interval 5
attr Input18 room Arduino
attr Input18 stateFormat reading
define Input19 FRM_IN 19
attr Input19 IODev DINo
attr Input19 event-min-interval 5
attr Input19 room Arduino
attr Input19 stateFormat reading
define Luefter DOIF ([stufe] > [Luefter])(set Relais1 on)(set Relais1 off) DOELSEIF ([stufe] < [Luefter])(set Relais2 on)(set Relais2 off)
attr Luefter room Arduino
attr Luefter wait 1,1:1,1
define stufe remotecontrol
attr stufe icon vent_ventilation_control
attr stufe rc_iconprefix black_btn_
attr stufe room Arduino
attr stufe row00 1:1,2:2,3:3
attr stufe row01 off:POWEROFF,down:DOWN,up:UP
attr stufe webCmd off:up:down:0:1:2:3
define stufe1 notify stu1 IF Input16 then stufe = 1
attr stufe1 room Arduino
define stufe2 notify stu2 IF Input17 then stufe = 2
attr stufe2 room Arduino
define stufe3 notify stu3 IF Input18 then stufe = 3
attr stufe3 room Arduino
define stufe4 notify stu4 IF Input19 then stufe = 4
attr stufe4 room Arduino
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

define Relais1 FRM_OUT 7
...
...
define Input19 FRM_IN 19
attr Input19 IODev DINo
attr Input19 event-min-interval 5
attr Input19 room Arduino
attr Input19 stateFormat reading

define Luefter DOIF ([stufe] > [IST] or [stufe:"up"])(set Relais1 on)(set Relais1 off) DOELSEIF ([stufe] < [IST] or [stufe:"down"])(set Relais2 on)(set Relais2 off)
attr Luefter room Arduino
attr Luefter wait 1,1:1,1
define stufe remotecontrol
attr stufe icon vent_ventilation_control
attr stufe rc_iconprefix black_btn_
attr stufe room Arduino
attr stufe row00 1:1,2:2,3:3
attr stufe row01 off:POWEROFF,down:DOWN,up:UP
attr stufe webCmd off:up:down:0:1:2:3

define IST DOIF ([Input16:"1"]) DOELSEIF ([Input17:"1"]) DOELSEIF ([Input18:"1"]) DOELSEIF ([Input19:"1"])
attr IST cmdState 0|1|2|3
attr IST room Arduino


Deine Notifys habe ich nicht verstanden. Haben die funktioniert?
Außerdem hat dein DOIF den Namen "Luefter", auf welchen du auch den Trigger setzt. Das ist hier falsch (und z.Zt. eh deaktiviert).
Ich habe mal angenommen, dass die Input-Werte "1" und "0" sind. Sonst musst du anpassen.
Je nach Schaltpunkt deiner Schrittschalter kanne sein, dass du statt
(set Relais1 on)(set Relais1 off)
(set Relais1 off)(set Relais1 on)(set Relais1 off)
und statt
wait 1,1:1,1
wait 0,1,1:0,1,1
schreiben musst. Kannst du auch gleich machen, erzeugt halt mehr Events.

Wieso sind es eigentlich 4 Relais? Und was bewirkt attr Input19 event-min-interval 5?

rico5588

Hallo Per,

danke erstmal für deinen mühen, bin schon einige schritte weiter gekommen. Der "IST" DOIF geht jetzt super. (musste ihn auf ON:OFF ändern).
Jedoch macht der Luefter DOIF noch etwas sorgen.
Bin mir nicht sicher ob es überhaupt so funktionieren kann, denn noch hängt der Dino am Raspi und ich simuliere die Eingänge per Pythonscript, in der nächsten freien Minute werde/wollte ich vielleicht das schalten der Relais noch mit einpflegen, war mir aber für eine Simulation bisher zu viel aufwand.
Jedenfalls habe ich das Problem das die Relais nur 1x mal bei "up" hoch und 1x bei "down" runterschalten, egal was ich für einen Eingang Simuliere.
War der Meinung oder hatte gehofft das die Relais solange an und aus gehen bis der gewünschte Eingang erscheint.
Ich glaube in der Lüfter DOIF kommt die Rückmeldung nicht welche Stufe aktuell ansteht.
Zu deinen Fragen...
Es sind 4 Relais eingebunden weil 4 auf dem Board drauf waren (ist ein DINO Ethernet board von kmtronic 4Digi IN + 4 Relais)
Mein Nachbar hat die selbe Belüftungsanlage, mir würden dann nur noch 4 digitale Eingänge fehlen und ich könnte seine mit ans "NETZ" nehmen
das attr von 19 und den anderen hat  selbst hinzugefügt, weiß nicht warum und wieso

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

Per

Zitat von: rico5588 am 14 März 2016, 18:21:52Jedenfalls habe ich das Problem das die Relais nur 1x mal bei "up" hoch und 1x bei "down" runterschalten, egal was ich für einen Eingang Simuliere.
Was zeigt das Event-Logging?

Zitat von: rico5588 am 14 März 2016, 18:21:52mir würden dann nur noch 4 digitale Eingänge fehlen und ich könnte seine mit ans "NETZ" nehmen
Kannst ja mit einem Binary-Encoder die Anzahl der Eingänge vergrößern. Musst dann aber das "Ist"-DOIF wieder anpassen.

rico5588

Das mit dem Binären Code habe ich mir auch schon mal überlegt, obwohl mir die Umsetzung momentan noch zu hoch ist. Ich möchte erstmal eine Anlage ordentlich ans laufen bringen.
Bei dem einmal hoch und einmal runter hatte ich vergessen zu schreiben dass das jeweils nur einmal geht(das ist mein Aktuelles Problem) wenn ich das zweitemal in die selbe Richtung drücke passiert nichts. Auch wenn ich mich z.b. in stufe 1 befinde und die stufe 3 drücke geht leider auch noch nichts...
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


rico5588

Hallo alle miteinander,

bin leider erst heute wieder zu meinem Projekt gekommen.

Habe heute meinen Arduino DINO mit meiner Belüftungsanlage gepaart und bin froh das zumindest die grundzüge erstmal Funktionieren.
Das durchschalten mit den Relais geht in beiden Richtungen super. Die Rückmeldungen kommen auch aaaberrrr.
Ich habe bei den Eingängen noch ein paar Fehler.
Das heisst in meiner IST DOIF steckt irgentwo der Wurm.
So ist die Theorie
Es gibt 4 Schalt zustände, Input16 = on (Stufe1) Input17 = on (stufe2) Input18 = on (stufe3) und Alle drei = off (Stufe0)
So der Code
([Input16:"on"]) DOELSEIF ([Input17:"on"]) DOELSEIF ([Input18:"on"])DOELSE  ([Input17:"off"][Input18:"off"][Input16:"off"])
und so die Fehlerauswertung

2016.03.20 17:55:54 5 : FRM:>902000
2016.03.20 17:55:54 5 : FRM:<920100
2016-03-20 17:55:54 DOIF IST cmd_nr: 1
2016-03-20 17:55:54 DOIF IST cmd_event: Input16
2016-03-20 17:55:54 DOIF IST 1
2016.03.20 17:55:54 5 : FRM:>900000
2016.03.20 17:55:56 5 : FRM:>902000
2016.03.20 17:55:56 5 : FRM:<920200
2016.03.20 17:55:56 2 : IST: 001: Unknown command 001, try help.
2016-03-20 17:55:56 DOIF IST cmd_nr: 4
2016-03-20 17:55:56 DOIF IST cmd_event: Input16
2016-03-20 17:55:56 DOIF IST error: 001: Unknown command 001, try help.
2016-03-20 17:55:56 DOIF IST 0
2016-03-20 17:55:56 DOIF IST cmd_nr: 2
2016-03-20 17:55:56 DOIF IST cmd_event: Input17
2016-03-20 17:55:56 DOIF IST 2
2016.03.20 17:55:56 5 : FRM:>900000
2016.03.20 17:55:58 5 : FRM:>902000
2016.03.20 17:55:58 5 : FRM:<920400
2016.03.20 17:55:58 2 : IST: 100: Unknown command 100, try help.
2016-03-20 17:55:58 DOIF IST cmd_nr: 4
2016-03-20 17:55:58 DOIF IST cmd_event: Input17
2016-03-20 17:55:58 DOIF IST error: 100: Unknown command 100, try help.
2016-03-20 17:55:58 DOIF IST 0
2016-03-20 17:55:58 DOIF IST cmd_nr: 3
2016-03-20 17:55:58 DOIF IST cmd_event: Input18
2016-03-20 17:55:58 DOIF IST 3
2016.03.20 17:55:58 5 : FRM:>900000
2016.03.20 17:56:00 5 : FRM:>902000
2016.03.20 17:56:00 5 : FRM:<920000
2016.03.20 17:56:00 2 : IST: 010: Unknown command 010, try help.
2016-03-20 17:56:00 DOIF IST cmd_nr: 4
2016-03-20 17:56:00 DOIF IST cmd_event: Input18
2016-03-20 17:56:00 DOIF IST error: 010: Unknown command 010, try help.
2016-03-20 17:56:00 DOIF IST 0
2016.03.20 17:56:00 5 : FRM:>900000

"Das kommt wenn ich einmal durch schalte"

Ich vermute wenn der IST DOIF richtig wäre würde die Fernbedienung auch funtkionieren.
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

Das DOELSE muss ein DOELSEIF sein. Sonst müsste die Abfrage aus den runden Klammern weg, DOELSE hat nur einen Befehlsteil, keinen Triggerteil.
Ich weiss nicht, ob es wichtig ist, aber ich würde mal nach den Leerzeichen schauen und im letzten DOELSEIF and dazwischen setzen.
Und mach mal ein list auf IST.

rico5588

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"
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