Hauptmenü

Syntax userReadings

Begonnen von blackdevil2k1, 02 Februar 2014, 05:41:00

Vorheriges Thema - Nächstes Thema

blackdevil2k1

Hallo

ich verzweifele, vermutlich aufgrund von Perl Kenntnismangel an folgendem Problem. Ich habe einen Temperatursensor der 2 Readings in Form von:

state: T: 23
temperature: 23

bereitstellt.
(nebenher gefragt: warum tut er das ? warum gibt es einmal state und einmal Temperature? ist das eine funktion de GPIO moduls?)

Meine eigentliche Frage wäre nun wie ich geschickt ein userreading anlege damit die ausgabe dann heißt "23 °C°" um das schöner in meinen Zimmern Darzustellen.

meine idee nun das irgendwie mit userReadings zu machen.

attr sensor userReadings schoenetemp { ReadingsVal("sensor","temperature",0) ;;}

liefert logischerweise genau die Gleiche Zahl die ich schon habe. Ich kriege es einfach nicht hin mit dieser Funktion dem Wert einfach noch ein °C anzuhängen. Ich hab viel gegoogelt versucht perl syntax ein wenig zu verstehen und hier im Forum geschaut aber vermutlich ist die Lösung so naheliegend dass sie normalerweise nicht erläutert wird.

Oder ich stelle mir das zu einfach vor und muss das anders angehen, wenn ja wie?

MfG

Joachim

Wenn Du die Forensuche verwendet hättest,
dann hättest Du diverse Beispiele, unteranderem auch mit Kommentirung gefunden!
Ich würde die Suche mit useReadings füttern,
wenn man dann noch die Sortierreihenfolge auf neueste zuerst und Ergebnisse als Beiträge anzeigen wählt, findet man das was man sucht recht schnell.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

justme1968

wenn du beim suchen bist mach gleich mit stateFotmat weiter. wenn dein device das kann ist es das was du willst

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

blackdevil2k1

Hallo,

Also ich habe jetzt nochmal wie vorgeschlagen im Forum gelesen und irgendwie werde ich nicht schlau. Auch finde ich für stateformat keine commandreferenz.

In den gegebenen Beispielen wird bei userreadings bei allen Beispielen nur eine mathematische Veränderung der Werte vorgenommen, zB /2 oder sowas. 

Bei den State Format Beispielen bzw. Bei Stateformat wird ja der State verändert wobei mich irritiert dass scheinbar zwischen state und STATE unterschieden wird, wo liegt der Unterschied ?

Was ist wenn ich den State gar nicht ändern will weil ich dem nochnzu anderen Zwecken so brauche wie er aus dem Sensor kommt ?

Mich raffst es einfach nicht....

betateilchen

#4
state ist ein Reading und wird vom Device geliefert
STATE ist ein Internal und wird zusätzlich generiert.

Falls NICHTS anderes definiert wird, wird STATE einfach 1:1 aus state übernommen und beide haben den gleichen Inhalt. Wobei es immer noch ein paar Module gibt, die auch STATE direkt beschreiben, was eigentlich nicht (mehr) sein sollte.

Mit stateFormat kannst Du selbst festlegen, was in STATE "angezeigt" werden soll. Das kann irgendwas sein, das Du aus state ableitest, Du kannst da aber auch einfach "Donnerstag" reinschreiben, dann wird STATE immer "Donnerstag" zurückliefern.

userReading ist das komplizierteste (auch vom Verständnis her) Das ist sowas ähnliches wie STATE, Du definierst also, welcher Wert angezeigt werden soll. Der Wert wird aber nicht nach STATE übertragen, sondern in ein von Dir festgelegtes Reading übertragen. Und Du definierst auch, WANN dies passieren soll. Du kannst also festlegen "wenn sich Reading a ändert, dann aktualisiere userReading xy mit dem Wert <wasAuchImmer>"

Ich habe hier mal ein Beispiel geklaut, das Boris irgendwann hier im Forum gepostet hatte:

attr e.ext.GDS userReadings currentMsg:(a_event|a_valid) { ReadingsVal("e.ext.GDS","a_valid",0) ? ReadingsVal("e.ext.GDS","a_event","") : "" }


  • Da wird ein userReading "currentMsg" für das Device e.ext.GDS angelegt.
  • Dieses wird immer dann aktualisiert, wenn sich das Reading a_event oder a_valid des Device e.ext.GDS ändert.
  • Wenn die Änderung getriggert wird, wird geprüft, ob das Reading a_valid ungleich 0 ist.
  • Falls JA wird der Inhalt von a_event in das userReading currentMsg übertragen.
  • Fall NEIN wird der Inhalt von currentMsg gelöscht.

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

Joachim

Was verstehst du in diesen Post, der 3. wenn Du meinen Suchvorschlag verwendest hast, nicht?
Zitat
1Wire / Antw:OWTHERM: Formatierung des STATUS, state
« Text von Joachim am 01 Februar 2014, 16:40:17 »
Moin Christian,
bastel mal dise Zeile, für Dich angepasst mit rein:
Code: [Auswählen]

attr TS_Bad userReadings Temperatur { int ( 10 * ReadingsVal("TS_Bad","temperature",0) + 0.5 ) / 10 }


Es wird ein userReading mit dem Namen Temperatur gesetzt, in dem bis auf eine Nachkommastelle der rest kaufm.weggerundet wird.
jetzt kannst Du alle weiteren Nachverarbeitungen auf Temperatur triggern.
Achtung: Der neue Name darf nicht identisch mit temperature oder T sein, sonst gibt es Probleme.

Zitat

    Bei dieser Gelegenheit: Welche Bedeutung hat das kleine Dreieck am Ende der Einheit - anfangs hatte ich es als Trendpfeil willkommen geheißen, doch es zeigt immer abwärts...

Alarmgrenze über bzw. unterschritten.

Gruß JAochim

FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

betateilchen

wobei ich das mit dem Runden auf jeden Fall anders lösen würde:

{ sprintf("%.1f", ReadingsVal("TS_Bad","temperature",0)) }

Aber das nur am Rande ;)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Joachim

perl:
There's more than one way to do it
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

blackdevil2k1

danke betateilchen für die Erklärungen, somit ist mir auf jedenfall wieder ein stückchen klarer geworden was state und STATE ist. Wenn ich das richtig interpretier ist state eine eigenschaft von meinem Sensor beispielsweise eine temperatur. Diese kann ich nicht ändern da sie eben vom sensor geliefert wird. STATE ist dann sozusagen die Instanz der Eigenschaft die in fhem übertragen wird und mit der gearbeitet wird. Diese kann dann mit verschiedenen möglichkeiten anpassen und umformen.

ich finde userREading einfacher zu verstehen. das ist meinem Verständnis nach ein "virtuelles" reading welches ich mit beliebigen Werten füttern kann.

ich habe auch schon erfolgreich userreadings von meinen sensoren erstellt und kann diese auch verändern, allerdings nur mathematisch... also zb den temperaturwert durch 2 teilen, mit etwas multiplizieren etc.

@Joachim: ich verstehe das Beispiel welches ich auch selbst gefunden habe durchaus, aber es ist nicht das was ich möchte.

Dein Beispiel führt wieder mathematische operationen an der Temperatur durch.

Ich möchte aber wissen wie ich aus einem reading mit dem wert "23,875" ein userreading mit dem wert "23,875 Bratwurst" mache.

ich hätte also zb Folgenden code:
attr sensor userReadings bratwurst { ReadingsVal("sensor","temperature",0) ;;}

dieser code gibt mir ja nur den Wert temperature vom Sensor sensor zurück
also bräuchte ich was wie

attr sensor userReadings bratwurst { ReadingsVal("sensor","temperature",0) +Bratwurst;;}

Das geht aber nicht, und ich habe keine Ahnung wie es geht.

Ich hoffe ich konnte meine Problematik verständlich machen.

BTW. wie kann ich denn ein userReading löschen? Ich habe die Attribute des Sensors gelöscht, aber die userReadings werden immernoch unter den Readings des Sensors angezeigt...

MfG

betateilchen

naja, so ganz hast Du das mit state STATE und userReading noch nicht verstanden, aber das lassen wir jetzt mal außen vor.

ZitatDas geht aber nicht

klar geht das...

attr sensor userReadings bratwurst { ReadingsVal("sensor","temperature",0)." Bratwurst"}

Einfacher gehts doch eigentlich gar nicht, oder? Das ist simple perl-Syntax für Stringverarbeitung und hat eigentlich überhaupt nichts mit fhem zu tun. Vereinfacht gesagt: Alles was in geschweiften Klammern steht, wird von perl ausgeführt.

Zitat[wie kann ich denn ein userReading löschen?

vermutlich wie jedes andere Reading auch, mit deletereading in der Kommandozeile:

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

blackdevil2k1

sehr vielen dank genau das hat mir gefehlt. Aufgrund fehlender Perlkenntnisse wusste ich einfach nicht dass ich mit dem punkt etwas anhängen kann. daran ists einfach nur gescheitert.

Perl muss ich mir noch weiter zu gemüte führen.

blackdevil2k1

Hallo,

ich bin schon wieder am verzweifeln mit der blöden perl Syntax. Und zwar geht es um ein notify. Ich versuche in einem {fhem("")} Ausdruck ein Perl ausdruck aufzurufen, aber überall im wiki etc wird nur der umgedrehte fall erläutert, nämlich in einem perl ausdruck fhem code aufzurufen.

ich hab mir das jetzt folgendermaßen gedacht:

define az_temp notify Arbeitszimmer { fhem("set az_Raumtemp {ReadingsVal("Arbeitszimmer","bratwurst",0)} ")}

und ich hab noch tausende andere Varianten mit verschiedensten Positionen von Semikolon, Anführungszeichen, Klammern etc ausprobiert. Aber da ich kein Pers kann komme ich nicht auf die richtige Lösung. Villeicht kann mir das jemand so umstellen dass es funktioniert. Ich kann dann wahrscheinlich daraus lesen wie der Syntax zu sein hat.

von der Systematik müsste es wohl so aussehen {fhem(fhembefehl  {Perl ReadingVal})}

aber ich kriegs einfach nicht hin

justme1968

es gibt in perl zwei Arten von anführungszeichen. einfache und doppelte. nimm für den fhem teil die einen und für den perl teil die anderen. in deinem fall sind beide gleichwertig verhindern aber das mit dem ersten anführungszeichen nach ReadingsVal der fhem auadruck beendet wird und dann sie syntax nicht stimmt.

die andere möglichkeit ist alle anführungszeichen innerhalb des fhem ausdrucks mit einem \ zu maskieren.

ansonsten hilft hier auch das buch.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

der-Lolo

Zitat von: betateilchen am 02 Februar 2014, 20:17:27

userReading ist das komplizierteste (auch vom Verständnis her) Das ist sowas ähnliches wie STATE, Du definierst also, welcher Wert angezeigt werden soll. Der Wert wird aber nicht nach STATE übertragen, sondern in ein von Dir festgelegtes Reading übertragen. Und Du definierst auch, WANN dies passieren soll. Du kannst also festlegen "wenn sich Reading a ändert, dann aktualisiere userReading xy mit dem Wert <wasAuchImmer>"


Das ist interessant für mich, ich habe eine IF Abfrage (Damians Modul) welches je nach Uhrzeit und Lautstärke wenn State on ist die Steckdose eines subwoofers schalten soll, das macht es auch aber immer nur dann wenn der Receiver seinen State on aktualisiert - das tut er zwar zyklisch etwa alle 5 Minuten, so Vergehen aber unter Umständen bis zu 5 Minuten bis die Steckdose geschaltet wird...
Wenn ich nun sagen könnte das State sich aktualisieren soll wenn eine Lautstärke Änderungen vorgenommen wurde wäre das perfekt.
Wie kann ich sowas bauen?

justme1968

du kannst mit user readings nur readings im gleichen device erzeugen und auch nur neue readings. nicht vom device verwendete überschreiben. im prinzip jedenfalls. (real geht beides wenn man die nebenwirkungen kennt und damit leben kann).

ansonsten ist für STATE stateFormat zuständig wenn sein device das kann.

ansonsten kannst du dein notify zum schalten an jedes reading hängen. natürlich auch volume.

gruss
  abdre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968