devStateIcon - negative Zahl anders färben

Begonnen von australien, 15 Mai 2020, 19:23:12

Vorheriges Thema - Nächstes Thema

australien

Hallo zusammen,

ich würde gerne in meinem devStateIcon den Wert #total_ges bei positiv rot und bei negativ grün schreiben.

wie ist das darstellbar?

Danke für Eure Hilfe


{my $onl = ReadingsVal($name,"online","false") eq "false"?"10px-kreis-rot" : ReadingsVal($name,"new_fw","false") eq "true" ? "10px-kreis-gelb" : "10px-kreis-gruen";;   
my $light = ReadingsVal($name,"state","off");;     

my $cons1 = ReadingsVal($name,"emeter_0_power","unknown");;   
my $ret_day1 = (ReadingsVal($name,"emeter_0_returned_energy","unknown")/1000);; 
my $ret_all1 = (ReadingsVal($name,"emeter_0_total_returned","unknown")/1000);;   
my $total1 = (ReadingsVal($name,"emeter_0_total","unknown")/1000);;     

my $cons2 = ReadingsVal($name,"emeter_1_power","unknown");;   
my $ret_day2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);; 
my $ret_all2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);;   
my $total2 = (ReadingsVal($name,"emeter_1_total","unknown")/1000);;     

my $cons3 = ReadingsVal($name,"emeter_2_power","unknown");;   
my $ret_day3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);; 
my $ret_all3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);;   
my $total3 = (ReadingsVal($name,"emeter_2_total","unknown")/1000);;   

my $sumcons =$cons1+$cons2+$cons3;;   
my $ret_ges = $ret_all1+$ret_all2+$ret_all3;; 
my $total_ges = $total1+$total2+$total3;;   

"<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a><div>Verbrauch L1: $cons1 / Ret_day: $ret_day1/ Ret_all: $ret_all1/ Total: $total1</br>Verbrauch L2: $cons2 / Ret_day: $ret_day2/ Ret_all: $ret_all2/ Total: $total2 </br>Verbrauch L2: $cons3 / Ret_day: $ret_day3/ Ret_all: $ret_all3/ Total: $total3 </br>akt Gesamt: $sumcons</br>Gesamt Return: $ret_ges kW/ Gesamt Verbrauch: $total_ges kW</div>"}
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

australien

gibt es keine Tips?

werde mit der Suche nicht fündig, leider.
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Otto123

#2
Hi,

ich hab Dir mal das Beispiel aus der Doku ganz simpel aufbereitet:
define LUK10 dummy
attr LUK10 devStateIcon {(Value($name)>0)?'<div style="width:32px;;height:32px;;background-color:green"></div>':'<div style="width:32px;;height:32px;;background-color:red"></div>'}
attr LUK10 room Test
attr LUK10 setList -5 +5


Das geht wesentlich schlanker, aber vielleicht ist so der Mechanismus klarer.

Der Ausdruck ist ein typischer Vergleich in Perl: (Bedingung)?'Return wahr':'Return falsch'

So wäre ne kurze Variante (für die DEF nicht Raw Def!):
{my $color=(Value($name)>0)?'red':'green';return '<div style="width:32px;height:32px;background-color:'.$color.'"></div>'}

Vielleicht kommst Du damit weiter?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Dann würde ich doch gleich den Wert einfärben:

devStateIcon {my $color=(Value($name)>0)?'red':'green';;return '<div style="color:'.$color.'">'.Value($name).'</div>'}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

oder etwas kürzer:

devStateIcon {'<div style="color:'.(Value($name)<0?'red':'green').'">'.Value($name).'</div>'}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

australien

danke für Eure Inputs, leider bekomme ich es trozdem nicht hin:

attr MQTT2_shellyem3 devStateIcon: Bad name after red' at (eval 200783) line 1.

anstatt red und green sind die #Werte
attr MQTT2_shellyem3 devStateIcon: syntax error at (eval 199939) line 1, near "color"

{my $onl = ReadingsVal($name,"online","false") eq "false"?"10px-kreis-rot" : ReadingsVal($name,"new_fw","false") eq "true" ? "10px-kreis-gelb" : "10px-kreis-gruen";;   
my $light = ReadingsVal($name,"state","off");;     

my $cons1 = ReadingsVal($name,"emeter_0_power","unknown");;   
my $ret_day1 = (ReadingsVal($name,"emeter_0_returned_energy","unknown")/1000);; 
my $ret_all1 = (ReadingsVal($name,"emeter_0_total_returned","unknown")/1000);;   
my $total1 = (ReadingsVal($name,"emeter_0_total","unknown")/1000);;     

my $cons2 = ReadingsVal($name,"emeter_1_power","unknown");;   
my $ret_day2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);; 
my $ret_all2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);;   
my $total2 = (ReadingsVal($name,"emeter_1_total","unknown")/1000);;     

my $cons3 = ReadingsVal($name,"emeter_2_power","unknown");;   
my $ret_day3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);; 
my $ret_all3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);;   
my $total3 = (ReadingsVal($name,"emeter_2_total","unknown")/1000);;   

my $sumcons =$cons1+$cons2+$cons3;;   
my $ret_ges = $ret_all1+$ret_all2+$ret_all3;; 
my $total_ges = $total1+$total2+$total3;;   

"<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a><div>Verbrauch L1: $cons1 / Ret_day: $ret_day1/ Ret_all: $ret_all1/ Total: $total1</br>Verbrauch L2: $cons2 / Ret_day: $ret_day2/ Ret_all: $ret_all2/ Total: $total2 </br>Verbrauch L2: $cons3 / Ret_day: $ret_day3/ Ret_all: $ret_all3/ Total: $total3 </br>akt Gesamt: $sumcons</br>Gesamt Return: $ret_ges kW/ Gesamt Verbrauch: $total_ges kW</div>
<div style="color:'.(Value($sumcons)<0?'red':'green').'">'.Value($sumcons).'</div>"}



raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Otto123

Wozu (Value($sumcons) ?
In $sumcons steht doch Dein Wert? Mit Value willst ein Gerät dessen Name in  $sumcons steht auslesen  :o
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

australien

#7
das ist eine gute Bemerkung :)

wenn ich
"<div style="color:'.($sumcons<0?'red':'green').'">'.$sumcons.'</div>"}

schreibe, bekomme ich aber trotzdem den Fehler
attr MQTT2_shellyem3 devStateIcon: Bad name after red' at (eval 670235) line 1.



wenn ich - Leerzeichen nach der Farbe
"<div style="color:'.($sumcons<0?'red ':'green ').'">'.$sumcons.'</div>"}

schreibe, kommt das
attr MQTT2_shellyem3 devStateIcon: syntax error at (eval 698761) line 1, near ""<div style="color"
und das irritiert mich?
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Damian

Schaue dir mal die einfachen und die doppelten Anführungszeichen genauer an und vergleiche sie mit meinem Vorschlag ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

australien

Zitat von: Damian am 26 Mai 2020, 16:27:27
Schaue dir mal die einfachen und die doppelten Anführungszeichen genauer an und vergleiche sie mit meinem Vorschlag ;)

ich sehe den Unterschied ' und  ", sehe aber den Wald vor lauter Bäumen nicht!

{my $onl = ReadingsVal($name,"online","false") eq "false"?"10px-kreis-rot" : ReadingsVal($name,"new_fw","false") eq "true" ? "10px-kreis-gelb" : "10px-kreis-gruen";;   
my $light = ReadingsVal($name,"state","off");;     

my $cons1 = ReadingsVal($name,"emeter_0_power","unknown");;   
my $ret_day1 = (ReadingsVal($name,"emeter_0_returned_energy","unknown")/1000);; 
my $ret_all1 = (ReadingsVal($name,"emeter_0_total_returned","unknown")/1000);;   
my $total1 = (ReadingsVal($name,"emeter_0_total","unknown")/1000);;     

my $cons2 = ReadingsVal($name,"emeter_1_power","unknown");;   
my $ret_day2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);; 
my $ret_all2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);;   
my $total2 = (ReadingsVal($name,"emeter_1_total","unknown")/1000);;     

my $cons3 = ReadingsVal($name,"emeter_2_power","unknown");;   
my $ret_day3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);; 
my $ret_all3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);;   
my $total3 = (ReadingsVal($name,"emeter_2_total","unknown")/1000);;   

my $sumcons =$cons1+$cons2+$cons3;;   
my $ret_ges = $ret_all1+$ret_all2+$ret_all3;; 
my $total_ges = $total1+$total2+$total3;;   
'<div style="color:'.(Value($name)<0?'red':'green').'">'.Value($name).'</div>'}

schreibt mir off oder on in grün.

Wenn ich aber
{my $onl = ReadingsVal($name,"online","false") eq "false"?"10px-kreis-rot" : ReadingsVal($name,"new_fw","false") eq "true" ? "10px-kreis-gelb" : "10px-kreis-gruen";;   
my $light = ReadingsVal($name,"state","off");;     

my $cons1 = ReadingsVal($name,"emeter_0_power","unknown");;   
my $ret_day1 = (ReadingsVal($name,"emeter_0_returned_energy","unknown")/1000);; 
my $ret_all1 = (ReadingsVal($name,"emeter_0_total_returned","unknown")/1000);;   
my $total1 = (ReadingsVal($name,"emeter_0_total","unknown")/1000);;     

my $cons2 = ReadingsVal($name,"emeter_1_power","unknown");;   
my $ret_day2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);; 
my $ret_all2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);;   
my $total2 = (ReadingsVal($name,"emeter_1_total","unknown")/1000);;     

my $cons3 = ReadingsVal($name,"emeter_2_power","unknown");;   
my $ret_day3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);; 
my $ret_all3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);;   
my $total3 = (ReadingsVal($name,"emeter_2_total","unknown")/1000);;   

my $sumcons =$cons1+$cons2+$cons3;;   
my $ret_ges = $ret_all1+$ret_all2+$ret_all3;; 
my $total_ges = $total1+$total2+$total3;;   


'<div style="color:'.($sumcons)<0?'red ':'green ').'">'.$sumcons.'</div>'}

mache, es soll ja der wert $sumcons abgefragt und ausgegeben werden, kommt
attr MQTT2_shellyem3 devStateIcon: syntax error at (eval 715170) line 1, near "'green ')"

und eigenltich soll der Wert $sumcons hier mitausgegeben werden

"<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a><div>Verbrauch L1: $cons1 / Ret_day: $ret_day1/ Ret_all: $ret_all1/ Total: $total1</br>Verbrauch L2: $cons2 / Ret_day: $ret_day2/ Ret_all: $ret_all2/ Total: $total2 </br>Verbrauch L2: $cons3 / Ret_day: $ret_day3/ Ret_all: $ret_all3/ Total: $total3</br> akt Gesamt: $sumcons</br>Gesamt Return: $ret_ges kW/Gesamt Verbrauch: $total_ges kW</div>"}


es kann auch mittlerweile anstatt des Wertes $sumcons das UserReading energy_total verwendet werden.
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Otto123

Ehrlich: das ist zu lang und unübersichtlich. Solche ewig langen Strings mit ' und " und Variablen dazwischen :(
Damians Vorschlag sieht von der Sache her so aus:
{'<div style="color:'.'red'.'">'.'willi'.'</div>'}
Schau was da rauskommt wenn Du es in die FHEM Kommandozeile wirfst.
Deines sieht eher so aus:
{"<div style="color:'.'red'.'">'.'willi'.'</div>"}
Schau was da rauskommt wenn Du es in die FHEM Kommandozeile wirfst.

Große Probleme immer in kleine zerteilen :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

australien

Danke Otto, und Damian

schön langsam kommt Licht ins Dunkel.

bis jetzt
{my $onl = ReadingsVal($name,"online","false") eq "false"?"10px-kreis-rot" : ReadingsVal($name,"new_fw","false") eq "true" ? "10px-kreis-gelb" : "10px-kreis-gruen";;   
my $light = ReadingsVal($name,"state","off");;     

my $cons1 = ReadingsVal($name,"emeter_0_power","unknown");;   
my $ret_day1 = (ReadingsVal($name,"emeter_0_returned_energy","unknown")/1000);; 
my $ret_all1 = (ReadingsVal($name,"emeter_0_total_returned","unknown")/1000);;   
my $total1 = (ReadingsVal($name,"emeter_0_total","unknown")/1000);;     

my $cons2 = ReadingsVal($name,"emeter_1_power","unknown");;   
my $ret_day2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);; 
my $ret_all2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);;   
my $total2 = (ReadingsVal($name,"emeter_1_total","unknown")/1000);;     

my $cons3 = ReadingsVal($name,"emeter_2_power","unknown");;   
my $ret_day3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);; 
my $ret_all3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);;   
my $total3 = (ReadingsVal($name,"emeter_2_total","unknown")/1000);;   

my $sumcons = ReadingsVal($name,"energy_total",9999);;   
my $ret_ges = $ret_all1+$ret_all2+$ret_all3;; 
my $total_ges = $total1+$total2+$total3;;


'<div>Verbrauch L1 '.$cons1.' Ret_day: '.$ret_day1.' Ret_all '.$ret_all1.' Total '.$total1.'
</br>Verbrauch L2 '.$cons2.' Ret_day: '.$ret_day2.' Ret_all '.$ret_all2.' Total '.$total2.'
</br>Verbrauch L3 '.$cons3.' Ret_day: '.$ret_day3.' Ret_all '.$ret_all3.' Total '.$total3.'</div>
<div>Total </div> <div style="color:'.($sumcons<0?'green':'red').'">'.$sumcons.'</div>
<div></br>Gesamt Return: '.$ret_ges.' kW/Gesamt Verbrauch: '.$total_ges.' kW</div>'}


ergibt dann:
Verbrauch L1 -254.53 Ret_day: 0.078 Ret_all 459.4466 Total 299.632
Verbrauch L2 224.40 Ret_day: 0 Ret_all 0 Total 472.2731
Verbrauch L3 -336.49 Ret_day: 0.438 Ret_all 0.438 Total 329.9894
Total
-366.62

Gesamt Return: 459.8846 kW/Gesamt Verbrauch: 1101.8945 kW

aber alles als Toggle Button für den switch?!

wie bekomme ich nun noch folgendes eingearbeitet?
"<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a>
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a>
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

australien

Geschaft!!!

einiges Manko, es ist nun der ganze Status/Text als toggle switch vorhanden, was mir persönlich aber egal ist.

meine Lösung
{my $onl = (ReadingsVal($name,"online","false") eq "false"?"10px-kreis-rot" : ReadingsVal($name,"new_fw","false") eq "true" ? "10px-kreis-gelb" : "10px-kreis-gruen");;
my $online = FW_makeImage($onl);;
my $light = FW_makeImage(ReadingsVal($name,"state","off"));;

my $cons1 = ReadingsVal($name,"emeter_0_power","unknown");;
my $ret_day1 = (ReadingsVal($name,"emeter_0_returned_energy","unknown")/1000);;
my $ret_all1 = (ReadingsVal($name,"emeter_0_total_returned","unknown")/1000);;
my $total1 = (ReadingsVal($name,"emeter_0_total","unknown")/1000);;

my $cons2 = ReadingsVal($name,"emeter_1_power","unknown");;
my $ret_day2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);;
my $ret_all2 = (ReadingsVal($name,"emeter_1_returned_energy","unknown")/1000);;
my $total2 = (ReadingsVal($name,"emeter_1_total","unknown")/1000);;

my $cons3 = ReadingsVal($name,"emeter_2_power","unknown");;
my $ret_day3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);;
my $ret_all3 = (ReadingsVal($name,"emeter_2_returned_energy","unknown")/1000);;
my $total3 = (ReadingsVal($name,"emeter_2_total","unknown")/1000);;

my $sumcons =$cons1+$cons2+$cons3;;
my $ret_ges = $ret_all1+$ret_all2+$ret_all3;;
my $total_ges = $total1+$total2+$total3;;


'<div>'.$online.' '.$light.' akt Gesamt </div> <div style="color:'.($sumcons<0?'green':'red').'">'.$sumcons.'</div>
<div style="color:black">Verbrauch L1 '.$cons1.' Ret_day: '.$ret_day1.' Ret_all '.$ret_all1.' Total '.$total1.'
</br>Verbrauch L2 '.$cons2.' Ret_day: '.$ret_day2.' Ret_all '.$ret_all2.' Total '.$total2.'
</br>Verbrauch L3 '.$cons3.' Ret_day: '.$ret_day3.' Ret_all '.$ret_all3.' Total '.$total3.'
</br>Gesamt Return: '.$ret_ges.' kW  Gesamt Verbrauch: '.$total_ges.' kW</div>'}



Danke euch beiden nochmals!
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"