FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: TobiasR am 11 August 2025, 11:12:22

Titel: cmd_1 versus cmd_2
Beitrag von: TobiasR am 11 August 2025, 11:12:22
Hallo,

ich brauche mal Hilfe.
Wieso wie lege ich fest ob eine Funktion in DOIF mit "set xyz cmd_1" oder "set xyz cmd_2" ausgeführt werden soll?

Hintergrund:
Wenn mein Klingeltaster betätigt wird, wurde bisher immer eine Telegramnachricht erzeugt.
Seit gestern ist das nicht mehr der Fall und ich habe jetzt rausgefunden dass offensichtlich seit gestern der Befehl nur noch über cmd_2 raus geht.
Aber wo lege ich das fest?

Hier die Sequenz:
define Hofklingel DOIF (\
[K_Klingel:"^sensor:.closed$"]\
) \
(\
get WebCamHof image\
) \
(\
set Telegram sendImage @Tobias /opt/fhem/www/webcam/WebCamHof_snapshot.jpg Es hat gerade am Hoftor geklingelt\
)\
(\
set Telegram sendImage @Tobias /opt/fhem/www/webcam/WebCamHof_snapshot_2.jpg\
)\
\

setuuid Hofklingel 68960241-f33f-f1f8-4a89-1bcaf9bf4d25b116
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: Prof. Dr. Peter Henning am 11 August 2025, 14:41:29
Welcher ist
Zitat von: TobiasR am 11 August 2025, 11:12:22der Befehl
?
Und was heißt "rausgehen"?
Und warum stehen in der Definition die ganzen "\", das ist ziemlich unwartbar.
Es fehlen außerdem Angaben über sonstige Attribute, z.B. Zeitverzögerungen.

LG

pah
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: passibe am 11 August 2025, 14:58:15
Zitat von: Prof. Dr. Peter Henning am 11 August 2025, 14:41:29Und warum stehen in der Definition die ganzen "\", das ist ziemlich unwartbar.
Das sind doch einfach nur die Zeilenumbrüche aus dem raw editor lol

Aber zur Abwechslung vielleicht mal ein Versuch, das eigentliche Problem zu lösen:

@TobiasR, cmd_2 ist der zweite Bedingungszweig (zum Begriff siehe hier (https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Struktur_und_Verhalten_des_DOIF_ohne_steuernde_Attribute)).

Weil dein DOIF nur einen DOIF-Zweig und kein DOELSE enthält, fällt es, wenn die im DOIF-Zweig angegebene Bedingung unwahr ist, in ein "internes" bzw. unsichtbares DOELSE zurück. Das ist das cmd_2, was du siehst.

Dazu aus dem Wiki (https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Angaben_im_Bedingungsteil):
ZitatEin DOIF mit nur einem Bedingungszweig enthält ein internes DOELSE, d.h. bei unwahrer Bedingung und vorhandenem Auslöser findet ein Statuswechsel auf cmd_2 statt.

Die von dir in der Klammer angegebenen Kommandos (get WebCamHof, set Telegram, set Telegram) sind cmd 1.1, 1.2 und 1.3, nicht etwa cmd_1, cmd_2 und cmd_3. Also nochmal: Bei cmd_n bezeichnet n immer den Bedingungszweig.

Im Prinzip heißt das hier einfach, dass deine Bedingung [K_Klingel:"^sensor:.closed$"] nicht wahr wird. Du triggerst also nicht auf das richtige Event. Wieso das bis jetzt funktioniert hat, keine Ahnung. Irgendwas muss sich da geändert haben. Schau nochmal im Eventmonitor, ob tatsächlich auch dieses Event von K_Klingel ankommt, wenn jemand klingelt, bzw. arbeite der Übersichtlichkeit halber vielleicht sowieso lieber einfach mit setmagic und eq statt mit regex, also: [K_Klingel:sensor] eq "closed".
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: TomLee am 11 August 2025, 15:00:22
Zitat von: passibe am 11 August 2025, 14:58:15Das sind doch einfach nur die Zeilenumbrüche aus dem raw editor lol

Es ist ein Auszug aus der fhem.cfg.
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: passibe am 11 August 2025, 15:20:34
Stimmt, wegen setuuid. Aber ändert nichts :D
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: Per am 11 August 2025, 18:55:33
Das interne DOELSE zieht nicht, weil es keinen Trigger gibt, dessen Bedienung unwahr ist. Es gibt nur einen Event Trigger und der ist immer wahr, wenn er auslöst.
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: Prof. Dr. Peter Henning am 11 August 2025, 19:47:45
Zitat von: TomLee am 11 August 2025, 15:00:22Es ist ein Auszug aus der fhem.cfg.
::)  ::) 
Leute, das ist klar - aber das muss man hier nicht posten. Wie fett müssen wir den Button "Raw definition" denn machen, damit er benutzt wird?

LG

pah

Titel: Aw: cmd_1 versus cmd_2
Beitrag von: Prof. Dr. Peter Henning am 11 August 2025, 19:50:53
Zitat von: passibe am 11 August 2025, 14:58:15Aber zur Abwechslung vielleicht mal ein Versuch, das eigentliche Problem zu lösen:
@TobiasR, cmd_2 ist der zweite Bedingungszweig

Aber ganz sicher nicht so, wie der TE es gepostet hat - nämlich als "set xyz cmd_1/2". Darum muss der TE doch bitte etwas stringenter in seinen Angaben sein, sonst weiß kein Mensch, wie er ihm helfen soll.

LG

pah
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: TomLee am 11 August 2025, 20:22:55
Einmal noch OT.

Zitat von: Prof. Dr. Peter Henning am 11 August 2025, 19:47:45
Zitat von: TomLee am 11 August 2025, 15:00:22Es ist ein Auszug aus der fhem.cfg.
::)  ::) 
Leute, das ist klar - aber das muss man hier nicht posten. Wie fett müssen wir den Button "Raw definition" denn machen, damit er benutzt wird?

LG

pah



"Raw definition" ist ein Wert einer Kombi.-/Auswahlliste der default gar nicht zu sehen ist.

"Copy for forum.fhem.de" ist nur fett, weil es ein Link ist.

Verstehe die Argumentation nicht ...
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: TobiasR am 11 August 2025, 21:16:30
Zitat von: passibe am 11 August 2025, 14:58:15
Zitat von: Prof. Dr. Peter Henning am 11 August 2025, 14:41:29Und warum stehen in der Definition die ganzen "\", das ist ziemlich unwartbar.
Das sind doch einfach nur die Zeilenumbrüche aus dem raw editor lol

Aber zur Abwechslung vielleicht mal ein Versuch, das eigentliche Problem zu lösen:

@TobiasR, cmd_2 ist der zweite Bedingungszweig (zum Begriff siehe hier (https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Struktur_und_Verhalten_des_DOIF_ohne_steuernde_Attribute)).

Weil dein DOIF nur einen DOIF-Zweig und kein DOELSE enthält, fällt es, wenn die im DOIF-Zweig angegebene Bedingung unwahr ist, in ein "internes" bzw. unsichtbares DOELSE zurück. Das ist das cmd_2, was du siehst.

Dazu aus dem Wiki (https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Angaben_im_Bedingungsteil):
ZitatEin DOIF mit nur einem Bedingungszweig enthält ein internes DOELSE, d.h. bei unwahrer Bedingung und vorhandenem Auslöser findet ein Statuswechsel auf cmd_2 statt.

Die von dir in der Klammer angegebenen Kommandos (get WebCamHof, set Telegram, set Telegram) sind cmd 1.1, 1.2 und 1.3, nicht etwa cmd_1, cmd_2 und cmd_3. Also nochmal: Bei cmd_n bezeichnet n immer den Bedingungszweig.

Im Prinzip heißt das hier einfach, dass deine Bedingung [K_Klingel:"^sensor:.closed$"] nicht wahr wird. Du triggerst also nicht auf das richtige Event. Wieso das bis jetzt funktioniert hat, keine Ahnung. Irgendwas muss sich da geändert haben. Schau nochmal im Eventmonitor, ob tatsächlich auch dieses Event von K_Klingel ankommt, wenn jemand klingelt, bzw. arbeite der Übersichtlichkeit halber vielleicht sowieso lieber einfach mit setmagic und eq statt mit regex, also: [K_Klingel:sensor] eq "closed".

Vielen Dank für deine Unterstützung. Wundert mich, ich habe das schon seit 5 Jahren so laufen.
Ich muss da noch mal einsteigen. Mit deiner Erklärung bekomme ich das jetzt aber hin
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: passibe am 11 August 2025, 21:30:36
Zitat von: Per am 11 August 2025, 18:55:33Das interne DOELSE zieht nicht, weil es keinen Trigger gibt, dessen Bedienung unwahr ist. Es gibt nur einen Event Trigger und der ist immer wahr, wenn er auslöst.
Ne, teste das mal. Das geht schon in DOELSE (oder woher sonst soll cmd_2 kommen?). Glaube das liegt daran, dass das Event mit K_Klingel: gematched wird und dann halt nur die Regex falsch ist -> zack, DOELSE.
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: Per am 12 August 2025, 08:45:47
Zeig mal bitte die Bedienung, bei der in diesem Beispiel(!) "DOELSE" zum Tragen käme, egal ob virtuell oder reell.
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: passibe am 12 August 2025, 11:32:27
Folgendes DOIF:

Internals:
   CFGFN     
   DEF        (
[test:"^sensor:.closed$"]
)
(
set test on
)
(
set test off
)
(
set test on
)


   FUUID      689b08c1-f33f-fcd4-3de4-8b609af02fa7f0e8
   MODEL      FHEM
   NAME       beispiel
   NOTIFYDEV  test,global
   NR         367
   NTFY_ORDER 50-beispiel
   STATE      cmd_2
   TYPE       DOIF
   VERSION    29460 2024-12-29 20:25:48
   eventCount 6
   READINGS:
     2025-08-12 11:27:28   Device          test
     2025-08-12 11:27:28   cmd             2
     2025-08-12 11:27:28   cmd_event       test
     2025-08-12 11:27:28   cmd_nr          2
     2025-08-12 11:27:28   e_test_events   sensor: cloosed
     2025-08-12 11:27:03   mode            enabled
     2025-08-12 11:27:28   state           cmd_2
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       test:
         0:
           &STATE     ^test$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0           ::EventDoIf('test',$hash,'^sensor:.closed$',1)
   do:
     0:
       0           set test on
       1           set test off
       2           set test on
     1:
   helper:
     NOTIFYDEV  test,global
     event      sensor: cloosed
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   test
     timerevent sensor: cloosed
     triggerDev test
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: test
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: test
       state: cmd_2
     timerevents:
       sensor: cloosed
     timereventsState:
       sensor: cloosed
     triggerEvents:
       sensor: cloosed
     triggerEventsState:
       sensor: cloosed
   internals:
   readings:
   trigger:
     all         test
   uiState:
   uiTable:
Attributes:

Wenn das ankommende Event nicht zur Regex passt (habe hier im Beispiel mit "cloosed" getriggert, statt mit "closed"), dann springt es in cmd_2. Und ich vermute, dass mit OPs DOIF genau das passiert ist, dass Event und Regex nicht zu einander passen.

Oder verstehen wir uns falsch?
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: Per am 12 August 2025, 13:15:31
Jein. Wenn es nicht passt, wird gar nicht getriggert. Also auch nicht nach DOELSE weitergereicht.
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: passibe am 12 August 2025, 14:53:57
Schau doch mein list an. Was glaubst du, wie da sonst cmd_2 hingekommen ist, wenn nicht dadurch, dass es einen Trigger gab? Oder wenn du mir nicht glaubst, erstell einen dummy test, kopier die DEF aus meine list und teste es mit trigger test sensor: cloosed.
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: RalfRog am 12 August 2025, 16:00:02
Ist es nicht so, dass der Ausdruck [test:"^sensor:.closed$"] gleichzeitig für den Trigger sorgt und die RegEx darin für den Match (cmd_1) oder Nichtmatch (cmd_2)?

Titel: Aw: cmd_1 versus cmd_2
Beitrag von: Damian am 12 August 2025, 16:05:00
Um es klarzustellen:

Bei Ereignisangaben der Art
DOIF (["^mydevice:^myreading bla"]) bei denen das Device durch eine Regex angegeben wird, gibt es keinen DOELSE-Fall, weil sonst alle anderen Events des Systems zu einem DOELSE-Fall führen würden.

Bei Angaben, bei denen das Device eindeutig angeben wird (nicht in Anführungszeichen), gibt es einen DOELSE-Fall, falls ein Event von dem angegeben Device kommt, aber der Rest der Abfrage nicht erfüllt ist.

z. B. bei Zustandsabfragen
DOIF ([mydevice:myreading] eq "bla")
bei setreading mydevice myreading bla2 weil das Reading einen anderen Inhalt hat

oder bei reinen Ereignistriggern z. B.
DOIF ([mydevice:"^myreading bla"])
bei setreading mydevice test bla
weil das Reading im Event nicht passt
Titel: Aw: cmd_1 versus cmd_2
Beitrag von: Per am 12 August 2025, 16:54:36
Danke für die Klarstellung. Lag ich wohl "knapp daneben".