Hallo Zusammen,
ich wollte meine ReadingsGroup zur Heizungsanzeige um ein vom Batteriezustand abhängiges Symbol ergänzen.
Leider gelingt mir die Zuordnung nicht, verliere durch die Abfrage die restlichen Auswertungen am Attr valueIcon.
Was mache ich falsch?
ReadingsGroup ohne Auswertung des Batteriezustands
{ 'battery.ok' => 'measure_battery_75@green', 'battery.low' => 'batterie@red', 'controlMode.auto' => 'sani_heating_automatic@green', 'controlMode.set_auto' => 'sani_heating_automatic@orange' , 'controlMode.manual' => 'sani_heating_manual@red', 'controlMode.set_manual' => 'sani_heating_manual@orange','state.closed' => 'fts_window_1w@green','state.tilted' => 'fts_window_1w_tilt@orange','state.open' => 'fts_window_1w_open@red' }
ReadingsGroup mit Auswertung
{ if($READING eq "batteryLevel" and $VALUE > 4) {'measure_battery_75@green'} else {'battery.ok' => 'measure_battery_75@green', 'battery.low' => 'batterie@red', 'controlMode.auto' => 'sani_heating_automatic@green', 'controlMode.set_auto' => 'sani_heating_automatic@orange' , 'controlMode.manual' => 'sani_heating_manual@red', 'controlMode.set_manual' => 'sani_heating_manual@orange','state.closed' => 'fts_window_1w@green','state.tilted' => 'fts_window_1w_tilt@orange','state.open' => 'fts_window_1w_open@red' } }
Du vermischst da zwei 'Formen, entweder nur einen perl-Code verwenden oder einen Hash.
Was aber geht, ist folgende Schreibweise:
valueIcon {'reading1.wert1^' => '{perlcode, der einen wert für ein Icon zurückliefert}', 'reading2' => '{perlcode, der $READING auswertet und ein Icon zurückliefert}', 'reading43.Wert1' => 'Icon',... usw}
Zuerst wird der hash ausgewertet, wenn der Inhalt in {[ steht, wird ein eval darauf ausgeführt. Das eval kann $READING, $VALUE, $DEVICE usw auswerten. Da wird vorher im Grunde genommen nur ein
s/$READING/durch den aktuellen Wert/g gemacht.
Gruß
Elektrolurch
Hallo Elektrolurch,
mit deinem Tipp bin ich ein deutliches Stück weiter gekommen,
aber ich bekomm die Farbsteuerung der Icons noch nicht geregelt.
{'batteryLevel' => '{if($VALUE gt "2.7") {"measure_battery_75"} else {"measure_battery_0"}}', 'battery.ok' => 'measure_battery_75@green', usw...
Wo/wie muss ich das @green bzw. @red einfügen?
Grüße
Knut
Hinter dem Icon-Namen m.K.n.:
'battery.ok' => 'measure_battery_75@green', usw...
Die If-Abfrage könnte man wohl auch so schreiben:
'reading.Wert1' => 'icon1@red', 'reading.Wert2' => 'Icon@yellow',...
Was ich aber nicht weiß:
Ich denke, dass das mit der Farbangabe nur für Icons vom Typ svg geht und nicht für .png.
Elektrolurch
OK, das funktioniert, so hab ich das auch vorher schon verstanden.
Damit sind meine Grenzen nun quasi hartverdrahtet.
Ich wollte das aber dynmaisch ohne Eingriff in Programmierung, heißt über 2 Variablen steuern können.
Mal sehen, ob jemanden noch was dazu einfällt.
Danke
wenn du etwas werte abhängig einfärben willst schau dir das hier an: http://www.fhemwiki.de/wiki/Color#Farbskala_mit_Color::pahColor (http://www.fhemwiki.de/wiki/Color#Farbskala_mit_Color::pahColor) oder das hier: http://forum.fhem.de/index.php/topic,26470.msg194541.html#msg194541 (http://forum.fhem.de/index.php/topic,26470.msg194541.html#msg194541).
gruss
andre
Danke, die 2 Beispiele sind ober cool, das muss ich mir mal in Ruhe anschauen.
Hallo,
mittlerweile konnte ich meine readingsGroup "Heizung" schon deutlich verbessern, aber ich hab da immer noch einen Punkt bei dem ich nicht weiterkomme.
Wie bekomme ich die Farbe des controlMode in Abhängigkeit von ValvePosition?
Ich hab es schon über
attr Heizung valueIcon {if(substr($READING,0,12) eq "ValvePosition"){...
versucht, aber das liefert mitunter
2015.07.26 17:31:36 1: PERL WARNING: Useless use of a constant (ValvePosition.60) in void context at (eval 376054) line 1.
2015.07.26 17:31:36 1: PERL WARNING: Useless use of a constant (sani_heating_level_60@FF00DD) in void context at (eval 376054) line 1.
2015.07.26 17:31:36 1: PERL WARNING: Useless use of a constant (ValvePosition.70) in void context at (eval 376054) line 1.
2015.07.26 17:31:36 1: PERL WARNING: Useless use of a constant (sani_heating_level_70@FF00AA) in void context at (eval 376054) line 1.
Gibt es eine Lösung für mein Problem?
Grüße
sorry, ich vergaß, momentan sieht das so aus
{'batteryLevel.100'=>'measure_battery_100@green','batteryLevel.75'=>'measure_battery_75@green','batteryLevel.50'=>'measure_battery_50@orange','batteryLevel.25'=>'measure_battery_25@orange','batteryLevel.0'=>'measure_battery_0@red',
'battery.ok' => 'measure_battery_100@green', 'battery.low' => 'batterie@red',
'controlMode.auto' => 'sani_heating_automatic@green', 'controlMode.set_auto' => 'sani_heating_automatic@orange' ,
'controlMode.manual' => 'sani_heating_manual@red', 'controlMode.set_manual' => 'sani_heating_manual@orange',
'controlMode.boost' => 'sani_heating_boost@orange',
'state.closed' => 'fts_window_1w@green','state.tilted' => 'fts_window_1w_tilt@orange','state.open' => 'fts_window_1w_open@red',
'ValvePosition.0' => 'sani_heating_level_0@0000FF','ValvePosition.10' => 'sani_heating_level_10@6600FF','ValvePosition.20' => 'sani_heating_level_20@8800FF',
'ValvePosition.30' => 'sani_heating_level_30@AA00FF','ValvePosition.40' => 'sani_heating_level_40@CC00FF','ValvePosition.50' => 'sani_heating_level_50@EE00FF',
'ValvePosition.60' => 'sani_heating_level_60@FF00DD','ValvePosition.70' => 'sani_heating_level_70@FF00AA','ValvePosition.80' => 'sani_heating_level_80@FF0088',
'ValvePosition.90' => 'sani_heating_level_90@FF0044','ValvePosition.100' => 'sani_heating_level_100@FF0000'}
Grüße
Hat keiner einen Tipp, oder ist es nicht möglich?
Grüße
du musst für das icon das mapping in der art machen => '{...}' und den icon namen dann anlog zum humitidy beispiel hier: http://www.fhemwiki.de/wiki/Color#Beispiele (http://www.fhemwiki.de/wiki/Color#Beispiele) zusammen bauen.
gruss
andre
Hallo Andre,
danke für den Tipp. Jetzt sieht es so aus wie ich mir das vorgestellt habe. :)
Allerdings frage ich mich, ob ich meinen Code noch etwas verschlanken kann.
...
'ValvePosition.0' => 'sani_heating_level_0@'.substr(Color::pahColor(0,50,100,0,[0,0,255, 140,0,255, 255,0,255, 255,0,140, 255,0,0]),0,6),
'ValvePosition.10' => 'sani_heating_level_10@'.substr(Color::pahColor(0,50,100,10,[0,0,255, 140,0,255, 255,0,255, 255,0,140, 255,0,0]),0,6),
'ValvePosition.20' => 'sani_heating_level_20@'.substr(Color::pahColor(0,50,100,20,[0,0,255, 140,0,255, 255,0,255, 255,0,140, 255,0,0]),0,6),
'ValvePosition.30' => 'sani_heating_level_30@'.substr(Color::pahColor(0,50,100,30,[0,0,255, 140,0,255, 255,0,255, 255,0,140, 255,0,0]),0,6)
...
Ich habe es fast geschafft, aber irgendwie funktionieren nur 0% und 100%, denn bei 27% wurde nur die Zahl 30 angezeigt statt dem Icon, wo liegt mein Denkfehler?
... => 'sani_heating_level_'.int(int(ReadingsVal($DEVICE,"ValvePosition",0)/10+0.5)*10).'@'...
Grüße
etwa so sollte es gehen:..., 'ValvePosition' => '{my $v=int($VALUE/10)*10; return "sani_heating_level_".$v"@"..substr(Color::pahColor(0,50,100,$v,[0,0,255, 140,0,255, 255,0,255, 255,0,140, 255,0,0]),0,6) }', ...
wenn das nicht geht schau ins log. steht da etwas ?
gruss
andre
Hallo Andre,
Klasse, bis auf "." an der falschen Stelle hat es funktioniert, hier die korrigierte Version.
..., 'ValvePosition' => '{my $v=int($VALUE/10)*10; return "sani_heating_level_".$v."@".substr(Color::pahColor(0,50,100,$v,[0,0,255, 140,0,255, 255,0,255, 255,0,140, 255,0,0]),0,6) }',...
Super, jetzt sieht der Code viel aufgeräumter auf.
Das war's was ich gesucht habe.
Danke
Knut
Hallo,
inspiriert durch die vorgenannte Lösung wollte ich nun auch den letzten Teil in der readingsGroup verallgemeinern, Sinn oder Unsinn sei mal dahingestellt.
...'batteryLevel.100' => 'measure_battery_100@green','batteryLevel.75' => 'measure_battery_75@green'...
Leider funktioniert meine Lösung nicht
'...{return "batteryLevel.".$VALUE}' => '{return "measure_battery_".$VALUE."@".substr(Color::pahColor(0,50,100,$VALUE,[0,255,0, 140,255,0, 255,255,0, 255,140,0, 255,0,0]),0,6)}'...
Das Problem liegt in
"batteryLevel.".$VALUE}
denn der Punkt wird als Sonderzeichen interpretiert und nicht als Punkt zwischen batteryLevel und Wert also als "batteryLevel.Wert".
Laut Hinweise aus der perl-Community müsste man den Punkt als Zeichen \. darstellen, aber das hat auch nicht funktioniert.
Hat jemand einen Tipp?
Danke und Grüße
der key, d.h. das was links vom => steht darf kein perl ausdruck sein. das ist aber auch gar nicht nötig.
...,'batteryLevel' => '{return "measure_battery_".$VALUE."@".substr(Color::pahColor(0,50,100,$VALUE,[0,255,0, 140,255,0, 255,255,0, 255,140,0, 255,0,0]),0,6)}',...
ich glaube aber das du $VALUE noch auf die vorhandenen icons beschränken must. es gibt glaube ich nicht für alle werte zwischen 0 und 100 ein icon.
gruss
andre
Hallo Andre,
das war's.
Du hast recht, das $VALUE muss eingeschränkt werden,
das hab ich schon gelöst.
Danke und Grüße