[Gelöst] set_State scheint kein Event auszulösen

Begonnen von Reinhard.M, 23 Oktober 2022, 23:23:09

Vorheriges Thema - Nächstes Thema

Reinhard.M

Hallo Zusammen!
Ich möchte in einem DOIF "A" das Ergebnis eines DOIF "B" auswerten. Dafür setze ich im Device "B" mit set_State den DOIF state. Im DOIF "A" möchte ich jetzt einen Trigger via [B:state] auslösen und den Wert von B:state prüfen. Der Trigger kommt aber nicht. [B:STATE] löst zwar einen Trigger aus, liefert aber den alten B:state Wert. Das Problem habe ich nur mit DOIF Devices, alle anderen lassen sich problemlos auswerten. Habe ich da etwas falsch verstanden oder läuft etwas im DOIF schief?

Gruß Reinhard

Damian

Zitat von: Reinhard.M am 23 Oktober 2022, 23:23:09
Hallo Zusammen!
Ich möchte in einem DOIF "A" das Ergebnis eines DOIF "B" auswerten. Dafür setze ich im Device "B" mit set_State den DOIF state. Im DOIF "A" möchte ich jetzt einen Trigger via [B:state] auslösen und den Wert von B:state prüfen. Der Trigger kommt aber nicht. [B:STATE] löst zwar einen Trigger aus, liefert aber den alten B:state Wert. Das Problem habe ich nur mit DOIF Devices, alle anderen lassen sich problemlos auswerten. Habe ich da etwas falsch verstanden oder läuft etwas im DOIF schief?

Gruß Reinhard

Dann musst du deine Definitionen posten. [B:STATE] gibt es so nicht, entweder [ B ] (hier wird auf alles getriggert) oder [B:state]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Reinhard.M

Hallo Damian,
hatte ich blöd geschrieben, sorry. Meinte natürlich \[B\]. Hier mal der zitierte Testcase:

defmod A DOIF action\
{\
  my $state = [B:state];;\
  set_Event("---------------------> B = $state/".[?B]);;\
  set_State("$state");;\
}
attr A room Test



defmod B DOIF action\
{\
  my $state = [$SELF:Trigger];;\
  set_State("$state");;\
}
attr B devStateIcon on::Trigger+off off::Trigger+on
attr B readingList Trigger
attr B room Test
attr B setList Trigger:on,off


Ich habe das set_Event eingefügt um besser Debuggen zu können. In dieser Konstellation (mit [?B]) reagiert bei mir A nicht einmal obwohl das Reading state bei B den Status korrekt wiedergibt. Wenn ich aus [?B] das ? entferne reagiert A zwar, zeigt aber immer den vorherigen B-state an. Ich hoffe, du kannst es nachstellen.

Gruß Reinhard

Damian

Das Problem scheint mit den setList readingList FHEM-Mechanismen zusammen zu hängen.

mit
defmod B DOIF action\
{\
  ## my $state = [$SELF:Trigger];;\
  ##set_State("$state");;\
  set_State("off");;\
}
attr B room Test


und set B action wird dagegen A korrekt getriggert:

Zitat2022-10-24 20:32:50.309 DOIF A ---------------------> B = off/off
2022-10-24 20:32:50.328 DOIF A off
2022-10-24 20:32:50.340 DOIF B off

Warum FHEM die Events in umgekehrter Reihenfolge loggt, weiß ich nicht. B ist auf jeden Fall der Auslöser für A gewesen.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#4
Ich denke, hier wurde ein "Loop" erfolgreich unterbunden, denn:

Mit set B trigger wird ein Event von B erzeugt auf welches B selbst reagiert, um dann wieder mit set_State selbst ein Event zu erzeugen - spätestens jetzt unterbindet FHEM solche Zirkel um mögliche Endlos-Loops zu verhindern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Reinhard.M

Ok, kann ich mehr oder weniger bestätigen.
Allerdings scheint es nicht die set/readingList zu sein sondern ausschließlich das ich das DOIF selber schalte. Wenn ich im B-Device auf einen Dummy-Switch trigger funktioniert es wie gewünscht. Ich trigger auf das Reading des Dummy-Switches im B-Device und setze mit dem Reading den state des B-Device. Das löst dann auch im A-Device die entsprechende Reaktion aus. Alles wie gewünscht. Ich kann auch das DOIF direkt zum Schalten verwenden. Dann darf ich aber nicht den state verwenden sondern muss ein explizites Reading aufsetzen. Dann funktioniert es auch direkt im DOIF wie gewünscht.
Noch eine Beobachtung: Wenn ich das gerade genannte Reading mit gassistant share habe ich wieder das gleiche Verhalten wie mit state, also keine Reaktion im A-Device. Alles etwas spooky  :D

Damian

Zitat von: Reinhard.M am 24 Oktober 2022, 21:54:52
Ok, kann ich mehr oder weniger bestätigen.
Allerdings scheint es nicht die set/readingList zu sein sondern ausschließlich das ich das DOIF selber schalte. Wenn ich im B-Device auf einen Dummy-Switch trigger funktioniert es wie gewünscht. Ich trigger auf das Reading des Dummy-Switches im B-Device und setze mit dem Reading den state des B-Device. Das löst dann auch im A-Device die entsprechende Reaktion aus. Alles wie gewünscht. Ich kann auch das DOIF direkt zum Schalten verwenden. Dann darf ich aber nicht den state verwenden sondern muss ein explizites Reading aufsetzen. Dann funktioniert es auch direkt im DOIF wie gewünscht.
Noch eine Beobachtung: Wenn ich das gerade genannte Reading mit gassistant share habe ich wieder das gleiche Verhalten wie mit state, also keine Reaktion im A-Device. Alles etwas spooky  :D

Naja, mit set/readingList hast du ja bereits einen Trigger mit B erzeugt, wenn du es mit einem dummy machst, kommt der Trigger dagegen von außen, daher funktioniert das.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF