Gerät: HM-SEC-SCo (threeStateSensor)
Hallo, hat jemand einen Tipp, wie man die letzte Türöffnung z.B. mittels stateformat im STATE anzeigen lassen kann?
Die Readings state, contact, etc. werden kontinuierlich aktualisiert. Somit kann ich auch nicht mit dem Attribut "showtime" arbeiten, die ich es vom Bewegungsmelder gewohnt bin.
attr Sensor stateFormat {ReadingsVal("Sensor","contact","") =~ "open.*" ? "open " . ReadingsTimestamp("Sensor","contact","") : "closed"}
Das ist schon sehr geil. Aber sobald der Kontakt wieder geschlossen ist, springt der Status wieder auf "closed". Ich würde den Timestamp des letzten Öffnens aber gerne behalten. Hast du ne Idee? Danke.
Mach dir ein userreading mit dem Timestamp.
Zitat von: Ralli am 22 September 2015, 18:46:52
attr Sensor stateFormat {ReadingsVal("Sensor","contact","") =~ "open.*" ? "open " . ReadingsTimestamp("Sensor","contact","")}
@Ralli:
Das hatte ich auch schon ausprobiert. Dann erhalte ich aber folgenden Fehler.
Error evaluating diele_tuersensor stateFormat: syntax error at (eval 4670) line 2, at EOF
Dann mach halt
attr Sensor stateFormat {if (ReadingsVal("Sensor","contact","") =~ "open.*") {"open " . ReadingsTimestamp("Sensor","contact","")}}
Braucht man das if? Readingtimestamp müsste doch default zurückgeben, wenn das reading nicht existiert. Also ohne wenn.
attr Sensor stateFormat {"open " . ReadingsTimestamp("Sensor","contact","")}
.
Dieses Reading ist aber immer da - dann, wenn geöffnet und dann wenn geschlossen wird jeweils mit dem entsprechenden Eintrag.
Im State soll aber immer nur die Zeit des letzten Öffnens stehen bleiben.
Daher: wenn ein Event gegeben ist, schaut fhem nach, ob Öffnung, wenn ja, dann wird STATE neu gesetzt. Wenn stattdessen Schließung, passiert eben nichts.
ich denke das funktioniert nicht. im else fall nicht der alte wert angezeigt sondern nichts oder blödsinn oder etwas das du nicht willst.
du brauchst ein notify das nur auf open reagiert. darin erzeugst du mit setreading ein neues reading und dieses verwendest du dann in stateFormat.
gruß
andre
dann könntest du auch das modul hourcounter "anwerfen". das liefert dir dann noch einiges mehr.
@Andre: Du hast Recht. Das kann man dann so umgehen ;D :
attr Sensor stateFormat {if (ReadingsVal("Sensor","contact","") =~ "open.*") {"open " . ReadingsTimestamp("Sensor","contact","")} else {InternalVal("Sensor","STATE","")}}
Super, vielen Dank für eure Hilfe.
Ich habe es bisher nur mit einem manuell durchgeführten "setreading" ausprobiert und es sieht ganz gut aus.
Ich werde mir mal notieren, diese Info ins Wiki zu packen.
Sorry, dass ich noch einmal nachfragen muss.
Ich war mit euren Tipps absolut zufrieden.
Nun würde ich das gerne um den aktuellen Status von "contact" erweitern.
Ich hatte es erst damit versucht, einfach stateformat hinter der geschwungenen Klammer mit "Aktuell: contact" zu erweitern. Kommagetrennt oder mit Leerzeichen. Beides ohne Erfolg. Dann wird die Perl-Formel als String interpretiert.
Nun versuche ich es gerade über die Userreadings, aber das will auch nicht funktionieren.
Irgendwie bin ich betriebsblind.
Wäre jemand so nett und kann mir dabei helfen? Ich wäre sehr dankbar.
Ach, Denkblockade. Das ist ja eigentlich ganz einfach, wenn man eure Basis nutzt.
Ich habe ein userreading angelegt:
last:contact {if (ReadingsVal("contactsensor","contact","") =~ "open.*") {ReadingsTimestamp("contactsensor","contact","")} else {ReadingsVal("contactsensor","last","")}}
Und dann im Stateformat:
Zuletzt:last Aktuell:contact