FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Grimmschak am 05 September 2019, 09:02:22

Titel: [Gelöst] userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Grimmschak am 05 September 2019, 09:02:22
Hallo zusammen,

ich habe diverse Tür/Fenster Kontakte und würde gern dort jeweils usereadings mit den Zeiten der letzten Zustandsänderungen haben.
Da meine Fähigkeiten in perl nur leicht besser als mein koreanisch sind, nun die Frage hier... ;D

Ich denke das das bestimmt schon jemand "gebaut" hat, leider haben diverse Versuche mit der Suche mir auch noch keine Lösung bescherrt.

Die genaue Idee ist 2, bzw 3 usereadings ala lastchange2closed;lastchanged2open und falls der sensor es kennt lastchanged2tilted zu haben, in denen Datum und Uhrzeit der jeweils letzten Änderung in den jeweiligen Zustand stehen. Ob ich das direkt in den userreadings codieren kann, oder noch ein notify dazu benötige entzieht sich leider im Moment auch noch meinem Wissen, aber ich arbeite dran.

Also meine Bitte falls a) das jemand schon so umgesetzt hat: bitte mit mir teilen, oder b) falls die Idee neu sein sollte, kann das jemand "einfach" als Deffinition posten ?


Danke schon einmal für alle hilfreichen Posts  ;)

Gruß
Jens
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: t1me2die am 05 September 2019, 09:10:16
Moin Jens,

eine fertige Lösung habe ich für Dich aktuell nicht parat, jedoch mache ich soetwas "ähnliches".
Ich zähle jeden Tag, wie oft die Eingangstür geöffnet / geschlossen wird mit einem Zähler.
Anhand dessen steuer ich andere Komponenten.

Ich arbeite mit einem Notify, der die Eingangstür überwacht:

fl_Eingangstuer:(open|closed)
{   if ($EVENT eq 'open')
    {   my $countOpen = ReadingsNum('fl_Eingangstuer','countOpen',0)+1;
         fhem "setreading fl_Eingangstuer countOpen $countOpen";
    }
    elsif ($EVENT eq 'closed')
    {   my $countClosed = ReadingsNum('fl_Eingangstuer','countClosed',0)+1;
         fhem "setreading fl_Eingangstuer countClosed $countClosed";
    }
}


Du könntest mit ReadingsTimestamp('fl_Eingangstuer','state','') arbeiten.
Evtl. wie folgt:


fl_Eingangstuer:(open|closed)
{   if ($EVENT eq 'open')
    {   my $lastchanged2open = ReadingsTimestamp('fl_Eingangstuer','state',0);
         fhem "setreading fl_Eingangstuer lastchanged2open $lastchanged2open";
    }
    elsif ($EVENT eq 'closed')
    {   my $lastchanged2closed = ReadingsTimestamp('fl_Eingangstuer','state',0);
         fhem "setreading fl_Eingangstuer lastchanged2closed $lastchanged2closed";
    }
}


Ungetestet.

Gruß
Mathze
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: AndreasHH am 05 September 2019, 09:22:34
Moin,

readingsHistory ist Dein Freund.

Gruß
Andreas
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Grimmschak am 05 September 2019, 17:59:47
Hi Mathze,

hat fast funktioniert, Danke.

Leider wird der letzte, aktuelle Zustand immer mit aktuellem Zeitstempel überschrieben, das ist suboptimal.

Jens
Titel: Antw:[fast gelöst] userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Peteruser am 05 September 2019, 20:13:46
Hallo,
es gibt auch die Harte Tour.

Watchdog überwacht das device
defmod Check.WindfangEingang notify WindfangEingang:.* {system ("/home/fhem/skripte/Check.WindfangEingang.sh &")}

Skript schreibt das bei open (man könnte also auch den * mit open ersetzen) in einen Dummy
defmod Info.WindfangEingang.Offen dummy

Entspricht nicht 100% der reinen Lehre, klappt aber:-)

Grüße Peter


Grüße Peter
Titel: Antw:[fast gelöst] userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: juemuc am 05 September 2019, 22:01:58
Hallo,

ich habe hierzu ein userreadings definiert.
attr <devicename> userReadings LastOpen:1.STATE.* {if (ReadingsVal($name,"state","") eq "open") {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/;; return "$3.$2.$1 - $4";;} else {ReadingsVal($name,"LastOpen","")}}
Titel: Antw:[fast gelöst] userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: DeeSPe am 06 September 2019, 09:11:40
Ich habe das auch über 2 userReadings gelöst:
Code (RAW DEF) Auswählen
attr <DEVICE> userReadings lastOpen:open {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/;; "$3.$2.$1 $4"},lastClosed:closed {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/;; "$3.$2.$1 $4"}

Gruß
Dan
Titel: Antw:[fast gelöst] userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Grimmschak am 06 September 2019, 17:34:07
Hallo zusammen,

die UserReadings haben leider auch genau das Problem wie das notify, sobald das Device (HMCCUDEV) aktuallisiert wird, wird auch das UserReading des Status in dem es sich zum Zeitpunkt der Aktualisierung befand mit aktualisiert.

Das ist unschön, da ich eigentlich nur den Zeitunkt der Änderung merken will.
Hat da noch jemand eine Idee ?

Habe ich in dem Device vieleicht einen Fehler ?

Gruß
Jens
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: jkriegl am 06 September 2019, 19:18:40
Bei einem HM habe ich ein userreading seit {substr(ReadingsTimestamp($name,"trigger_cnt",""),8, 8);}
Da ist noch der Tag mit dabei, sieht so aus: 06 10:45
Bei einem Xiaomi ist es schwieriger, man muss sich die Zeit in einem userReading merken.
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Peteruser am 06 September 2019, 21:39:04
Hallo,
der Tip war echt gut :-)
attr <devicename> userReadings lastOpen:open {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/;; "$3.$2.$1 $4"},lastClosed:closed {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/;; "$3.$2.$1 $4"}

Das gibt bei mir den Zeitpunkt z.B. des letzten Öffnen aus.

Bei mir handelt es sich um:     lumi.sensor_magnet.aq2 = Xiaomi Aqara Smart Fenstersensor

Grüße und Danke vom Peter
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Grimmschak am 07 September 2019, 10:58:01
Hallo zusammen,

bei mir sind es Homematik Sensoren, mit HMCCUDEV in fhem.
Leider aktualisieren die die immer auch den state.

Frage zu dem "seit", welches reading ist "trigger_cnt" ?
Das habe ich nicht bei meinen HMCCUDEV Geräten.

J.
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: rippi46 am 09 September 2019, 09:24:05
Hallo Grimmschak,

Ich habe das Beispiel von t1me2die verwendet nur mit dem Unterschied, dass ich nicht state beutzt habe sondern den contact.
Dadurch habe ich zumindest nur bei einem Reading die letzte Zustandsänderung.

defmod opencloseElena_ntfy notify (Fensterhinten:contact.*) {\
if ($EVTPART1 eq 'open')\
    {   my $lastchanged2open = ReadingsTimestamp('Fensterhinten','contact',0);;\
         fhem "setreading Fensterhinten lastchanged2open $lastchanged2open";;\
    }\
    elsif ($EVTPART1 eq 'close')\
    {   my $lastchanged2closed = ReadingsTimestamp('Fensterhinten','contact',0);;\
         fhem "setreading Fensterhinten lastchanged2closed $lastchanged2closed";;\
    }}
attr opencloseElena_ntfy room Elena

setstate opencloseElena_ntfy 2019-09-09 09:05:52
setstate opencloseElena_ntfy 2019-09-08 19:27:16 state active



PS: also ich kann feststellen wann es zuletzt geöffnet oder geschlossen wurde, je nachdem welche Zeit älter ist

Gruß rippi
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Grimmschak am 10 September 2019, 19:19:22
Hallo rippi46,

leider haben die HMCCUDEV das Attribut contact nicht, und leider finde ich auch kein Attribut was sich nicht mit ändert, da ich die Devices aktiv alle 15 min update. Dieses hat sich bewährt um auch VARS etc aus der CCU3 aktuell zu halten.
Interessanterweise hat bei mir anscheinend geholfen ein event-on-change-reading .* mit einzubauen, damit scheint er sie Werte sowohl mit der notify Lösung als auch mit den userreading zu behalten. Ich werde das noch ein paar Tage beobachten.

Gruß
Jens
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: rippi46 am 10 September 2019, 20:36:30
Das hört sich doch mal gut an!

Gruß rippi
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: juemuc am 13 September 2019, 20:34:58
Zitat von: Grimmschak am 10 September 2019, 19:19:22
Hallo rippi46,

leider haben die HMCCUDEV das Attribut contact nicht, und leider finde ich auch kein Attribut was sich nicht mit ändert, da ich die Devices aktiv alle 15 min update. Dieses hat sich bewährt um auch VARS etc aus der CCU3 aktuell zu halten.
Interessanterweise hat bei mir anscheinend geholfen ein event-on-change-reading .* mit einzubauen, damit scheint er sie Werte sowohl mit der notify Lösung als auch mit den userreading zu behalten. Ich werde das noch ein paar Tage beobachten.

Gruß
Jens

Hallo Jens,
wenn fhem neu gestartet wird, hilft auch das "event-on-change-reading" nicht.
Ich such auch nach einer Lösung, dass der Timestamp für die Userreadings nur bei einer "echten" Änderung verändert wird. Ich habe aber noch keine Idee. Dies ist aus meiner Sicht vor allem dann relevant, wenn der Kontakt nur selten verändert wird, aber fhem hin und wieder ein update erhält  8)

Viele Grüße
Jürgen

Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Grimmschak am 14 September 2019, 09:24:51
Hi Jürgen,

stimmt, ist mir auch aufgefallen,das ein restart von fhem oder auch der ccu das verfälscht. Man müßte sich ein userreading bauen, welches mit etwas logik den letzten Zustand merkt und bei potentieller Änderung zusätzlich vergleicht. Nur wenn es dann wirklich neuen Zustand hat, den timestamp merkt. Muß ich mal in Ruhe schauen wie man das mit perl hin bekommt.

Gruß
Jens
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Gisbert am 14 September 2019, 10:18:11
Hallo Jens,

vielleicht nutzt dir das Modul HourCounter.
Ich überwache damit die Anzahl der Schaltvorgänge und die Laufzeit der Warmwasserkreislaufpumpe.

Anbei meine bescheidene Funktion, sowie ein Diagramm, das u.a. die obige Laufzeit enthält.
defmod HourCount.Warmwasser HourCounter Heizung.POWER1:.ON Heizung.POWER1:.OFF
attr HourCount.Warmwasser alias Laufzeit Warmwasser
attr HourCount.Warmwasser comment Text und Werte (ReadingsVal()) werden in dem String über den ,,." (Punkt) zusammengesetzt.
attr HourCount.Warmwasser interval 10
attr HourCount.Warmwasser room Heizung
attr HourCount.Warmwasser stateFormat {'Schaltzyklen: '.ReadingsVal($name,'countsPerDay',0).'x<br>'.'Laufzeit: '.ReadingsVal($name,'MinpulseTimePerDay',0).' min'}
attr HourCount.Warmwasser userReadings MinpulseTimePerDay {round(ReadingsVal($name,'pulseTimePerDay','')/60,0)}


Viele​ Grüße​ Gisbert​
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Grimmschak am 14 September 2019, 16:27:50
Hallo zusammen,

denke habe nun meine Lösung, welche auch durchstarten etc übersteht:
keller.tuer.check notify
keller.tuer:(open|closed)
{   if (($EVENT eq 'open') && ReadingsVal('keller.tuer','formerState',0) ne 'open')
    {   my $lastchanged2open = ReadingsTimestamp('keller.tuer','state',0);
         fhem "setreading keller.tuer lastchanged2open $lastchanged2open";
         fhem "setreading keller.tuer formerState open";
    }
    elsif (($EVENT eq 'closed') && ReadingsVal('keller.tuer','formerState',0) ne 'closed')
    {   my $lastchanged2closed = ReadingsTimestamp('keller.tuer','state',0);
         fhem "setreading keller.tuer lastchanged2closed $lastchanged2closed";
         fhem "setreading keller.tuer formerState closed";
    }
}


Das sollte in Kombi mit dem event-on-change-reading .* reichen.
Sieht im Moment zumindest so aus.
Vorteil für mich, ich kann es leicht für Fenster mit 3 Stati erweitern, deshalb so um die Ecke.

Gruß
Jens
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: juemuc am 14 September 2019, 18:30:14
Hallo Jens,

ich habe Deine Idee aufgenommen und folgendes userReadings definiert:

LastOpen:open {if (ReadingsVal($name,"Laststate","") eq "closed") {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/; return "$3.$2.$1 - $4";} else {ReadingsVal($name,"LastOpen","")}}, LastClose:closed {if ((ReadingsVal($name,"Laststate","") eq "open") || (ReadingsVal($name,"Laststate","") eq "tilted")) {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/; return "$3.$2.$1 - $4";} else {ReadingsVal($name,"LastClose","")}}, Laststate:.* {ReadingsVal($name,"state","")}


Damit funktioniert es und Du benötigst kein zusätzliches notify. Tilted wird hierbei als "open" angesehen.

Viele Grüße
Jürgen
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Grimmschak am 15 September 2019, 11:30:54
Hallo Jürgen,

nice, diese "Kurzfassung" überfordert mich, kannst du das auch mit dem richtigen Status "tilted" umsetzen ?

also wie dieses notify als pure readings:
wohnzimmer.terassentuer:(open|tilted|closed)
{   if (($EVENT eq 'open') && ReadingsVal('wohnzimmer.terassentuer','formerState',0) ne 'open')
    {   my $lastchanged2open = ReadingsTimestamp('wohnzimmer.terassentuer','state',0);
         fhem "setreading wohnzimmer.terassentuer lastchanged2open $lastchanged2open";
         fhem "setreading wohnzimmer.terassentuer formerState open";
    }
    elsif (($EVENT eq 'tilted') && ReadingsVal('wohnzimmer.terassentuer','formerState',0) ne 'tilted')
    {   my $lastchanged2closed = ReadingsTimestamp('wohnzimmer.terassentuer','state',0);
         fhem "setreading wohnzimmer.terassentuer lastchanged2tilted $lastchanged2closed";
         fhem "setreading wohnzimmer.terassentuer formerState tilted";
    }
    elsif (($EVENT eq 'closed') && ReadingsVal('wohnzimmer.terassentuer','formerState',0) ne 'closed')
    {   my $lastchanged2closed = ReadingsTimestamp('wohnzimmer.terassentuer','state',0);
         fhem "setreading wohnzimmer.terassentuer lastchanged2closed $lastchanged2closed";
         fhem "setreading wohnzimmer.terassentuer formerState closed";
    }
}


das wäre natürlich besser, da man dort nichts umbenennen muss und man direkt in die Devices kopieren kann.

Denke ein elseif Konstrukt geht da bestimmt auch, oder ?

Gruß
Jens
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: jkriegl am 16 September 2019, 19:21:32
Die Ergänzung zu "seit" für z.B. Xiaomi seit {if (ReadingsVal($NAME,"state",0) ne ReadingsVal($NAME,".usr",0))
{sprintf("%s", substr(ReadingsTimestamp($NAME,"state",""),8,8))}
else{ReadingsVal($NAME,"seit",0)}},
.usr {ReadingsVal($NAME,"state",0)}

Ich merke mir in .usr (also nicht sichtbar) den state und prüfe ob sich etwas geändert hat; event-on-change-reading auf state

trigger_cnt? habe einen CUL und eine mehrere Jahre laufende Installation mit HM-Komponenten, keinerlei Besonderheiten.
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: juemuc am 16 September 2019, 21:38:25
Zitat von: Grimmschak am 15 September 2019, 11:30:54
Hallo Jürgen,

nice, diese "Kurzfassung" überfordert mich, kannst du das auch mit dem richtigen Status "tilted" umsetzen ?

also wie dieses notify als pure readings:
wohnzimmer.terassentuer:(open|tilted|closed)
{   if (($EVENT eq 'open') && ReadingsVal('wohnzimmer.terassentuer','formerState',0) ne 'open')
    {   my $lastchanged2open = ReadingsTimestamp('wohnzimmer.terassentuer','state',0);
         fhem "setreading wohnzimmer.terassentuer lastchanged2open $lastchanged2open";
         fhem "setreading wohnzimmer.terassentuer formerState open";
    }
    elsif (($EVENT eq 'tilted') && ReadingsVal('wohnzimmer.terassentuer','formerState',0) ne 'tilted')
    {   my $lastchanged2closed = ReadingsTimestamp('wohnzimmer.terassentuer','state',0);
         fhem "setreading wohnzimmer.terassentuer lastchanged2tilted $lastchanged2closed";
         fhem "setreading wohnzimmer.terassentuer formerState tilted";
    }
    elsif (($EVENT eq 'closed') && ReadingsVal('wohnzimmer.terassentuer','formerState',0) ne 'closed')
    {   my $lastchanged2closed = ReadingsTimestamp('wohnzimmer.terassentuer','state',0);
         fhem "setreading wohnzimmer.terassentuer lastchanged2closed $lastchanged2closed";
         fhem "setreading wohnzimmer.terassentuer formerState closed";
    }
}


das wäre natürlich besser, da man dort nichts umbenennen muss und man direkt in die Devices kopieren kann.

Denke ein elseif Konstrukt geht da bestimmt auch, oder ?

Gruß
Jens

Hallo Jens,
versuche es einmal damit:
LastOpen:open {if (ReadingsVal($name,"Laststate","") ne "open") {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/; return "$3.$2.$1 - $4";} else {ReadingsVal($name,"LastOpen","")}}, LastClose:closed {if (ReadingsVal($name,"Laststate","") ne "closed") {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/; return "$3.$2.$1 - $4";} else {ReadingsVal($name,"LastClose","")}}, LastTilted:tilted {if (ReadingsVal($name,"Laststate","") ne "tilted") {ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/; return "$3.$2.$1 - $4";} else {ReadingsVal($name,"LastTilted","")}},
Laststate:.* {ReadingsVal($name,"state","")}


Die einzelnen UserReadings sind durch Komma getrennt. Zusätzlich habe ich die Ausgabe formatiert (
=~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+:\d+)$/; return "$3.$2.$1 - $4";) kannst Du auch weglassen.

Viele Grüße
Jürgen
Titel: Antw:userreading für Tükontak letzte Öffnung/Schliessung
Beitrag von: Grimmschak am 17 September 2019, 18:49:38
Hallo Jürgen,

simply perfect  ;D

Da spar ich mir 13 notify.

Vielen Dank !!

Gruß Jens