FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: fireball am 03 Februar 2025, 16:26:52

Titel: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 03 Februar 2025, 16:26:52
Hi,

ich habe aktuell ein HTTPMOD "Katzenklappe", welches mir den Zustand der Katzenklappe auswertet.
Dadurch bekomme ich auch Readings, welche mir sagen, ob eine Katze drin oder draußen ist und ich schicke mir dann ne Info aufs Handy.
Der Status wird alle 2 oder 5 min abgefragt.

Mit nem DOIF werte ich das Reading aus, wo die Katze sich befindet bzw. ob sie reingekommen ist oder rausgegangen ist.

Jetzt habe ich aber zwei Katzen :) und das Problem besteht darin, wenn die Katzen gleichzeitig rauslaufen, also innerhalb der Abfrage des HTTPMOD, dann bekomme ich zwar zwei Änderungsevents, aber DOIF scheint nur eins davon zu treffen und wertet das andere dann nicht mehr aus (bleibt also in dem DOIF Zweig, welcher zuerst gefunden wurde stecken)

do_always hilft dabei nicht.

Ist DOIF dafür falsch? Müssen es zwei DOIFs oder zwei Notifys sein oder hab ich was übersehen?!

VG+Danke

Internals:
  DEF        ([Katzenklappe:data_pets_01_position_where] == 1)
    ((set Meine_TGBot message Maui sagt, ich bin zu Hause.))
DOELSEIF ([Katzenklappe:data_pets_01_position_where] == 2)
    ((set Meine_TGBot message Maui sagt, ich gehe raus.))
DOELSEIF ([Katzenklappe:data_pets_02_position_where] == 1)
    ((set Meine_TGBot message Kami sagt, ich bin zu Hause.))
DOELSEIF ([Katzenklappe:data_pets_02_position_where] == 2)
    ((set Meine_TGBot message Kami sagt, ich gehe raus.))
  FUUID      67611f4b-f33f-0804-1d20-ca975a1b32416d80
  MODEL      FHEM
  NAME      Katzenklappe_BM
  NOTIFYDEV  Katzenklappe,global
  NR        716
  NTFY_ORDER 50-Katzenklappe_BM
  STATE      cmd_4
  TYPE      DOIF
  VERSION    28546 2024-02-23 20:11:05
  eventCount 27
  READINGS:
    2025-02-03 16:16:21  Device          Katzenklappe
    2025-02-03 16:16:21  cmd            4
    2025-02-03 16:16:21  cmd_event      Katzenklappe
    2025-02-03 16:16:21  cmd_nr          4
    2025-02-03 15:18:20  e_Katzenklappe_data_pets_01_position_where 1
    2025-02-03 16:16:21  e_Katzenklappe_data_pets_02_position_where 2
    2024-12-17 11:44:36  mode            enabled
    2025-02-03 16:16:21  state          cmd_4
  Regex:
    accu:
    bar:
    barAvg:
    collect:
    cond:
      Katzenklappe:
        0:
          data_pets_01_position_where ^Katzenklappe$:^data_pets_01_position_where:
        1:
          data_pets_01_position_where ^Katzenklappe$:^data_pets_01_position_where:
        2:
          data_pets_02_position_where ^Katzenklappe$:^data_pets_02_position_where:
        3:
          data_pets_02_position_where ^Katzenklappe$:^data_pets_02_position_where:
  attr:
    cmdState:
    wait:
    waitdel:
  condition:
    0          ::ReadingValDoIf($hash,'Katzenklappe','data_pets_01_position_where') == 1
    1          ::ReadingValDoIf($hash,'Katzenklappe','data_pets_01_position_where') == 2
    2          ::ReadingValDoIf($hash,'Katzenklappe','data_pets_02_position_where') == 1
    3          ::ReadingValDoIf($hash,'Katzenklappe','data_pets_02_position_where') == 2
  do:
    0:
      0          (set Meine_TGBot message Maui sagt, ich bin zu Hause.)
    1:
      0          (set Meine_TGBot message Maui sagt, ich gehe raus.)
    2:
      0          (set Meine_TGBot message Kami sagt, ich bin zu Hause.)
    3:
      0          (set Meine_TGBot message Kami sagt, ich gehe raus.)
    4:
  helper:
    NOTIFYDEV  Katzenklappe,global
    event      data_pets_02_status_activity_id: 4462749480,data_pets_02_status_activity_since: 2025-02-03T15:15:37+00:00,data_devices_01_last_new_event_at: 2025-02-03T15:16:01+00:00,data_devices_02_last_new_event_at: 2025-02-03T15:16:05+00:00,data_pets_02_position_where: 2,data_pets_02_position_since: 2025-02-03T15:15:37+00:00,data_devices_01_updated_at: 2025-02-03T15:16:02+00:00,data_pets_02_status_activity_where: 2,data_devices_02_updated_at: 2025-02-03T15:16:05+00:00,data_pets_02_position_id: 4462749480
    globalinit 1
    last_timer 0
    sleeptimer -1
    timerdev  Katzenklappe
    timerevent data_pets_02_status_activity_id: 4462749480,data_pets_02_status_activity_since: 2025-02-03T15:15:37+00:00,data_devices_01_last_new_event_at: 2025-02-03T15:16:01+00:00,data_devices_02_last_new_event_at: 2025-02-03T15:16:05+00:00,data_pets_02_position_where: 2,data_pets_02_position_since: 2025-02-03T15:15:37+00:00,data_devices_01_updated_at: 2025-02-03T15:16:02+00:00,data_pets_02_status_activity_where: 2,data_devices_02_updated_at: 2025-02-03T15:16:05+00:00,data_pets_02_position_id: 4462749480
    triggerDev Katzenklappe
    timerevents:
      data_pets_02_status_activity_id: 4462749480
      data_pets_02_status_activity_since: 2025-02-03T15:15:37+00:00
      data_devices_01_last_new_event_at: 2025-02-03T15:16:01+00:00
      data_devices_02_last_new_event_at: 2025-02-03T15:16:05+00:00
      data_pets_02_position_where: 2
      data_pets_02_position_since: 2025-02-03T15:15:37+00:00
      data_devices_01_updated_at: 2025-02-03T15:16:02+00:00
      data_pets_02_status_activity_where: 2
      data_devices_02_updated_at: 2025-02-03T15:16:05+00:00
      data_pets_02_position_id: 4462749480
    timereventsState:
      data_pets_02_status_activity_id: 4462749480
      data_pets_02_status_activity_since: 2025-02-03T15:15:37+00:00
      data_devices_01_last_new_event_at: 2025-02-03T15:16:01+00:00
      data_devices_02_last_new_event_at: 2025-02-03T15:16:05+00:00
      data_pets_02_position_where: 2
      data_pets_02_position_since: 2025-02-03T15:15:37+00:00
      data_devices_01_updated_at: 2025-02-03T15:16:02+00:00
      data_pets_02_status_activity_where: 2
      data_devices_02_updated_at: 2025-02-03T15:16:05+00:00
      data_pets_02_position_id: 4462749480
    triggerEvents:
      data_pets_02_status_activity_id: 4462749480
      data_pets_02_status_activity_since: 2025-02-03T15:15:37+00:00
      data_devices_01_last_new_event_at: 2025-02-03T15:16:01+00:00
      data_devices_02_last_new_event_at: 2025-02-03T15:16:05+00:00
      data_pets_02_position_where: 2
      data_pets_02_position_since: 2025-02-03T15:15:37+00:00
      data_devices_01_updated_at: 2025-02-03T15:16:02+00:00
      data_pets_02_status_activity_where: 2
      data_devices_02_updated_at: 2025-02-03T15:16:05+00:00
      data_pets_02_position_id: 4462749480
    triggerEventsState:
      data_pets_02_status_activity_id: 4462749480
      data_pets_02_status_activity_since: 2025-02-03T15:15:37+00:00
      data_devices_01_last_new_event_at: 2025-02-03T15:16:01+00:00
      data_devices_02_last_new_event_at: 2025-02-03T15:16:05+00:00
      data_pets_02_position_where: 2
      data_pets_02_position_since: 2025-02-03T15:15:37+00:00
      data_devices_01_updated_at: 2025-02-03T15:16:02+00:00
      data_pets_02_status_activity_where: 2
      data_devices_02_updated_at: 2025-02-03T15:16:05+00:00
      data_pets_02_position_id: 4462749480
  internals:
  perlblock:
  readings:
    all        Katzenklappe:data_pets_01_position_where Katzenklappe:data_pets_02_position_where
  trigger:
  uiState:
  uiTable:
Attributes:
  do        always
  icon      helper_doif
  room      ALARM

Titel: Aw: DOIF und 2 Events
Beitrag von: Per am 03 Februar 2025, 18:12:29
Am einfachsten in den Perl Modus wechseln.
Oder die Abfrage in der Reihenfolge
A und B
A
B
Keine
ausführen.
Titel: Aw: DOIF und 2 Events
Beitrag von: fireball am 04 Februar 2025, 12:25:10
Hi,

danke der Hinweis war sehr wertvoll.
So hatte ich das noch gar nicht betrachtet... jetzt funktionieren die Infos.

([Katzenklappe:data_pets_01_position_where] == 1 && [Katzenklappe:data_pets_02_position_where] == 1)
    ((set Meine_TGBot message Kami und Maui sagen, wir sind zu Hause.))
DOELSEIF ([Katzenklappe:data_pets_01_position_where] == 2 && [Katzenklappe:data_pets_02_position_where] == 2)
    ((set Meine_TGBot message Kami und Maui sagen, wir gehen raus.))
DOELSEIF ([Katzenklappe:data_pets_01_position_where] == 1)
    ((set Meine_TGBot message Maui sagt, ich bin zu Hause.))
DOELSEIF ([Katzenklappe:data_pets_01_position_where] == 2)
    ((set Meine_TGBot message Maui sagt, ich gehe raus.))
DOELSEIF ([Katzenklappe:data_pets_02_position_where] == 1)
    ((set Meine_TGBot message Kami sagt, ich bin zu Hause.))
DOELSEIF ([Katzenklappe:data_pets_02_position_where] == 2)
    ((set Meine_TGBot message Kami sagt, ich gehe raus.))

VG
René
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: Per am 04 Februar 2025, 14:37:11
Finde die Idee recht witzig, aber wird das nicht schnell nervig?
Und kann es passieren, dass eine rein und eine raus geht? Oder eine rausguckt und dann doch drinbleibt?
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 04 Februar 2025, 15:14:00
Ja... es kommen schon ein paar Nachrichten am Tag zusammen, aber so kann ich wenigstens sicherstellen, wo die Katzen sind bzw. in meinem Fall (Klappe nur zur Garage, aber nicht ins Haus) dann noch im Winter die Tür aufmachen.
Außerdem müssen nicht alle die App des Herstellers installieren und wir nutzen alle den gemeinsamen Telegram-Haus-Channel.

Das mit dem Kucken und nicht rausgehen, gibts auch, ist aber glaube ein anderer Wert. Jedenfalls wird das DOIF nicht getriggert.
Und mit eine raus und eine rein, das habe ich gar nicht betrachtet... der Fall ist aber bisher (in dem 2 Minuten Abfrageintervall) so noch nicht aufgetreten...

Am Ende ist es eine kleine Spielerei...  ;D
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: Per am 04 Februar 2025, 15:54:10
Dass der Zustand mitgetrackt wird, ist ok, je nach Aktivität der beiden Tiger (wo bleiben die Bilder? ;)) kann es aber zu viel Gerede werden.
Mittels (z.B.) Alexa Abfrage oder Display kann man das auch im Bedarfsfall lösen (wenn abends die Tür geschlossen werden soll). Falls man gerade nicht im passenden Zimmer war, hat man ohnehin den aktuellen Status verpasst.
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 04 Februar 2025, 15:59:46
Ja, wenn uns auf die Nerven geht, dann setze ich das DOIF auf disable, aktuell gehts... die Racker pennen ja den ganzen Tag :P oder sind viel draußen...

Ansonsten habe ich eine Anzeige in FHEM mit den Zuständen, siehe Anhang.
Die Tür wird rot und offen, wenn sie draußen sind.

Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: rabehd am 04 Februar 2025, 16:06:22
Was für eine Klappe hast Du?
Meine ist 20 Jahre alt und daran klebt ein Bewegungssensor.
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 04 Februar 2025, 16:10:24
Hier die Infos (https://forum.fhem.de/index.php?topic=122437.msg1317804#msg1317804) mit Code für die Abfrage:
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 10 Juni 2025, 11:08:43
Zitat von: fireball am 04 Februar 2025, 12:25:10Hi,

danke der Hinweis war sehr wertvoll.
So hatte ich das noch gar nicht betrachtet... jetzt funktionieren die Infos.

([Katzenklappe:data_pets_01_position_where] == 1 && [Katzenklappe:data_pets_02_position_where] == 1)
    ((set Meine_TGBot message Kami und Maui sagen, wir sind zu Hause.))
DOELSEIF ([Katzenklappe:data_pets_01_position_where] == 2 && [Katzenklappe:data_pets_02_position_where] == 2)
    ((set Meine_TGBot message Kami und Maui sagen, wir gehen raus.))
DOELSEIF ([Katzenklappe:data_pets_01_position_where] == 1)
    ((set Meine_TGBot message Maui sagt, ich bin zu Hause.))
DOELSEIF ([Katzenklappe:data_pets_01_position_where] == 2)
    ((set Meine_TGBot message Maui sagt, ich gehe raus.))
DOELSEIF ([Katzenklappe:data_pets_02_position_where] == 1)
    ((set Meine_TGBot message Kami sagt, ich bin zu Hause.))
DOELSEIF ([Katzenklappe:data_pets_02_position_where] == 2)
    ((set Meine_TGBot message Kami sagt, ich gehe raus.))

VG
René


Hi, ich habe grad festgestellt, dass es doch nicht so richtig läuft...
DOIF sollte ja auf die Events reagieren und ich habe ja eingestellt, dass nur Events bei Änderungen erzeugt werden sollen (event-on-change-reading= .*).

Es ist aber so, dass wenn nur eine Katze reinkommt und damit der Status auf 1 geht und die andere schon drinne ist (also auch 1), trotzdem die 1. DOIF Schleife durchlaufen wird:
([Katzenklappe:data_pets_01_position_where] == 1 && [Katzenklappe:data_pets_02_position_where] == 1)

Ich dachte eigentlich, dass das nicht passieren kann. Klar sind beide Werte 1, aber nur auf pets_02_ kamm der Event eben.
Damit sollte eigentlich diese Schleifen durchlaufen werden:
DOELSEIF ([Katzenklappe:data_pets_02_position_where] == 1)
Was überseh ich hier?!
VG
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: Otto123 am 10 Juni 2025, 12:58:56
Hi,

so wie ich das verstehe triggert das DOIF auf jeden Event eines jeden beteiligten Devices und klappert anschließend die Bedingungen ab. Trifft eine Bedingung zu ist erstmal fertig. Genau so läuft es offenbar bei Dir.
Du solltest eventuell nicht einfach nur die Readings abfragen sondern auf den Event selbst reagieren?!
https://fhem.de/commandref_modular_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events

Gruß Otto
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 10 Juni 2025, 15:18:10
Hi Otto,

und ich dachte ich mach das die ganze Zeit schon :) aber Ereignis und Event...
Meinst du so:
(["Katzenklappe:data_pets_01_position_where:1"] && ["Katzenklappe:data_pets_02_position_where:1"])
VG
René
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: Otto123 am 10 Juni 2025, 17:00:54
Nein, das wird nicht funktionieren. Innerhalb FHEM kann es keine gleichzeitigen Events geben, alles läuft nacheinander. Steht so auch im verlinkten Text:
ZitatDie logische Verknüpfung "and" mehrerer Ereignisse ist nicht sinnvoll, da zu einem Zeitpunkt immer nur ein Ereignis zutreffen kann.
Ich meine, dass beide Katzen da sind, ist eigentlich keine Alternative zu: eine kommt oder geht. Insofern ist bei genauer Überlegung die erste Abfrage immer wahr wenn beide da sind und alternative Zweige werden gar nicht evaluiert? Aber so genau kann ich es zur Funktion von DOIF nicht sagen, das ist für mich immer etwas im verborgenen geblieben ;) aber sowas steht in der commandref:
ZitatKommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.
Konsequenz: die erste Abfrage ist ein eigenes DOIF ?

Ich meinte eher diese Zweige:
([Katzenklappe:data_pets_01_position_where] == 2) aber um es genau zu zeigen muss Du dir die Events genau im Eventmonitor anschauen, beim Reading ist da immer noch ein Leerzeichen. Ev. so
[Katzenklappe:"data_pets_01_position_where:.2"]
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 11 Juni 2025, 19:00:34
Hi Otto,

das mit den zwei Ereignissen auf einmal ist schade...
Das habe ich dann wohl übersehen. Meine Katzenklappe frag ich nur alle 5min ab, daher kann der Zustand ob eine der beiden Katzen drin oder draußen ist sich natürlich ändern.
Mir war jetzt nur wichtig, die 4 Zustände abzufangen, meist kommt es nicht so häufig vor, das sich das innerhalb der 5min so schnell ändert.
Aber beide morgens raus, dann kommen die beiden Änderung/Ereignisse bei der nächsten Abfrage ja gleichzeitig.
Daher gibts die erste DOIF Schleife...

Ich dachte eigentlich dass ich auf die Änderungen der Werte reagiert hatte, aber das mit den Events habe ich überhaupt nicht auf dem Schirm gehabt.

Aktuell funktioniert die Abfrage, wie du sie empfohlen hast auch...

   
([Katzenklappe:"data_pets_01_position_where:.1"] && [Katzenklappe:"data_pets_02_position_where:.1"])
    ((set Meine_TGBot message Kami und Maui sagen, wir sind zu Hause.))
DOELSEIF ([Katzenklappe:"data_pets_01_position_where:.2"] && [Katzenklappe:"data_pets_02_position_where:.2"])
    ((set Meine_TGBot message Kami und Maui sagen, wir gehen raus.))
DOELSEIF ([Katzenklappe:"data_pets_01_position_where:.1"])
    ((set Meine_TGBot message Maui sagt, ich bin zu Hause.))
DOELSEIF ([Katzenklappe:"data_pets_01_position_where:.2"])
    ((set Meine_TGBot message Maui sagt, ich gehe raus.))
DOELSEIF ([Katzenklappe:"data_pets_02_position_where:.1"])
    ((set Meine_TGBot message Kami sagt, ich bin zu Hause.))
DOELSEIF ([Katzenklappe:"data_pets_02_position_where:.2"])
    ((set Meine_TGBot message Kami sagt, ich gehe raus.))

Jetzt muss ich mal beide Racker gleichzeitig durch die Tür jagen  ;D

Viell. bau ich das auch einfach nochmal um, ähnlich dem Bsp mit der Fensterüberwachung... das hab ich ja auch... dann zeig ich mir einfach an, welche Katzen draußen sind (Fenster offen sind) oder drinnen (geschlossen). Das funzt bei mir ganz gut. Dafür brauch ich dann aber zwei Devices... na mal schauen...

VG
René
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: Per am 11 Juni 2025, 20:09:46
define Maui Cat
define Kami Cat
;D
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 11 Juni 2025, 21:08:59
Ja genau...
Da fällt mir ein, ich könnte zwei readingsProxys auf den HTTPMOD setzen, dann hätte ich zwei Devices mit dem aktuellen Status..  8)  na mal schauen
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: Otto123 am 11 Juni 2025, 21:33:34
Zitat von: fireball am 11 Juni 2025, 19:00:34[Katzenklappe:"data_pets_01_position_where:.1"] && [Katzenklappe:"data_pets_02_position_where:.1"]
Das wird nie wahr!
;)
Den Zweig kannst Du mMn einfach weglassen, bzw. daraus ein zweites Gerät machen mit der alten Zustandsabfrage, die funktioniert.
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: Per am 12 Juni 2025, 08:17:00
Du kannst auch zwei DOIF nehmen. Dann entfällt auch die Gleichzeitigkeit der Events.
Oder ein Perl DOIF mit zwei Userreadings.
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: tobi01001 am 12 Juni 2025, 14:31:36
Oder halt nur eine Katze **wegduck**

Mit dem was du da machst (per Telegram benachrichtigen ob Mietze oder Katze raus oder rein gehen), würde ich ein Notify auf Katzenklappe:data_pets_0?_position_where.* triggern und im notify über $NAME und $EVENT auswerten welche Mieze es war und wohin die gegangen ist.
Wenn du dennoch pro im Zweifel 5 Minuten verzögerten Event den diskreten Ortszustand beider Fellnasen melden möchtest, kannst du das auch im notify abfragen und so den Ortszustandswechsel melden.
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 18 Juni 2025, 12:21:47
Hi, also der Trigger auf die Events hat schonmal gut funktioniert.
Ich hatte jetzt leider erst einmal den Fall, dass beide gleichzeitig raus sind, aber mit der Umstellung auf die Events funktionierte auch dieser Fall mit der "and" Abfrage im DOIF.

@Tobi, dein Ansatz klingt auch sehr nice... viell. stelle ich da nochmal um.

Ich beobachte mal weiter.
VG
René
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: Damian am 18 Juni 2025, 12:47:51
Warum stellst du deine Event-Abfragen nicht auf Zustandsabfragen um. Diese triggern ebenso, haben aber noch einen definierten Zustand.

z. B. ([Katzenklappe:data_pets_01_position_where] == 1 && [Katzenklappe:data_pets_02_position_where] == 1)
so kann eine UND-Abfrage durchaus Sinn machen.
Titel: Aw: (gelöst) DOIF und 2 Events
Beitrag von: fireball am 18 Juni 2025, 13:01:39
Hallo Damian,

so hatte ich es ja am Anfang auch, aber das funktionier nicht. Ich hatte mein DOIF ja (sieh POST #2) so aufgebaut.
Dann hab ich aber das Problem, Katze 1 rennt raus und data_pets_01_position_where wird 1. Wenn Katze zwei vorher raus rennt, dann ist da auch ne 1 und schwups greift DOIF mit UND.

Ich dachte, wenn ich das "event-on-change-reading" auf .* setzte, dann wird immer nur die DOIF Schleife durchlaufen, je nachdem ob sich innerhalb des 5min Abfrageintervall Katze1 oder 2 oder beide ändern. Aber das hat nicht funktioniert, wenn ich auf die Readings gehe.
Jetzt mit den Events scheints zu klappen...

VG
René