Fehler in $READING?

Begonnen von hopgeq, 03 November 2017, 20:58:17

Vorheriges Thema - Nächstes Thema

hopgeq

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 ?


viegener

Gibt es denn wirklich ein reading namens presence:sec?

Vielleicht zeigst Du mal ein list eines beteiligten devices?
(Bitte in code tags)
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

hopgeq

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

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

hopgeq

#4
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).


viegener

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
(als batteriewert und batterieicon bei heatinginfo)

Das wiki kann ich sowieso empfehlen zum lernen
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

hopgeq

#7
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.


viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

hopgeq

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!!!

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

hopgeq

#11
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",  "")  }