Problem mit einer DOIF Definition

Begonnen von maci, 12 Februar 2017, 16:12:21

Vorheriges Thema - Nächstes Thema

Ellert

Zitat von: maci am 27 Februar 2017, 14:03:33
Hallo an alle,

wenn ich ehrlich bin blicke ich bei den ganze DOIF nicht wirklich durch.

Ich kenne wenn-dann Konstruktionen bei anderen Programmierungen. Hier funktionieren diese, was ich auch schreibe.
Anfangs dachte ich noch, es sei hier sehr ähnlich, aber anscheinend ist es nicht so.
Ich weiß, das ist jetzt sehr allgemein. Aber ich stehe derzeit total am Schlauch und weiß nicht wo ich anfangen soll, warum das nicht geht.

Das grundsätzliche Verhalten von DOIF ist hier ergänzend erläutert: https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Struktur_und_Verhalten_des_DOIF
Lies das mal, dann wird Dir der Unterschied zu den von Dir erwähnten Programmierbefehlen vielleicht deutlicher.

maci

Wenn ich mir das so ansehe im Wiki, frage ich mich wie ich nach dieser Struktur und Bedingungen  schreiben soll.
Bsp: Bedingung 1 ist ein Zeitrahmen, Bedingung 2 ist ein Vergleich von Werten.

Die DOIF Anweisung bekommt ein Ereignis.
Es wird nach Bedingung 1 geprüft. Diese ist wahr!
Nun soll aber auch nach Bedingung 2 geprüft werden.

Doch in der Grafik ist dieser Fall nicht zu finden.
Hier gibt es nur  DOIF Bedingung 1 -> wahr -- Prüfung der Bedingung -> wahr -- Befehl ausführen
Ich brauche bei und Bedingungen aber den Fall:
DOIF Bedingung 1 -> wahr -- Prüfung der Bedingung -> wahr -- Bedingung 2 prüfen , usw.

Für mich sind die Einzelprüfungen einzelne Bedingungen.
Diese Grafik kann ich auf oder anwenden, da passt es.

Ich müsste im Prinzip mehrere DOIF's verschachteln. Dann komme ich hin.
Sehe ich das falsch, oder wie soll ich sonst aufbauen.

Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

Ellert

#32
ZitatDoch in der Grafik ist dieser Fall nicht zu finden.
Hier gibt es nur  DOIF Bedingung 1 -> wahr -- Prüfung der Bedingung -> wahr -- Befehl ausführen

Genau das ist die Arbeitsweise des DOIF ohne steuernde Attribute. Es wir die erste Bedingung, bei der Zeit oder Ereignis zum Auslöser passen und die wahr wird ausgeführt.

Mit Attribut checkAll, werden alle Bedingungen geprüft, auch die, wo der Auslöser nicht zum Ereignis passt. Die erste wahre Bedingung wird ausgeführt.

DOIF verschachteln ist nicht vorgesehen.

Für Dich kommt eventuell dieses Schema in Frage:

DOIF (["A"] or ["B"] or [HH:MM:SS] or ...)
           (
          IF (<Bedingung>) (<Befehle>) ELSE (Befehle),
          IF (<Bedingung>) (<Befehle>) ELSE (Befehle),
          IF (<Bedingung>) (<Befehle>) ELSE (Befehle),
          ...
          )



DOIF ist ein FHEM Gerät, IF ist ein FHEM-Befehl  https://fhem.de/commandref_DE.html#IF

maci

Hallo,

Habe nun einer meiner DOIFs umgebaut.
Ein DOIF mit einer IF Abfrage.

Es funktioniert zwar, grundsätzlich, aber die IF Abfrage macht etwas verkehrt, meine ich.

Hier das List:
Internals:
   DEF        ([4:30-19:00] and [HeizAutomatik] eq "on")
(
  IF ([Temp_Ausgang_Puffer:temperature] > [Boiler_Temperatur:temperature])
    (set Schalt_Boilerladepumpe desired [Puffer_Tmin])
  ELSE
    (set Schalt_Boilerladepumpe desired [Boiler_Tmax_Winter])
)
   NAME       a_Schalt_Boilerladepumpe
   NR         279
   NTFY_ORDER 50-a_Schalt_Boilerladepumpe
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2017-03-09 18:27:43   Device          HeizAutomatik
     2017-03-09 18:27:44   cmd             1
     2017-03-09 18:27:44   cmd_event       HeizAutomatik
     2017-03-09 18:27:44   cmd_nr          1
     2017-03-09 18:27:43   e_HeizAutomatik_STATE on
     2017-03-09 18:27:44   state           cmd_1
     2017-03-09 18:22:03   timer_01_c01    10.03.2017 04:30:00
     2017-03-09 18:22:03   timer_02_c01    09.03.2017 19:00:00
   Condition:
     0          DOIF_time($hash,0,1,$wday,$hms) and InternalDoIf($hash,'HeizAutomatik','STATE') eq "on"
   Days:
   Devices:
     0           HeizAutomatik
     all         HeizAutomatik
   Do:
     0:
       0              IF ([Temp_Ausgang_Puffer:temperature] > [Boiler_Temperatur:temperature])      (set Schalt_Boilerladepumpe desired [Puffer_Tmin])    ELSE      (set Schalt_Boilerladepumpe desired [Boiler_Tmax_Winter])
   Helper:
     event      on
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   HeizAutomatik
     timerevent on
     triggerDev HeizAutomatik
     timerevents:
       on
     timereventsState:
       state: on
     triggerEvents:
       on
     triggerEventsState:
       state: on
   Internals:
     0           HeizAutomatik:STATE
     all         HeizAutomatik:STATE
   Interval:
     0          -1
     1          0
   Itimer:
   Localtime:
     0          1489116600
     1          1489082400
   Readings:
   Realtime:
     0          04:30:00
     1          19:00:00
   Regexp:
     0:
     All:
   State:
   Time:
     0          4:30
     1          19:00:00
   Timecond:
     0          0
     1          0
   Timer:
     0          0
     1          0
   Timers:
     0           0  1
   Trigger:
   Triggertime:
     1489082400:
       localtime  1489082400
       Hash:
     1489116600:
       localtime  1489116600
       Hash:
Attributes:
   room       2.03_Heizung_Schalter


Ich kann es mir nicht erklären darum stelle ich es rein.

Bitte um Hilfe?

Danke im voraus
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan