Autor Thema: update readingsGroup (zeilen/spalten summe,min,max,durchschnitt,...)  (Gelesen 18173 mal)

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 21292
anbei ein test version von readingsGroup mit folgenden neuen möglichkeiten:
  • es ist möglich mit den reading werten in den zellen zu rechnen.
    d.h. z.b. summen oder mittelwerte über zeilen oder spalten zu bilden. wenn sich ein reading ändert und per longpoll aktualisiert wird werden auch alle davon abhängigen/abgeleiteten werte per longpoll aktualisiert.
  • in allen attributen die einen hash verstehen gibt es jetzt die möglichkeit einen default wert anzugeben.
    dieser wird verwendet wird wenn kein spezielleres mapping greift hierfür wird ein leerer string als key angegeben: { '' => <default> }. es ist somit für einfache fälle nicht mehr nötig auf perl code auszuweichen.

das rechnen funktioniert über ein neues flag $ mit dem eine funktion angegeben werden die auf beliebige kombination von zeilen, spalten und einzelnen zellen angewendet wird. ähnlich wie in einer tabellenkalkulation.

ein beispiel:define rg readingsGroup .*:temperature rg:$avg hier wird eine readingsGroup über alle temperature readings definiert. in einer zusätzlichen zeile am ende wird mit $avg der durchschnittswert aller darüber liegenden temperaturen angezeigt.

das genaue format: $<operator>[(<zellen>)] mit
  • <operator>: sum,avg,min,max,scalar oder der name einer beliebigen anderen funktion die ein array mit allen werten übergeben bekommt und eine ergebnis wert zurück liefert.
  • <zellen>: ist eine durch semikolon getrennte liste aus <zeilen>:<spalten> paaren.
    <zeilen> und <spalten> sind jeweils eine perl liste. d.h. hier können
    • einzelne werte,
    • durch komma getrennte aufzählungen,
    • mit .. angegebene wertebereiche
    • $ROW und $COLUMN bezeichnen die aktuelle zelle
    verwendet werden.
alle möglichkeiten sind kombinierbar. die zählung der zeilen und spalten beginnt bei 1. eine nicht vorhandene zeilen angabe wird durch den bereich von zeile 1 bis zur aktuellen zeile ersetzt, eine nicht vorhandene spalte durch die aktuelle spalte.

es ergeben sich somit unter anderem folgende möglichkeiten:
$sum equivalent zu $sum(1..$ROW), $sum(:$COLUMN) und $sum(1..$ROW:$COLUMN) die summe werte in der spalte über der aktuellen zelle.
$max($ROW:1..$COLUMN-1) maximum aller werte in der zeile links von der aktuellen zelle
$avg(1..$ROW:1) durchschnitt aller werte in spalte 1 bis zur aktuellen zeile
$scalar(:1) anzahl der werte in spalte 1
$min(1..5:1,2,4) minimum der werte aus den zeilen 1-5 in den spalten 1, 2 und 4

eigene funktionen lassen sich über 99_myUtils anlegen und z.b. verwenden um häufigkeiten zu zählen oder mit nicht numerischen redings umzugehen.

die ergebnisse werden im weiteren wie normale readings behandelt und lassen sich über valuePrefix, valueSuffix, valueFormat und valueStyle in der darstellung beeinflussen. also z.b. einfärben,  als balken diagramm darstellen, ...

mit hilfe der funktionalität zum auf und zu klappen von teilen einer readingsGroup lassen sich z.b. im zusammengeklappten zustand summen, extremwerte oder andere ausreißer anzeigen und die details nur beim aufklappen zeigen.


wichtig:
  • zur zeit kann eine zelle nur auf werte die links und oberhalb davon liegen zugreifen. die ergebnisse stehen also vor allem rechts und unten. intern ist aber schon das meiste darauf vorbereitet das zu ändern.
  • die longpoll aktualisierung für abhängige werte funktioniert zur zeit nur für direkt von device readings abhängige werte.
    d.h. man kann zwar die berechnung kaskadieren, diese kaskadierten werte werden aber noch nicht per longpoll aktualisiert.
  • die nummerierung der zellen hat sich in spezialfällen etwas geändert. dies könnte einfluss auf bestehende cellStyle definitionen haben.

fragen:
  • welche anwenungsfälle gibt es noch?
  • aktuell wird auf den 'original' readings gerechnet. sollte auch auf den durch valueFormat geänderten werten gerechnet werden können?
  • was fehlt sonst noch?

gruss
  andre

update 06.05.2015:
  • neues attribut firstCalcRow
    hiermit kann default für nummer die erste zeile vorgegeben werden sofern im ausdruck nichts genaueres angegeben ist gesetzt werden. firstCalcRow kann man z.b. auf 2 setzen wenn in der readingsGroup spalten überschriften verwendet werden.
  • neues special <hr> um eine horizontale linie über die volle breite einzufügen
  • über ein angehängtes @<alias> kann einem rechenergebniss ein alias name gegeben werden.
    über diesem alias namen kann der wert dann zur formatierung mit den value attributen angesprochen werden
  • das alwaysTrigger attribut kann jetzt auch den wert 2 bekommen. damit werden in der readingsGroup readings für alle durch aggregation gebildeten werte und entsprechende events erzeugt. auch wenn die readingsGroup nicht angezeigt wird. wenn ein alias name vergeben ist wird dieser auch für den reading namen verwendet.
  • es gibt eine neuen operator $count(<wert>)(<zellen>) um das vorkommen von <wert> in den angegebenen zellen zu zählen. <wert> kann enweder direkt der zu zählende wert sein (ohne anführungzeichen) oder eine in / eingeschlossene regex.
  • die longpoll aktualisierung von kaskadierten zellen funktioniert jetzt
  • wenn das gleiche reading mehrfach in einer radingGroup verwendet wird werden nicht mehr mehrfache events erzeugt
  • die formatierung der ergebniswerte bei der longpoll aktualisierung ist repariert

mit dem folgenden kleinen beispiel kann man die meisten der neuen features in aktion sehen:define rg readingsGroup <>,<value>,<sum>,<min>,<max>,<avg>\
t\d:+NAME,state,$sum(1..$ROW:2),$min(1..$ROW:2),$max(1..$ROW:2),$avg(1..$ROW:2)\
<hr>\
rg:<>,$scalar,$sum(:2)@SUM,$min(:2)@MIN,$max(:2)@MAX,$avg(:2)@AVG\
<hr>\
t1:<t1,t2,t3>,state,state@t2,state@t3,$sum($ROW:2..4)@SUM,$count(/\d/)(2..$ROW-4:2)\
 
attr rg nonames 1
attr rg room rg
attr rg style style='text-align:center'
attr rg valueFormat { 'avg' => '%.2f', 'AVG' => '%.2f' }
attr rg valuePrefix { 'rg.scalar' => '#', 'rg.SUM' =>'&Sigma;; ', 'rg.MIN' =>'Min: ', 'rg.MAX' =>'Max: ', 'rg.AVG' =>'&empty;; ', 'rg.count' => '#(X): ' }
attr rg valueSuffix { state => '&deg;;C' }

define t1 dummy
attr t1 room rg
attr t1 setList state:slider,-10,1,30
attr t1 webCmd state
define t2 dummy
attr t2 room rg
attr t2 setList state:slider,-10,1,30
attr t2 webCmd statedefine t3 dummy
attr t3 room rg
attr t3 setList state:slider,-10,1,30
attr t3 webCmd state

die drei dummys lassen sich über slider im wert verändern. die readingGroup zeigt in der value spalte die werte der dummys an, in der sum spalte die summe der elemente in der ersten spalte bis zu dieser zeile, die min, max und avg spalten entsprechend. die darauf folgende zeile zeigt die anzahl der werte in spalte 1 und noch mal die min, max und avg werte, die letzte zeile noch mal die drei readings, die die summe und die anzahl der werte in denen eine dezimal zahl vor kommt.

bei änderung der werte über die slider werden alle abhängigen werte per longpoll aktualisiert.

edit: die hier beschriebenen features sind inzwischen teil des 'offiziellen' moduls.
« Letzte Änderung: 07 Oktober 2015, 16:45:00 von justme1968 »
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, …

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

Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2134
Hi Andre,

danke für die Erweiterung...
Ich habe das gerade mal angetestet, und ein paar Bemerkungen:
- Mit welchem Schlüssel kann ich denn z.B. diese valueStyle-Anweisungen verwenden? Ich versuche damit dann dem Ergebnis z.B. ein %-Zeichen anzuhängen oder eine rechtsbündige Ausgabe zu erreichen...
Irgendwie habe ich ja keinen Readings-Namen dazu :)

- Ich fände es super, wenn man den Perl-Code zum Umrechnen von Readings-Werten in rechenbare Werte direkt in der ReadingsGroup angeben könnte. Ich mag es nicht, wenn immer irgendeine Rechnung dann noch in meiner Utils rumfliegt :)

Man könnte ja z.B. ein Attribut valueConverter einführen, der für jede Spalte (Mechanik dabei wie bei allen andern value... Attributen auch) die Möglichkeit einer einfachen oder per Perl-Code angegebenen Umrechnung vornimmt.
Dieses Attribut wird dann immer erstmal auf den zu rechnenden ReadingsWert angewendet, und das Ergebnis dann an deine Aggregat-Funktion übergeben (bzw. in das Interne Array geschrieben).

Damit könnte man die Standard-Rechnungen noch schlanker und direkter in der ReadingsGroup selbst abwickeln...

- Irgendwie stimmt die Spaltenzählung nicht ganz, bzw. ist nicht konsistent.
Wenn ich z.B. in der Zeilen-Definition für die Summe o.ä. einen eigenen Titel verwenden möchte:
define rg readingsGroup <Name>,<Modus>,<Wunschtemperatur>,<Ventilstellung> type=HeatingThermostat:mode,desiredTemperature,valveposition rg:<MaxVentil>,<>,<>,$max(:$COLUMN)
Dann aggregiert er irgendwas, und zeigt in meinem Fall kein Ergebnis an. Wenn ich eins von den leeren <> wegnehme, dann steht das Rechenergebnis eine Spalte zu weit links aber korrekt berechnet.

Wenn ich es so schreibe:
define rg readingsGroup <Name>,<Modus>,<Wunschtemperatur>,<Ventilstellung> type=HeatingThermostat:mode,desiredTemperature,valveposition rg:<MaxVentil>,<>,<>,$max(:3)
Geht es (wobei 4 der logischere Wert wäre :) )
Das liegt wohl daran, das die Zeilenausgabe der ersten Spalte (des Devices z.B.) nicht mitgezählt wird. Wenn ich diese Spalte aber selber beschreibe (mit der <>-Schreibweise), dann zählt sie wohl mit.

Mal konkret mein Beispiel zum Verdeutlichen:
Im Anhang mal ein Screenshot zu folgender Definition:
define heizung_Sammler_Stellventile readingsGroup <Name>,<Modus>,<Wunschtemperatur>,<Ventilstellung> type=HeatingThermostat:mode,desiredTemperature,valveposition heizung_Sammler_Stellventile:<Max.&nbsp;Ventilstellung>,<>,<>,!calculatedValue heizung_Sammler_Stellventile:<Test1>,<>,$max(:$COLUMN) heizung_Sammler_Stellventile:<Test2>,<>,<>,$max(:3)
Die erste Max-Spalte ist das "alte" Format, ohne deine Aggregat-Funktionalität.

- Was ich mir für später noch vorstellen könnte, wäre diese Aggregat-Ergebnisse auch ausserhalb der ReadingsGroup verwenden zu können.
In meinem Beispiel berechne ich ja z.B. das Maximum der Öffnungsgrade aller Stellventile. Das ist als Info ja ganz nett, aber eigentlich würde ich den Wert später gerne dazu verwenden, z.B. die Heizungsumwälzpumpe bei einem Maximum von 0% nach kurzer Zeit abzuschalten, bzw. bei Bedarf über 0% wieder anzuschalten. Das wäre ja eine Super-Aufgabe für ein DOIF, aber dann muss ich mir das Maximum wieder selber berechnen... es sei denn, es gäbe eine Abfragemöglichkeit dieses Rechenergebnisses durch das DOIF (oder auch andere)-Module. Dann hätte man das an einer Stelle, sozusagen wie so ein ReadingsProxy, nur eben ein Readings-Aggregat-Proxy...

Aber eine Supersache das ganze... Das geht genau in die richtige Richtung, danke dafür :)

Grüße
Reiner

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 21292
das 'reading' heißt wie die funktion. (ich weiß das man damit nich nicht die gleiche operation unterschiedlich mappen kann).

zum anhängen von einheiten ist übrigens valueSuffix besser als valueStyle.

so etwas wie valueConverter will ich noch einbauen. valueStyle soll dann nur noch fürs formatieren sein.

das aggregieren von konvertierten werten ist im prinzip schon drin. nur noch nicht aktivierbar weil ich noch keine idee für die syntax habe. intern werkt readingsGroup sich für alle zellen den originalwert und den durch valueFormat aufbereiteten.

zur nummerierung: zeilen fangen bei 1 an. wenn du spaltenüberschriften hast musst du 2..$ROW-1: verwenden.

spalten fangen auch bei 1 an wobei der default zeilentitel als 0 zählt. wenn man nonames umschaltet ändert sich die nummerierung hier nicht. eigene <> tags zählen aber mit. bei einem <> als erstes reading in einer zeile gibt es diverse ungereimtheiten aus gründen der rückwärstkompatibilität. ich weiß noch nicht ob und wie ich das normalisieren kann. damit bin ich noch nicht zufrieden.

ich hatte schon etwas drin um nicht numerische readings automatisch auszublenden. das hat mir aber noch nicht gefallen weil dann so etwas wie on/off nicht mehr in einer eigenen routine behandelt werden kann. das sollte mit valueConverter erledigt sein.

das problem am außerhalb verwenden ist das per default die readingsGroup alles weg optimiert sobald sie nicht gerade in einem browser sichtbar ist. es gibt zwar schon ein allwaysTrigger Attribut aber dann fehlt immer noch der start zustand. aber im prinzip wäre aber fast alles schon da.

gruß
 andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, …

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

Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2134
Hi Andre,

Danke für die Infos.
Zu dem valueStyle und valueFormat: das wird einmal Initial verwendet. Wenn aber eine Aktualisierung per longpoll passiert, verschwinden diese Angaben aus der Anzeige wieder, und es werden nur die reinen Werte angezeigt.
Deswegen war mir das mit der korrekten Angabe des Schlüssels nicht aufgefallen, da ich immer zu spät geschaut hatte. Ich hatte da schon die richtig Vermutung für den Schlüssel :)

Zu der externen Verwendung: ich dachte auch eher an eine Art "virtuelles Reading", also ein Aufruf der internen Funktionen, die dann die Werte ausrechnen, ohne dass da was angezeigt werden würde, Inkl. Longpoll... Aber ich kenne deine interne Struktur natürlich nicht.
Damit hätten die Werte auch gleich einen"sauberen" Namen für diese ganzen value...-Attribute, und alle Module könnten die Ergebnisse weiterverwenden.
Ich fand die Idee nur gut, das ich die Art der Berechnung nicht mehrfach irgendwo stehen hätte (ich hätte ja schon meine Prozedur zum Berechnen da), und diese dann immer identisch ausgeführt werden würde, wenn ich sie an der zentralen Stelle ändere (natürlich Inkl. des Vorteils von Longpoll/Events für diese Readings).

Wenn ich was testen soll, sag Bescheid...

Grüße
Reiner

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 21292
du hast recht mit der fehlenden formatierung bei der longpoll aktualisierung. die ist kurz vor dem hochlanden noch einer iptimierung zum opfer gefallen.

das ist aber ein wunderbarer anlass alles auf den kopf zu stellen und die optimierungen und aufräumsrbeiten dir schon lange auf der todo liste stehen noch mit zu machen.

demnächst also alles neu und effizienter :)

die externe verwendung ist glaube ich über events notifys besser umgesetzt als über eine schnittstelle auf die internen werte die ja dann auch erst mal getriggert werden müsste.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, …

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

Offline Elektrolurch

  • Hero Member
  • *****
  • Beiträge: 1631
Hallo Reiner,

Zitat:
Man könnte ja z.B. ein Attribut valueConverter einführen, der für jede Spalte (Mechanik dabei wie bei allen andern value... Attributen auch) die Möglichkeit einer einfachen oder per Perl-Code angegebenen Umrechnung vornimmt.
Dieses Attribut wird dann immer erstmal auf den zu rechnenden ReadingsWert angewendet, und das Ergebnis dann an deine Aggregat-Funktion übergeben (bzw. in das Interne Array geschrieben).

vielleicht habe ich das Problem nicht ganz verstanden, aber valueFormat kann doch  perl enthalten:

valueFormat {'reading1' => '{perl ... $VALUE...}', ...}

damit kann ich doch Konvertieren.
Damit wäre auch die Frage von Andre beantwortet, ob die Aggregatfunktionen direkt den Wert oder das Ergebnis von ValueFormat verwenden sollen.
Meiner Meinung nach das Letztere.

Gruß


Elektrolurch

configDB und Windows befreite Zone!

Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2134
Hi Elektrolurch,

es geht mir hier um zwei verschiedene Converter. Einen für die Anzeige, und einen für die Berechnung.

Am Beispiel der Fensterkontakte z.B. möchte ich in der Übersicht gerne weiterhin "open" oder "closed" sehen, aber trotzdem eine Summe über alle geöffneten Fenster erhalten (also mal eine Umwandlung von open=>1 und closed=>0, oder aber auch mal umgekehrt, also open=>0 und closed=>1, je nach Anwendungsfall)

Oder im Falle der Batteriezustände in der Anzeige "OK" oder "Low" (oder was anderes, was ich bislang noch nicht gesehen habe :) ), aber auch dort eine Summe über die Anzahl der nicht-ok-Komponenten.

Oder bei meinen Heizungsventilen in der Anzeige eine Umwandlung in Prozentdarstellung (z.B. "7 %"), in der Berechnung des Maximalwertes dann aber als Zahl...

Grüße
Reiner

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 21292
ich denke auch es sollten zwei converter möglich sein. einen zur anzeige und einen zum rechnen bzw. eventuell sogar aufeinander aufbauend.

die fälle bei denen aber nur die häufigkeit von bestimmten werten gezählt wird wurde ich über eine allgemeine count routine einbauen.
etwas in der art: ...,$count(<wert>)(<zeilen>:<spalten>),... womit die anzahl an <wert> werten in den angegebene zellen gezählt wird. wert kann dann als zahl, als string, als regex oder als perl funktion angegeben werden. mit zahl, string und regex sollte man alle fälle wie in/off/open/closed/ok/!= ok/... abdecken können und über die perl code variante kann man dann z.b. auch zählen wieviele werte eine bestimmte grenze über oder unter schreiten.

mir ist vorhin noch eine idee gekommen wie man die zellen mit den summen selbst mit einem alias namen versehen kann. diesen kann man dann im mapping verwenden um unterschiedliche summen unterschiedlich zu formatieren der alias ist aber auch für die events zur verwendung ausserhalb der readingsGroup wichtig weil ich so konfigurieren mit welchem namen die events erscheinen und in verbindung mit der zähl funktion kann ich noch bedingungen einbauen um z.b. das erscheinungsbild dynamisch vom auftreten ok/nicht ok werten zu machen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, …

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

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 21292
im ersten post gibt es eine neue version mit den folgenden neuen features:update1:
  • neues attribut firstCalcRow
    hiermit kann default für nummer die erste zeile vorgegeben werden sofern im ausdruck nichts genaueres angegeben ist gesetzt werden. firstCalcRow kann man z.b. auf 2 setzen wenn in der readingsGroup spalten überschriften verwendet werden.
  • neues special <hr> um eine horizontale linie über die volle breite einzufügen
  • über ein angehängtes @<alias> kann einem rechenergebniss ein alias name gegeben werden.
    über diesem alias namen kann der wert dann zur formatierung mit den value attributen angesprochen werden
  • das alwaysTrigger attribut kann jetzt auch den wert 2 bekommen. damit werden in der readingsGroup readings für alle durch aggregation gebildeten werte und entsprechende events erzeugt. auch wenn die readingsGroup nicht angezeigt wird. wenn ein alias name vergeben ist wird dieser auch für den reading namen verwendet.
  • es gibt eine neuen operator $count(<wert>)(<zellen>) um das vorkommen von <wert> in den angegebenen zellen zu zählen. <wert> kann enweder direkt der zu zählende wert sein (ohne anführungzeichen) oder eine in / eingeschlossene regex.
  • die longpoll aktualisierung von kaskadierten zellen funktioniert jetzt
  • wenn das gleiche reading mehrfach in einer radingGroup verwendet wird werden nicht mehr mehrfache events erzeugt
  • die formatierung der ergebniswerte bei der longpoll aktualisierung ist repariert

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

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

Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2134
Hi Andre,

da konnte ich doch nicht widerstehen :)

Das sieht super aus. Danke für die Erweiterungen.
Eine Frage habe ich aber noch zu der Count-Möglichkeit:
Ich habe die ReadingsGroup für meine Batteriezustände auf die neue Count-Variante umgestellt.
Dabei habe ich zwei Zahlen drunter: Einmal für OK, und eine für alle anderen.

Nun bekomme ich den regulären Ausdruck für "Nicht-OK" irgendwie nicht hin.
Im Normalfall braucht man doch nur eine negative Lookahead-Anweisung. Nur funktioniert die hier nicht.
Kann es sein, dass irgendwelche Zeichen verschluckt werden?
In der Zeile wird einfach eine "0" angezeigt.
define global_batteries readingsGroup <Device>,<Zustand>,<Zeitstempel> <hr> .*:(b|B)attery <hr> global_batteries:<Anzahl&nbsp;OK>,$count(ok)(:1)@countok global_batteries:<Anzahl&nbsp;nicht&nbsp;OK>,$count(/^(?!ok)/)(:1)@countnotok

Danke schon mal für deine Hilfe...

Edit/Nachtrag:
Diese Count-Werte werden nicht per longpoll aktualisiert? Oder muss ich dazu noch extra was einstellen?

Grüße
Reiner
« Letzte Änderung: 06 Mai 2015, 22:31:02 von Reinerlein »

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 21292
das problem sind die klammern.

die regex zum parsen des kompletten ausdrucks ist noch nicht auf verschachtelte klammern ausgerichtet. ich muss mal schauen wie das am besten zu lösen ist.

bis dahin habe ich eben noch eingebaut das man auch !<wert> verwenden kann. dann wird gezählt wie oft der wert nicht vorkommt. update ist im ersten beitrag.


die count werte sind nicht anders als die anderen ausdrücke. bei mir werden sie auch per longpill aktualisiert. wenn etwas nicht geht versuch bitte mal es mit ein paar dummys nachzustellen. zum beispiel mit dem beispiel :) aus dem ersten post. du kannst hier das \d in count z.b. durch 10 ersetzen und die slider betätigen. count sollte immer aktuell sein.

gruss
  andre

ps: bei den beiden count zeilen solltest du 1..$ROW-1:1 bzw 1..$ROW-2:1 verwenden. sonst wird zumindest bei der zweiten die erste mit gezählt.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, …

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

Offline fruit

  • Full Member
  • ***
  • Beiträge: 289
Antw:update readingsGroup (zeilen/spalten summe,min,max,durchschnitt,...)
« Antwort #11 am: 14 August 2015, 11:22:32 »
I hope this is the right thread for this.

I have been playing around with the $max and $min functions, I realise they and the other calcs are still experimental but they look very useful.
So many useful possibilities with this module!

My first issue is how to reset them (perhaps at midnight) - it is not clear to me from the wiki using google translate :(

My second is that I am trying to use $max and $min for both temp and humidity readings from panStamps.
The values seem correct but I cannot format them correctly using valueFormat as I have it now.
I can understand why it is using the last named format but cannot see how to distinguish the two occurences - perhaps it is not possible at all and best not to format.
define RoomInfo readingsGroup <%status_comfort>,<Temperature>,<|>,<Max temp>,<|>,<Min temp>,<|>,<rHumidity>,<|>,<Max hum>,<|>,<Min hum>,<|>,<aHumidity>,<|>,<Dewpoint> \
SWAP.(0A|0B|0C|0D|0E):,temperature,<|>,$max(1..$ROW:1),<|>,$min(1..$ROW:1),<|>,humidity,<|>,$max(1..$ROW:7),<|>,$min(1..$ROW:7),<|>,absFeuchte,<|>,dewpoint
attr RoomInfo mapping %ROOM
attr RoomInfo nameStyle style="color:black;;font-weight:bold"
attr RoomInfo room Heat_Control,SWAP
attr RoomInfo valueFormat { temperature => "%.1f&deg;;C", max => "%.1f&deg;;C", min => "%.1f&deg;;C", humidity => "%.1f %%", max => "%.1f %%",  humidity => "%.1f %%", min => "%.1f %%", absFeuchte => "%.1f %%", dewpoint => "%.1f&deg;;C"}
attr RoomInfo valueStyle { if($READING eq "temperature" && $VALUE > 23){ 'style="color:red;;;;font-weight:bold;;;;text-align:center"' }elsif( $READING eq "temperature" && $VALUE <= 20 ){ 'style="color:blue;;;;text-align:center"' }elsif( $READING eq "humidity" && $VALUE > 65 ){ 'style="color:red;;;;font-weight:bold;;;;text-align:center"' }elsif( $READING eq "humidity" && $VALUE < 60 ){ 'style="color:blue;;;;text-align:center"' }else{ 'style="color:black;;;;text-align:center"' } }
Feel free to follow up in German if you prefer

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 21292
Antw:update readingsGroup (zeilen/spalten summe,min,max,durchschnitt,...)
« Antwort #12 am: 14 August 2015, 11:32:57 »
1. you would not reset the readingsGroup but the source values. the readingsGroup just does calculations based on all current readingValues across multiple devices. not on the history of values.

for a calculations over time this would be done with userReadings or one of the statistics (average,statistics,rain,...) modules in the original device. and then these values from multiple devices would be used in a readingsGroup.


2. you can append a @<alias> to the definition of a calculated value and then use this name in the subsequent value... attributes for formatting.
« Letzte Änderung: 14 August 2015, 11:46:24 von justme1968 »
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, …

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

Offline fruit

  • Full Member
  • ***
  • Beiträge: 289
Antw:update readingsGroup (zeilen/spalten summe,min,max,durchschnitt,...)
« Antwort #13 am: 14 August 2015, 11:51:21 »
1. you would not reset the readingsGroup but the source values.
Much clearer thanks - and google translate was not so far out.

Zitat
2. you can append a @<alias> to the definition of a calculated value and then use this name in the subsequent value... attributes for formatting.
Clearer too - I think, I'll play some more ;)

Many thanks

Edit: Fine, formatting all working now. I see it's also mentioned in the wiki but I missed that bit.
As you say I may be better using the statistics module for what I need - an interesting exercise anyway :)
« Letzte Änderung: 14 August 2015, 12:15:53 von fruit »
Feel free to follow up in German if you prefer

Offline fruit

  • Full Member
  • ***
  • Beiträge: 289
Antw:update readingsGroup (zeilen/spalten summe,min,max,durchschnitt,...)
« Antwort #14 am: 17 August 2015, 09:37:25 »
This is not directly related to the new additions but is based on my earlier readingsGroup (now using the average module - max and min readings are easier to extract).
I have added the timestamp to monitor updates temporarily using <{ReadingsTimestamp($DEVICE,"temperature","")}>

I was surprised to see that formatting of the timestamp entry is affected by attribute nameStyle, perhaps that is what is expected.

It's not really a problem as I have used cellStyle to embolden the headings but thought I should mention it.
Feel free to follow up in German if you prefer