FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: blackdevil2k1 am 02 Februar 2014, 05:41:00

Titel: Syntax userReadings
Beitrag von: blackdevil2k1 am 02 Februar 2014, 05:41:00
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
Titel: Antw:Syntax userReadings
Beitrag von: Joachim am 02 Februar 2014, 07:27:47
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
Titel: Antw:Syntax userReadings
Beitrag von: justme1968 am 02 Februar 2014, 09:51:43
wenn du beim suchen bist mach gleich mit stateFotmat weiter. wenn dein device das kann ist es das was du willst

gruss
  andre
Titel: Antw:Syntax userReadings
Beitrag von: blackdevil2k1 am 02 Februar 2014, 20:05:25
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....
Titel: Antw:Syntax userReadings
Beitrag von: betateilchen am 02 Februar 2014, 20:17:27
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","") : "" }


Titel: Antw:Syntax userReadings
Beitrag von: Joachim am 02 Februar 2014, 20:25:43
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

Titel: Antw:Syntax userReadings
Beitrag von: betateilchen am 02 Februar 2014, 20:50:32
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 ;)
Titel: Antw:Syntax userReadings
Beitrag von: Joachim am 02 Februar 2014, 21:06:55
perl:
There's more than one way to do it
Titel: Antw:Syntax userReadings
Beitrag von: blackdevil2k1 am 02 Februar 2014, 23:57:55
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
Titel: Antw:Syntax userReadings
Beitrag von: betateilchen am 03 Februar 2014, 08:17:06
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>
Titel: Antw:Syntax userReadings
Beitrag von: blackdevil2k1 am 04 Februar 2014, 00:39:15
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.
Titel: Antw:Syntax userReadings
Beitrag von: blackdevil2k1 am 04 Februar 2014, 05:27:28
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
Titel: Antw:Syntax userReadings
Beitrag von: justme1968 am 04 Februar 2014, 08:28:22
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
Titel: Antw:Syntax userReadings
Beitrag von: der-Lolo am 04 Februar 2014, 09:20:36
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?
Titel: Antw:Syntax userReadings
Beitrag von: justme1968 am 04 Februar 2014, 09:28:56
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
Titel: Antw:Syntax userReadings
Beitrag von: betateilchen am 04 Februar 2014, 09:46:43
ZitatWenn 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?

Nur mit einem Notify.
Titel: Antw:Syntax userReadings
Beitrag von: blackdevil2k1 am 05 Februar 2014, 00:15:45
so ich habe deinen vorschlag nun mal versucht umzusetzten aber wirklich weiter komme ich nicht

deiner hilfe nach müsste der string ja nun folgender maßen aussehen:

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

oder

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

allerdings bringt er dann keinen syntax error sondern setzt den STATE einfach in {ReadingsVal("Arbeitszimmer","bratwurst",0)}

er setzt den ReadingsVal befehl also nicht um sondern setzt nur den Text einfach so ein. Wo liegt mein fehler...

man ist das frustrierend

Titel: Antw:Syntax userReadings
Beitrag von: betateilchen am 05 Februar 2014, 11:06:40
was Du da machst, ist völliger Unfug. Du hast weder die Verwendung der Funktion ReadingsVal() noch das Verketten von Zeichenketten verstanden.

ReadingsVal() erwartet innerhalb der Klammer drei Dinge, die sich auf das auszulesende Reading beziehen.

1. den Namen des Devices
2. den Namen des auszulesenden Readings
3. einen (optionalen) Wert, der verwendet werden soll, falls das Reading nicht existiert.

Also zum Beispiel: ReadingsVal('Arbeitszimmer','measured-temp','')

An den ausgelesenen Wert willst Du das Wort 'bratwurst' anhängen, wir kommen also zum Thema Verketten von Zeichenketten. Das funktioniert einfach mit einem Punkt.

my $s = 'ABC'.'def';

Ergibt in der Variablen $s das Ergebnis 'ABCdef'

Wenn Du also Dein ausgelesenes Reading mit dem Wort bratwurst verbinden willst, würde das so aussehen:

my $s = ReadingsVal('Arbeitszimmer','measured-temp','').' bratwurst';

Nun musst Du Dir nur noch klar darüber werden, was Du eigentlich letztendlich tun willst - das hab ich jedenfalls bis jetzt noch nicht ganz verstanden.

Aber ich hoffe, die beiden Erklärungen helfen Dir erstmal weiter. Das ist übrigens PERL-Wissen, und hat mit fhem selbst nur bedingt etwas zu tun (ReadingsVal ist eine perl-Funktion, die von fhem bereitgestellt wird; Zeichenverkettung ist 100% perl)

Vielleicht solltest Du Dir mal ein Einsteigerbuch zu Perl anschaffen und das auch lesen :)
Titel: Antw:Syntax userReadings
Beitrag von: blackdevil2k1 am 05 Februar 2014, 15:55:10
Ich denke hier liegt ein Missverständnis vor, meine zweite frage mit dem REadingsVal, hat keinen zusammenhang mit der ersten Frage. Die verkettung von Zeichenketten habe ich verstanden und funktioniert nun auch sehr gut.

Was ich vorhabe ist mir auch noch nicht klar da ich kaum Aktoren und Sensoren besitze bisher. Daher nur rumprobieren mit Dummys und trockenübungen für mögliche szenarien.

ich wollte für weitere Syntaxprobleme nur einfach keinen weiteren Thread eröffnen.

Was ich machen möchte ist folgendes:

sobald sich der state von Arbeitszimmer ändert, möchte ich das UserReading von bratwurst (ein userReading von Arbeitszimmer) in den STATE von meinem Dummy az_temp schreiben.

Und ich dachte das kann ich mit meinem Notify realisieren.
Titel: Antw:Syntax userReadings
Beitrag von: blackdevil2k1 am 06 Februar 2014, 14:18:25
dazu kann keiner was sagen ? bin doch sicher nicht der erste der das macht