Hallo,
ich habe folgende Readingsgroup:
defmod rg_test readingsGroup TYPE=PRESENCE:+ADDRESS,presence:sec,presence,state
attr rg_test valueStyle {($READING eq "presence") ? 'style="color:red"' : 'style=""'}
Also 4 Werte pro Device. Eines davon sollte separat behandelt werden. Hier exemplarisch über das valueStyle Attribut: Der Wert soll im Beispiel einfach rot werden.
Es werden aber 2 Werte rot.
Ist das ein Fehler bei der Belegung der Variable $READING? Die Variable ist für beide Werte (presence:sec und presence) gleich belegt.
Gibt es noch eine andere Variable, die ich abfragen könnte, um die beiden Werte zu unterscheiden? Also sowas wie $COL ?
Gibt es denn wirklich ein reading namens presence:sec?
Vielleicht zeigst Du mal ein list eines beteiligten devices?
(Bitte in code tags)
Danke für deine Antwort! Hier eines der dargestellen Devices:
defmod Pres_Router_Main PRESENCE lan-ping 192.168.0.1 251
Es produziert die Readings model, presence, state.
presence:sec ist ja eine Darstellungsform des Timestamps des Readings presence. Daher ist $READING vermutlich auf presence gesetzt.
Aber dann kann man die Werte nicht mehr unterscheiden.
Im oben genannten Beispiel könnte man einfach auf state:sec ausweichen. Das geht aber nicht beim realen Device, siehe
https://forum.fhem.de/index.php/topic,78772.0.html
Das ist kein list des devices - Befehl list <name des devices) sondern die Definition - das hilft nicht.
Aber Deine Vermutung ist richtig das :sec hat mit dem Namen des Readings nichts zu tun, also ist hier auch keine Unterscheidung möglich, denn es ist dasselbe Reading. Es gibt also keine vier Werte/Readings pro device sondern nur drei. und :sec ist eine spezielle Funktion
Also wenn ich es richtig verstehe möchtest Du in der RG eine Spalte rot einfärben und zwar da wo das reading presence steht?
Das lässt sich wohl einfacher mit cellStyle erledigen also vermutlich
attr rg_test cellStyle { "c:3" => 'style="color:red"' }
ohne dasa jetzt ausprobiert zu haben
Ah, verstehe. Hier der list:
Internals:
ADDRESS 192.168.0.1
CHANGED
DEF lan-ping 192.168.0.1 251
MODE lan-ping
NAME Pres_Router_Main
NOTIFYDEV global
NR 70
NTFY_ORDER 50-Pres_Router_Main
STATE present
TIMEOUT_NORMAL 251
TIMEOUT_PRESENT 251
TYPE PRESENCE
READINGS:
2017-11-04 00:50:43 model lan-ping
2017-11-04 12:19:22 presence present
2017-11-04 12:19:22 state present
helper:
CURRENT_STATE present
PRESENT_COUNT 0
Attributes:
devStateIcon present:10px-kreis-gruen absent:10px-kreis-rot
event-on-change-reading .*
sortby a
Nun das mit dem rot einfärben war nur ein Beispiel um das Problem zu veranschaulichen.
Tatsächlich möchte ich
presence als Icon anzeigen und
presence:sec vor der Anzeige von einer eigenen Funktion überarbeiten lassen, um es lesbarer zu gestalten. Es gehört also in valueFormat rein.
Eine Lösung wäre eine Variable wie $COLUMN, die sich statt $READING einsetzen lässt. Oder $READING würde nicht auf den Namen des zugrundeliegenden Readings gesetzt (presence), sondern auf den kompletten Ausdruck (presence:sec).
Deshalb ist es so wichtig zu beschreiben, was man machen möchte, denn dann kann man besser helfen.
Du kannst hier (z.B.) mit valueSuffix arbeiten und nur eine Spalte presence haben und das Alter dann in valueSuffix hinzufügen als perl-Ausdruck.
Es gibt so ein Beispiel wo das gemacht wird (und auch mit Icons in derselben Spalte kombiniert im wiki zu readingsgroup:
https://wiki.fhem.de/wiki/ReadingsGroup (https://wiki.fhem.de/wiki/ReadingsGroup)
(als batteriewert und batterieicon bei heatinginfo)
Das wiki kann ich sowieso empfehlen zum lernen
Achso und eine kleine Anmerkung - im Threadtitel deutest Du einen Fehler im Modul an, das finde ich eigentlich etwas zu stark, da wäre ich etwas zurückhaltender
Ok mit valueSuffix könnte man es hinbasteln, ich verstehe. Hey, natürlich lese ich das Wiki, ich will ja niemanden mit Trivialfragen nerven.
Ja vielleicht hast du recht dass der Titel zu stark formuliert war. Sorry. Der Punkt ist aber doch, dass readingsGroup dazu dienen, Informationen zu sammeln und übersichtlich darzustellen. Ein bisschen wie eine SQL Abfrage. Im Gegensatz zu einer SQL Abfrage kann man sehr elegant jedes kleine Detail einstellen, sogar Farbe und Maßeinheiten.
Wenn dabei aber keine Unterscheidung zwischen dem Wert eines Readings (presence) und seine Entstehungszeit (presence:sec) möglich ist, was mir viel elementarer und wichtiger erschien, dann ist das doch ein Fehler in der Variablen, mit der sich die Werte / Spalten eigentlich unterscheiden lassen, so mein Gedanke.
Gut, diese Variable heißt $READINGS und enthält genau das, was ihr Name verspricht, so gesehen ist es kein Fehler.
Aber nach wie vor denke ich, dass readingsGroup doch zwischen einem Wert und seinem Timestamp unterscheiden können müsste. Es fühlt sich irgendwie falsch an, den Timestamp als Maßeinheit zu tarnen.
Ich teile Deine Meinung an der Stelle nicht, das ist aber nicht relevant hier, denn es geht ja nicht um Umgangsformen und die Diskussion wäre OT
Schön, dass es funktioniert
Die Lösung mit valueSuffix hat leider den Nachteil, dass die Werte damit nicht mehr tabellarisch untereinander stehen.
Ich habe das jetzt erst mal über die 99_myUtils.pm realisiert. Alles mit $READING eq presence wird der Funktion zur Lesbarmachung von Timestamps übergeben. Diese Funktion entscheidet dann, ob es einen Reading-Wert oder einen Reading-Timestamp erhalten hat.
Danke für deine Mühe!!!
Eine weitere Lösung ist mir noch eingefallen:
Du könntest an den presence devices ein userreading mit dem Wert von presence anlegen (z.B. prescopy)
Dann hast Du zwei verschiedene Readings und könntest prescopy anzeigen und presence:sec anzeigen und hättest jeweils einen anderen Wert von $READING
Ja, das ist eine sehr gute Idee! Danke.
Mit diesem Code stelle ich in allen PRESENCE-Devices das Reading presence unter anderem Namen (presence2) noch einmal zur Verfügung:
attr TYPE=PRESENCE userReadings presence2 { ReadingsVal( $name, "presence", "") }