[Gelöst] DOIF soll bei level <20 schalten schaltet aber bei level 21

Begonnen von seule3008, 17 Juni 2019, 21:50:56

Vorheriges Thema - Nächstes Thema

seule3008

Hallo an alle,

ich habe ein DOIF, welches die Rollladen an der Wohnrimmertür auf Schlitz fahren soll, wenn man die Tür kippt oder die Rollladen hoch fahren soll, wenn man die Tür öffnet usw.

Jetzt mein Problem von dem ich hoffe, dass mir jemand helfen kann. Wenn die Beschattung eingeschaltet ist, sind alle Rollladen auf 21%. Ist jetzt allerdings die Tür gekippt und ich schalte die Beschattung aus sollen alle Rollladen hoch fahren. Die Tür fährt aber nicht hoch sondern schaltet cmd5 welches eigentlich erst bei unter 20% schalten soll und fährt 1% runter statt hoch.

ich hab mal das List angehangen.

Vielen Dank im Voraus

Christian

Internals:
   DEF        ([GriffWzTuer:state] eq "closed" and [RolloWzTuerKipp1:state] eq "0") (set RolloWzTuer 0)
DOELSEIF ([GriffWzTuer:state] eq "open" and [RolloWzTuer:level] < 100) (set RolloWzTuer 100)
DOELSEIF ([GriffWzTuer:state] =~ "closed|tilted" and [autoRolloWzTuer:state] eq "cmd_4") (set RolloWzTuer 19)
DOELSEIF ([GriffWzTuer:state] =~ "closed|tilted" and [Beschattung_Manuell:state] eq "on") (set RolloWzTuer 21)
DOELSEIF ([GriffWzTuer:state] eq "tilted" and [RolloWzTuer:level] < 20) (set RolloWzTuer 20)
   MODEL      FHEM
   NAME       RolloWzTuerKipp
   NR         36
   NTFY_ORDER 50-RolloWzTuerKipp
   STATE      cmd_4
   TYPE       DOIF
   READINGS:
     2019-06-17 21:37:16   Device          RolloWzTuer
     2019-06-17 21:37:10   cmd             4
     2019-06-17 21:37:10   cmd_event       GriffWzTuer
     2019-06-17 21:37:10   cmd_nr          4
     2019-06-17 21:37:10   e_GriffWzTuer_state tilted
     2019-06-17 21:37:16   e_RolloWzTuer_level 21
     2019-06-17 21:36:21   mode            enabled
     2019-06-17 21:37:10   state           cmd_4
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "closed" and ::ReadingValDoIf($hash,'RolloWzTuerKipp1','state') eq "0"
     1          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "open" and ::ReadingValDoIf($hash,'RolloWzTuer','level') < 100
     2          ::ReadingValDoIf($hash,'GriffWzTuer','state') =~ "closed|tilted" and ::ReadingValDoIf($hash,'autoRolloWzTuer','state') eq "cmd_4"
     3          ::ReadingValDoIf($hash,'GriffWzTuer','state') =~ "closed|tilted" and ::ReadingValDoIf($hash,'Beschattung_Manuell','state') eq "on"
     4          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "tilted" and ::ReadingValDoIf($hash,'RolloWzTuer','level') < 20
   devices:
     0           GriffWzTuer RolloWzTuerKipp1
     1           GriffWzTuer RolloWzTuer
     2           GriffWzTuer autoRolloWzTuer
     3           GriffWzTuer Beschattung_Manuell
     4           GriffWzTuer RolloWzTuer
     all         GriffWzTuer RolloWzTuerKipp1 RolloWzTuer autoRolloWzTuer Beschattung_Manuell
   do:
     0:
       0          set RolloWzTuer 0
     1:
       0          set RolloWzTuer 100
     2:
       0          set RolloWzTuer 19
     3:
       0          set RolloWzTuer 21
     4:
       0          set RolloWzTuer 20
     5:
   helper:
     event      deviceMsg: 21 (to nanoCUL),level: 21,motor: Halt:21,pct: 21,21,timedOn: Runter
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   GriffWzTuer
     timerevent battery: ok,contact: tilted (to nanoCUL),tilted,trigDst_1F7650: noConfig,trigger_cnt: 118
     triggerDev RolloWzTuer
     DOIF_eventas:
       cmd_nr: 4
       cmd: 4
       cmd_event: GriffWzTuer
       state: cmd_4
     timerevents:
       battery: ok
       contact: tilted (to nanoCUL)
       tilted
       trigDst_1F7650: noConfig
       trigger_cnt: 118
     timereventsState:
       battery: ok
       contact: tilted (to nanoCUL)
       state: tilted
       trigDst_1F7650: noConfig
       trigger_cnt: 118
     triggerEvents:
       deviceMsg: 21 (to nanoCUL)
       level: 21
       motor: Halt:21
       pct: 21
       21
       timedOn: Runter
     triggerEventsState:
       deviceMsg: 21 (to nanoCUL)
       level: 21
       motor: Halt:21
       pct: 21
       state: 21
       timedOn: Runter
   internals:
   itimer:
   readings:
     0           GriffWzTuer:state RolloWzTuerKipp1:state
     1           GriffWzTuer:state RolloWzTuer:level
     2           GriffWzTuer:state autoRolloWzTuer:state
     3           GriffWzTuer:state Beschattung_Manuell:state
     4           GriffWzTuer:state RolloWzTuer:level
     all         GriffWzTuer:state RolloWzTuerKipp1:state RolloWzTuer:level autoRolloWzTuer:state Beschattung_Manuell:state
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always

Ellert

Das DOIF zeigt cmd_4, das sieht i.O. aus.
cmd_5 wird nur ausgeführt, wenn auch [RolloWzTuer:level] < 20. Das bedeutet der Rolladen wurde vorher auf < 20 gebracht.

Da müsstest Du Dir die Events genauer ansehen, die beteiligt sind. Und die beteilligten Parameter und das DOIF loggen und das analysieren.

Vielleicht hast Du gedanklich die Richtungen verwechselt und es müsste > 20 heissen.

seule3008

Hallo Ellert,

Cmd4 ist in dem Moment richtig. Dann ist die Rolllade auf level 21. Schalte ich aber jetzt die Beschattung aus, ist ein anderes doif, dass bei ,,aus" alles hoch fährt. Das hier beschriebene doif schaltet dann aber auf cmd5 sprich level 20 obwohl der Wert vorher 21 und damit nicht kleiner 20 war. Das leuchtet mir nicht ein, da da extra kleiner 20 steht. Wieso löst das trotzdem aus??

Grüße 


Frank_Huber

Poste bitte mal ein list vom fehlerzustand. Das sagt mehr aus.

Gesendet von meinem Telekom Puls mit Tapatalk


CoolTux

Oder Du schaust Dir mal AutoShuttersControl (ASC) an.
https://commandref.fhem.de/commandref_DE.html#AutoShuttersControl

Das Modul steuert in Beschattung und noch mehr.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

pc1246

Zitat von: seule3008 am 17 Juni 2019, 23:56:15
Hallo Ellert,

Cmd4 ist in dem Moment richtig. Dann ist die Rolllade auf level 21. Schalte ich aber jetzt die Beschattung aus, ist ein anderes doif, dass bei ,,aus" alles hoch fährt. Das hier beschriebene doif schaltet dann aber auf cmd5 sprich level 20 obwohl der Wert vorher 21 und damit nicht kleiner 20 war. Das leuchtet mir nicht ein, da da extra kleiner 20 steht. Wieso löst das trotzdem aus??

Grüße

Moin
Und wieder komme ich mit meiner Weisheit, ein Element nur an einer Stelle zu steuern!
Nimm das Ergebnis aus dem anderen DOIF und packe es als Bedingung X in dieses hinein!
Gruss Christoph
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

Ellert

Ich vermute, dass bei der Ausführung vom 1. Zweig eine Position unter 20 erreicht wird und dann der fünfte Zweig ausgeführt wird.

Das wäre mit einem Logmitschnitt zu prüfen und wenn sich die Vermutung als richtig erweist, dann könnte man als erste Maßnahme den Positionstrigger im fünften Zweig abschalten.

seule3008

Jungs ihr seid die Besten.

Alles in deinem DOIF war des Problems Lösung. Wieso ich das nicht direkt gemacht habe, weiß ich nicht. Wahrscheinlich war das zu einfach :)

Vielen Dank und viele Grüße

Christian

seule3008

Hallo nochmal,

das Problem ist trotz das alles in einem DOIF war nicht gelöst. Ich habe allerdings festgestellt, dass wenn ich pct 100 als Befehl verwende tritt der Fehler auf und wenn ich Hoch als Befehl verwende nicht.

Ich hatte das ganze in 2 DOIF weil eins das Attribut do always hat und das andere nicht. Oder kann ich in einem DOIF einzelne Befehle mit diesem Attribut versehen und andere nicht??

Mit freundlichen Grüßen

Christian

Damian

Zitat von: seule3008 am 19 Juni 2019, 20:01:38
Hallo nochmal,

das Problem ist trotz das alles in einem DOIF war nicht gelöst. Ich habe allerdings festgestellt, dass wenn ich pct 100 als Befehl verwende tritt der Fehler auf und wenn ich Hoch als Befehl verwende nicht.

Ich hatte das ganze in 2 DOIF weil eins das Attribut do always hat und das andere nicht. Oder kann ich in einem DOIF einzelne Befehle mit diesem Attribut versehen und andere nicht??

Mit freundlichen Grüßen

Christian

Du kannst logische Wiederholung mit do always von zyklisch sendenden Sensoren elegant über DOIF_Readings entkoppeln:

https://fhem.de/commandref_DE.html#DOIF_DOIF_Readings
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

seule3008

Moin

so langsam verstehe ich nix mehr. Das DOIF schaltet was es will. Seit gestern Abend war der Status von autoRolloWzTuer nicht mehr cmd_4 und es steht auch in den readings cmd_1 aber trotzdem schaltet es immer wieder obwohl da steht, es soll nur schalten, wenn die Tür "closed" or "tildet" AND cmd_4 ist. Gibt es irgendwo eine schritt für schritt Auswertung des Codes wie z.b. in Exel??

Internals:
   DEF        ([GriffWzTuer:state] eq "closed" and [RolloWzTuerKipp1:state] eq "0") (set RolloWzTuer 0)
DOELSEIF ([GriffWzTuer:state] eq "open" and [RolloWzTuer:level] < 100) (set RolloWzTuer 100)
DOELSEIF ([GriffWzTuer:state] eq "tilted" and [RolloWzTuer:level] < 20) (set RolloWzTuer 20)
DOELSEIF ([GriffWzTuer:state] eq "closed" or "tilted" and [autoRolloWzTuer:state] eq "cmd_4") (set RolloWzTuer 20)
DOELSEIF ([GriffWzTuer:state] eq "closed" or "tilted" and [Beschattung_Manuell:state] eq "on") (set RolloWzTuer 20)
   MODEL      FHEM
   NAME       RolloWzTuerKipp
   NR         36
   NTFY_ORDER 50-RolloWzTuerKipp
   STATE      cmd_4
   TYPE       DOIF
   READINGS:
     2019-06-23 05:59:17   Device          RolloWzTuer
     2019-06-23 05:59:11   cmd             4
     2019-06-23 05:59:11   cmd_event       autoRolloWzTuer
     2019-06-23 05:59:11   cmd_nr          4
     2019-06-22 20:10:56   e_GriffWzTuer_state closed
     2019-06-23 05:59:11   e_RolloWzTuerKipp1_state 1
     2019-06-23 05:59:17   e_RolloWzTuer_level 20
     2019-06-23 05:59:11   e_autoRolloWzTuer_state cmd_1
     2019-06-22 14:56:20   mode            enabled
     2019-06-23 05:59:11   state           cmd_4
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "closed" and ::ReadingValDoIf($hash,'RolloWzTuerKipp1','state') eq "0"
     1          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "open" and ::ReadingValDoIf($hash,'RolloWzTuer','level') < 100
     2          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "tilted" and ::ReadingValDoIf($hash,'RolloWzTuer','level') < 20
     3          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "closed" or "tilted" and ::ReadingValDoIf($hash,'autoRolloWzTuer','state') eq "cmd_4"
     4          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "closed" or "tilted" and ::ReadingValDoIf($hash,'Beschattung_Manuell','state') eq "on"
   devices:
     0           GriffWzTuer RolloWzTuerKipp1
     1           GriffWzTuer RolloWzTuer
     2           GriffWzTuer RolloWzTuer
     3           GriffWzTuer autoRolloWzTuer
     4           GriffWzTuer Beschattung_Manuell
     all         GriffWzTuer RolloWzTuerKipp1 RolloWzTuer autoRolloWzTuer Beschattung_Manuell
   do:
     0:
       0          set RolloWzTuer 0
     1:
       0          set RolloWzTuer 100
     2:
       0          set RolloWzTuer 20
     3:
       0          set RolloWzTuer 20
     4:
       0          set RolloWzTuer 20
     5:
   helper:
     event      deviceMsg: 20 (to nanoCUL),level: 20,motor: stop:20,pct: 20,20,timedOn: Runter
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   autoRolloWzTuer
     timerevent cmd_nr: 1,cmd: 1,cmd_event: timer_1,cmd_1
     triggerDev RolloWzTuer
     DOIF_eventas:
       cmd_nr: 4
       cmd: 4
       cmd_event: autoRolloWzTuer
       state: cmd_4
     timerevents:
       cmd_nr: 1
       cmd: 1
       cmd_event: timer_1
       cmd_1
     timereventsState:
       cmd_nr: 1
       cmd: 1
       cmd_event: timer_1
       state: cmd_1
     triggerEvents:
       deviceMsg: 20 (to nanoCUL)
       level: 20
       motor: stop:20
       pct: 20
       20
       timedOn: Runter
     triggerEventsState:
       deviceMsg: 20 (to nanoCUL)
       level: 20
       motor: stop:20
       pct: 20
       state: 20
       timedOn: Runter
   internals:
   itimer:
   readings:
     0           GriffWzTuer:state RolloWzTuerKipp1:state
     1           GriffWzTuer:state RolloWzTuer:level
     2           GriffWzTuer:state RolloWzTuer:level
     3           GriffWzTuer:state autoRolloWzTuer:state
     4           GriffWzTuer:state Beschattung_Manuell:state
     all         GriffWzTuer:state RolloWzTuerKipp1:state RolloWzTuer:level autoRolloWzTuer:state Beschattung_Manuell:state
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always



Mit freundlichen Grüßen

Christian

Damian

Zitat von: seule3008 am 23 Juni 2019, 09:57:44
Moin

so langsam verstehe ich nix mehr. Das DOIF schaltet was es will.
DOELSEIF ([GriffWzTuer:state] eq "closed" or "tilted" and [autoRolloWzTuer:state] eq "cmd_4") (set RolloWzTuer 20)

Das Modul schaltet nicht was es will, sondern was du ihm gesagt hast - das ist ein feiner Unterschied ;)

Wie kommst du auf diese Syntax?

Zitat[GriffWzTuer:state] eq "closed" or "tilted"

Sie funktioniert nicht in DOIF und in keiner mir bekannten Programmiersprache.


"tilted" ist für sich immer wahr, also macht das Modul das, was du definiert hast.

Du meinst sicherlich

([GriffWzTuer:state] eq "closed" or [GriffWzTuer:state] eq "tilted") and [autoRolloWzTuer:state] eq "cmd_4")


Nicht nur der Vergleich muss so definiert werden, ebenso ist die Klammerung wichtig, da or eine niedrigere Priorität hat als and.

Leider kommt man auch bei DOIF nicht um die Grundlagen der Informatik herum.

... aber man kann es ja noch lernen :)

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

seule3008

Hallo Damian,

ich hatte auch schon diese Schreibweise: DOELSEIF ([GriffWzTuer:state] =~ "closed|tilted" and [autoRolloWzTuer:state] eq "cmd_4") (set RolloWzTuer 19),
Und trotzdem macht er das. Ich versuche mal das, was du mir geschrieben hast. Allerdings reagiert er auch immer, wenn die Rolllade oben ist also sprich 100% und das auch so in den readings steht. Kippe ich dann die Tür, fährt er wieder runter obwohl der Wert eindeutig großer als 20% ist. Er schaltet dann CMD_3

Vielen Dank für deine Hilfe. Ich habe schon für meine Laienkenntnisse viel mit hem und DOIF umgesetzt aber manchmal verstehe ich nicht was er da macht. Ein Tool, dass den Code schritt für schritt auswertet und einen damit besser verstehen lässt wo der knoten im Kopf ist gibt es nicht oder?

Gruß

Christian

seule3008

In der Schreibweise die du gerade Beschrieben hast :

([GriffWzTuer:state] eq "closed" and [RolloWzTuerKipp1:state] eq "0") (set RolloWzTuer 0)
DOELSEIF ([GriffWzTuer:state] eq "open" and [RolloWzTuer:level] < 100) (set RolloWzTuer 100)
DOELSEIF ([GriffWzTuer:state] eq "closed" or [GriffWzTuer:state] eq "tilted" and [autoRolloWzTuer:state] eq "cmd_4") (set RolloWzTuer 20)
DOELSEIF ([GriffWzTuer:state] eq "closed" or [GriffWzTuer:state] eq "tilted" and [Beschattung_Manuell:state] eq "on") (set RolloWzTuer 20)
DOELSEIF ([GriffWzTuer:state] eq "tilted" and [RolloWzTuer:level] < 20) (set RolloWzTuer 20)

tritt der selbe Fehler auf. Er fährt immer wieder die Rolllade runter auf 20% (cmd_3)obwohl im reading von [autoRolloWzTuer:state] eindeutig cmd_1 steht. Ich hab nochmal ein list angehangen.

Internals:
   CFGFN     
   DEF        ([GriffWzTuer:state] eq "closed" and [RolloWzTuerKipp1:state] eq "0") (set RolloWzTuer 0)
DOELSEIF ([GriffWzTuer:state] eq "open" and [RolloWzTuer:level] < 100) (set RolloWzTuer 100)
DOELSEIF ([GriffWzTuer:state] eq "closed" or [GriffWzTuer:state] eq "tilted" and [autoRolloWzTuer:state] eq "cmd_4") (set RolloWzTuer 20)
DOELSEIF ([GriffWzTuer:state] eq "closed" or [GriffWzTuer:state] eq "tilted" and [Beschattung_Manuell:state] eq "on") (set RolloWzTuer 20)
DOELSEIF ([GriffWzTuer:state] eq "tilted" and [RolloWzTuer:level] < 20) (set RolloWzTuer 20)
   MODEL      FHEM
   NAME       RolloWzTuerKipp
   NR         48235
   NTFY_ORDER 50-RolloWzTuerKipp
   STATE      cmd_3
   TYPE       DOIF
   READINGS:
     2019-06-23 10:51:59   Device          RolloWzTuer
     2019-06-23 10:51:41   cmd             3
     2019-06-23 10:51:41   cmd_event       GriffWzTuer
     2019-06-23 10:51:41   cmd_nr          3
     2019-06-23 10:51:41   e_GriffWzTuer_state closed
     2019-06-23 10:51:59   e_RolloWzTuer_level 20
     2019-06-23 10:51:15   mode            enabled
     2019-06-23 10:51:41   state           cmd_3
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "closed" and ::ReadingValDoIf($hash,'RolloWzTuerKipp1','state') eq "0"
     1          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "open" and ::ReadingValDoIf($hash,'RolloWzTuer','level') < 100
     2          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "closed" or ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "tilted" and ::ReadingValDoIf($hash,'autoRolloWzTuer','state') eq "cmd_4"
     3          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "closed" or ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "tilted" and ::ReadingValDoIf($hash,'Beschattung_Manuell','state') eq "on"
     4          ::ReadingValDoIf($hash,'GriffWzTuer','state') eq "tilted" and ::ReadingValDoIf($hash,'RolloWzTuer','level') < 20
   devices:
     0           GriffWzTuer RolloWzTuerKipp1
     1           GriffWzTuer RolloWzTuer
     2           GriffWzTuer autoRolloWzTuer
     3           GriffWzTuer Beschattung_Manuell
     4           GriffWzTuer RolloWzTuer
     all         GriffWzTuer RolloWzTuerKipp1 RolloWzTuer autoRolloWzTuer Beschattung_Manuell
   do:
     0:
       0          set RolloWzTuer 0
     1:
       0          set RolloWzTuer 100
     2:
       0          set RolloWzTuer 20
     3:
       0          set RolloWzTuer 20
     4:
       0          set RolloWzTuer 20
     5:
   helper:
     event      deviceMsg: 20 (to nanoCUL),level: 20,motor: stop:20,pct: 20,20,timedOn: Runter
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   GriffWzTuer
     timerevent battery: ok,contact: closed (to nanoCUL),closed,trigDst_1F7650: noConfig,trigger_cnt: 206
     triggerDev RolloWzTuer
     DOIF_eventas:
       cmd_nr: 3
       cmd: 3
       cmd_event: GriffWzTuer
       state: cmd_3
     timerevents:
       battery: ok
       contact: closed (to nanoCUL)
       closed
       trigDst_1F7650: noConfig
       trigger_cnt: 206
     timereventsState:
       battery: ok
       contact: closed (to nanoCUL)
       state: closed
       trigDst_1F7650: noConfig
       trigger_cnt: 206
     triggerEvents:
       deviceMsg: 20 (to nanoCUL)
       level: 20
       motor: stop:20
       pct: 20
       20
       timedOn: Runter
     triggerEventsState:
       deviceMsg: 20 (to nanoCUL)
       level: 20
       motor: stop:20
       pct: 20
       state: 20
       timedOn: Runter
   internals:
   itimer:
   readings:
     0           GriffWzTuer:state RolloWzTuerKipp1:state
     1           GriffWzTuer:state RolloWzTuer:level
     2           GriffWzTuer:state autoRolloWzTuer:state
     3           GriffWzTuer:state Beschattung_Manuell:state
     4           GriffWzTuer:state RolloWzTuer:level
     all         GriffWzTuer:state RolloWzTuerKipp1:state RolloWzTuer:level autoRolloWzTuer:state Beschattung_Manuell:state
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always


Gruß

Christian

seule3008

Hallo Damian,


ich glaube jetzt hab ich es. Die Klammern waren es scheinbar. Vielen Dank für deine Hilfe. Ich beobachte das jetzt mal aber bei meinen Tests gerade ist es nicht mehr aufgetreten.


Viele Grüße

Christian