wie soll man das beschreiben? / IF in DOIF

Begonnen von holle75, 20 Juli 2017, 14:38:27

Vorheriges Thema - Nächstes Thema

holle75

Ich hätte da mal wieder ein etwas komplexes DOIF. Denksportaufgabe.

([Container_TEMPFEUCHTESENSOR:temperature] > 26 and [myTwilight:azimuth] > 100 and [myTwilight:azimuth] < 260 and [myTwilight:elevation] > 28 and [AnwesenheitHaupt:state] eq "present" and [Container_SENSOR_XtenderTransfer:sensor] eq "closed") (set ZirkusOben_KLIMA on, set $SELF zustand KlimaAn)
DOELSEIF ([?$SELF:zustand] eq "KlimaAn" and [AnwesenheitHaupt:state] eq "absent")
(IF ([Container_TEMPFEUCHTESENSOR:temperature] < 26 or [myTwilight:azimuth] > 260 or [myTwilight:elevation] < 28 or [Container_SENSOR_XtenderTransfer:sensor] ne "closed") (set ZirkusOben_KLIMA off, set $SELF zustand KlimaAus))
DOELSE (IF ([$SELF:cmd] ne "2") (set ZirkusOben_KLIMA off, set $SELF zustand KlimaAus))


cmd_1 soll machen was es macht. Noch gut zu verstehen.
cmd_2 soll das selbe machen wie cmd_1 aber nur wenn vorher cmd_1 aktiv war und dann Abwesenheit eintritt .... aber nur solange die anderen Parameter erfüllt sind ....
cmd_3 soll vor allem cmd_1 abschalten.

Das muß doch einfacher gehen?! .... und weiß auch noch nicht, ob der Erguss oben überhaupt so ganz funktioniert da schwer zu testen.

Input jemand?

amenomade

Was soll [$SELF:zustand] sein? Hast Du ein userReading? Dann zeig lieber das gesamte "list" vom DOIF, damit wir verstehen können.

Um "solange die anderen Parameter erfüllt sind" zu realisieren brauchst Du kein weiteres IF im Befehl, sonden einfach mit [?device:reading] die Bedingungen erweitern:

DOELSEIF ([?$SELF:zustand] eq "KlimaAn" and [AnwesenheitHaupt:state] eq "absent"
and (
    [?Container_TEMPFEUCHTESENSOR:temperature] < 26
    or [?myTwilight:azimuth] > 260
    or [?myTwilight:elevation] < 28
    or [?Container_SENSOR_XtenderTransfer:sensor] ne "closed"
    )
)
        (set ZirkusOben_KLIMA off, set $SELF zustand KlimaAus))


Um zu testen, ob "nur wenn vorher cmd_1 aktiv war", kannst Du auch [?$SELF:cmd] eq "1"

Und zuletzt: wenn Du z.B. Fhem neu startest, oder das DEF vom DOIF änderst, wird $SELF:cmd "0"
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

holle75

list

Internals:
   DEF        ([Container_TEMPFEUCHTESENSOR:temperature] > 26 and [myTwilight:azimuth] > 100 and [myTwilight:azimuth] < 260 and [myTwilight:elevation] > 28 and [AnwesenheitHaupt:state] eq "present" and [Container_SENSOR_XtenderTransfer:sensor] eq "closed") (set ZirkusOben_KLIMA on, set $SELF zustand KlimaAn)
DOELSEIF ([?$SELF:zustand] eq "KlimaAn" and [AnwesenheitHaupt:state] eq "absent")
(IF ([Container_TEMPFEUCHTESENSOR:temperature] < 26 or [myTwilight:azimuth] > 260 or [myTwilight:elevation] < 28 or [Container_SENSOR_XtenderTransfer:sensor] ne "closed") (set ZirkusOben_KLIMA off, set $SELF zustand KlimaAus))
DOELSE (IF ([$SELF:cmd] ne "2") (set ZirkusOben_KLIMA off, set $SELF zustand KlimaAus))
   NAME       Container_XTENDER_Schalter_KLIMAAnAusDOIF
   NR         749
   NTFY_ORDER 50-Container_XTENDER_Schalter_KLIMAAnAusDOIF
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2017-07-20 16:01:35   Device          AnwesenheitHaupt
     2017-07-20 15:43:31   cmd             1
     2017-07-20 15:43:31   cmd_event       AnwesenheitHaupt
     2017-07-20 15:43:31   cmd_nr          1
     2017-07-20 16:01:35   e_AnwesenheitHaupt_state present
     2017-07-20 16:00:38   e_Container_SENSOR_XtenderTransfer_sensor closed
     2017-07-20 15:45:50   e_Container_TEMPFEUCHTESENSOR_temperature 33.1
     2017-07-20 16:00:52   e_myTwilight_azimuth 248.77
     2017-07-20 16:00:52   e_myTwilight_elevation 49.17
     2017-07-20 15:43:31   state           cmd_1
     2017-07-20 15:43:31   wait_timer      no timer
     2017-07-20 15:43:31   zustand         KlimaAn
   Condition:
     0          ReadingValDoIf($hash,'Container_TEMPFEUCHTESENSOR','temperature') > 26 and ReadingValDoIf($hash,'myTwilight','azimuth') > 100 and ReadingValDoIf($hash,'myTwilight','azimuth') < 260 and ReadingValDoIf($hash,'myTwilight','elevation') > 28 and ReadingValDoIf($hash,'AnwesenheitHaupt','state') eq "present" and ReadingValDoIf($hash,'Container_SENSOR_XtenderTransfer','sensor') eq "closed"
     1          ReadingValDoIf($hash,'Container_XTENDER_Schalter_KLIMAAnAusDOIF','zustand') eq "KlimaAn" and ReadingValDoIf($hash,'AnwesenheitHaupt','state') eq "absent"
   Devices:
     0           Container_TEMPFEUCHTESENSOR myTwilight AnwesenheitHaupt Container_SENSOR_XtenderTransfer
     1           AnwesenheitHaupt
     all         Container_TEMPFEUCHTESENSOR myTwilight AnwesenheitHaupt Container_SENSOR_XtenderTransfer
   Do:
     0:
       0          set ZirkusOben_KLIMA on, set Container_XTENDER_Schalter_KLIMAAnAusDOIF zustand KlimaAn
     1:
       0          IF ([Container_TEMPFEUCHTESENSOR:temperature] < 26 or [myTwilight:azimuth] > 260 or [myTwilight:elevation] < 28 or [Container_SENSOR_XtenderTransfer:sensor] ne "closed") (set ZirkusOben_KLIMA off, set Container_XTENDER_Schalter_KLIMAAnAusDOIF zustand KlimaAus)
     2:
       0          IF ([Container_XTENDER_Schalter_KLIMAAnAusDOIF:cmd] ne "2") (set ZirkusOben_KLIMA off, set Container_XTENDER_Schalter_KLIMAAnAusDOIF zustand KlimaAus)
   Helper:
     event      present
     globalinit 1
     last_timer 0
     sleepdevice AnwesenheitHaupt
     sleepsubtimer -1
     sleeptimer -1
     timerdev   AnwesenheitHaupt
     timerevent present
     triggerDev AnwesenheitHaupt
     timerevents:
       present
     timereventsState:
       state: present
     triggerEvents:
       present
     triggerEventsState:
       state: present
   Internals:
   Itimer:
   Readings:
     0           Container_TEMPFEUCHTESENSOR:temperature myTwilight:azimuth myTwilight:elevation AnwesenheitHaupt:state Container_SENSOR_XtenderTransfer:sensor
     1           AnwesenheitHaupt:state
     all         Container_TEMPFEUCHTESENSOR:temperature myTwilight:azimuth myTwilight:elevation AnwesenheitHaupt:state Container_SENSOR_XtenderTransfer:sensor
   Regexp:
     0:
     1:
     All:
   State:
     State:
   Trigger:
Attributes:
   devStateIcon disabled:general_aus@red:initialize initialize:general_an@yellow:disable initialized:general_an@yellow:disable cmd_1:general_an@green:disable cmd_2:general_an@green:disable cmd_3:general_an@yellow:disable
   group      System
   readingList zustand
   room       System,Anwesenheit
   sortby     2
   wait       600:0:600


erstmal das list anbei. Dachte ich halte es übersichtlich und wer mir hier helfen kann sieht (so wie du) sowieso alle (wichtigen) attr  ;)

Soo, denke ich mich mal in das was du geschrieben hast rein.

Zitat von: amenomade am 20 Juli 2017, 15:55:35
.... die Bedingungen erweitern:

mpfh, logisch. Also manchmal ....  Aber ohne ?, denn die sollen ja triggern.

Aber was mir gerade auffällt: Irgendwie habe ich drei mal um die Ecke gedacht. So


([Container_TEMPFEUCHTESENSOR:temperature] > 26 and [myTwilight:azimuth] > 100 and [myTwilight:azimuth] < 260 and [myTwilight:elevation] > 28 and [AnwesenheitHaupt:state] eq "present" and [Container_SENSOR_XtenderTransfer:sensor] eq "closed")
(set ZirkusOben_KLIMA on)

DOELSEIF ([Container_TEMPFEUCHTESENSOR:temperature] > 26 and [myTwilight:azimuth] > 100 and [myTwilight:azimuth] < 260 and [myTwilight:elevation] > 28 and [AnwesenheitHaupt:state] eq "absent" and [Container_SENSOR_XtenderTransfer:sensor] eq "closed")

DOELSE (set ZirkusOben_KLIMA off)


sollte ich doch genau das gewollte erreichen ohne viel Schnickschnack?

cmd_1 macht Klima unter den gegebenen Bedingungen an.
cmd_2 macht gar nicht außer die Ausführung von cmd_1 bedingungstechnisch zu "halten"
cmd_3 schaltet in beiden Fällen aus

was meinst du?

amenomade

ZitatAber ohne ?, denn die sollen ja triggern.
Du hattest die aber in einem IF in dem Befehl gepackt, und nicht in den Bedingungen, deswegen habe ich gedacht, die sollten nicht triggern. Triggern = die Bedingungen von den DOIF Zweigen  prüfen lassen.

Ich kenne alle deine Devices nicht, und weiss nicht genau was Du erreichen willst. Nur kann ich zu deine letzte Version sagen:
cmd1 wird geführt wenn present, cmd2 wenn dann absent, oder cmd3 wenn irgendwelche von den anderen Bedingungen nicht mehr wahr ist.

Wofür das set $SELF zustand ? Nur um des Status des DOIFs irgendwo darzustellen? Das kannst Du mit "attr <doifname> cmdState An|Aus|Aus " auch machen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

holle75

#4
Zitat von: amenomade am 20 Juli 2017, 23:43:38
Du hattest die aber in einem IF in dem Befehl gepackt, und nicht in den Bedingungen, deswegen habe ich gedacht, die sollten nicht triggern. Triggern = die Bedingungen von den DOIF Zweigen  prüfen lassen.

Ja, habe viel zu kompliziert gedacht.... und es komplexer (und falsch) dann mit den IF´s probiert. Ansatz schon falsch.

Zitat von: amenomade am 20 Juli 2017, 23:43:38
Ich kenne alle deine Devices nicht, und weiss nicht genau was Du erreichen willst. Nur kann ich zu deine letzte Version sagen:
cmd1 wird geführt wenn present, cmd2 wenn dann absent, oder cmd3 wenn irgendwelche von den anderen Bedingungen nicht mehr wahr ist.

und so soll es sein. Ich probiere jetzt mal die "neue" Version ein paar Tage. Gedanklich sollte das so funktionieren.

Zitat von: amenomade am 20 Juli 2017, 23:43:38
Wofür das set $SELF zustand ? Nur um des Status des DOIFs irgendwo darzustellen? Das kannst Du mit "attr <doifname> cmdState An|Aus|Aus " auch machen.

Danke für den Tip. Ja es ging um den Zustand/Status der Klimaanlage.... im Endeffekt status des Doif´s