Autor Thema: [Gelöst] set_State scheint kein Event auszulösen  (Gelesen 618 mal)

Offline Reinhard.M

  • Full Member
  • ***
  • Beiträge: 311
[Gelöst] set_State scheint kein Event auszulösen
« 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
« Letzte Änderung: 24 Oktober 2022, 23:04:56 von Reinhard.M »

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10125
Antw:set_State scheint kein Event auszulösen
« Antwort #1 am: 24 Oktober 2022, 09:39:31 »
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

Offline Reinhard.M

  • Full Member
  • ***
  • Beiträge: 311
Antw:set_State scheint kein Event auszulösen
« Antwort #2 am: 24 Oktober 2022, 20:13:36 »
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

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10125
Antw:set_State scheint kein Event auszulösen
« Antwort #3 am: 24 Oktober 2022, 20:41:26 »
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:

Zitat
2022-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

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10125
Antw:set_State scheint kein Event auszulösen
« Antwort #4 am: 24 Oktober 2022, 21:53:23 »
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.
« Letzte Änderung: 24 Oktober 2022, 21:55:32 von Damian »
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline Reinhard.M

  • Full Member
  • ***
  • Beiträge: 311
Antw:set_State scheint kein Event auszulösen
« Antwort #5 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

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10125
Antw:set_State scheint kein Event auszulösen
« Antwort #6 am: 24 Oktober 2022, 23:02:01 »
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

 

decade-submarginal