optischen Fenster-/Türsensor HM-Sec-SCo triggert ständig DOIF

Begonnen von MichaelO, 15 November 2015, 12:09:13

Vorheriges Thema - Nächstes Thema

MichaelO

Moin,

ich habe ein Verständnisproblem im Umgang mit dem optischen Fenster-/Türsensor HM-Sec-SCo. Ich möchte meine Rolläden in eine bestimmte Position fahren, sobald das entspr. Fenster geschlossen wird. Gelöst habe ich das in einem DOIF. Prinzipiell funktioniert es, aber der Sensor triggert "regelmäßig" den entsprechenden Zweig im DOIF, da er anscheinend regelmäßig Dinge sendet.

Zunächst bin ich dann weg von der generellen Abfrage mit ' eq "closed" bzw "open" ' und habe gedacht, dass ich nur dann reagiere, wenn es auch im Eventmonitor mit "contact" auftaucht. Daraus entstanden ist dann dies:

## wenn ein Fenster geschlossen wird
DOELSEIF
( ([WZ_FK_Fenster_links:?contact] and [?WZ_FK_Fenster_links] eq "closed") or
  ([GZ_FK_Fenster_rechts:?contact] and [?GZ_FK_Fenster_rechts] eq "closed")
)

     ## den entspr. Rolladen an die gewünschte Position fahren
     (IF ([WZ_FK_Fenster_links] eq "closed")
          (set WZ_Rolladen position [di_RolloVorneAutomatik:WZ_desired_pos])
     )
     (IF ([GZ_FK_Fenster_rechts] eq "closed")
          (set GZ_Rolladen position [di_RolloVorneAutomatik:GZ_desired_pos])
     )


Allerdings scheint das nicht wirklich zu funktionieren. Alle X Minuten meldet sich der Kontakt und dann springt das DOIF in die entsp. Zeile.

Nun die Frage: Was muss ich tun, damit das DOIF nur dann getigert wird, wenn sich tatsächlich der Status des Sensors ändert?

Danke
Michael

VB90

Stichwort "event-on-change-reading"
Keine Ahnung ob das wirklich so funktioniert wie du möchtest, ich würde es aber mal testen.

vb
Man muss das Rad nicht neu erfinden, nur wissen wie es gedreht wird.

MichaelO

Ok, das hab ich nun für beide Fenster eingerichtet und werde es beobachten. Viel verspreche ich mir davon aber nicht, da ich glaube, dass bei den regelmäßigen WakeUps anscheinend auch der status mitgesendet wird, so dass doch wieder ein triggern erfolgt.

PowerDiz

Hallo,
hat sich hier noch was getan?
Ich kann nach ersten Beobachtungen dieses Phänomen auch bestätigen.
Ich hab auf dem HM-SEC-SCo ein Event on Change reading .*, aber die notifies werden ausgelöst, wenn cycle info message kommt.
Dagegen ist im Logfile kein neuer Eintrag vorhanden.
Auch habe ich auf stateFormat ein:
{sprintf("%s (%s)", ReadingsVal($name,"state", "--"), ReadingsTimestamp($name,"state", "--"))}
Hier geht der TimeStamp mit der cycleInfo message, also ca. alle 30 Minuten mit, obwohl keine Änderung am Kontakt war.

Zur Info: Ich kann das für den HM-SEC-SC auch bestätigen. Hier ist mir das aber nicht aufgefallen, da die cycleInfo message scheinbar nur alle 24 Stunden kommt. Ich werde das aber jetzt beobachten.

Gruß,
Dieter

frank

ZitatIch hab auf dem HM-SEC-SCo ein Event on Change reading .*, aber die notifies werden ausgelöst, wenn cycle info message kommt.
dann ist die regex deines notify schlecht.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

PowerDiz

versteh ich jetzt nicht ganz.
Wir nicht ein notify nur ausgelößt, wenn sich was geämdert hat?
Wenn ich doch event-on-Change-reading mit * setzte, dann darf doch nur ein notify ausgelößt werden, wenn sich was ändert.
Aber wenn die cycleInfo kommt wird doch nur der aktuelle Status nochmal gesendet. Ergo es hat sich nichts geändert.
Wenn ich das falsch verstehe OK.

frank

um ein notify zu triggern, muss ein passendes event kommen. also schau auf den eventmonitor oder baue eine log ausgabe in dein notify ein. dann siehst du genau, welches event es war. 
ich schätze, du triggerst auf state, oder sogar das komplette device. und dort kommt häufig mehr, als man möchte.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

PowerDiz

Danke für die Infos.
das notify sieht so aus:
define n_virtualSC_Anbau notify (wz_Tuer_Haus|wz_Tuer_Terrasse):(open|closed) {VirtualSC_Anbau()}

->wz_Tuer_Haus ist ein optischer Kontakt und wz_Tuer_Terrasse ist ein magnetischer Kontakt.

Bei beiden Devices ist das Attribut 'event-on-change-reading .*' gesetzt. Ich dachte immer, dass dann nur getriggert wird, wenn sich was ändert.

Es funktioinert ja auch soweit alles, wenn die Kontakte betätigt werde.
Das Problem ist nur, dass das notify auch getriggert wird, wenn das Lebenszeichen (cycleInfo message) kommt.
Im log file ist auch kein Eintrag zu finden, wenn die cycleInfo message kommt, da scheint es ja zu funktionieren.






frank

wie gesagt, schau auf den eventmonitor, damit du alle events siehst.

theoretisch könnten folgende events im state vom device kommen:
open => MISSING_ACK => open
hier ändert sich das reading state, aber der zustand des kontaktes nicht. also würde dein notify triggern, obwohl du es nicht willst.

für notifys würde ich immer spezielle readings nehmen, wenn es welche gibt. hier zb das reading contact:

define n_virtualSC_Anbau notify (wz_Tuer_Haus|wz_Tuer_Terrasse).contact:.(open|closed).* {VirtualSC_Anbau()}

ZitatIm log file ist auch kein Eintrag zu finden, wenn die cycleInfo message kommt, da scheint es ja zu funktionieren.
das hängt wiederum von der regex des logfile ab. die sieht sicherlich anders aus.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

PowerDiz

hi frank,
danke für deine Ausführungen.
Ich hab jetzt mal den Event Monitor beobachtet.
Wenn die cycleInfo message (wenn es die überhaupt ist) kommt werden die Readings des Devices im Zeitstempel aktualisiert.
Im Event Monitor war nichts von dem Device zu sehen.
Ist echt komisch. Vielleicht werde ich das im code später noch analysieren, was da genau passiert.
Vielen Dank noch mal für deine Hilfe.

MarcelK

Tatsächlich macht es mehr Sinn solche Sachen durch das DOIF Modul machen zu lassen, da dies eine State-Machine implementiert. Auf Deutsch heisst das auch wenn der gleiche Status 5 mal kommt wird die Aktion per Default trotzdem nur einmal (beim ersten Mal) getriggert. Das Code-Beispiel des OP startet aber mit DOELSEIF, aus welchem Grund auch immer, was denke ich mal beliebige Nebenwirkungen haben könnte. Oder der Code ist nicht komplett.

MichaelO

Ist zwar schon etwas her, aber die Arbeit hat eine intensivere Beschäftigung mit fhem verhindert.

MarcelK hat recht mit der Annahme, dass der Code nicht komplett ist. Das DOIF besteht aus der Logik, wann unter welchen Umständen die Rollos fahren sollten sowie der Implementierung, dass durch die Fensterkontakte zusätzlich in die Steuerung eingegriffen wird. Nur letztere hab ich hier gepostet.

Gruß
Michael

MarcelK

Zitat von: MichaelO am 09 Februar 2016, 15:00:23
MarcelK hat recht mit der Annahme, dass der Code nicht komplett ist. Das DOIF besteht aus der Logik, wann unter welchen Umständen die Rollos fahren sollten sowie der Implementierung, dass durch die Fensterkontakte zusätzlich in die Steuerung eingegriffen wird. Nur letztere hab ich hier gepostet.

Alleine dass Du zwei Rolläden in einem DOIF abhandelst ist so nicht richtig, da DOIF wie gesagt eine State-Machine ist und Du damit den State von zwei verschiedenen Fenstern mixt. Und einen DOIF muss man immer gesamt betrachten, sonst kann man da auch keine wirklich Aussage treffen. Per Default löst er auf jeden Fall nie zweimal für den selben State aus.

Gruß Marcel

MichaelO

Zitat von: MarcelK am 09 Februar 2016, 16:56:24
Alleine dass Du zwei Rolläden in einem DOIF abhandelst ist so nicht richtig, da DOIF wie gesagt eine State-Machine ist und Du damit den State von zwei verschiedenen Fenstern mixt. Und einen DOIF muss man immer gesamt betrachten, sonst kann man da auch keine wirklich Aussage treffen. Per Default löst er auf jeden Fall nie zweimal für den selben State aus.

Gruß Marcel

Auch wenn off topic, hier mal das gesamte DOIF, welches bislang keine Fehlfunktion zeigt (bis auf anfangs das Problem mit den Events der Fenstersensoren. Ich habe das Gefühl, dass alle beabsichtigten States behandelt werden, oder es ist nur Zufall, dass alles geht.

## Rolladen fahren nur wenn entspr. Fenster zu, ansonsten erst
## wenn es geschlossen wird.
##
## morgens bei Sonnenaufgang frühestens zu ersten, spätestend zur zweiten Zeit
## unterschiedlich für Wochenende/Feiertage (7) oder Wochentage (8)
([{sunrise("REAL",0,"08:00","09:00")}|7] or
[{sunrise("REAL",0,"05:00","07:00")}|8]
)

     ## Wohnzimmer rauf wenn Fenster zu, sonst nur gwünschte Position merken
     (setreading di_RolloVorneAutomatik WZ_desired_pos 0)
     (IF ([WZ_FK_Fenster_links] eq "closed")
          (set WZ_Rolladen position 0)
     )
     ## und wenn kein Schlafbesuch dann auch Gästezimmer rauf wenn Fenster zu,
     ## sonst nur gwünschte Position merken
     (IF ([rg_Besuch] eq "none" or [rg_Besuch] eq "absent")
          (setreading di_RolloVorneAutomatik GZ_desired_pos 0,
           IF ([GZ_FK_Fenster_rechts] eq "closed")
                (set GZ_Rolladen position 0)
          )
     )

## wenn Schlafbesuch,
DOELSEIF
( [09:00] and ([?rg_Besuch] eq "home" or
[?rg_Besuch] eq "asleep")
)

     ##dann Gästezimmer zu anderer Uhrzeit rauf wenn Fenster zu
     ## sonst nur gwünschte Position merken
     (setreading di_RolloVorneAutomatik GZ_desired_pos 0)
     (IF ([GZ_FK_Fenster_rechts] eq "closed")
          (set GZ_Rolladen position 0)
     )

## wenn es keine Weihnachtsdeko gibt,
## im Zeitraum gefühlt dunkel wird, spätestens um Uhrzeit
DOELSEIF
( ([?dy_WZ_Dekobeleuchtung] ne "Weihnachten" or [?GZ_Dekobeleuchtung] ne "Weihnachten") and
(([AU_Sonnensensor:Helligkeit]<5.5 and [?16:00-21:00]) or [21:00])
)

     ## wenn im Wohnzimmerfenster keine Weihnachtsdemo, dann ganz zu
     (IF ([dy_WZ_Dekobeleuchtung] ne "Weihnachten")
          (setreading di_RolloVorneAutomatik WZ_desired_pos 100)
     )
     (IF ([WZ_FK_Fenster_links] eq "closed")
          (set WZ_Rolladen position 100)
     )
     ## wenn im Gästezimmerfenster keine Weihnachtsdemo, dann ganz zu
     (IF ([GZ_Dekobeleuchtung] ne "Weihnachten")
          (setreading di_RolloVorneAutomatik GZ_desired_pos 100)
     )
     (IF ([GZ_FK_Fenster_rechts] eq "closed")
          (set GZ_Rolladen position 100)
     )

## wenn in einem Fenster Weihnachtsdeko steht, und es dunkel wird und
## es wird 20:00Uhr plus 0-15 Minuten Zufall
DOELSEIF
( ([?dy_WZ_Dekobeleuchtung] eq "Weihnachten" or [?GZ_Dekobeleuchtung] eq "Weihnachten") and
    [([20:00]+int(rand(900)))]
)

     ## wenn im Wohnzimmerfenster Weihnachtsdeko, dann ganz zu
     (IF ([dy_WZ_Dekobeleuchtung] eq "Weihnachten")
          (setreading di_RolloVorneAutomatik WZ_desired_pos 100,
           IF ([WZ_FK_Fenster_links] eq "closed")
               (set WZ_Rolladen position 100)
           )
     )
     ## wenn im Gästezimmerfenster Weihnachtsdeko, dann ganz zu
     (IF ([GZ_Dekobeleuchtung] eq "Weihnachten")
          (setreading di_RolloVorneAutomatik GZ_desired_pos 100,
           IF ([GZ_FK_Fenster_rechts] eq "closed")
               (set GZ_Rolladen position 100)
           )
     )

## wenn das Wohnzimmer-Fenster geöffnet wird
DOELSEIF
( [WZ_FK_Fenster_links] eq "open" )

     ## den Rolladen hochfahren
          (set WZ_Rolladen position 0)

## wenn das Wohnzimmer-Fenster geschlossen wird
DOELSEIF
( [WZ_FK_Fenster_links] eq "closed" )

     ## den Rolladen an die gewünschte Position fahren
          (set WZ_Rolladen position [di_RolloVorneAutomatik:WZ_desired_pos])

## wenn das Gästezimmer-Fenster geöffnet wird
DOELSEIF
( [GZ_FK_Fenster_rechts] eq "open" )

     ## den Rolladen hochfahren
          (set GZ_Rolladen position 0)

## wenn das Gästezimmer-Fenster geschlossen wird
DOELSEIF
( [GZ_FK_Fenster_rechts] eq "closed" )

     ## den Rolladen an die gewünschte Position fahren
          (set GZ_Rolladen position [di_RolloVorneAutomatik:GZ_desired_pos])

## wenn das Modul initialisiert wird,
DOELSEIF
([di_RolloVorneAutomatik] eq "initialized")

     ## die Rolladenpositionen merken
     (setreading di_RolloVorneAutomatik WZ_desired_pos [WZ_Rolladen:position])
     (setreading di_RolloVorneAutomatik GZ_desired_pos [GZ_Rolladen:position])