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?
			
			
			
				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
			
			
			
				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.
			
			
			
				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
			
			
			
				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 
			 
			
			
				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
			
			
			
				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
			
			
			
				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.
			
 
			
			
				Das DOIF funktioniert jetzt!
Danke für die Hilfe.