update readingsGroup (zeilen/spalten summe,min,max,durchschnitt,...)

Begonnen von justme1968, 04 Mai 2015, 00:45:25

Vorheriges Thema - Nächstes Thema

justme1968

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.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Reinerlein

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

justme1968

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

Reinerlein

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

justme1968

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

Elektrolurch

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!

Reinerlein

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

justme1968

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

justme1968

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

Reinerlein

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

justme1968

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

fruit

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

justme1968

#12
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.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

fruit

Zitat von: justme1968 am 14 August 2015, 11:32:57
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 :)
Feel free to follow up in German if you prefer

fruit

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

justme1968

this is intentional. everything that is not a reading and has no name (i.e. heading elements) is affected by nameStyle instead of valueStyle.

you can use the 'more modern' way of using !<pseudo reading>    (!timestamp) with valueFormat instead of <{...}>. this will then be affected by the value... attributes.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

fruit

OK, nameStyle makes sense.
Struggling with the second bit but I'll take a look through the module - and as said I can do what I need with what I have (or with what I can understand)

I think I need an O'Reilly's "fhem: readingsGroup" book ;)
Feel free to follow up in German if you prefer

justme1968

#17
you just define the timestamp as you would a normal reading. but add an ! in front of the name to force ist to display even if there is no real reading with this name. then use valueFormat to set the value exactly aus you have done with ReadingsTimestamp above.

the only advatage of the <{...}> version is that you can append an @<reading> after the } to get longpoll update of the timestamp. this is (currently) not possible with the 'newer' version.

als much als i like the o'reilly books... i fear this will not happen ;)
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

fruit

Feel free to follow up in German if you prefer

kvo1

hallo Andre,

hmmmm..
bin wieder mal per Zufall auf diese Erweiterung gestoßen , hätte ich mal eher lesen sollen.
Danke
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

hneu

Hallo,

wie kann ich denn beispielsweise folgende Aufgabe lösen?

Ich habe das Beispiel der RSSI Werte aus dem WIKI an meine Enocean Komponenten angepasst. Das funktioniert soweit.

Zu den RSSI Werten enthält die Tabelle auch den Zeitstempel des letzten Readings eines Gerätes.

Wie kann ich nun in einer weiteren Spalte das Alter dieses Zeitstempels berechnen?

Ich will einen Hinweis auf verlorene Readings erhalten.


Hat jemand eine Idee?

mfg
Helmut

justme1968

das geht normalerweise über ...,<{...}>,... und eigenem perl code. irgendwo im forum gibt es auch ein kleines javascript modul das alle zeitsempel in eine altersangabe umrechnet.

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

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

macmattes

hallo

gibts irgendwo ein besipiel für eine eigene Funktion für die myUtils?
ich komm da nicht weiter, ich möchte ein delta der werte von oben nach unten machen, also vom oberen alle unteren abziehen.
ein beispiel wie ich es bisher versuche

sub
myrgDelta
{
  my @values = @{$_[0]};
  my $cnt = scalar @values;
  my $ret = $values[0];
  for (my $i=1;$i<@values;$i++){
     $ret = $ret - $values[$i];
  }
  return undef if( !$cnt );
  return $ret;
}

justme1968

die count routine wäre ein beispiel. da siehst du wie die werte übergeben werden.

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

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

Afterburner

Servus,

ich bin gerade dabei mit eine RG für meinen Stromverbrauch zu basteln in der ich dann im Endeffekt die Summe aller Einzelverbraucher vom Gesamtverbrauch (durch ESA2000 gemessen) abziehe.
DEF
<%message_socket_ch_3>,<Power>,<Voltage>,<Strom>
TYPE=Revolt:power,voltage,current
Arbeitszimmer.Steckdose_Pwr:power,voltage,current
TYPE=FBDECT:power,voltage,current
TYPE=UbiquitiOut:power,voltage,current
TYPE=ESA2000:actual,day,raw_total
Strom.Uebersicht:$sum(2..12:1)
<Differenz>



Das funktioniert bis zur Summe (Zeile 2 bis 12, Spalte 1), allerdings bekomme ich dabei Log-Einträge da die FritzDECT Dosen ihre Werte mit Maßeinheit liefern

2016.01.02 10:19:43 1: PERL WARNING: Argument "26.82 W" isn't numeric in subroutine entry at (eval 9350) line 1.
2016.01.02 10:19:43 1: PERL WARNING: Argument "14.87 W" isn't numeric in subroutine entry at (eval 9350) line 1.
2016.01.02 10:19:54 1: PERL WARNING: Argument "26.82 W" isn't numeric in subroutine entry at (eval 9366) line 1.
2016.01.02 10:19:54 1: PERL WARNING: Argument "14.94 W" isn't numeric in subroutine entry at (eval 9366) line 1.


Für das Valueformat und Style habe ich schon eine Lösung gefunden mittels einen "PHP str_replace clones",

99_my...
sub str_replace {
my $replace_this = shift;
my $with_this  = shift;
my $string   = shift;

my $length = length($string);
my $target = length($replace_this);

for(my $i=0; $i<$length - $target + 1; $i++) {
if(substr($string,$i,$target) eq $replace_this) {
$string = substr($string,0,$i) . $with_this . substr($string,$i+$target);
return $string;
}
}
return $string;
}


schaut dann so aus:

valueFormat
{
'Arbeitszimmer.Steckdose_Pwr.current' => '{sprintf("%.2f A",$VALUE/1000)}',
power => '{sprintf("%1.f W",str_replace(" W","",$VALUE))}',
voltage => '{sprintf("%.1f V",str_replace(" V","",$VALUE))}',
current => '{sprintf("%.2f A",str_replace(" A","",$VALUE))}',
actual => '%.3f KW',
day => '%.2f KW',
raw_total => '%.1f'
}



valueStyle
{
if($READING eq "voltage" && str_replace(' V','',$VALUE) > 232){
'style="color:orange;;font-weight:bold;;font-size:16px"'
}elsif( $READING eq "voltage" && str_replace(' V','',$VALUE) <= 232 && str_replace(' V','',$VALUE) >= 228 ){
'style="color:green;;font-size:16px"'
}elsif( $READING eq "voltage" && str_replace(' V','',$VALUE) < 228 && str_replace(' V','',$VALUE) >= 220 ){
'style="color:orange;;font-size:16px"'
}elsif( $READING eq "voltage" && str_replace(' V','',$VALUE) < 220 ){
'style="color:red;;font-size:16px"'
}elsif($READING eq "power" && str_replace(' W','',$VALUE) > 500){
'style="color:red;;font-weight:bold;;font-size:16px"'
}elsif( $READING eq "power" && str_replace(' W','',$VALUE) <= 500 && str_replace(' W','',$VALUE) >= 50){
'style="color:orange;;font-size:16px"'
}elsif( $READING eq "power" && str_replace(' W','',$VALUE) < 50 ){
'style="color:green;;font-size:16px"'
}else{
'style="color:gray;;text-align:right"'
}
}



Hat jemand eine Idee wie ich diese Einträge vermeiden kann ?
Sprich ich müsste dem readingsGroup Modul irgendwie str_replace(' W','',$VALUE) zur Summierung übergeben

Oder könnte der "Modulverwalter" im Modul eine Funktion einbauen die nicht nummerische Werte automatisch "korrigiert" um so z.B. die " W", " V" und " A" zu entfernen

Der nächste Punkt welcher mir jetzt noch fehlt ist die Subtraktion, ich möchte dort
Strom.Uebersicht:$sum(2..12:1)
von
TYPE=ESA2000:actual
abziehen, wobei TYPE=ESA2000:actual noch in KW angegeben ist und auch noch umgerechnet werden müsste ^^

Ach ja Strom.Uebersicht:$sum(2..12:1) wird in der Ausgabe als
Strom.Uebersicht:sum 123.4
dargestellt, kann man da den Namen irgendwie ändern in "Freitext" und mit Maßeinheit?
Summer Verbraucher 123.4 W
CUL 868 --> Dirks Universalsensor - ESA200 Strommesser
HM USB --> HM Klingelsensor - HM Zwischenstecker
MAXLAN --> 5 x Thermostat - 4 x Fensterkontakt - ECO Taster - Cube
Arduino Nano V3.0 CC1101 433 MHz --> für Revolt Strommesser
bestellt: JeeLink 868 --> für TX 29 DT-HT Außensender

justme1968

wenn du $NUM statt $VALUE verwendest werden die einheiten abgeschnitten. zum formatieren der ausgabe solltest du die einheiten mit valueSuffix anhängen. nicht mit valueFormat. dann beeinflusst es die Berechnungen nicht.

an die definition einer rechnung kannst du @<alias> und dann diesen alias verwenden um den wert mit den entsprechenden attributen zu formatieren.

sie bistraktion bekommst du z.b. in dem du dir einen eigenen operator definierst. oder in deinem fall vermutlich einfacher in dem du ein valueFormat für das summenfeld angibst und dort rechnest.

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

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

Afterburner

Danke für die Antwort

Zitat von: justme1968 am 02 Januar 2016, 11:23:41
an die definition einer rechnung kannst du @<alias> und dann diesen alias verwenden um den wert mit den entsprechenden attributen zu formatieren.

OK das mit der Maßeinheit habe ich so hinbekommen,
Strom.Uebersicht:$sum(2..12:1)@SummeVerbraucher
aber in der 1. Spalte steht noch bzw jetzt
Strom.Uebersicht:SummeVerbraucher
ich hätte da gerne
Summe Verbraucher
zu stehen.


Zitat von: justme1968 am 02 Januar 2016, 11:23:41
wenn du $NUM statt $VALUE verwendest werden die einheiten abgeschnitten. zum formatieren der ausgabe solltest du die einheiten mit valueSuffix anhängen. nicht mit valueFormat. dann beeinflusst es die Berechnungen nicht.

OK wieder was dazu gelernt, macht zumindest mein valueStyle Code kürzer
{
if($READING eq "voltage" && $NUM > 232){
'style="color:orange;;font-weight:bold;;font-size:16px"'
}elsif( $READING eq "voltage" && $NUM <= 232 && $NUM >= 228 ){
'style="color:green;;font-size:16px"'
}elsif( $READING eq "voltage" && $NUM < 228 && $NUM >= 220 ){
'style="color:orange;;font-size:16px"'
}elsif( $READING eq "voltage" && $NUM < 220 ){
'style="color:red;;font-size:16px"'
}elsif($READING eq "power" && $NUM > 500){
'style="color:red;;font-weight:bold;;font-size:16px"'
}elsif( $READING eq "power" && $NUM <= 500 && $NUM >= 50){
'style="color:orange;;font-size:16px"'
}elsif( $READING eq "power" && $NUM < 50 ){
'style="color:green;;font-size:16px"'
}else{
'style="color:gray;;text-align:right"'
}
}


valueFormat habe ich momentan so
{
'Arbeitszimmer.Steckdose_Pwr.current' => '{sprintf("%.2f",$VALUE/1000)}',
power => '{sprintf("%1.f",str_replace(" W","",$VALUE))}',
voltage => '{sprintf("%.1f",str_replace(" V","",$VALUE))}',
current => '{sprintf("%.2f",str_replace(" A","",$VALUE))}',
actual => '%.3f',
day => '%.2f',
raw_total => '%.1f',
SummeVerbraucher => '%1.f'
}


wenn ich dort ins valueFormat $NUM statt $VALUE eintrage
{
'Arbeitszimmer.Steckdose_Pwr.current' => '{sprintf("%.2f",$NUM/1000)}',
power => '{sprintf("%1.f",$NUM)}',
voltage => '{sprintf("%.1f",$NUM)}',
current => '{sprintf("%.2f",$NUM)}',
actual => '%.3f',
day => '%.2f',
raw_total => '%.1f',
SummeVerbraucher => '%1.f'
}


dann werden die Einheiten bei den Fritzgeräten nicht abgeschnitten und auch die Umrechnung von mA in A bei Arbeitszimmer.Steckdose_Pwr.current geht nicht mehr. (siehe Anhang)
Des weiteren gibt es dann nen Haufen Einträge im Logfile ala

2016.01.02 12:32:13 2: Global symbol "$NUM" requires explicit package name at (eval 20935) line 1.
2016.01.02 12:32:13 2: Global symbol "$NUM" requires explicit package name at (eval 20938) line 1.
2016.01.02 12:32:13 2: Global symbol "$NUM" requires explicit package name at (eval 20941) line 1.



Zitat von: justme1968 am 02 Januar 2016, 11:23:41
sie bistraktion bekommst du z.b. in dem du dir einen eigenen operator definierst. oder in deinem fall vermutlich einfacher in dem du ein valueFormat für das summenfeld angibst und dort rechnest.
das verstehe ich nicht wirklich
CUL 868 --> Dirks Universalsensor - ESA200 Strommesser
HM USB --> HM Klingelsensor - HM Zwischenstecker
MAXLAN --> 5 x Thermostat - 4 x Fensterkontakt - ECO Taster - Cube
Arduino Nano V3.0 CC1101 433 MHz --> für Revolt Strommesser
bestellt: JeeLink 868 --> für TX 29 DT-HT Außensender

C0mmanda

Moin,

Habe mir eine Readingsgroup mit Berechnungen für meinen Stromverbrauch zusammengebastelt.
Die Readingsgroup funktioniert auch Einwandfrei nur wird mein Log nun hiermit regelrecht geflutet:

2016.04.26 10:59:37 1: readingsUpdate(Verbrauch,KWh,368.30) missed to call readingsBeginUpdate first.
2016.04.26 10:59:37 1: readingsUpdate(Verbrauch,ATotal,0.80) missed to call readingsBeginUpdate first.
2016.04.26 10:59:41 1: readingsUpdate(Verbrauch,KWh,368.30) missed to call readingsBeginUpdate first.
2016.04.26 10:59:41 1: readingsUpdate(Verbrauch,ATotal,0.80) missed to call readingsBeginUpdate first.
2016.04.26 10:59:41 1: readingsUpdate(Verbrauch,KWh,368.30) missed to call readingsBeginUpdate first.
2016.04.26 10:59:41 1: readingsUpdate(Verbrauch,ATotal,0.80) missed to call readingsBeginUpdate first.
2016.04.26 10:59:43 1: readingsUpdate(Verbrauch,KWh,368.30) missed to call readingsBeginUpdate first.
2016.04.26 10:59:43 1: readingsUpdate(Verbrauch,ATotal,0.80) missed to call readingsBeginUpdate first.
2016.04.26 10:59:45 1: readingsUpdate(Verbrauch,KWh,368.30) missed to call readingsBeginUpdate first.
2016.04.26 10:59:45 1: readingsUpdate(Verbrauch,ATotal,0.80) missed to call readingsBeginUpdate first.



Wo kann ich hier ansetzen um den Fehler zu finden?
Was will mir die Meldung überhaupt im genauen sagen?
Bin seit heute morgen auf der Suche, kann nur leider nichts finden.

Vielen Dank für eure Hilfe!

Grtz
CmdA

justme1968

zeig mal bitte ein list auf die readingsGroup und was im log steht wenn du stacktrace einschaltest.

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

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

C0mmanda

Anbei das list der Readingsgroup und stacktracemeldung.

List:
Internals:
   DEF        <Gerät>,<Aktuell>,<Gesamt>,<Amp>,<Volt> .*[Pp]ower:power,energyKWh,A,voltage TYPE=MilightDevice:actualW,energyKWh,A,VoltAVG@Verbrauch TYPE=WifiLight:actualW,energyKWh,A,VoltAVG@Verbrauch Taster_HausBeleuchtung_Sw_01:actualW,energyKWh,A,VoltAVG@Verbrauch GZ_TVLampe:actualW,energyKWh,A,VoltAVG@Verbrauch Openelec_.*:actualW,energyKWh,A,VoltAVG@Verbrauch <hr> Verbrauch:$sum(:1)@aktuellW,$sum(:2)@KWh,$sum(1..17:3)@AGesamt,$avg(1..5:4)@VoltAVG d_W_Diff_Calc:W_Diff,<->,A,VoltAVG@Verbrauch Stromzaehler:power,kWhTotal,ATotal@Verbrauch,VoltAVG@Verbrauch
   NAME       Verbrauch
   NR         1129
   NTFY_ORDER 50-Verbrauch
   STATE      Initialized
   TYPE       readingsGroup
   alwaysTrigger 2
   mayBeVisible 1
   Content:
     GZ_TVLampe 1
     KUE_Kuehlschrank_Power 1
     NUC_Server_Power 1
     OMV_Server_power 1
     Openelec_GZ 1
     Openelec_KUE 1
     Openelec_SZ 1
     Stromzaehler 1
     Taster_HausBeleuchtung_Sw_01 1
     Tiefkuehltruhe_Power 1
     Verbrauch  1
     WZ_Multimedia_Power 1
     d_W_Diff_Calc 1
     eg_KUE_RGBW_Regal 1
     eg_WZ_Couchlampe 1
     eg_WZ_Esszimmer_Stehlampe 1
     eg_WZ_Stehlampe 1
     eg_WZ_TV_RGBW 1
     og_AKZ_Lampe 1
     og_FL_Lampe 1
   Content2:
     Verbrauch  1
   DEVICES:
     ARRAY(0x629a7d8)
     ARRAY(0x636fbf0)
     ARRAY(0x6d363a0)
     ARRAY(0x6685de8)
     ARRAY(0x6d36c10)
     ARRAY(0x6686cf8)
     ARRAY(0x5fee298)
     ARRAY(0x6d367c0)
     ARRAY(0x66863c8)
     ARRAY(0x6392740)
     ARRAY(0x6d38298)
     ARRAY(0x62bb260)
     ARRAY(0x6d369b8)
     ARRAY(0x62d00d0)
     ARRAY(0x6d367d8)
     ARRAY(0x632e7e8)
     ARRAY(0x465e240)
     ARRAY(0x6685c08)
     ARRAY(0x60eabf0)
     ARRAY(0x6d387f0)
     ARRAY(0x6d38e38)
     ARRAY(0x6d39310)
   DEVICES2:
     ARRAY(0x629a7d8)
     ARRAY(0x636fbf0)
     ARRAY(0x6d363a0)
     ARRAY(0x6685de8)
     ARRAY(0x6d36c10)
     ARRAY(0x6686cf8)
     ARRAY(0x5fee298)
     ARRAY(0x6d367c0)
     ARRAY(0x66863c8)
     ARRAY(0x6392740)
     ARRAY(0x6d38298)
     ARRAY(0x62bb260)
     ARRAY(0x6d369b8)
     ARRAY(0x62d00d0)
     ARRAY(0x6d367d8)
     ARRAY(0x632e7e8)
     ARRAY(0x465e240)
     ARRAY(0x6685c08)
     ARRAY(0x60eabf0)
     ARRAY(0x6d387f0)
     ARRAY(0x6d38e38)
     ARRAY(0x6d39310)
     ARRAY(0x6d392b0)
     ARRAY(0x62e2a10)
   Helper:
     Dblog:
       Kwh:
         Logdb1:
           TIME       1461663406.01576
           VALUE      368.35
       Aktuellw:
         Logdb1:
           TIME       1461663406.10803
           VALUE      33.58
   Readings:
     2016-04-26 11:31:55   AGesamt         0.33
     2016-04-26 11:37:05   ATotal          0.59
     2016-04-26 11:36:45   KWh             368.35
     2016-04-26 11:36:43   VoltAVG         232.00
     2016-04-25 19:41:59   W_Diff          73.12
     2016-04-26 11:36:45   aktuellW        33.58
   Fhem:
     lastDefChange 1
     last_update 1461663336.27358
   Helper:
     DEF
     mapping    %ROOM %ALIAS
     valueStyle {
if ($DEVICE eq "KUE_Kuehlschrank_Power" && $READING eq "power" && $VALUE >= 40) {'style="color:red"'}
elsif
($DEVICE eq "KUE_Kuehlschrank_Power" && $READING eq "power" && $VALUE < 40) {'style="color:green"'}
elsif
($DEVICE eq "NUC_Server_Power" && $READING eq "power" && $VALUE >= 19.5) {'style="color:red"'}
elsif
($DEVICE eq "NUC_Server_Power" && $READING eq "power" && $VALUE < 19.5) {'style="color:green"'}
elsif
($DEVICE eq "OMV_Server_power" && $READING eq "power" && $VALUE >= 5) {'style="color:red"'}
elsif
($DEVICE eq "OMV_Server_power" && $READING eq "power" && $VALUE < 5) {'style="color:green"'}
elsif
($DEVICE eq "Tiefkuehltruhe_Power" && $READING eq "power" && $VALUE >= 4) {'style="color:red"'}
elsif
($DEVICE eq "Tiefkuehltruhe_Power" && $READING eq "power" && $VALUE < 4) {'style="color:green"'}
elsif
($DEVICE eq "WZ_Multimedia_Power" && $READING eq "power" && $VALUE >= 20) {'style="color:red"'}
elsif
($DEVICE eq "WZ_Multimedia_Power" && $READING eq "power" && $VALUE < 20) {'style="color:green"'}
elsif
($DEVICE eq "eg_WZ_Couchlampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "eg_WZ_Couchlampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "eg_WZ_Esszimmer_Stehlampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "eg_WZ_Esszimmer_Stehlampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "eg_WZ_Stehlampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "eg_WZ_Stehlampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "eg_WZ_TV_RGBW" && $READING eq "actualW" && $VALUE > 1) {'style="color:red"'}
elsif
($DEVICE eq "eg_WZ_TV_RGBW" && $READING eq "actualW" && $VALUE <= 1) {'style="color:green"'}
elsif
($DEVICE eq "og_AKZ_Lampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "og_AKZ_Lampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "og_FL_Lampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "og_FL_Lampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "eg_KUE_RGBW_Regal" && $READING eq "actualW" && $VALUE > 1) {'style="color:red"'}
elsif
($DEVICE eq "eg_KUE_RGBW_Regal" && $READING eq "actualW" && $VALUE <= 1) {'style="color:green"'}
elsif
($DEVICE eq "Taster_HausBeleuchtung_Sw_01" && $READING eq "actualW" && $VALUE > 0.5) {'style="color:red"'}
elsif
($DEVICE eq "Taster_HausBeleuchtung_Sw_01" && $READING eq "actualW" && $VALUE <= 0.5) {'style="color:green"'}
elsif
($DEVICE eq "Openelec_GZ" && $READING eq "actualW" && $VALUE > 10) {'style="color:red"'}
elsif
($DEVICE eq "Openelec_GZ" && $READING eq "actualW" && $VALUE <= 10) {'style="color:green"'}
elsif
($DEVICE eq "Openelec_SZ" && $READING eq "actualW" && $VALUE > 10) {'style="color:red"'}
elsif
($DEVICE eq "Openelec_SZ" && $READING eq "actualW" && $VALUE <= 10) {'style="color:green"'}
elsif
($DEVICE eq "GZ_TVLampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "GZ_TVLampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "Verbrauch" && $READING eq "aktuellW" && $VALUE > 34.5) {'style="color:red"'}
elsif
($DEVICE eq "Verbrauch" && $READING eq "aktuellW" && $VALUE <= 34.5) {'style="color:green"'}
}
     Cellstyle:
       c:0        style="text-align:left"
       c:1        style="text-align:right"
       c:2        style="text-align:right"
       c:3        style="text-align:right"
       c:4        style="text-align:right"
     Positions:
       GZ_TVLampe.A 15:3
       GZ_TVLampe.actualW 15:1
       GZ_TVLampe.energyKWh 15:2
       KUE_Kuehlschrank_Power.A 2:3
       KUE_Kuehlschrank_Power.energyKWh 2:2
       KUE_Kuehlschrank_Power.power 2:1
       KUE_Kuehlschrank_Power.voltage 2:4
       NUC_Server_Power.A 3:3
       NUC_Server_Power.energyKWh 3:2
       NUC_Server_Power.power 3:1
       NUC_Server_Power.voltage 3:4
       OMV_Server_power.A 4:3
       OMV_Server_power.energyKWh 4:2
       OMV_Server_power.power 4:1
       OMV_Server_power.voltage 4:4
       Openelec_GZ.A 16:3
       Openelec_GZ.actualW 16:1
       Openelec_GZ.energyKWh 16:2
       Openelec_KUE.A 17:3
       Openelec_KUE.actualW 17:1
       Openelec_KUE.energyKWh 17:2
       Openelec_SZ.A 18:3
       Openelec_SZ.actualW 18:1
       Openelec_SZ.energyKWh 18:2
       Stromzaehler.kWhTotal 22:2
       Stromzaehler.power 22:1
       Taster_HausBeleuchtung_Sw_01.A 14:3
       Taster_HausBeleuchtung_Sw_01.actualW 14:1
       Taster_HausBeleuchtung_Sw_01.energyKWh 14:2
       Tiefkuehltruhe_Power.A 5:3
       Tiefkuehltruhe_Power.energyKWh 5:2
       Tiefkuehltruhe_Power.power 5:1
       Tiefkuehltruhe_Power.voltage 5:4
       Verbrauch.ATotal 22:3
       Verbrauch.VoltAVG 7:4,8:4,9:4,10:4,11:4,12:4,13:4,14:4,15:4,16:4,17:4,18:4,21:4,22:4
       WZ_Multimedia_Power.A 6:3
       WZ_Multimedia_Power.energyKWh 6:2
       WZ_Multimedia_Power.power 6:1
       WZ_Multimedia_Power.voltage 6:4
       d_W_Diff_Calc.A 21:3
       d_W_Diff_Calc.W_Diff 21:1
       eg_KUE_RGBW_Regal.A 13:3
       eg_KUE_RGBW_Regal.actualW 13:1
       eg_KUE_RGBW_Regal.energyKWh 13:2
       eg_WZ_Couchlampe.A 7:3
       eg_WZ_Couchlampe.actualW 7:1
       eg_WZ_Couchlampe.energyKWh 7:2
       eg_WZ_Esszimmer_Stehlampe.A 8:3
       eg_WZ_Esszimmer_Stehlampe.actualW 8:1
       eg_WZ_Esszimmer_Stehlampe.energyKWh 8:2
       eg_WZ_Stehlampe.A 9:3
       eg_WZ_Stehlampe.actualW 9:1
       eg_WZ_Stehlampe.energyKWh 9:2
       eg_WZ_TV_RGBW.A 10:3
       eg_WZ_TV_RGBW.actualW 10:1
       eg_WZ_TV_RGBW.energyKWh 10:2
       og_AKZ_Lampe.A 11:3
       og_AKZ_Lampe.actualW 11:1
       og_AKZ_Lampe.energyKWh 11:2
       og_FL_Lampe.A 12:3
       og_FL_Lampe.actualW 12:1
       og_FL_Lampe.energyKWh 12:2
     recalc:

       ARRAY(0x6354cb0)
       ARRAY(0x6357118)
       ARRAY(0x6355a48)
       ARRAY(0x6369178)
     Valueformat:
       A          %.2f
       AGesamt    %.2f
       ATotal     %.2f
       KWh        %.2f
       VoltAVG    %.2f
       W_Diff     %.2f
       actualW    %.2f
       aktuellW   %.2f
       energyKWh  %.2f
       kWhTotal   %.2f
       power      %.2f
       sum        %.2f
       voltage    %.2f
     Values:
       calc:

         ARRAY(0x63531e8)
         ARRAY(0x6355418)
         ARRAY(0x6356ed8)
         ARRAY(0x6356d58)
       formated:

         ARRAY(0x6356f98)
         ARRAY(0x63571c0)
         ARRAY(0x6357298)
         ARRAY(0x6356548)
       orig:

         ARRAY(0x63792e8)
         ARRAY(0x6355b50)
         ARRAY(0x6369418)
         ARRAY(0x6355490)
       prefixsuffix:

         ARRAY(0x6357370)
         ARRAY(0x6355c40)
         ARRAY(0x63693b8)
         ARRAY(0x632fd58)
Attributes:
   alwaysTrigger 2
   cellStyle  { "c:0" => 'style="text-align:left"', "c:1" => 'style="text-align:right"', "c:2" => 'style="text-align:right"', "c:3" => 'style="text-align:right"', "c:4" => 'style="text-align:right"' }
   firstCalcRow 2
   group      Infos
   mapping    %ROOM %ALIAS
   room       Energie,Home
   userReadings ATotal {sprintf("%.2f",(ReadingsNum("Verbrauch","AGesamt","???")+ReadingsNum("d_W_Diff_Calc","A","???")));}
   valueFormat {  ATotal => "%.2f", W_Diff => "%.2f", VoltAVG => "%.2f", aktuellW => "%.2f", kWhTotal => "%.2f", voltage => "%.2f", AGesamt => "%.2f", A => "%.2f", KWh => "%.2f", 'sum' => "%.2f", actualW => "%.2f", power => "%.2f", energyKWh => "%.2f"}
   valueStyle {
if ($DEVICE eq "KUE_Kuehlschrank_Power" && $READING eq "power" && $VALUE >= 40) {'style="color:red"'}
elsif
($DEVICE eq "KUE_Kuehlschrank_Power" && $READING eq "power" && $VALUE < 40) {'style="color:green"'}
elsif
($DEVICE eq "NUC_Server_Power" && $READING eq "power" && $VALUE >= 19.5) {'style="color:red"'}
elsif
($DEVICE eq "NUC_Server_Power" && $READING eq "power" && $VALUE < 19.5) {'style="color:green"'}
elsif
($DEVICE eq "OMV_Server_power" && $READING eq "power" && $VALUE >= 5) {'style="color:red"'}
elsif
($DEVICE eq "OMV_Server_power" && $READING eq "power" && $VALUE < 5) {'style="color:green"'}
elsif
($DEVICE eq "Tiefkuehltruhe_Power" && $READING eq "power" && $VALUE >= 4) {'style="color:red"'}
elsif
($DEVICE eq "Tiefkuehltruhe_Power" && $READING eq "power" && $VALUE < 4) {'style="color:green"'}
elsif
($DEVICE eq "WZ_Multimedia_Power" && $READING eq "power" && $VALUE >= 20) {'style="color:red"'}
elsif
($DEVICE eq "WZ_Multimedia_Power" && $READING eq "power" && $VALUE < 20) {'style="color:green"'}
elsif
($DEVICE eq "eg_WZ_Couchlampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "eg_WZ_Couchlampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "eg_WZ_Esszimmer_Stehlampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "eg_WZ_Esszimmer_Stehlampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "eg_WZ_Stehlampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "eg_WZ_Stehlampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "eg_WZ_TV_RGBW" && $READING eq "actualW" && $VALUE > 1) {'style="color:red"'}
elsif
($DEVICE eq "eg_WZ_TV_RGBW" && $READING eq "actualW" && $VALUE <= 1) {'style="color:green"'}
elsif
($DEVICE eq "og_AKZ_Lampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "og_AKZ_Lampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "og_FL_Lampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "og_FL_Lampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "eg_KUE_RGBW_Regal" && $READING eq "actualW" && $VALUE > 1) {'style="color:red"'}
elsif
($DEVICE eq "eg_KUE_RGBW_Regal" && $READING eq "actualW" && $VALUE <= 1) {'style="color:green"'}
elsif
($DEVICE eq "Taster_HausBeleuchtung_Sw_01" && $READING eq "actualW" && $VALUE > 0.5) {'style="color:red"'}
elsif
($DEVICE eq "Taster_HausBeleuchtung_Sw_01" && $READING eq "actualW" && $VALUE <= 0.5) {'style="color:green"'}
elsif
($DEVICE eq "Openelec_GZ" && $READING eq "actualW" && $VALUE > 10) {'style="color:red"'}
elsif
($DEVICE eq "Openelec_GZ" && $READING eq "actualW" && $VALUE <= 10) {'style="color:green"'}
elsif
($DEVICE eq "Openelec_SZ" && $READING eq "actualW" && $VALUE > 10) {'style="color:red"'}
elsif
($DEVICE eq "Openelec_SZ" && $READING eq "actualW" && $VALUE <= 10) {'style="color:green"'}
elsif
($DEVICE eq "GZ_TVLampe" && $READING eq "actualW" && $VALUE > 0) {'style="color:red"'}
elsif
($DEVICE eq "GZ_TVLampe" && $READING eq "actualW" && $VALUE == 0) {'style="color:green"'}
elsif
($DEVICE eq "Verbrauch" && $READING eq "aktuellW" && $VALUE > 34.5) {'style="color:red"'}
elsif
($DEVICE eq "Verbrauch" && $READING eq "aktuellW" && $VALUE <= 34.5) {'style="color:green"'}
}
   verbose    0


Stacktrace:

2016.04.26 12:04:41 1: readingsUpdate(Verbrauch,VoltAVG,234.33) missed to call readingsBeginUpdate first.
2016.04.26 12:04:41 1: readingsUpdate(Verbrauch,ATotal,0.66) missed to call readingsBeginUpdate first.
2016.04.26 12:04:52 1: readingsUpdate(Verbrauch,KWh,368.38) missed to call readingsBeginUpdate first.
2016.04.26 12:04:52 1: readingsUpdate(Verbrauch,ATotal,0.66) missed to call readingsBeginUpdate first.
2016.04.26 12:05:31 1: PERL WARNING: False [] range "/-\d" in regex; marked by <-- HERE in m/<dewpoint_c>([/-\d <-- HERE *\.]+)/ at ./FHEM/98_HTTPMOD.pm line 1537.
2016.04.26 12:05:31 3: stacktrace:
2016.04.26 12:05:31 3:     main::__ANON__                      called by ./FHEM/98_HTTPMOD.pm (1537)
2016.04.26 12:05:31 3:     main::HTTPMOD_ExtractReading        called by ./FHEM/98_HTTPMOD.pm (2097)
2016.04.26 12:05:31 3:     main::HTTPMOD_Read                  called by FHEM/HttpUtils.pm (298)
2016.04.26 12:05:31 3:     main::__ANON__                      called by fhem.pl (655)
2016.04.26 12:05:31 1: PERL WARNING: False [] range "/-\d" in regex; marked by <-- HERE in m/<temp_c>([/-\d <-- HERE *\.]+)/ at ./FHEM/98_HTTPMOD.pm line 1537.
2016.04.26 12:05:31 3: stacktrace:
2016.04.26 12:05:31 3:     main::__ANON__                      called by ./FHEM/98_HTTPMOD.pm (1537)
2016.04.26 12:05:31 3:     main::HTTPMOD_ExtractReading        called by ./FHEM/98_HTTPMOD.pm (2097)
2016.04.26 12:05:31 3:     main::HTTPMOD_Read                  called by FHEM/HttpUtils.pm (298)
2016.04.26 12:05:31 3:     main::__ANON__                      called by fhem.pl (655)
2016.04.26 12:06:29 1: readingsUpdate(Verbrauch,VoltAVG,234.25) missed to call readingsBeginUpdate first.
2016.04.26 12:06:29 1: readingsUpdate(Verbrauch,ATotal,0.66) missed to call readingsBeginUpdate first.
2016.04.26 12:06:31 1: readingsUpdate(Verbrauch,KWh,368.38) missed to call readingsBeginUpdate first.
2016.

C0mmanda

Hier steht nochmal etwas mehr im Stacktrace:

2016.04.26 14:31:11 1: readingsUpdate(Verbrauch,ATotal,0.93) missed to call readingsBeginUpdate first.
2016.04.26 14:32:21 1: readingsUpdate(Verbrauch,KWh,368.53) missed to call readingsBeginUpdate first.
2016.04.26 14:32:21 1: readingsUpdate(Verbrauch,ATotal,0.93) missed to call readingsBeginUpdate first.
2016.04.26 14:32:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 60985) line 1.
2016.04.26 14:32:30 3: stacktrace:
2016.04.26 14:32:30 3:     main::__ANON__                      called by (eval 60985) (1)
2016.04.26 14:32:30 3:     (eval)                              called by ./FHEM/33_readingsGroup.pm (341)
2016.04.26 14:32:30 3:     main::lookup2                       called by ./FHEM/33_readingsGroup.pm (522)
2016.04.26 14:32:30 3:     main::readingsGroup_value2html      called by ./FHEM/33_readingsGroup.pm (997)
2016.04.26 14:32:30 3:     main::readingsGroup_2html           called by ./FHEM/33_readingsGroup.pm (1086)
2016.04.26 14:32:30 3:     main::readingsGroup_detailFn        called by ./FHEM/01_FHEMWEB.pm (2739)
2016.04.26 14:32:30 3:     main::FW_devState                   called by ./FHEM/01_FHEMWEB.pm (1533)
2016.04.26 14:32:30 3:     main::FW_showRoom                   called by ./FHEM/01_FHEMWEB.pm (897)
2016.04.26 14:32:30 3:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (446)
2016.04.26 14:32:30 3:     main::FW_Read                       called by fhem.pl (3164)
2016.04.26 14:32:30 3:     main::CallFn                        called by fhem.pl (658)
2016.04.26 14:32:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 60987) line 1.
2016.04.26 14:32:30 3: stacktrace:
2016.04.26 14:32:30 3:     main::__ANON__                      called by (eval 60987) (1)
2016.04.26 14:32:30 3:     (eval)                              called by ./FHEM/33_readingsGroup.pm (341)
2016.04.26 14:32:30 3:     main::lookup2                       called by ./FHEM/33_readingsGroup.pm (522)
2016.04.26 14:32:30 3:     main::readingsGroup_value2html      called by ./FHEM/33_readingsGroup.pm (997)
2016.04.26 14:32:30 3:     main::readingsGroup_2html           called by ./FHEM/33_readingsGroup.pm (1086)
2016.04.26 14:32:30 3:     main::readingsGroup_detailFn        called by ./FHEM/01_FHEMWEB.pm (2739)
2016.04.26 14:32:30 3:     main::FW_devState                   called by ./FHEM/01_FHEMWEB.pm (1533)
2016.04.26 14:32:30 3:     main::FW_showRoom                   called by ./FHEM/01_FHEMWEB.pm (897)
2016.04.26 14:32:30 3:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (446)
2016.04.26 14:32:30 3:     main::FW_Read                       called by fhem.pl (3164)
2016.04.26 14:32:30 3:     main::CallFn                        called by fhem.pl (658)
2016.04.26 14:32:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 60988) line 1.
2016.04.26 14:32:30 3: stacktrace:
2016.04.26 14:32:30 3:     main::__ANON__                      called by (eval 60988) (1)
2016.04.26 14:32:30 3:     (eval)                              called by ./FHEM/33_readingsGroup.pm (341)
2016.04.26 14:32:30 3:     main::lookup2                       called by ./FHEM/33_readingsGroup.pm (522)
2016.04.26 14:32:30 3:     main::readingsGroup_value2html      called by ./FHEM/33_readingsGroup.pm (997)
2016.04.26 14:32:30 3:     main::readingsGroup_2html           called by ./FHEM/33_readingsGroup.pm (1086)
2016.04.26 14:32:30 3:     main::readingsGroup_detailFn        called by ./FHEM/01_FHEMWEB.pm (2739)
2016.04.26 14:32:30 3:     main::FW_devState                   called by ./FHEM/01_FHEMWEB.pm (1533)
2016.04.26 14:32:30 3:     main::FW_showRoom                   called by ./FHEM/01_FHEMWEB.pm (897)
2016.04.26 14:32:30 3:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (446)
2016.04.26 14:32:30 3:     main::FW_Read                       called by fhem.pl (3164)
2016.04.26 14:32:30 3:     main::CallFn                        called by fhem.pl (658)
2016.04.26 14:32:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 60990) line 1.
2016.04.26 14:32:30 3: stacktrace:
2016.04.26 14:32:30 3:     main::__ANON__                      called by (eval 60990) (1)
2016.04.26 14:32:30 3:     (eval)                              called by ./FHEM/33_readingsGroup.pm (341)
2016.04.26 14:32:30 3:     main::lookup2                       called by ./FHEM/33_readingsGroup.pm (522)
2016.04.26 14:32:30 3:     main::readingsGroup_value2html      called by ./FHEM/33_readingsGroup.pm (997)
2016.04.26 14:32:30 3:     main::readingsGroup_2html           called by ./FHEM/33_readingsGroup.pm (1086)
2016.04.26 14:32:30 3:     main::readingsGroup_detailFn        called by ./FHEM/01_FHEMWEB.pm (2739)
2016.04.26 14:32:30 3:     main::FW_devState                   called by ./FHEM/01_FHEMWEB.pm (1533)
2016.04.26 14:32:30 3:     main::FW_showRoom                   called by ./FHEM/01_FHEMWEB.pm (897)
2016.04.26 14:32:30 3:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (446)
2016.04.26 14:32:30 3:     main::FW_Read                       called by fhem.pl (3164)
2016.04.26 14:32:30 3:     main::CallFn                        called by fhem.pl (658)
2016.04.26 14:32:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 60991) line 1.
2016.04.26 14:32:30 3: stacktrace:
2016.04.26 14:32:30 3:     main::__ANON__                      called by (eval 60991) (1)
2016.04.26 14:32:30 3:     (eval)                              called by ./FHEM/33_readingsGroup.pm (341)
2016.04.26 14:32:30 3:     main::lookup2                       called by ./FHEM/33_readingsGroup.pm (522)
2016.04.26 14:32:30 3:     main::readingsGroup_value2html      called by ./FHEM/33_readingsGroup.pm (997)
2016.04.26 14:32:30 3:     main::readingsGroup_2html           called by ./FHEM/33_readingsGroup.pm (1086)
2016.04.26 14:32:30 3:     main::readingsGroup_detailFn        called by ./FHEM/01_FHEMWEB.pm (2739)
2016.04.26 14:32:30 3:     main::FW_devState                   called by ./FHEM/01_FHEMWEB.pm (1533)
2016.04.26 14:32:30 3:     main::FW_showRoom                   called by ./FHEM/01_FHEMWEB.pm (897)
2016.04.26 14:32:30 3:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (446)
2016.04.26 14:32:30 3:     main::FW_Read                       called by fhem.pl (3164)
2016.04.26 14:32:30 3:     main::CallFn                        called by fhem.pl (658)
2016.04.26 14:32:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 60993) line 1.
2016.04.26 14:32:30 3: stacktrace:
2016.04.26 14:32:30 3:     main::__ANON__                      called by (eval 60993) (1)
2016.04.26 14:32:30 3:     (eval)                              called by ./FHEM/33_readingsGroup.pm (341)
2016.04.26 14:32:30 3:     main::lookup2                       called by ./FHEM/33_readingsGroup.pm (522)
2016.04.26 14:32:30 3:     main::readingsGroup_value2html      called by ./FHEM/33_readingsGroup.pm (997)
2016.04.26 14:32:30 3:     main::readingsGroup_2html           called by ./FHEM/33_readingsGroup.pm (1086)
2016.04.26 14:32:30 3:     main::readingsGroup_detailFn        called by ./FHEM/01_FHEMWEB.pm (2739)
2016.04.26 14:32:30 3:     main::FW_devState                   called by ./FHEM/01_FHEMWEB.pm (1533)
2016.04.26 14:32:30 3:     main::FW_showRoom                   called by ./FHEM/01_FHEMWEB.pm (897)
2016.04.26 14:32:30 3:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (446)
2016.04.26 14:32:30 3:     main::FW_Read                       called by fhem.pl (3164)
2016.04.26 14:32:30 3:     main::CallFn                        called by fhem.pl (658)
2016.04.26 14:32:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 60994) line 1.
2016.04.26 14:32:30 3: stacktrace:
2016.04.26 14:32:30 3:     main::__ANON__                      called by (eval 60994) (1)
2016.04.26 14:32:30 3:     (eval)                              called by ./FHEM/33_readingsGroup.pm (341)
2016.04.26 14:32:30 3:     main::lookup2                       called by ./FHEM/33_readingsGroup.pm (522)
2016.04.26 14:32:30 3:     main::readingsGroup_value2html      called by ./FHEM/33_readingsGroup.pm (997)
2016.04.26 14:32:30 3:     main::readingsGroup_2html           called by ./FHEM/33_readingsGroup.pm (1086)
2016.04.26 14:32:30 3:     main::readingsGroup_detailFn        called by ./FHEM/01_FHEMWEB.pm (2739)
2016.04.26 14:32:30 3:     main::FW_devState                   called by ./FHEM/01_FHEMWEB.pm (1533)
2016.04.26 14:32:30 3:     main::FW_showRoom                   called by ./FHEM/01_FHEMWEB.pm (897)
2016.04.26 14:32:30 3:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (446)
2016.04.26 14:32:30 3:     main::FW_Read                       called by fhem.pl (3164)
2016.04.26 14:32:30 3:     main::CallFn                        called by fhem.pl (658)
2016.04.26 14:32:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 60996) line 1.
2016.04.26 14:32:30 3: stacktrace:
2016.04.26 14:32:30 3:     main::__ANON__                      called by (eval 60996) (1)
2016.04.26 14:32:30 3:     (eval)                              called by ./FHEM/33_readingsGroup.pm (341)
2016.04.26 14:32:30 3:     main::lookup2                       called by ./FHEM/33_readingsGroup.pm (522)
2016.04.26 14:32:30 3:     main::readingsGroup_value2html      called by ./FHEM/33_readingsGroup.pm (997)
2016.04.26 14:32:30 3:     main::readingsGroup_2html           called by ./FHEM/33_readingsGroup.pm (1086)
2016.04.26 14:32:30 3:     main::readingsGroup_detailFn        called by ./FHEM/01_FHEMWEB.pm (2739)
2016.04.26 14:32:30 3:     main::FW_devState                   called by ./FHEM/01_FHEMWEB.pm (1533)
2016.04.26 14:32:30 3:     main::FW_showRoom                   called by ./FHEM/01_FHEMWEB.pm (897)
2016.04.26 14:32:30 3:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (446)
2016.04.26 14:32:30 3:     main::FW_Read                       called by fhem.pl (3164)
2016.04.26 14:32:30 3:     main::CallFn                        called by fhem.pl (658)
2016.04.26 14:32:38 1: readingsUpdate(Verbrauch,VoltAVG,232.93) missed to call readingsBeginUpdate first.
2016.04.26 14:32:38 1: readingsUpdate(Verbrauch,ATotal,0.93) missed to call readingsBeginUpdate first.
2016.04.26 14:32:57 1: readingsUpdate(Verbrauch,KWh,368.53) missed to call readingsBeginUpdate first.
2016.04.26 14:32:57 1: readingsUpdate(Verbrauch,ATotal,0.92) missed to call readingsBeginUpdate first.

C0mmanda

Ich habe die Fehlermeldung erst einmal wegbekommen, allerdings ist das auch keine schöne Lösung.

Ich hatte die Einheiten der readings (W, kWh, A, V) ja im attr valueSuffix hinterlegt, so wie es eigentlich auch sein sollte.
Dadurch habe ich jedoch die ganzen Fehlermeldungen bekommen.

Nun habe ich die Einheiten mal testweise mit ins valueFormat mit reingepackt ( A => "%.2f A", KWh => "%.2f kWh" usw) und die Fehlermeldung ist weg.

Jetzt bekomme ich natürlich diese Fehlermeldung:

2016.04.26 17:40:37 1: PERL WARNING: Argument "233.32 V" isn't numeric in sprintf at ./FHEM/33_readingsGroup.pm line 525.


Jedoch weitaus seltener und das Log wird nicht geflutet.

Dies nur zur Info, an einer Lösung wäre ich dennoch interessiert. Scheint ja irgendwie mit attr valueSuffix zusammen zu hängen?!?!

Danke.

grtz
CmdA

awex102

#32
Hallo,

ich stehe auf dem Schlauch:

Ich habe folgende readingsGroup angelegt:

.*:Daily.Energy  .*:AC.Power.Fast

Damit erhalte ich die Werte von zwei Wechselrichtern, die ich nun summieren möchte.

Also sum(). Ich kriege es aber nicht hin das jeweils für die beiden getrennt jeweils die summe ausgegeben wird.

.*:Daily.Energy WechselrichterGroup:$sum()  .*:AC.Power.Fast WechselrichterGroup:$sum()

Welche "Koordinaten" muss ich der $sum Funktion mitgeben?

Aktuell sehe ich im Webfrontend:

Wechselrichter1:Daily.Energy 1
Wechselrichter2:Daily.Energy 1
WechselrichterGroup:sum 2
Wechselrichter1:AC.Power.Fast 1
Wechselrichter2:AC.Power.Fast 1
WechselrichterGroup:sum 6

Danke und Gruß!

justme1968

je nach dem wie es aussehen soll. spaltenweise z.b. so:

.*:Daily.Energy,AC.Power.Fast
<hr>
WechselrichterGroup:<&Sigma;>,$sum(:1),$sum(:2)


so wie bei dir einspaltig z.b. so:Wechselrichter.:Daily.Energy WechselrichterGroup:$sum(1..$ROW)  Wechselrichter.:AC.Power.Fast WechselrichterGroup:$sum($ROW-2..$ROW)das hat aber für den zweiten block den nachteil das die anzahl der geräte (2) fest eingetragen werden muss.

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

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

sz_wolfi

#34
Zitat von: C0mmanda am 26 April 2016, 17:45:06

Jetzt bekomme ich natürlich diese Fehlermeldung:

2016.04.26 17:40:37 1: PERL WARNING: Argument "233.32 V" isn't numeric in sprintf at ./FHEM/33_readingsGroup.pm line 525.


ich habe ein aehnliches Problem - und kann es nicht loesen:

ich habe mehrere Verbrauchsmesser und will als letzte Zeile die Summe anzeigen:


defmod rg_StromVerbrauch readingsGroup < Device: >,<%measure_power>,<%measure_power_meter>\
ALWAYS_ON:power,energy \
DIMMER_OFFICE:power,energy\
STECKER_1:power,energy\
<hr>\
rg_StromVerbrauch:<Summe:>,$sum(:1)@power_total,$sum(:2)@energy_total
attr rg_StromVerbrauch group grp_Stromverbrauch
attr rg_StromVerbrauch mapping {"ALWAYS_ON"=>"IT+NASBOX","STECKER_1"=>"LG-MONITOR","DIMMER_OFFICE"=>"Beleuchtung"}
attr rg_StromVerbrauch room OFFICE
attr rg_StromVerbrauch valueFormat { my $val=$NUM;; my $formatted_val;; $formatted_val = sprintf("%4.2f", $val);; return $formatted_val;; }
attr rg_StromVerbrauch valueStyle style="text-align:right;; font-weight:bold;;"
attr rg_StromVerbrauch valueSuffix {"voltage"=>" V","current"=>" A","power"=>" W","energy"=>" kWh","power_total"=>" W","energy_total"=>" kWh"}


Es funktioniert ALLEs wie gewuenscht, nur kommen im log immer diese Zeilen:


2019.10.16 12:34:34 1: PERL WARNING: Argument "83.268 W" isn't numeric in subroutine entry at (eval 1821225) line 1.
2019.10.16 12:34:34 1: PERL WARNING: Argument "0 W" isn't numeric in subroutine entry at (eval 1821225) line 1.
2019.10.16 12:34:34 1: PERL WARNING: Argument "56.606 W" isn't numeric in subroutine entry at (eval 1821225) line 1.
2019.10.16 12:34:34 1: PERL WARNING: Argument "1854.035 kWh previous: 1854.028 delta_time: 300 s" isn't numeric in subroutine entry at (eval 1821229) line 1.
2019.10.16 12:34:34 1: PERL WARNING: Argument "98.4 kWh previous: 98.4 delta_time: 1800 s" isn't numeric in subroutine entry at (eval 1821229) line 1.
2019.10.16 12:34:34 1: PERL WARNING: Argument "153.87 kWh previous: 153.865 delta_time: 300 s" isn't numeric in subroutine entry at (eval 1821229) line 1.


ich habe das 'valueFormat' rel. einfach gemacht - mit debug getestet - kommen nur Zahlen zurueck:


{ my $val=$NUM; my $formatted_val; $formatted_val = sprintf("%4.2f", $val); return $formatted_val; }


valueSuffix - pinselt dann wieder die Einheiten dran:


{"voltage"=>" V","current"=>" A","power"=>" W","energy"=>" kWh","power_total"=>" W","energy_total"=>" kWh"}



ABER:
Die PERL-Meldungen sagen mir, dass die Summen-Funktion NICHT auf die mit ValueStyle-formattierten Readings zugreift,
sondern auf die 'rohen' Readings vom Gerät:


Argument "1854.035 kWh previous: 1854.028 delta_time: 300 s" isn't numeric in subroutine entry at (eval 1821323) line 1.


...so melden die Aeotec-Teile ihren Verbrauchszähler im Reading - raw.
D.h. die sum-Funktion von 'readingsGroup' - muesste auf $NUM statt $VALUE zum Summieren zugreifen.

oder ich muss fuer alle Sensoren userReadings bauen, die die Einheiten+Text vorab schon abschneiden.
(will ich eigentlich vermeiden)

...AH - EDIT: --- mit userReadings an allen beteiligten Devices geht natürlich der Fehler weg.
einfach jedem Strommess-Device so ein Satz Readings einbauen - hier nur beispielhaft an einem Device:


attr STECKER_1 userReadings energyNum {return ReadingsNum("$name","energy",0);;},powerNum {return ReadingsNum("$name","power",0);;}


...und dann in der ReadingsGroup statt 'energy' -> 'energyNum' und statt 'power' -> 'powerNum' lesen/summieren ...

KNUT345

Hallo Zusammen,
ich wollte ähnliches machen, Rechnen mit power,
aber auch bei mir gibt es Geräte die das Reading mit und ohne 'W' liefern
und dann kommt es zu genau den vorgenannten Fehlermeldungen.
Zitat
2022.02.06 15:13:09 1: PERL WARNING: Argument "0.00 W" isn't numeric in subroutine entry at (eval 9210503) line 1.
2022.02.06 15:13:09 1: PERL WARNING: Argument "5.22 W" isn't numeric in subroutine entry at (eval 9210503) line 1.
2022.02.06 15:13:09 1: PERL WARNING: Argument "26.60 W" isn't numeric in subroutine entry at (eval 9210503) line 1.
Jetzt habe ich eingangs gelesen, dass man auch eine Regex einsetzen könnte

rg_Statistik_Steckdosen:,$scalar@<#>,<>,$sum(:3)

Die Umsetzung ist mir aber nicht klar.

Ok, die Variante mit dem Hilfs-Reading ist mir klar und habe ich an anderer Stelle schon verwendet,
aber hier habe ich eine Vielzahl von Geräten und da hätte so eine Regex schon mehr Charm.

Danke im Voraus
Knut

justme1968

einfach in der definition der readingsGroup :d an die reading namen anhängen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

KNUT345


KNUT345

Ok, ganz so einfach geht es doch nicht, denn
Ich habe etwas getrickst.
Ich wollte die Leistung meiner Steckdosen einfach addieren,
da ich seit kurzem ein Balkonkraftwerk an einer Steckdose habe.
Und da dachte ich mir, alles kein Problem wenn da nur -power kommt.
Um das zu erreichen habe ich ein Dummy erzeugt, dort das Reading invertiert und
dann eben in einer Funktion in myUtils entsprechend umgeleitet.

..Steckdose6X.{1,2}):voltage:d,power@{PowerOfDevice($DEVICE)}:d,statMyEnergyDay,..
<hr>
rg_Statistik_Steckdosen:<Summe>,$scalar@<#>,$sum(:2),$sum(:3)


# Namen des Power-Device aus device ableiten
sub PowerOfDevice ($)
{
  my ($DEVICE) = @_;
  if ($DEVICE eq "Steckdose10") {
    return $DEVICE."_green";
  } else {
    return $DEVICE;
  }
}

Zitat
2022.02.07 20:43:43 1: PERL WARNING: Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/^power@{ <-- HERE PowerOfDevice($DEVICE)}:d,statMyEnergyDay,statMyEnergyDayLast,statMyEnergyMonth,statMyEnergyYear,myEnergy,state$/ at ./FHEM/33_readingsGroup.pm line 1076.
hingegen

..Steckdose6X.{1,2}):voltage:d,power:d@{PowerOfDevice($DEVICE)},statMyEnergyDay,..
<hr>
rg_Statistik_Steckdosen:<Summe>,$scalar@<#>,$sum(:2),$sum(:3)

liefert
Zitat
2022.02.07 20:47:57 1: PERL WARNING: Argument "0.00 W" isn't numeric in subroutine entry at (eval 9585789) line 1.
2022.02.07 20:47:57 1: PERL WARNING: Argument "2.21 W" isn't numeric in subroutine entry at (eval 9585789) line 1.
2022.02.07 20:47:57 1: PERL WARNING: Argument "4.64 W" isn't numeric in subroutine entry at (eval 9585789) line 1.

Was mich auch noch interessieren würde.
Wie bekomme ich die ValueFormat auch in die Ergebniszeile? (siehe Anhang)

Grüße


KNUT345

Ok, wer lesen kann ist klar im Vorteil.
Zitat
...und lassen sich über valuePrefix, valueSuffix, valueFormat und valueStyle in der Darstellung beeinflussen...

Auch etwas rumprobieren hilft.

...Steckdose6X.{1,2}):voltage:d,power:d@{PowerOfDevice($DEVICE)},statMyEnergyDay,...
rg_Statistik_Steckdosen:<Summe>,$scalar,$sum(:2)@SUM2,$sum(:3)@SUM3


und dann mit valueFormat

{scalar => '{sprintf("Σ %d",$VALUE)}',
SUM2 => '{sprintf("%.1f W",$VALUE)}',
SUM3 => '{sprintf("%.1f Wh",$VALUE)}',
usw.}


Ein klasse Tool.