[gelöst] if else in den Perl-Teil eines userReadings bringen

Begonnen von roedert, 10 Februar 2014, 13:04:14

Vorheriges Thema - Nächstes Thema

roedert

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?

betateilchen

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'; }
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ph1959de

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
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

roedert

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.

betateilchen

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.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

roedert

#5
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" }

Wernieman

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 ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Wernieman

Neee ...... so etwas würde ich mich nie "anmaßen"   8)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Wernieman

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.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Rince

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?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

betateilchen

Die Diskussion ist müßig, das Thema ist seit gestern geklärt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoeALLb

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?
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270