Ich möchte bei einem PCA301 (Strommessgerät) ein userReading Status bringen, welches den on enthält wenn die Stromaufnahem größer 20, sonst off enthält.
attr PCA301 userReadings status PCA031:power { perl-code }
In den Beispielen ist dieser Perl-Code immer nur ein Wert oder eine Funktion - zB ReadingsVal("PCA301","power",0)/1250.0
Wie kann ich da mein Code wenn > 30 "on", sonst "off" unterbringen? Oder muss ich mir eine entsprechende function in myUtils anlegen?
Perl Buch kaufen und Perl lernen :)
Ich verstehe Deine Frage nicht, zwischen den geschweiften Klammern kannst Du doch das gleiche schreiben, wie in jedem notify auch?
attr PCA301 userReadings status PCA031:power {my $wert = <hier kommt irgendeine Wertzuweisung irgendwoher>; ($wert > 30) ? 'on' : 'off'; }
Ich habe zwar nicht genau verstanden, wofür Du das verwenden willst, aber vielleicht hilft Dir schon das PCA301-Beispiel bei der readingsGroup: http://www.fhemwiki.de/wiki/ReadingsGroup
Gruß, Peter
Zitat von: betateilchen am 10 Februar 2014, 13:08:29
Perl Buch kaufen und Perl lernen :)
Ich verstehe Deine Frage nicht, zwischen den geschweiften Klammern kannst Du doch das gleiche schreiben, wie in jedem notify auch?
Schon klar ... Perl kenne ich in den Grundlagen und den Rest finde ich in manuals etc. ... ist aber in diesem Zusammenhang gar nicht so einfach, da es in dem Perl-Code der userReading-Definition gar keine Zuweisung zu irgendeiner Variable enthalten ist.
Beispiel aus der commandref:
attr myPowerMeter userReadings power differential { ReadingsVal("myPowerMeter","counters.A",0)/1250.0;; }
Es kann wohl nur eine Funktion angegeben werden und kein "richtiger Perl-Code" wie zB mein if ... else
Mein Versuch ist also
attr PCA301 userReadings status PCA301:power {((ReadingsVal("PCA301","power",0) > 10 ) ? 'on' : 'off');;}
...bringt keinen Fehler im Log, legt aber auch kein userReading an ???
Hintergrund ist es einen Watchdog auf das neue userReading "on/off" einzurichten, da ich dem Watchdog nicht beibringen kann auf einen größer/kleiner-Vergleich eines Wertes zu reagieren.
Zitat von: roedert am 10 Februar 2014, 13:29:26Es kann wohl nur eine Funktion angegeben werden und kein "richtiger Perl-Code"
Falsch.
currentMsg:(a_event|a_valid) { ReadingsVal("gds","a_valid",0) ? ReadingsVal("gds","a_event","") : "" }
Ist das etwa kein richtiger Perl-Code? Funktioniert in meinem userreading "currentMsg" jedenfalls perfekt.
Das ist doch die Antwort die ich hören (ähm lesen) wollte :-) ... - nach dem Vorbild habe ich es hinbekommen, hatte noch einen blöden Denkfehler drin.
Danke + Gruß
attr Kueche.Kuehlschrank userReadings cooling:power { ReadingsVal("Kueche.Kuehlschrank","power",0)>20 ? "on" : "off" }
Könntest Du bitte:
1. Den Betreff Ändern indem du am Anfang (Ende) ein "(gelöst)" setzt?
2. Nur aus Interesse:
Könntest Du Deinen Code posten? Nur mal als Vergleich für andere ....
es sprach die Forumpolizei 8)
Neee ...... so etwas würde ich mich nie "anmaßen" 8)
sieht aber anders aus.
Mhh .. dann sollte ich mich hiermit entschuldigen, war nicht so gemeint!
Bedauerlicherweise war ich in einem anderen Forum (Gentoo) schon mal "Fast"-Admin .. und irgendwann entgleitet einem der Ton. Werde es versuchen zu vermeiden.
Ich fand die Anmerkung von Wernieman absolut ok.
Sie war freundlich (Bitte),
und die beiden Bitten erscheinen mir überaus sinnvoll.
Ich verstehe aber natürlich auch Betateilchen. Er löst es, und ein Anderer stellt Forderungen.
Wenn wir mal davon ausgehen, dass das Thema auch für jemand Anders interessant ist:
Wie hätte Wernieman es formulieren können, ohne das es dich, Betateilchen, stört?
Die Diskussion ist müßig, das Thema ist seit gestern geklärt.
Rückfrage:
attr Kueche.Kuehlschrank userReadings cooling:power { ReadingsVal("Kueche.Kuehlschrank","power",0)>20 ? "on" : "off" }
ändert leider bei jeder änderung von power auch das reading und schreibt sich somit in die logdatei.
Das produziert mir hier viel zuviele "on".
Muss man heir ein zweites IF verwenden, das zuvor prüft, ob der wert schon korrekt gesetzt ist, um ihn in diesem Fall nicht zu setzen?
Wenn ja, was gebe ich dann an um das reading nicht zu verändern? reicht ein {} aus?