Hauptmenü

(gelöst) DOIF und 2 Events

Begonnen von fireball, 03 Februar 2025, 16:26:52

Vorheriges Thema - Nächstes Thema

fireball

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


Per

Am einfachsten in den Perl Modus wechseln.
Oder die Abfrage in der Reihenfolge
A und B
A
B
Keine
ausführen.

fireball

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é

Per

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?

fireball

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

Per

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.

fireball

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.


rabehd

Was für eine Klappe hast Du?
Meine ist 20 Jahre alt und daran klebt ein Bewegungssensor.
Auch funktionierende Lösungen kann man hinterfragen.

fireball

Hier die Infos mit Code für die Abfrage:

fireball

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

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

fireball

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é

Otto123

#12
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"]
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

fireball

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é

Per

define Maui Cat
define Kami Cat
;D