gelöst: readingsGroup mit vom Reading gesteuertem Icon

Begonnen von KNUT345, 11 März 2015, 10:31:18

Vorheriges Thema - Nächstes Thema

KNUT345

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' } }

Elektrolurch

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
configDB und Windows befreite Zone!

KNUT345

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

Elektrolurch

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
configDB und Windows befreite Zone!

KNUT345

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

justme1968

#5
wenn du etwas werte abhängig einfärben willst schau dir das hier an: http://www.fhemwiki.de/wiki/Color#Farbskala_mit_Color::pahColor oder das hier: http://forum.fhem.de/index.php/topic,26470.msg194541.html#msg194541.

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

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

KNUT345

Danke, die 2 Beispiele sind ober cool, das muss ich mir mal in Ruhe anschauen.

KNUT345

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

KNUT345

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

KNUT345

Hat keiner einen Tipp, oder ist es nicht möglich?
Grüße

justme1968

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 zusammen bauen.

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

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

KNUT345

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

justme1968

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

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

KNUT345

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

KNUT345

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