checkReadingEvent - was mache ich falsch?

Begonnen von der_oBi, 20 Oktober 2018, 23:11:53

Vorheriges Thema - Nächstes Thema

der_oBi

Moin zusammen,

ich verzweifel grade an einem echt simplen DOIF. Ich versuche auf die Änderung eines Readings zu triggern (genauer ein Reading in einem dummy das nichts anderes als ein Hilfs-Flag darstellt). Leider wird mein DOIF auch bei jedem anderen Event dieses Dummys getriggert obwohl ich checkReadingEvent 1 habe (ist ja mittlerweile auch Standard).

Wo ist mein Fehler? Findet ihn jemand von Euch?

Hier mal ein list von meinem DOIF:


Internals:
   CFGFN     
   DEF        ( [f_rollo_nacht] == 1 )
( set Rollo_EG_Bad off )
DOELSEIF
( [f_rollo_nacht] == 0 and [f_beschattung:nord] == 1 and [rollo_settings_beschattung:status] eq "aktiv" )
( {fhem "set Rollo_EG_Bad dim ".ReadingsVal('Rollo_EG_Bad','dim_Schatten',0)} )
DOELSE
( set Rollo_EG_Bad on )
   MODEL      FHEM
   NAME       di_Rollo_EG_Bad
   NR         230
   NTFY_ORDER 50-di_Rollo_EG_Bad
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-10-20 23:03:55   cmd             0
     2018-10-20 23:03:55   mode            enabled
     2018-10-20 23:03:55   state           initialized
   Regex:
   attr:
     cmdState:
       0:
         Nacht
       1:
         Beschattung
       2:
         Tag
     wait:
     waitdel:
   condition:
     0           ::InternalDoIf($hash,'f_rollo_nacht','STATE') == 1
     1           ::InternalDoIf($hash,'f_rollo_nacht','STATE') == 0 and ::ReadingValDoIf($hash,'f_beschattung','nord') == 1 and ::ReadingValDoIf($hash,'rollo_settings_beschattung','status') eq "aktiv"
   devices:
     0           f_rollo_nacht
     1           f_rollo_nacht f_beschattung rollo_settings_beschattung
     all         f_rollo_nacht f_beschattung rollo_settings_beschattung
   do:
     0:
       0           set Rollo_EG_Bad off
     1:
       0           {fhem "set Rollo_EG_Bad dim ".ReadingsVal('Rollo_EG_Bad','dim_Schatten',0)}
     2:
       0           set Rollo_EG_Bad on
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
     0           f_rollo_nacht:STATE
     1           f_rollo_nacht:STATE
     all         f_rollo_nacht:STATE
   itimer:
   readings:
     1           f_beschattung:nord rollo_settings_beschattung:status
     all         f_beschattung:nord rollo_settings_beschattung:status
   uiState:
   uiTable:
Attributes:
   checkReadingEvent 1
   checkall   all
   cmdState   Nacht|Beschattung|Tag
   devStateIcon Nacht:weather_moon_phases_8 Beschattung:weather_summer Tag:weather_sun
   event-on-change-reading state
   room       Rollos


Ich wäre über eine zündende Idee echt mehr als dankbar!

Grüße
der_oBi

Damian

Du musst auf das Reading state triggern:

( [f_rollo_nacht:state] == 1 )
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der_oBi

Hi!

Sorry, ich hatte vergessen zu erwähnen, dass [f_beschattung:nord] mein Problem darstellt. Es wird leider bei jeder Reading-Änderung von f_beschattung getriggert, nicht nur wenn das Reading nord ein Event erzeugt.

f_rollo_nacht hingegen macht keine Probleme (ist ebenfalls ein Dummy, hat aber keinerlei Readings :-))

Oder kann das dennoch mein Problem sein?

Ellert

Laut Deinem Listing hat das DOIF noch nie getriggert.

Kannst Du diesen Fall
ZitatEs wird leider bei jeder Reading-Änderung von f_beschattung getriggert
durch Events dokumentieren und posten.


der_oBi

Mein Fehler...In dem list ist nichts davon zu sehen, da ich gestern abend wieder gefühlt 1000mal redefined habe in der Hoffnung, eine Lösung zu finden.

Hier mal alle Events zum Zeitpunkt der letzten Triggerung:


2018-10-21 14:49:58 VCONTROL300 Vitotronic200 UpdateStatus: Inactive
2018-10-21 14:50:00 dummy f_beschattung Winkel_dach_ost: 30.4338878953486
2018-10-21 14:50:00 dummy f_beschattung Winkel_dach_west: 11.6625443362512
2018-10-21 14:50:00 dummy f_beschattung Winkel_nord: -59.527294145007
2018-10-21 14:50:00 dummy f_beschattung Winkel_ost: 15.4186077290514
2018-10-21 14:50:00 dummy f_beschattung Winkel_sued: 59.5751261995288
2018-10-21 14:50:00 dummy f_beschattung Winkel_west: -15.3369866407196
2018-10-21 14:50:00 at at_Rollo_Beschattung_setzen Next: 15:00:00
2018-10-21 14:50:00 dummy WW_tempgradient 2.09999999999998
2018-10-21 14:50:00 dummy WW_tempgradient alt: 50.8
2018-10-21 14:50:00 at at_wwtempgradient Next: 15:00:00
2018-10-21 14:50:00 at at_watchdog Next: 14:51:00
2018-10-21 14:50:05 SONOS Sonos LastProcessAnswer: 1540126205.85842


Und hier das List dazu (dieses Mal mit Triggerung ;-))
Internals:
   CFGFN     
   DEF        ( [f_rollo_nacht] == 1 )
( set Rollo_EG_Bad off )
DOELSEIF
( [f_rollo_nacht] == 0 and [f_beschattung:nord] == 1 and [rollo_settings_beschattung:status] eq "aktiv" )
( {fhem "set Rollo_EG_Bad dim ".ReadingsVal('Rollo_EG_Bad','dim_Schatten',0)} )
DOELSE
( set Rollo_EG_Bad on )
   MODEL      FHEM
   NAME       di_Rollo_EG_Bad
   NR         230
   NTFY_ORDER 50-di_Rollo_EG_Bad
   STATE      Tag
   TYPE       DOIF
   READINGS:
     2018-10-21 14:50:00   Device          f_beschattung
     2018-10-21 07:30:00   cmd             3
     2018-10-21 07:30:00   cmd_event       f_rollo_nacht
     2018-10-21 07:30:00   cmd_nr          3
     2018-10-21 07:30:00   e_f_rollo_nacht_STATE 0
     2018-10-20 23:03:55   mode            enabled
     2018-10-21 07:30:00   state           Tag
   Regex:
   attr:
     cmdState:
       0:
         Nacht
       1:
         Beschattung
       2:
         Tag
     wait:
     waitdel:
   condition:
     0           ::InternalDoIf($hash,'f_rollo_nacht','STATE') == 1
     1           ::InternalDoIf($hash,'f_rollo_nacht','STATE') == 0 and ::ReadingValDoIf($hash,'f_beschattung','nord') == 1 and ::ReadingValDoIf($hash,'rollo_settings_beschattung','status') eq "aktiv"
   devices:
     0           f_rollo_nacht
     1           f_rollo_nacht f_beschattung rollo_settings_beschattung
     all         f_rollo_nacht f_beschattung rollo_settings_beschattung
   do:
     0:
       0           set Rollo_EG_Bad off
     1:
       0           {fhem "set Rollo_EG_Bad dim ".ReadingsVal('Rollo_EG_Bad','dim_Schatten',0)}
     2:
       0           set Rollo_EG_Bad on
   helper:
     event      Winkel_west: -15.3369866407196
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   f_beschattung
     timerevent Winkel_west: -15.3369866407196
     triggerDev f_beschattung
     DOIF_eventas:
       cmd_nr: 3
       cmd: 3
       cmd_event: f_rollo_nacht
       state: Tag
     timerevents:
       Winkel_west: -15.3369866407196
     timereventsState:
       Winkel_west: -15.3369866407196
     triggerEvents:
       Winkel_west: -15.3369866407196
     triggerEventsState:
       Winkel_west: -15.3369866407196
   internals:
     0           f_rollo_nacht:STATE
     1           f_rollo_nacht:STATE
     all         f_rollo_nacht:STATE
   itimer:
   readings:
     1           f_beschattung:nord rollo_settings_beschattung:status
     all         f_beschattung:nord rollo_settings_beschattung:status
   trigger:
   uiState:
   uiTable:
Attributes:
   checkReadingEvent 1
   checkall   all
   cmdState   Nacht|Beschattung|Tag
   devStateIcon Nacht:weather_moon_phases_8 Beschattung:weather_summer Tag:weather_sun
   event-on-change-reading state
   room       Rollos

Damian

Das passt schon:

2018-10-21 14:50:00 dummy f_beschattung Winkel_nord: -59.527294145007

2018-10-21 14:50:00   Device          f_beschattung

Der letzte Schaltvorgang auf cmd_3 war durch:

2018-10-21 07:30:00   cmd_event       f_rollo_nacht


Funktioniert wie programmiert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Übrigens, falls Du mit einer aktuellen DOIF-Version arbeitest, ist checkReadingEvent auf 1 voreingestellt, Du musst es nur setzen, wenn Du die Voreinstellung nicht möchtest und dann auf 0.

der_oBi

Zitat von: Ellert am 21 Oktober 2018, 17:58:56
Übrigens, falls Du mit einer aktuellen DOIF-Version arbeitest, ist checkReadingEvent auf 1 voreingestellt, Du musst es nur setzen, wenn Du die Voreinstellung nicht möchtest und dann auf 0.

Ja, weiß ich ja. Die DOIFs sind schon etwas älter, da war default noch "0".

Zitat von: Damian am 21 Oktober 2018, 15:12:30
Der letzte Schaltvorgang auf cmd_3 war durch:

Das stimmt ja auch soweit. Jetzt kommt das aber:
Alle 10 Minuten wird das DOIF wieder durchlaufen, weil andere  Readings von f_beschattung aktualisiert werden. Wenn ich in der Zwischenzeit etwas manuell per Schalter übersteuert habe, funkt mir das DOIF (ungewollt) wieder dazwischen.
Z.B. wenn ich in den Bedingungen von cmd_1 und cmd_2 einen Fensterkontakt prüfen lasse (nicht triggern, nur prüfen).
Es wird z.B. Nacht, Fenster ist zu, DOIF geht nach cmd_1. Alles super.
Danach mache ich das Fenster auf (da ich nur prüfe, sollte nichts passieren). Maximal 10 Minuten später wird das DOIF wieder durchlaufen, cmd_1 wird nicht mehr erfüllt und cmd_3 (ELSE) greift. Schon sind die Rollos wieder oben. Sehr unpraktisch ;-)

Wie aber kann es überhaupt sein, dass das hier zu einem Triggern führt, obwohl das checkReadingEvent gesetzt ist und nirgendwo von Winkel_west die Rede ist? Ich raffs echt nicht...
[code]     timerevents:
       Winkel_west: -15.3369866407196
     timereventsState:
       Winkel_west: -15.3369866407196
     triggerEvents:
       Winkel_west: -15.3369866407196
     triggerEventsState:
       Winkel_west: -15.3369866407196
[/code]

Ellert

Letztlich kannst Du Dir die Fragen nur beantworten, wenn Du das Verhalten durch Aufzeichnung der Events dokumentierst und analysierst welche Events das DOIF tatsächlich schalten lassen.

ZitatAlle 10 Minuten wird das DOIF wieder durchlaufen, weil andere  Readings von f_beschattung aktualisiert werden. Wenn ich in der Zwischenzeit etwas manuell per Schalter übersteuert habe, funkt mir das DOIF (ungewollt) wieder dazwischen.
Z.B. wenn ich in den Bedingungen von cmd_1 und cmd_2 einen Fensterkontakt prüfen lasse (nicht triggern, nur prüfen).
Es wird z.B. Nacht, Fenster ist zu, DOIF geht nach cmd_1. Alles super.
Danach mache ich das Fenster auf (da ich nur prüfe, sollte nichts passieren). Maximal 10 Minuten später wird das DOIF wieder durchlaufen, cmd_1 wird nicht mehr erfüllt und cmd_3 (ELSE) greift. Schon sind die Rollos wieder oben. Sehr unpraktisch ;-)
Dafür hast Du doch extra checkall gesetzt.

der_oBi

Zitat von: Ellert am 21 Oktober 2018, 19:42:31
Dafür hast Du doch extra checkall gesetzt.
Da hast Du natürlich recht. Ich hatte das damals wegen irgendeinem Szenario gesetzt, ich weiß nur grade nicht mehr wieso. Wenn ich das lösche, sollte es erstmal funktionieren (glaube ich).

Nichts desto trotz hätte ich gerne verstanden, wieso checkReadingEvent nicht so funktioniert wie ich es erwarten würde.

Zitat von: Ellert am 21 Oktober 2018, 19:42:31
Letztlich kannst Du Dir die Fragen nur beantworten, wenn Du das Verhalten durch Aufzeichnung der Events dokumentierst und analysierst welche Events das DOIF tatsächlich schalten lassen.
Das hab ich doch getan. Offensichtlich triggert jede Aktualisierung von f_beschattung mein DOIF.
Im List und Event-Auszug von oben sehe ich doch, dass f_beschattung:Winkel_west das letzte Event war. Wenn ich das Event-Log anschaue, wurde das DOIF wahrscheinlich sogar 6x nacheinander getriggert:
2018-10-21 14:50:00 dummy f_beschattung Winkel_dach_ost: 30.4338878953486
2018-10-21 14:50:00 dummy f_beschattung Winkel_dach_west: 11.6625443362512
2018-10-21 14:50:00 dummy f_beschattung Winkel_nord: -59.527294145007
2018-10-21 14:50:00 dummy f_beschattung Winkel_ost: 15.4186077290514
2018-10-21 14:50:00 dummy f_beschattung Winkel_sued: 59.5751261995288
2018-10-21 14:50:00 dummy f_beschattung Winkel_west: -15.3369866407196


Ob dann was geschaltet wird, hängt natürlich von den Bedingungen ab. Dennoch wird es momentan alle 10 Minuten getriggert.

Ich frage mich halt, ob hier ein Bug begraben liegt, oder ob ich schlicht zu blöd bin.

Damian

Bisher fehlt mir hier der Nachweis, dass DOIF sich nicht korrekt verhalten sollte.

Alles, was ich bisher gesehen habe, lässt keine Aussage zum Fehlverhalten zu.

Du musst ein list vom DOIF vom vermeintlichen Zustand posten, mit den dazugehörigen Events aus dem Eventmonitor.

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

der_oBi

Hier das Szenario wie im letzten Post beschrieben: Fenster wurde geöffnet während eigentlich cmd_1 (Nacht) anliegt. Beim nächsten Durchlauf wird das Rollo leider hochgefahren, da das ELSE greift. Wenn nicht fälschlicherweise auf f_beschattung:Winkel_west getriggert würde, wäre mein Rollo geschlossen geblieben :-)

Event-Monitor:
2018-10-22 07:09:58 VCONTROL300 Vitotronic200 UpdateStatus: Inactive
2018-10-22 07:10:00 structure struct_Rollos_EG undefined
2018-10-22 07:10:00 ZWave Rollo_EG_Balkontuer on
2018-10-22 07:10:00 DOIF di_Rollo_EG_Balkon Tag
2018-10-22 07:10:00 dummy f_beschattung Winkel_dach_ost: 18.0096511383823
2018-10-22 07:10:00 dummy f_beschattung Winkel_dach_west: -37.575217471601
2018-10-22 07:10:00 dummy f_beschattung Winkel_nord: 34.9340463712588
2018-10-22 07:10:00 dummy f_beschattung Winkel_ost: 53.1306292848995
2018-10-22 07:10:00 dummy f_beschattung Winkel_sued: -34.8450523207303
2018-10-22 07:10:00 dummy f_beschattung Winkel_west: -53.2175657361181
2018-10-22 07:10:00 at at_Rollo_Beschattung_setzen Next: 07:20:00
2018-10-22 07:10:00 dummy WW_tempgradient 4.5
2018-10-22 07:10:00 dummy WW_tempgradient alt: 54
2018-10-22 07:10:00 at at_wwtempgradient Next: 07:20:00
2018-10-22 07:10:00 at at_watchdog Next: 07:11:00
2018-10-22 07:10:00 TRX_LIGHT Leuchte_Kz light: on
2018-10-22 07:10:00 TRX_LIGHT Leuchte_Kz on
2018-10-22 07:10:04 ZWave SD_Trockner power: 1.3 W


List DOIF:
Internals:
   CFGFN     
   DEF        ( [f_rollo_nacht:state] == 1 and [?Fensterkontakt_EG_Balkon] eq "closed")
( set Rollo_EG_Balkontuer off; set Rollo_EG_Balkonfenster off )
DOELSEIF
( [f_rollo_nacht:state] == 0 and [f_beschattung:sued] == 2  and [rollo_settings_beschattung:status] eq "aktiv"  and [?Fensterkontakt_EG_Balkon] eq "closed")
( {fhem "set Rollo_EG_Balkontuer dim ".ReadingsVal('Rollo_EG_Balkontuer','dim_Schatten',0);
fhem "set Rollo_EG_Balkonfenster dim ".ReadingsVal('Rollo_EG_Balkonfenster','dim_Schatten',0)} )
DOELSE
( set Rollo_EG_Balkontuer on; set Rollo_EG_Balkontuer on )
   MODEL      FHEM
   NAME       di_Rollo_EG_Balkon
   NR         231
   NTFY_ORDER 50-di_Rollo_EG_Balkon
   STATE      Tag
   TYPE       DOIF
   READINGS:
     2018-10-22 07:10:00   Device          f_beschattung
     2018-10-22 07:10:00   cmd             3
     2018-10-22 07:10:00   cmd_event       f_beschattung
     2018-10-22 07:10:00   cmd_nr          3
     2018-10-22 07:06:13   mode            enabled
     2018-10-22 07:10:00   state           Tag
   Regex:
   attr:
     cmdState:
       0:
         Nacht
       1:
         Beschattung
       2:
         Tag
     wait:
     waitdel:
   condition:
     0           ::ReadingValDoIf($hash,'f_rollo_nacht','state') == 1 and ::InternalDoIf($hash,'Fensterkontakt_EG_Balkon','STATE') eq "closed"
     1           ::ReadingValDoIf($hash,'f_rollo_nacht','state') == 0 and ::ReadingValDoIf($hash,'f_beschattung','sued') == 2  and ::ReadingValDoIf($hash,'rollo_settings_beschattung','status') eq "aktiv"  and ::InternalDoIf($hash,'Fensterkontakt_EG_Balkon','STATE') eq "closed"
   devices:
     0           f_rollo_nacht
     1           f_rollo_nacht f_beschattung rollo_settings_beschattung
     all         f_rollo_nacht f_beschattung rollo_settings_beschattung
   do:
     0:
       0           set Rollo_EG_Balkontuer off; set Rollo_EG_Balkonfenster off
     1:
       0           {fhem "set Rollo_EG_Balkontuer dim ".ReadingsVal('Rollo_EG_Balkontuer','dim_Schatten',0); fhem "set Rollo_EG_Balkonfenster dim ".ReadingsVal('Rollo_EG_Balkonfenster','dim_Schatten',0)}
     2:
       0           set Rollo_EG_Balkontuer on; set Rollo_EG_Balkontuer on
   helper:
     event      Winkel_west: -53.2175657361181
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   f_beschattung
     timerevent Winkel_west: -53.2175657361181
     triggerDev f_beschattung
     DOIF_eventas:
       cmd_nr: 3
       cmd: 3
       cmd_event: f_beschattung
       state: Tag
     timerevents:
       Winkel_west: -53.2175657361181
     timereventsState:
       Winkel_west: -53.2175657361181
     triggerEvents:
       Winkel_west: -53.2175657361181
     triggerEventsState:
       Winkel_west: -53.2175657361181
   internals:
     0           Fensterkontakt_EG_Balkon:STATE
     1           Fensterkontakt_EG_Balkon:STATE
     all         Fensterkontakt_EG_Balkon:STATE
   itimer:
   readings:
     0           f_rollo_nacht:state
     1           f_rollo_nacht:state f_beschattung:sued rollo_settings_beschattung:status
     all         f_rollo_nacht:state f_beschattung:sued rollo_settings_beschattung:status
   trigger:
   uiState:
   uiTable:
Attributes:
   checkReadingEvent 1
   checkall   all
   cmdState   Nacht|Beschattung|Tag
   devStateIcon Nacht:weather_moon_phases_8 Beschattung:weather_summer Tag:weather_sun
   event-on-change-reading state
   room       Rollos


Ich vermute mal stark, dass der Befehl zum Öffnen (cmd_3) sogar 6 mal gesendet werden würde, wenn ich do always setze (wegen der 6 aktualisierten Readings von f_beschattung).

Damian

Auch hier funktioniert alles korrekt:

f_beschattung:sued  kommt im zweiten Zeig vor. Es sendete ein Event um 7:10. Mit -34.8450523207303 ist es nicht 2 und damit bleibt nur noch DOELSE, welches auf cmd_3 schaltet.



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

der_oBi

f_beschattung:sued kommt in der Bedingung vor.
f_beschattung:Winkel_sued erzeugt aber ein Event.

Und in dem List wird doch Winkel_west als letzter Trigger aufgeführt ( da das als letztes aktualisiert wird)

Damian

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