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?
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"
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?
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.
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