DOIF beachtet scheinbar event-on-change-reading nicht

Begonnen von Michael Schmidt, 11 Juni 2017, 15:21:47

Vorheriges Thema - Nächstes Thema

Michael Schmidt

Ich weiß jedoch nicht ob es an DOIF oder KNX liegt.

Ich habe meine Lüftungsanlage angelegt mit ein paar Readings (KNX Adressen) das KNX Modul von Wolf sendet scheinbar in unregelmäßigen abständen, wenn jedoch gleich alle Daten auf einmal.

hier mal das listing
Internals:
   DEF        3/7/3:dpt5:programm 3/7/7:dpt1:intensivlueftung 3/7/8:dpt9:temp_frischluft 3/7/9:dpt9:temp_abluft 3/7/10:dpt13:vol_frischluft 3/7/11:dpt13:vol_abluft 3/7/12:dpt1:bypass_offen 3/7/13:dpt1:bypass_geschlossen
   DEVNAME    kwl_wolf_cwl400
   IODev      KNX
   KNX_MSGCNT 30
   KNX_RAWMSG C01107w0370b00189110
   KNX_TIME   2017-06-11 14:51:28
   LASTInputDev KNX
   MSGCNT     30
   NAME       kwl_wolf_cwl400
   NR         42
   NTFY_ORDER 50-kwl_wolf_cwl400
   STATE      1610000
   TYPE       KNX
   Gaddr:
     1          3/7/3
     2          3/7/7
     3          3/7/8
     4          3/7/9
     5          3/7/10
     6          3/7/11
     7          3/7/12
     8          3/7/13
   Gcode:
     1          03703
     2          03707
     3          03708
     4          03709
     5          0370a
     6          0370b
     7          0370c
     8          0370d
   Model:
     1          dpt5
     2          dpt1
     3          dpt9
     4          dpt9
     5          dpt13
     6          dpt13
     7          dpt1
     8          dpt1
   Readings:
     2017-06-11 14:30:40   bypass_geschlossen-get on
     2017-06-11 14:30:40   bypass_offen-get off
     2017-06-11 14:30:36   intensivlueftung-get off
     2017-06-11 14:21:47   intensivlueftung-set off
     2017-06-11 14:51:28   last-sender     1/1/7
     2017-06-11 14:30:35   programm-get    1
     2017-06-11 14:23:16   programm-set    1
     2017-06-11 14:51:28   state           1610000
     2017-06-11 14:30:39   temp_abluft-get 24.30
     2017-06-11 14:41:41   temp_frischluft-get 26.70
     2017-06-11 14:51:28   vol_abluft-get  1610000
     2017-06-11 14:30:40   vol_frischluft-get 1590000
   Readingsname:
     1          programm
     2          intensivlueftung
     3          temp_frischluft
     4          temp_abluft
     5          vol_frischluft
     6          vol_abluft
     7          bypass_offen
     8          bypass_geschlossen
Attributes:
   IODev      KNX
   event-on-change-reading .*
   eventMap   /value 1 g1:160m3/value 3 g1:100m3/on g2:intensiv an/off g2:intensiv aus
   group      Lueftung
   room       1 Zentral
   webCmd     100m3:160m3:intensiv an:intensiv aus


leider erzeugt trotz gesetztem event-on-Change-reading.* das objekt trigger für die Readings

und das doif löst dann natürlich immer cmd_1 aus.

hier mal das doif
Internals:
   DEF        ([kwl_wolf_cwl400:temp_frischluft-get])(set alle_rtr_s2 string [kwl_wolf_cwl400:temp_frischluft-get]/ g1)
DOELSEIF ([kwl_wolf_cwl400:temp_abluft-get])(set alle_rtr_s2 string [kwl_wolf_cwl400:temp_abluft-get] g4)
DOELSEIF ([kwl_wolf_cwl400:vol_frischluft-get])(set alle_rtr_s2 string {([kwl_wolf_cwl400:vol_frischluft-get])/10000}/ g2)
DOELSEIF ([kwl_wolf_cwl400:vol_abluft-get])(set alle_rtr_s2 string {([kwl_wolf_cwl400:vol_abluft-get])/10000} g5)
   NAME       doif_kwl_frischluft_temp
   NR         44
   NTFY_ORDER 50-doif_kwl_frischluft_temp
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2017-06-11 14:51:28   Device          kwl_wolf_cwl400
     2017-06-11 14:51:28   cmd             1
     2017-06-11 14:51:28   cmd_event       kwl_wolf_cwl400
     2017-06-11 14:51:28   cmd_nr          1
     2017-06-11 14:51:28   e_kwl_wolf_cwl400_temp_abluft-get 24.30
     2017-06-11 14:51:28   e_kwl_wolf_cwl400_temp_frischluft-get 26.70
     2017-06-11 14:51:28   e_kwl_wolf_cwl400_vol_abluft-get 1610000
     2017-06-11 14:51:28   e_kwl_wolf_cwl400_vol_frischluft-get 1590000
     2017-06-11 14:51:28   state           cmd_1
   Condition:
     0          ReadingValDoIf($hash,'kwl_wolf_cwl400','temp_frischluft-get')
     1          ReadingValDoIf($hash,'kwl_wolf_cwl400','temp_abluft-get')
     2          ReadingValDoIf($hash,'kwl_wolf_cwl400','vol_frischluft-get')
     3          ReadingValDoIf($hash,'kwl_wolf_cwl400','vol_abluft-get')
   Devices:
     0           kwl_wolf_cwl400
     1           kwl_wolf_cwl400
     2           kwl_wolf_cwl400
     3           kwl_wolf_cwl400
     all         kwl_wolf_cwl400
   Do:
     0:
       0          set alle_rtr_s2 string [kwl_wolf_cwl400:temp_frischluft-get]/ g1
     1:
       0          set alle_rtr_s2 string [kwl_wolf_cwl400:temp_abluft-get] g4
     2:
       0          set alle_rtr_s2 string {([kwl_wolf_cwl400:vol_frischluft-get])/10000}/ g2
     3:
       0          set alle_rtr_s2 string {([kwl_wolf_cwl400:vol_abluft-get])/10000} g5
     4:
   Helper:
     event      vol_abluft-get: 1610000,1610000
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   kwl_wolf_cwl400
     timerevent vol_abluft-get: 1610000,1610000
     triggerDev kwl_wolf_cwl400
     timerevents:
       vol_abluft-get: 1610000
       1610000
     timereventsState:
       vol_abluft-get: 1610000
       state: 1610000
     triggerEvents:
       vol_abluft-get: 1610000
       1610000
     triggerEventsState:
       vol_abluft-get: 1610000
       state: 1610000
   Internals:
   Itimer:
   Readings:
     0           kwl_wolf_cwl400:temp_frischluft-get
     1           kwl_wolf_cwl400:temp_abluft-get
     2           kwl_wolf_cwl400:vol_frischluft-get
     3           kwl_wolf_cwl400:vol_abluft-get
     all         kwl_wolf_cwl400:temp_frischluft-get kwl_wolf_cwl400:temp_abluft-get kwl_wolf_cwl400:vol_frischluft-get kwl_wolf_cwl400:vol_abluft-get
   Regexp:
     0:
     All:
   State:
     State:
   Trigger:
Attributes:
   do         always
   group      Lueftung
   room       1 Zentral


zu erkennen ist das alle Reading im DOIF den Timestamp 2017-06-11 14:51:28 haben
jedoch nur das Reading vol_abluft-get  um 14:51:28 im objekt geupdatet wurde.

Puh das ist sogar kompliziert zu erklären :)

LG


Otto123

#1
Hi,

ganz unabhängig vom DOIF kannst Du klären ob dein kwl_wolf_cwl400 Events generiert oder nicht, quasi Dein event-on-change-reading überprüfen -> Eventmonitor.

Dein DOIF triggert nach meiner Meinung nicht auf den Event sondern auf die Zustandsänderung, ich habe keine Ahnung an welcher Stelle sich da DOIF einklinkt und eventuell doch getriggert wird obwohl nur der Zustand neu geschrieben wird und gar kein Event erzeugt wird. Aber das ist nur graue Theorie von mir und als Randbemerkung zu verstehen.
Du hast do always gesetzt, meines Erachtens brauchst Du das nicht, da Du ja mehrere Alterativen Zweige hast und Du eh bloß etwas auslösen willst wenn sich der Zustand ändert. Eventuell ist aber in den DOELSEIF Zweigen nicht alles berücksichtigt und Du musst noch einen DOELSE vorsehen.

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

CoolTux

Als erstes bitte einmal das do always weg. Es sei denn Du kannst das erklären.
Als nächstes zu Verständnis. In den meisten Modulen ist es so eingestellt das jedes setzen von Readings ein Event aus löst. Auf dieses Event können dann DOIF oder Notify triggern.
Damit nun nicht auf alles und jeden ein Event erzeugt wird, kann der User die Eventgenerierung eines Modules überschreiben. So kann er sagen generieren nur ein Event wenn sich der Wert des Readings geändert hat. Das machst du ja bereits.
Aber jeder Modulauthor kann auch bestimmen das der User sowas nicht darf. Daher Ottos Ansatz schaue ob und wenn ja was überhaupt an Events generiert wird. Eventmonitor!
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Michael Schmidt

#3
Schonmal danke für eure Hinweise

habe das do always entfernt und im Event Monitor geschaut was passiert:
2017-06-11 17:01:21 readingsGroup cwl400 kwl_wolf_cwl400.vol_frischluft-get: 1000000
2017-06-11 17:01:21 KNX kwl_wolf_cwl400 vol_frischluft-get: 1000000
2017-06-11 17:01:21 KNX kwl_wolf_cwl400 last-sender: 1/1/7
2017-06-11 17:01:21 KNX kwl_wolf_cwl400 1000000
2017-06-11 17:01:21 readingsGroup cwl400 kwl_wolf_cwl400.vol_abluft-get: 990000
2017-06-11 17:01:21 KNX kwl_wolf_cwl400 vol_abluft-get: 990000
2017-06-11 17:01:21 KNX kwl_wolf_cwl400 990000

^^das sieht gut aus denn nur diese beiden Werte haben sich auch geändert.
Auch der Timestamp der Readings war und bleibt korrekt.

Leider beteht das Problem unverändert weiter!

Ich habe auch ein timestamp-on-change-reading .* versucht leider ändert auch das nichts.

Ich bin da ziemlich ratlos !?

Gruß

CoolTux

Ich glaube es Du verstehst nicht ganz.
Natürlich ändert sich der Timestamp der Readings, sie werden ja auch gesetzt, was richtig ist. Es wird halt nur kein Event ausgelöst bei einem event-on-change-reading

Wird wohl so eine DOIF Sache sein. Stell mal auf Event basiert um dein DOIF, ich denke mir daran liegt es.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

wenn die Events stimmen, dann versuche doch mal auf den Event und nicht auf den Status (Änderung) zu triggern.
Beispiel: anstatt
[kwl_wolf_cwl400:temp_frischluft-get] -> [kwl_wolf_cwl400:"temp_frischluft-get"]

Wenn ich das in der commandref richtig verstanden habe.  :-[

Um sicher zu gehen kannst Du Dir auch im Eventmonitor ein Beispiel DOIF generieren lassen.

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

Michael Schmidt

@CoolTux
bin nicht ganz sicher wie du das meinst also das im Eventmonitor "erscheinende" Readings geschrieben werden und einen neuen Timestamp bekommen ist klar aber warum bekommen alle Readings im DOIF einen neuen Timestamp (also auch nicht neu geschriebene)?

@Otto123 und CoolTux
Perfekt das funzt DANKE DANKE :)

würde mich mal interessieren was genau der unterschied ist zwischen den beiden Varianten??

Gruß



CoolTux

Dann hatte ich dich falsch verstanden. Ich dachte du meinst Dein KNX Device und nicht DOIF.

Deine Version reagiert auf alles was irgendwie mit Readings und dem Device zu tun hat. Nicht auf Events sondern liest wohl direkt das Device aus. Dir fehlt noch ein Vergleich bei Deiner Abfrage was ungewöhnlich ist daher reagiert er auch auf alles und sofort.

Ottos Version reagiert nur auf Events. Ereignisgesteuert heißt das in der Commandref dref zu DOIF.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Andi291

Auch, wenn das Thema gelöst zu sein scheint - gibt es einen Grund, warum Du mit solch einer fetten Logik arbeitest und nicht auf Notify ausweichst?

Mit DoIF habe ich keine Erfahrung, aber mit Notify kann ich sehr feingranular steuern.