Hauptmenü

DOIF or

Begonnen von Tyraldur, 06 Dezember 2017, 23:54:08

Vorheriges Thema - Nächstes Thema

Tyraldur

Hallo, eigentlich eine simple Sache, aber ich hab wohl Tomaten auf den Augen.

Das hier funktioniert:
([geofancy] =~ "id:614477FB-AB5E-4ACD-BDFB-C0E52957F9E6 trig:1")(set HUEDevice3 off) DOELSEIF ([geofancy] =~ "id:614477FB-AB5E-4ACD-BDFB-C0E52957F9E6 trig:0")(set HUEDevice3 rgb 45FF89 : pct 50 : on)

Das hier auch:
([pr_carsten_phone] eq "present")(set HUEDevice3 off) DOELSEIF ([pr_carsten_phone] eq "absent")(set HUEDevice3 rgb 45FF89 : pct 50 : on)

Eine Kombination aus beidem bekomme ich nicht zum laufen?
([pr_carsten_phone] eq "present" or [geofancy] =~ "id:614477FB-AB5E-4ACD-BDFB-C0E52957F9E6 trig:1")(set HUEDevice3 off) DOELSEIF ([pr_carsten_phone] eq "absent" or [geofancy] =~ "id:614477FB-AB5E-4ACD-BDFB-C0E52957F9E6 trig:0")(set HUEDevice3 rgb 45FF89 : pct 50 : on)

Amenophis86

#1
Hallo Tyraldur und willkommen im Forum,

folgender Hinweis. Bitte nutze für Codezeilen die Codetags (#-Symbol bei den Smilies)

Zu deiner Frage. Ich sehe auf den ersten Blick keinen Fehler. Daher die Frage, ob die beiden auch sich in verschiedenen Zuständen befinden? Geschätzt würde ich sagen, dass pr_carsten_phone present ist, wenn geofancy deinen angegeben Wert annimmt. Kann das sein? Dann würde das DOIF natürlich nicht Triggern.

Hilfreich ist auch immer ein List der beteiligten Device um eventuelle Fehler zu sehen.

Edit:
Rechtschreibung
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Frank_Huber

Zum ausschalten würde ich mit und verknüpfen.

Mit dem Handy online, daher kurz gefasst...


Tyraldur

Moin Amenophis86,

danke für deine Unterstützung.

pr_carsten_phone ist ein PRESENCE Device welches mein Telefon WLAN connect prüft.
geofancy ist GEOFANCY und die ID von meinem Zuhause.

Da beides nicht 100% zuverlässig ist, wollte ich sie kombinieren. Also mach was wenn entweder pr_carsten_phone=present oder geofancy mit der ID und trig 1.
Quasi was als erstes eintritt?

automatisierer

ja, schon klar. Da bei deinem geposteten Code nix auffällig ist, muss der Hund wo anders begraben liegen. Daher bitte ein list von dem DOIF posten, in # Code Tags.

Amenophis86

Joa aber dann klappt ja auch dein DOIF schätze ich mal. Und zwar soll es nur dann schalten, wenn es nicht zuverlässig gemeldet wird. Jetzt ist die Frage, ist dieser Zustand mal eingetreten, seit du das DOIF erstellt hast. Ist er bisher nämlich nicht eingetreten, dann muss das DOIF ja auch nicht schalten.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Tyraldur

Der Zustand ist simuliert eingetreten.
setreading pr_carsten_phone state absent
Oder mit der GeofancyApp auf dem Handy den Webhook geschickt.

Hier das list. Der Befehl war mir neu, danke dafür.
Internals:
   DEF        ([pr_carsten_phone] =~ "present" or [geofancy] =~ "id:614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig:1")(set HUEDevice3 off) DOELSEIF ([pr_carsten_phone] =~ "absent" or [geofancy] =~ "id:614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig:0")(set HUEDevice3 rgb 45FF89 : pct 50 : on)
   NAME       di_carsten_presence
   NR         40
   NTFY_ORDER 50-di_carsten_presence
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2017-12-07 07:36:38   Device          pr_carsten_phone
     2017-12-07 07:33:37   cmd             1
     2017-12-07 07:33:37   cmd_event       geofancy
     2017-12-07 07:33:37   cmd_nr          1
     2017-12-07 07:33:46   e_geofancy_STATE id:614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig:1 date:1512628426 lat:50.17453494020754 long:8.735587634154349 dev:8F6F145E-803B-4BA2-A6BE-05167CE2F91F devAlias=-
     2017-12-07 07:36:38   e_pr_carsten_phone_STATE present
     2017-12-07 07:33:37   state           cmd_1
   condition:
     0          InternalDoIf($hash,'pr_carsten_phone','STATE') =~ "present" or InternalDoIf($hash,'geofancy','STATE') =~ "id:614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig:1"
     1          InternalDoIf($hash,'pr_carsten_phone','STATE') =~ "absent" or InternalDoIf($hash,'geofancy','STATE') =~ "id:614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig:0"
   devices:
     0           pr_carsten_phone geofancy
     1           pr_carsten_phone geofancy
     all         pr_carsten_phone geofancy
   do:
     0:
       0          set HUEDevice3 off
     1:
       0          set HUEDevice3 rgb 45FF89 : pct 50 : on
   helper:
     event      present,presence: present
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   pr_carsten_phone
     timerevent present,presence: present
     triggerDev pr_carsten_phone
     timerevents:
       present
       presence: present
     timereventsState:
       state: present
       presence: present
     triggerEvents:
       present
       presence: present
     triggerEventsState:
       state: present
       presence: present
   internals:
     0           pr_carsten_phone:STATE geofancy:STATE
     1           pr_carsten_phone:STATE geofancy:STATE
     all         pr_carsten_phone:STATE geofancy:STATE
   itimer:
   readings:
   regexp:
     0:
     all:
   state:
     STATE:
   trigger:
Attributes:

Tyraldur

Ach ich seh grade, in dem list verwende ich bei pr_carsten_phone =~ anstatt eq wie im Einganspost. Ich teste mich halt durch alle mir erdenklichen Szenarien. Eine funktionierende habe ich aber noch nicht gefunden.

automatisierer

#8
Das DOIF sieht gut aus und wenn die Bedingungen einzeln funktioniert haben, sehe ich keinen Grund, warum sie nicht auch 'or-Verknüpft' funktionierenn sollten.

Ich gehe daher mal davon aus, das die auslösenden Events ausbleiben. Also presence und geofancy nicht funktionieren.

EDIT:
du hast kein do always gesetzt, daher wird der gleiche Zustand nicht noch einmal ausgelöst, macht ja prinzipiell auch keinen Sinn - nur das du da nicht beim Testen drüber stolperst.

Tyraldur

Zitat von: automatisierer am 07 Dezember 2017, 08:14:46

Ich gehe daher mal davon aus, das die auslösenden Events ausbleiben. Also presence und geofancy nicht funktionieren.

EDIT:
du hast kein do always gesetzt, daher wird der gleiche Zustand nicht noch einmal ausgelöst, macht ja prinzipiell auch keinen Sinn - nur das du da nicht beim Testen drüber stolperst.
Ob do always gesetzt ist oder nicht macht keinen Unterschied.

Wie schon geschrieben, ich setze das Event entweder mit setreading oder aus der Geofancy App heraus und im Event Monitor kann ich die Ereignisse sehen:
2017-12-07 08:22:09 PRESENCE pr_carsten_phone absent
2017-12-07 08:26:15 GEOFANCY geofancy id:614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig:0 date:1512631575 lat:50.17453494020754 long:8.735587634154349 dev:8F6F145E-803B-4BA2-A6BE-05167CE2F91F devAlias=-

Frank_Huber

zum ausschalten oder:

nehmen wir an: Bedingung 1 ist wahr und Bedingung 2 falsch.
Damit wären BEIDE DOIF Zweige wahr...

Für mein Anwesenheitsdoif habe ich:
Frau ODER Ich zuhause --> AN
Frau UND Ich nicht zuhause --> AUS

Du willst ja nicht auf Abwesend schalten wenn Du im WLAN bist aber Geofancy sagt du bist weg...
Daher der Tip die Abwesenheitsprüfung mit Oder zu machen.

automatisierer

ZitatDu willst ja nicht auf Abwesend schalten wenn Du im WLAN bist aber Geofancy sagt du bist weg...

Ich denke das soll es doch, da Geofancy sich nicht 100%ig zuverlässig meldet. In dem Fall sagt Geofancy "present" und Presence "absent"

Aber dadurch kann cmd_2 nie wahr werden. DOIF wird getriggert und die Bedingungen geprüft, eine der Bedingungen von cmd_1 ist wahr und fertig...

Du solltest das DOIF auf "Eventauswertung umstellen" dann löst jedes einzelne Event das entsprechende cmd aus.


([pr_carsten_phone:"present"] or [geofancy:"id.614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig.1"])(set HUEDevice3 off)
DOELSEIF
([pr_carsten_phone:"absent"] or [geofancy:"id.614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig.0"])(set HUEDevice3 rgb 45FF89 : pct 50 : on)

Frank_Huber

Naja,

Geofancy: present / presence: absent --> beide CMDs sind wahr
Geofancy: absent / presence: present --> beide CMDs sind wahr
Geofancy: present / presence: present --> nur CMD_1
Geofancy: absent / presence: absent --> nur CMD_2

Gerade der Fall dass nur eines davon unwahr sein muss für CMD_2 sorgt hier für den Genickbruch.
Das kann so nicht funktionieren.

Tyraldur

Ja, ihr habt recht. DOIF ist immer wahr und cmd1 wird bei do always auch immer ausgeführt. Da ist er mein Denkfehler.

Ich probier das mal mit der Eventauswertung, wobei mir der Unterschied noch nicht ganz klar ist.... aber ich les erstmal die Doku dazu.

Vielen Dank Euch allen.

Tyraldur

Soviel Doku gab es nicht zu lesen und die Logik ist mir klar geworden. Es wird nur das einzelne Event ausgewertet und nicht der Status beider Devices.
Nun macht es was es soll. Super, vielen Dank nochmal.

Frank_Huber

postest Du noch deinen Ergebis-Code?
Damit es für eventuelle andere suchende findbar ist.

automatisierer

Bei Eventauswertung ist eine Bedingung immer nur im Moment des auftretens des Events wahr, wie bei notify.

Bei Readingauswertung wird das DOIF beim auftreten eines Events nur getriggert und dann werden die Readings geprüft ob wahr/falsch. Da immer von "links nach rechts" geprüft wird und nur so weit geprüft wird bis ein DOIF Zweig wahr ist, bleibt das DOIF in deinem Fall immer bei cmd1 hängen, so lange eine der darin enthaltenen Bedinungen wahr ist.

EDIT:
da is er schon fertig und ich tippe mir mal wieder die Finger wund... 8)

Tyraldur

#17
Zitat von: Frank_Huber am 07 Dezember 2017, 11:04:05
postest Du noch deinen Ergebis-Code?
Damit es für eventuelle andere suchende findbar ist.

Ich hab quasi das Beispiel von automatisierer vorhin 1:1 kopiert, hat direkt gemacht was es soll.
([pr_carsten_phone:"present"] or [geofancy:"id.614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig.1"])(set HUEDevice3 off)
DOELSEIF
([pr_carsten_phone:"absent"] or [geofancy:"id.614477FB-AB5E-47CD-BDBB-C0E52957F9E6 trig.0"])(set HUEDevice3 rgb 45FF89 : pct 50 : on)


Wenn ich absent bin, schalte ich halt noch die Kaffeemaschine aus usw.

EDIT:
Das Beispiel war von automatisierer