Moin!
Wie Readings angezeigt werden ist mir klar. Was mir aber bei einigen Sachen (FHEMWeb-Anzeige) fehlt ist die Uhrzeit der letzten Messung/Auslesens. Das würde ich gern in stateformat mit unterbringen - aber ich weiss nicht wie. Gibt es da was "fertiges" (Variable/Bezeichner)?
viele Hasengrüße
Thomas
https://forum.fhem.de/index.php?topic=90089.0 (https://forum.fhem.de/index.php?topic=90089.0) sollte die Lösung sein.
Beispiel:
attr Wohnzimmer stateFormat [$name:temperature] °C, [$name:humidity] %, [$name:battery], [$name:state:t]
Danke für die schnelle Antwort, meine Suche im Forum hatte die falsche Zusammensetzung der Suchworte.
Trotzdem funktioniert das bei mir nicht (Bin Lego-Spezialist: Ich setzte nur zusammen was ich hier lese, verstanden habe ich die Systematik nicht wirklich):
Das ist mein funktionierendes Stateformat:
{sprintf( "T: %.1f °C", ReadingsVal("DS18B20_FFE99A531704","temperature",0 )) }
Wenn ich jetzt folgendes mache (aus dem Link ein Beitrag höher):
{sprintf( "T: %.1f °C", ReadingsVal("DS18B20_FFE99A531704","temperature",0 )) [$name:state:t] }
bekomme ich einen Syntaxfehler
syntax error at (eval 679888) line 1, near ") ["
Ich verstehe das da was mit Klammern falsch ist, aber nicht was oder warum. Auch bei
{sprintf( "T: %.1f °C", ReadingsVal("DS18B20_FFE99A531704","temperature",0 )[$name:state:t]) }
kommt Syntaxfehler.
Hallo Thomas,
wenn Du sowieso was mit Perl machst nimm ReadingsTimestamp https://fhem.de/commandref_DE.html#perl und nicht die set magic Ersetzung
Gruß Otto
{sprintf( "T: %.1f °C", ReadingsVal("DS18B20_FFE99A531704","temperature",0 )) ReadingsTimestamp($name, "state", 0)}
Funktioniert auch nicht, es wird nur noch Datum-Uhrzeit angezeigt. Gleiches Ergebnis bei
{sprintf( "T: %.1f °C", ReadingsVal("DS18B20_FFE99A531704","temperature",0 )) ; ReadingsTimestamp($name, "state", 0)}
Otto hat mal wieder recht.
Das ist Perl und dann sollte z.B. soetwas hier gehen:
attr ESPEasy_ESP_05_DHT22 stateFormat {"Hum: ".sprintf("%.1f",ReadingsNum($name,"Humidity",0)).\
" Temp: ".sprintf("%.1f",ReadingsNum($name,"Temperature",0))." ".ReadingsTimestamp($name,"Temperature","")}
Für Dich also ungetestet:
{sprintf( "T: %.1f °C", ReadingsVal("DS18B20_FFE99A531704","temperature",0 ))." ".ReadingsTimestamp($name, "temperature", 0)}
Man kann bei dieser Art "Magic" aber auch einfach direkt die Zahl der gewünschten Nachkommastellen angeben...
[$name:temperature:r1]
commandref_DE.html#set
@Nobbynews: Ich habe den (für mich erkennbar relevanten) Teil in mein stateFormat eingesetzt - bekomme dann aber wieder nur die Temperatur.
{sprintf( "T: %.1f °C", ReadingsVal("DS18B20_FFE99A531704","temperature",0 ))." ".ReadingsTimestamp($name,"Temperature","")}
Wozu dienen die
." ".
Teile zwischen den Readings? Leerzeichen?
Deine Änderung während ich schon wieder schrieb war dann die Lösung, DANKE!
Zitat von: tho-mas am 17 April 2022, 10:14:50
Wozu dienen die
." ".
Teile zwischen den Readings? Leerzeichen?
Ja.
um bei der Perl Variante noch etwas zum möglichen Syntax beizutragen:
https://perldoc.perl.org/functions/sprintf
{sprintf( "T: %1.1f °C %2s", ReadingsVal($name,"temperature",0 ) , ReadingsTimestamp($name,"temperature",""))}
Ich bin da in euren Beispielen noch über Temperature und temperature gestolpert?
Man könnte damit auch noch die Anzeige der Uhrzeit formatieren.
und es sind nicht "nur" Leerzeichen :)
https://www.perl.com/article/8/2013/3/31/Perl-string-functions-concatenate-substring-and-split/
Hallo,
ich bekomme die Zeit des Readings mit userReadings zeit {ReadingsTimestamp($name,'<readingname>','')}
.
<readigname> mit dem Namen des Readings ersetzen. Dann erhälst Du die Zeit als reading.
Gruß
Jürgen K.
Zitat von: juergen012 am 17 April 2022, 12:27:50
mit userReadings zeit {ReadingsTimestamp($name,'<readingname>','')}
.
<readigname> mit dem Namen des Readings ersetzen.
*Grusel*
Überflüssiges Datengeschubse, und dann noch ohne trigger...
Also, im stateFormat mit sprintf funktioniert es jetzt. Dann habe ich allerdings noch stateFormat(s) der Form
Feuchte: humidity, Hell.: luminance, Temp.: temperature, UV: ultraviolet
(Das funktioniert so.)
Da funktioniert der Vorschlag von Nobbynews nicht. Probiert habe ich
ReadingsTimestamp($name, "temperature", 0)." ". Feuchte: humidity, Hell.: luminance, Temp.: temperature, UV: ultraviolet
auch das hier geht nicht:
{sprintf(ReadingsTimestamp($name, "temperature", 0)} Feuchte: humidity, Hell.: luminance, Temp.: temperature, UV: ultraviolet
Nach der von mir erkennbaren Systematik sind ja Codebeispiel 1 und 2 bzw. 3 im Prinzip gleichwertige Textausgaben, warum funktioniert der 2. und 3. Code nicht?
Es funktioniert immer nur exklusiv eine Variante: entweder String-Reading, oder "set magic" oder Perl (wobei set magic eine versteckte Perl-Variante ist).
einfach umschreiben in die Form von #1 :)
Mir war das auch nicht klar, deswegen schreib ich nochmal auf: 3 Formen:
Das Zitat aus der Doku etwas aufgehübscht:
ZitatstateFormat
Ändert den Gerätestatus, dies ist z.Bsp. in der Ausgabe des list Kommandos zu sehen, oder in der Raumübersicht von FHEMWEB. Falls nicht gesetzt, dann wird das state Reading übernommen.
- Sonst werden alle Wörter im Wert des Attributes durch das entsprechende Reading des Gerätes ersetzt (soweit vorhanden). Temperatur: temperature °C
- Falls der Wert in {} eingeschlossen ist, dann wird es als Perl Ausdruck ausgewertet. Die Auswertung passiert bei jeder Änderung eines Readings.{"Temperatur: ".ReadingsNum($name,'temperature',0,1)." °C"}
- Die hier beschriebene "set magic" wird auch angewendet. Temperatur: [$name:temperature:r1] °C
Hinweis: Manche Module aktualisieren STATE ganz oder teilweise direkt. In diesen Fällen kann es zu abweichenden Anzeigen kommen.
@ Otto:
Dann müßte doch das hier auch funktonieren:
{ReadingsTimestamp($name, "temperature", 0)} Feuchte: humidity, Hell.: luminance, Temp.: temperature, UV: ultraviolet
Macht aber nicht, es werden die Variablennamen (nicht deren Inhalte) angezeigt. Ich bekomme beim speicherversuch (Klick auf "attr") eine Fehlermeldung "Sysntax Error near .:".
"Exklusiv" meinte: "exklusiv"... Edit: also nicht: gemischt.
@Otto123: falls du noch rumtesten willst - multiline ist die Steigerung ::) :P
Edit: Die direkte Perl-Variante ist m.E. die effizienteste, und wer keine Icons haben will und das nur für das FHEMWEB-Frontend braucht, kann das ganze pure-Perl nach devStateIcon verfrachten...
das in der Doku nicht extra exklusiv oder oder erwähnt wird, bedeutet nicht, dass da im Umkehrschluss vermischt irgendwo versteckt stehen könnte ;)
siehe Antwort #1
[$name:temperature:t] Feuchte: [$name:humidity], Hell.: [$name:luminance], Temp.: [$name:temperature], UV: [$name:ultraviolet]
Danke Otto, auf das nachgestellte "t" (für Time) muß man erst mal kommen.
Okay, dann noch die Königsfrage in dieser Diskussion: Geht "t" auch kürzer, also nicht volles Datum, sondern nur Uhrzeit im Format hh:mm?
Zitat von: tho-mas am 17 April 2022, 19:36:28
Danke Otto, auf das nachgestellte "t" (für Time) muß man erst mal kommen.
das stand aber wie gesagt schon in der ersten Antwort auf Deine erste Frage :)
was geht steht alles hier https://fhem.de/commandref_DE.html#set
Was Du willst geht mMn nur mit Perl oder den Umweg mit einem weiteren Reading - wird also aufwendiger.
Zitat von: tho-mas am 17 April 2022, 19:36:28
Geht "t" auch kürzer, also nicht volles Datum, sondern nur Uhrzeit im Format hh:mm?
Wie Otto schon meinte, mir fällt dazu auch nur eine Lösung in Perl ein.
attr ESPEasy_ESP_05_DHT22 stateFormat {"Hum: ".sprintf("%.1f",ReadingsNum($name,"Humidity",0)).\
" Temp: ".sprintf("%.1f",ReadingsNum($name,"Temperature",0))." ".\
substr(ReadingsTimestamp($name,"Temperature",""),11,5)}
Zitat von: Otto123 am 17 April 2022, 19:48:01
das stand aber wie gesagt schon in der ersten Antwort auf Deine erste Frage :)
Da habe ich nur die eckigen Klammern gesehen... HAbe bitte Nachsicht mit einem älterem Herrn, der nicht immer den Überblick hat.
Frohe Ostern naoch an alle Antworten.
Die zuletzt genannte Perllösung einfacher notiert 8):
{sprintf('Hum: %.1f Temp: %.1f %s',ReadingsNum($name,'Humidity',0),ReadingsNum($name,'Temperature',0),substr(ReadingsTimestamp($name,'Temperature',0),11,5))}
siehe dazu meine Anmerkung in #9 ;)
Gestehe erst auf der zweiten Seite angefangen zu haben zu lesen, den Anfang nur überflogen :)
edit:
Wenn man nicht angemeldet ist sinds bereits zwei Seiten, angemeldet bis jetzt nur eine, fällt mir gerade auf.
mir ging es da noch um T vs t ;) - sonst funktioniert es ja wieder nicht ...
Zitat von: Otto123 am 18 April 2022, 08:16:34
mir ging es da noch um T vs t ;) - sonst funktioniert es ja wieder nicht ...
??
Ist
Temperature != temperature
gemeint?