[Gelöst] userreading für Tükontak letzte Öffnung/Schliessung

Begonnen von Grimmschak, 05 September 2019, 09:02:22

Vorheriges Thema - Nächstes Thema

Grimmschak

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

Gisbert

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​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Grimmschak

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

juemuc

#18
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
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Grimmschak

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

jkriegl

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.
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

juemuc

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
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Grimmschak

Hallo Jürgen,

simply perfect  ;D

Da spar ich mir 13 notify.

Vielen Dank !!

Gruß Jens