FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: maci am 22 Oktober 2017, 13:38:54

Titel: [gelöst] Ich verstehe DOIF anscheinend nicht wirklich
Beitrag von: maci am 22 Oktober 2017, 13:38:54
Hallo,

Ich verstehe IF aus anderen Programmierungen, aber in Fhem habe sowohl Probleme mit IF als DOIF

Ich habe zwar schon ein paar Dinge definiert, aber die funktionieren nicht, wie sie sollen.
Bsp:
Internals:
   DEF        ([Ventil_1_Schalter] eq "on" and
[(ReadingsNum("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",""))] > [(ReadingsNum("Boiler_Temperatur","Temperatur_Boiler",""))]
+ [Hysterese])
(set Boilerladepumpe_Schalter on)
DOELSE (set Boilerladepumpe_Schalter off)
   NAME       Schalt_Boilerladepumpe
   NR         727
   NTFY_ORDER 50-Schalt_Boilerladepumpe
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2017-10-22 04:30:00   Device          Ventil_1_Schalter
     2017-10-21 14:02:47   cmd             2
     2017-10-21 14:02:47   cmd_event       Hysterese
     2017-10-21 14:02:47   cmd_nr          2
     2017-10-21 14:03:45   e_Hysterese_STATE 2
     2017-10-22 04:30:00   e_Ventil_1_Schalter_STATE on
     2017-10-21 14:02:47   state           cmd_2
     2017-10-22 00:00:46   timer_01_c01    23.10.2017 00:00:42
     2017-10-22 00:00:46   timer_02_c01    23.10.2017 00:00:44
   condition:
     0          InternalDoIf($hash,'Ventil_1_Schalter','STATE') eq "on" and   DOIF_time_once($hash,0,$wday) > DOIF_time_once($hash,1,$wday)   + InternalDoIf($hash,'Hysterese','STATE')
   days:
   devices:
     0           Ventil_1_Schalter Hysterese
     all         Ventil_1_Schalter Hysterese
   do:
     0:
       0          set Boilerladepumpe_Schalter on
     1:
       0          set Boilerladepumpe_Schalter off
   helper:
     event      on
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   Ventil_1_Schalter
     timerevent on
     triggerDev Ventil_1_Schalter
     timerevents:
       on
     timereventsState:
       state: on
     triggerEvents:
       on
     triggerEventsState:
       state: on
   internals:
     0           Ventil_1_Schalter:STATE Hysterese:STATE
     all         Ventil_1_Schalter:STATE Hysterese:STATE
   interval:
   itimer:
   localtime:
     0          1508709642.56
     1          1508709644.88
   readings:
   realtime:
     0          00:00:42
     1          00:00:44
   regexp:
     0:
     all:
   state:
     STATE:
   time:
     0          (ReadingsNum("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",""))
     1          (ReadingsNum("Boiler_Temperatur","Temperatur_Boiler",""))
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   trigger:
   triggertime:
     1508709642.56:
       localtime  1508709642.56
       hash:
     1508709644.88:
       localtime  1508709644.88
       hash:
Attributes:
   event-on-change-reading 1
   room       2.03_Heizung_Schalter


dazu meine Definition:
define Schalt_Boilerladepumpe DOIF ([Ventil_1_Schalter] eq "on" and \
[(ReadingsNum("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",""))] > [(ReadingsNum("Boiler_Temperatur","Temperatur_Boiler",""))] \
+ [Hysterese]) \
(set Boilerladepumpe_Schalter on) \
DOELSE (set Boilerladepumpe_Schalter off)


Wenn ich nun das list und die definition so ansehe, vermisse ich im List die Temperaturangaben.
In der Definition werden mir diese aber angebeben:
Bsp: Temp_Ausgang_Puffer: 51,2
Boiler_Temperatur: 41,8
Die Hysterese ist auf 2 Grad derzeit gestellt.
Ventil_1: on

Also müsste das DOIF nach meinem Gedankengang auf cmd1 gehen
Macht es aber nicht.
Um genau zu sein, das DOIF macht gar nichts.

Wo habe ich meinen Fehler?
Titel: Antw:Ich verstehe DOIF anscheinend nicht wirklich
Beitrag von: Frank_Huber am 22 Oktober 2017, 14:06:17
Setze den Vergleich mal noch in eine eigene klammer.
   DEF        ([Ventil_1_Schalter] eq "on" and
([(ReadingsNum("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",""))] > [(ReadingsNum("Boiler_Temperatur","Temperatur_Boiler",""))]
+ [Hysterese]))


Gesendet von meinem S3_32 mit Tapatalk

Titel: Antw:Ich verstehe DOIF anscheinend nicht wirklich
Beitrag von: maci am 22 Oktober 2017, 14:33:06
Hmm ...
Könntest recht haben. Damit sind die einzelnen Vergleiche sauber getrennt.
Klammern habe ich mal eingefügt.
Das Ergebnis wird sich morgen oder übermorgen zeigen.
Für heute habe ich es bereits per Hand gemacht.

Titel: Antw:Ich verstehe DOIF anscheinend nicht wirklich
Beitrag von: Otto123 am 22 Oktober 2017, 14:53:38
Ich würde es so machen:
defmod Schalt_Boilerladepumpe DOIF ([Ventil_1_Schalter] eq "on" and [Temp_Ausgang_Puffer:Temperatur_Ausgang_Puffer] > \
([Boiler_Temperatur:Temperatur_Boiler] + [Hysterese])) (set Boilerladepumpe_Schalter on) DOELSE (set Boilerladepumpe_Schalter off)


Wobei mir Deine Geräte und Readings komisch vorkommen.
Zeig mal bitte je ein list von Boiler_Temperatur und Temp_Ausgang_Puffer

Wenn die Hysterese wirklich eine sein soll würde ich dann auch ein DOELSEIF machen
([Ventil_1_Schalter] eq "off" or [Temp_Ausgang_Puffer:Temperatur_Ausgang_Puffer] < [Boiler_Temperatur:Temperatur_Boiler])

Gruß Otto
Titel: Antw:Ich verstehe DOIF anscheinend nicht wirklich
Beitrag von: maci am 22 Oktober 2017, 16:25:03
Zitat von: Otto123 am 22 Oktober 2017, 14:53:38
Wobei mir Deine Geräte und Readings komisch vorkommen.
Zeig mal bitte je ein list von Boiler_Temperatur und Temp_Ausgang_Puffer

Hier das List von Boiler_Temperatur:
Internals:
   DEF        10.0.0.201 80 espBridge ESP_Keller_Temp_Boiler
   ESP_BUILD  147
   ESP_SLEEP  0
   ESP_UNIT   0
   ESP_VERSION 9
   HOST       10.0.0.201
   IDENT      ESP_Keller_Temp_Boiler
   INTERVAL   120
   IODev      espBridge
   LASTInputDev espBridge
   MSGCNT     672
   NAME       Boiler_Temperatur
   NOTIFYDEV  global
   NR         652
   NTFY_ORDER 50-Boiler_Temperatur
   PORT       80
   STATE      Temperatur: 50.6 °
   SUBTYPE    device
   TYPE       ESPEasy
   VERSION    1.33
   espBridge_MSGCNT 672
   espBridge_TIME 2017-10-22 16:21:43
   Helper:
     DBLOG:
       temperature_T:
         DbLogging:
           TIME       1508682103.69011
           VALUE      50.6
   READINGS:
     2017-10-22 16:21:43   Temperatur_Boiler 50.560
     2017-09-07 17:42:47   alarm           0
     2017-10-22 16:21:14   presence        present
     2017-10-22 16:21:43   state           Tem: 50.560
     2017-09-05 23:59:18   temperature     57.8125
     2017-10-22 16:21:43   temperature_T   50.6
     2017-02-11 11:50:37   temphigh        75
     2017-02-11 11:50:22   templow         40
   helper:
     fpc        1508600930
     pm:
       Encode     1
       JSON       1
     received:
       Temperatur_Boiler 1508682103
Attributes:
   IODev      espBridge
   Interval   120
   group      Boiler
   icon       sani_boiler_temp
   presenceCheck 1
   readingSwitchText 1
   room       2.01_Heizung,3.01_Solaranlage
   setState   3
   sortby     2
   stateFormat {sprintf("Temperatur: %.1f °",ReadingsVal("Boiler_Temperatur","temperature_T",0))}
   userReadings temperature_T:Temperatur_Boiler.* { int ( 10 * ReadingsVal("Boiler_Temperatur","Temperatur_Boiler",0) + 0.5 ) / 10 }


und von Temp_Ausgang_Puffer: Internals:
   DEF        10.0.0.201 80 espBridge ESP_Keller_Temp_Ausgang_Puffer
   ESP_BUILD  147
   ESP_SLEEP  0
   ESP_UNIT   0
   ESP_VERSION 9
   HOST       10.0.0.201
   IDENT      ESP_Keller_Temp_Ausgang_Puffer
   INTERVAL   120
   IODev      espBridge
   LASTInputDev espBridge
   MSGCNT     675
   NAME       Temp_Ausgang_Puffer
   NOTIFYDEV  global
   NR         677
   NTFY_ORDER 50-Temp_Ausgang_Puffer
   PORT       80
   STATE      Temperatur: 36.7 °
   SUBTYPE    device
   TYPE       ESPEasy
   VERSION    1.33
   espBridge_MSGCNT 675
   espBridge_TIME 2017-10-22 16:21:23
   Helper:
     DBLOG:
       temperature_T:
         DbLogging:
           TIME       1508682083.66894
           VALUE      36.7
   READINGS:
     2017-10-22 16:21:23   Temperatur_Ausgang_Puffer 36.690
     2017-10-22 16:22:15   presence        present
     2017-10-22 16:22:15   state           Tem: 36.690
     2017-10-22 16:21:23   temperature_T   36.7
   helper:
     fpc        1508600930
     pm:
       Encode     1
       JSON       1
     received:
       Temperatur_Ausgang_Puffer 1508682083
Attributes:
   IODev      espBridge
   Interval   120
   icon       temp_temperature
   presenceCheck 1
   readingSwitchText 1
   room       2.01_Heizung
   setState   3
   stateFormat {sprintf("Temperatur: %.1f °",ReadingsVal("Temp_Ausgang_Puffer","temperature_T",0))}
   userReadings temperature_T:Temperatur_Ausgang_Puffer.* { int ( 10 * ReadingsVal("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",0) + 0.5 ) / 10 }


zur Vervollständigung noch das List von Hysterese:Internals:
   CFGFN      FHEM/vorgabe.cfg
   NAME       Hysterese
   NR         203
   STATE      2
   TYPE       dummy
   READINGS:
     2017-10-21 14:03:45   state           2
Attributes:
   group      1_Vorgaben
   room       2.09_Heizung_Vorgaben
   setList    state:0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,7,8,9,10
   webCmd     state
Titel: Antw:Ich verstehe DOIF anscheinend nicht wirklich
Beitrag von: Otto123 am 22 Oktober 2017, 17:36:36
Ok, das passt. Dann ist es so wie ich oben geschrieben habe. Das sollte funktionieren. Kannst Du so in die Raw Def werfen :)

Gruß Otto
Titel: Antw:Ich verstehe DOIF anscheinend nicht wirklich
Beitrag von: maci am 22 Oktober 2017, 19:40:53
Danke Otto,

Habe meine Definition jetzt verändert.
Die nächsten Tage zeigen ob das nun funktioniert.
Denke, dass wich wieder etwas gelernt habe.

Was ich noch nicht weiß, ist der Umgang mit den DOIF-Tools.
Ich habe diese zwar mal definiert, werde aber noch nicht schlau daraus.

Gruß
Georg
Titel: Antw:Ich verstehe DOIF anscheinend nicht wirklich
Beitrag von: Ellert am 22 Oktober 2017, 20:08:47
ZitatWas ich noch nicht weiß, ist der Umgang mit den DOIF-Tools.

Ein Blick in die Bedienungsanleitung (https://wiki.fhem.de/wiki/DOIFtools) sollte das ändern können.
Titel: Antw:Ich verstehe DOIF anscheinend nicht wirklich
Beitrag von: maci am 23 Oktober 2017, 16:36:00
Das DOIF funktioniert jetzt!

Danke für die Hilfe.