[gelöst] userReadings bei einem Dummy

Begonnen von roedert, 21 Juni 2014, 03:41:25

Vorheriges Thema - Nächstes Thema

roedert

Ich habe ein Dummy Katzenklappe und wollte dort jetzt ein userReading anlegen, was bei jedem Änderung des Dummy gesetzt wird:

define dummy Katzenklappe
attr Katzenklappe userReadings log:state {Value($name) eq "rein" ? 1 : 0}


Leider funktioniert das nicht, log wird nicht gesetzt.
Lasse ich den Trigger :state weg,
attr Katzenklappe userReadings log {Value($name) eq "rein" ? 1 : 0}
funktioniert es - allerdings wird es dann auch bei jeder Änderung des Dummys und nicht nur bei Änderung des state ausgeführt, eben auch wenn ich den userReading log manuell setze ... und das soll eben nicht sein.

Was mache ich falsch?

fiedel

Hi Roedert,

userReadings log:state geht so nicht. Du kannst hier nur den Namen des UR. vergeben, kein Regexp. In den geschw. Klammern kannst du jedoch beliebigen Perlcode setzen, also auch "if" usw. Am Besten beschreibst du mal im Ganzen, was du vor hast.

Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

roedert

#2
...so ist es aber in der Commandref beschrieben:

userReadings
A comma-separated list of definitions of user-defined readings. Each definition has the form:
<reading>[:<trigger>] [<modifier>] { <perl code> }


Und es funktioniert ja auch, zB ist das standardmäßig bei einem PCA301-Device (Steckdose mit Verbrauchsmessung) eingetragen

userReadings consumptionTotal:consumption monotonic {ReadingsVal($name,'consumption',0)}

Jedesmal, wenn das Reading consumption aktualisiert (und nur das Reading consumption!) wird, wird auch consumptionTotal aktualisiert.

Für meinen Fall:
Dummy Katzenklappe, wird von 2 Sensoren an der Katzenklappe auf "rein" oder "raus" gesetzt.
Zusätzlich brauche ich neben dem state rein/raus des Dummys eben noch ein zusätzliches Reading "log", welches 0 und 1 beinhalten soll um es einerseits schön grafisch darstellen zu können, andererseits wird dieses Reading log auch alle 5 Minuten neu gesetzt, damit ich einen kontinuierlichen Graph erhalte und nicht beim letzten Messwert endet.
Den state des Dummy will ich dafür nicht nutzen, da auf diesem auch notifys oder readingsHistory definiert sind, die bei dem periodischen Aktualisieren dann durcheinanderkommen würden.

Natürlich ginge auch ein zweiter Dummy, aber ein userReading ist übersichtlicher. 

roedert

....ich habe gerade noch ein wenig probiert und die Lösung gefunden: :-)

attr Katzenklappe userReadings log:(rein|raus) {Value($name) == "rein" ? 1 : 0}

Das UserReading wird nur gesetzt wenn "rein" oder "raus" kommt, nicht aber beim periodischen "log:1"  oder "log: 0"
Und genau so sollte es sein......

fiedel

Sehr schön!  Und ich hab wieder was gelernt.  ;)
Hätte ich mal in die Commandref. statt in meine CFG geguckt!  8) Deine Lösung gefällt mir. Kann ich ggf. auch mal abgewandelt einsetzten. Um den Plot nicht abreißen zu lassen gibt es noch "addLog" aber das kennst du ja sicher.

Gruß

Frank

PS.: *Puschelmode* Setze doch bitte noch den Threadtitel auf "[Geöst] ... " *Puschelmode \*  ;D
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

roedert

Zitat von: fiedel am 21 Juni 2014, 10:30:07
...Um den Plot nicht abreißen zu lassen gibt es noch "addLog" aber das kennst du ja sicher....

Ja, addLog kenne ich und setze ich auch ein, aber seit ich auch readingsHistory nutze, musste ich mir einen anderen Weg einfallen lassen, da ich im readingsHistory die AddLog-Einträge nicht rausfiltern kann (oder zumindest momentan nicht weiss wie.)

fhainz

#6
Hallo!

Zitat von: roedert am 21 Juni 2014, 13:02:16
da ich im readingsHistory die AddLog-Einträge nicht rausfiltern kann (oder zumindest momentan nicht weiss wie.)

Das schaffst du mit diesem Code:

readingsHistory Device
attr <name> valueFormat { allgEventHistoryValueFormat($DEVICE,$READING,$VALUE); }

99_myUtils.pm
sub allgEventHistoryValueFormat($$$){
  my $device = shift;
  my $reading = shift;
  my $value = shift;

  if( $value =~ m/.*addLog/){
    return undef;
  }


Du kannst das auch alles in einer Zeile im valueFormat schreiben, ich hab für dich nur einen Teil meiner Funktion rauskopiert.

Grüße