[gelöst] dreizeiliges Stateformat und devStateIcon

Begonnen von dusti64, 04 Dezember 2022, 17:16:26

Vorheriges Thema - Nächstes Thema

dusti64

Hallo...

in einem Sysstat (Drucker SNMP) habe ich ein Stateformat
Status: <span style='color:{(ReadingsVal("$name",'aktZustand','') ? "green":"red")}'>[$name:aktZustand]</span><br>
Seitenanz.: <span style='color:{(ReadingsVal("$name",'GesamtSeiten','') ? "green":"red")}'>[$name:GesamtSeiten]</span><br>
Toner: <span style='color:{(ReadingsVal("$name",'TonerStatus','') ? "green":"red")}'>[$name:TonerStatus]</span>


Der TonerStatus liefert aus einem Userreading eine 1

Ich möchte jetzt in der 3. Zeile den Text "Toner" und danach abhängig vom Reading "Tonerstatus" ein Icon message_attention oder message_ok haben.
Daran scheitere ich kläglich, egal was ich anstelle...

Gelesen habe ich alles mögliche, was ich hierzu gefunden habe im Forum, aber leider klappt nichts davon, weil ich immer wieder Fehler in der Art:
devStateIcon is not a valid regexp: Unmatched ( in regex; marked by <-- HERE in m/^(ReadingsVal( <-- HERE $name,$/ at fhem.pl line 3182 wenn ich zum Beispiel das versuche:
{my $alivecolor = 'ampel_aus@red';;$alivecolor='ampel_aus@green' if (ReadingsVal($name, "TonerStatus", "0") eq "1");;"<div>" . FW_makeImage("$alivecolor","ampel_aus") .  "</div>"} Auch das Beispiel mit dem IconDemo habe ich versucht...

Mit einem einzeiligen State klappt es, aber nicht mit drei Zeilen...ob  mir jemand helfen kann, der mehr Ahnung von der richtigen Syntax hat, um dies zu erreichen?

Gruß Dusti
2x Debian virtualisiert auf QNAP mit FHEM, 2x HMLAN, VCCU, Homatic Heizung+Licht-Rollläden, Alexa mit 2 Echos, Homebridge, Hue, Instar

Miami

Versuche mal :
ZitatStatus: <span style='color:{(ReadingsVal('$name','aktZustand','') ? "green":"red")}'>[$name:aktZustand]</span><br>
Seitenanz.: <span style='color:{(ReadingsVal('$name','GesamtSeiten','') ? "green":"red")}'>[$name:GesamtSeiten]</span><br>
Toner: <span style='color:{(ReadingsVal('$name','TonerStatus','') eq '1' ? "green":"red")}'>[$name:TonerStatus]</span>
Und ich würde in den Parametern von ReadingsVal entweder nur " oder nur ' verwenden.

dusti64

Danke!

Da ändert sich leider nichts, ich habe weiterhin 3 Ampeln untereinander.

Der State in den Internals zeigt ja auch alles richtig an:
Status: <span style='color:green'>Energiesparen</span><br>
Seitenanz.: <span style='color:green'>1020</span><br>
Toner: <span style='color:green'>1</span>


Ich weiß nicht, wie ich die ersten beiden Zeilen ohne Icon darstellen kann und wie in der 3. dann noch "Toner" davor steht...
2x Debian virtualisiert auf QNAP mit FHEM, 2x HMLAN, VCCU, Homatic Heizung+Licht-Rollläden, Alexa mit 2 Echos, Homebridge, Hue, Instar

eisman

#3
Hi,

vieleicht hilfs:


sub sub_Durchschnitt($) {
my ($Dev) = @_; my $Farbe = ""; my $STRG = "";
my $min = ReadingsVal("TC_0" . $Dev . "01","temperature_min_day", 0);
my $max = ReadingsVal("TC_0" . $Dev . "01","temperature_max_day", 0);

if    ($min <  10)               { $Farbe = "blue";   }
elsif ($min >= 10 and $min < 18) { $Farbe = "cyan";   }
elsif ($min >= 18 and $min < 21) { $Farbe = "green";  }
elsif ($min >= 21 and $min < 23) { $Farbe = "yellow"; }
elsif ($min >= 23)               { $Farbe = "red";    }

$STRG = $STRG .  FW_makeImage("ampel_aus\@red","ampel_aus") . "<span style='font-size:10px;font-weight:bold;color:" . $Farbe . ";'>" . $min . "</span>";
$STRG = $STRG ."<span style='font-size:6px;color:tan;'>°C<br></span>";

if    ($max <  10)               { $Farbe = "blue";   }
elsif ($max >= 10 and $max < 18) { $Farbe = "cyan";   }
elsif ($max >= 18 and $max < 21) { $Farbe = "green";  }
elsif ($max >= 21 and $max < 23) { $Farbe = "yellow"; }
elsif ($max >= 23)               { $Farbe = "red";    }

$STRG = $STRG ."<span style='font-size:10px;font-weight:bold;color:" . $Farbe . ";'>" . $max . "</span>";
$STRG = $STRG ."<span style='font-size:6px;color:tan;'>°C</span>";
return $STRG;
}



mit (Zeichensatz)


sub sub_Heizung($) {
my ($Dev) = @_; my $Farbe = ""; my $VorZeichen = ""; my $STRG = "";
my $NewTemp  = ReadingsVal("TC_0" . $Dev . "01","measured-temp",0);       
my $OldTemp  = ReadingsVal("TC_0" . $Dev . "01","old-temp",0);     

if   ($NewTemp <  $OldTemp) { $VorZeichen = "▼"; $Farbe = "mediumblue"; }
elsif($NewTemp >  $OldTemp) { $VorZeichen = "▲"; $Farbe = "red";        }
elsif($NewTemp == $OldTemp) { $VorZeichen = "●"; $Farbe = "green";      }
 
$NewTemp = sprintf("%.1f", $NewTemp);
$STRG    = $STRG . "<span style='font-size:10px;font-weight:bold;color:" . $Farbe . ";'>" . $VorZeichen . "</span>";

if    ($NewTemp <  10)                   { $Farbe = "blue";   }
elsif ($NewTemp >= 10 and $NewTemp < 18) { $Farbe = "cyan";   }
elsif ($NewTemp >= 18 and $NewTemp < 21) { $Farbe = "green";  }
elsif ($NewTemp >= 21 and $NewTemp < 23) { $Farbe = "yellow"; }
elsif ($NewTemp >= 23)                   { $Farbe = "red";    }

$STRG = $STRG . "<span style='font-size:22px; font-weight:bold; color:" . $Farbe . ";'>" . $NewTemp . "</span>";
$STRG = $STRG . "<span style='font-size:10px; font-weight:bold; color:gray;'>°C</span>";

return $STRG;
}


aufruf:

devStateIcon  { sub_Durchschnitt(1)}


nur als Beispiel.....
gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian, Homematic,ZigBee         / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian,MQTT                               / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

OdfFhem

@dusti64

Die parallele Verwendung von stateFormat und devStateIcon würde (in Deinem Fall) funktionieren:
... s. Screenshot (die Icons sind wertabhängig und können folglich auch entfallen)


attr ftuitest devStateIcon x.0:ampel_aus@red x.1:ampel_aus@green x.2:ampel_aus@blue x.*:ampel_aus@transparent
attr ftuitest stateFormat Status: <span style='color:{(ReadingsVal("$name",'x0','') ? "green":"red")}'>[$name:x0]</span>\
{('x0'.ReadingsVal("$name",'x0',''))}\
<br>\
Seitenanz.: <span style='color:{(ReadingsVal("$name",'x1','') ? "green":"red")}'>[$name:x1]</span>\
{('x1'.ReadingsVal("$name",'x1',''))}\
<br>\
Toner: <span style='color:{(ReadingsVal("$name",'x2','') ? "green":"red")}'>[$name:x2]</span>\
{('x2'.ReadingsVal("$name",'x2',''))}


Frage ist, ob Du tatsächlich den Mix aus beiden Attributen haben willst oder doch nur die DeviceOverview-Darstellung anpassen möchtest ?

dusti64

Ich danke euch schon mal für die Hilfe/Anstöße und werde es mir anschauen und versuchen (y)

Gruß Dusti
2x Debian virtualisiert auf QNAP mit FHEM, 2x HMLAN, VCCU, Homatic Heizung+Licht-Rollläden, Alexa mit 2 Echos, Homebridge, Hue, Instar

dusti64

#6
Zitat von: OdfFhem am 05 Dezember 2022, 10:29:52
@dusti64

Frage ist, ob Du tatsächlich den Mix aus beiden Attributen haben willst oder doch nur die DeviceOverview-Darstellung anpassen möchtest ?

@OdfFhem
Ich möchte schon gern die ersten beiden Zeilen als Text mit dem aktuellen Status und der Anzahl, sowie die dritte ein farbiges Symbol mit dem Text Toner davor...hab aber nicht genug Ahnung von Perl dafür  :-[ also ja, die DeviceOverview-Darstellung anpassen...

Edit:
Mit folgendem Code habe ich das, was ich möchte:
Stateformat Status: <span style='color:{(ReadingsVal("$name",'aktZustand','') ? "green":"red")}'>[$name:aktZustand]</span>
<br>
Seitenanz.: <span style='color:{(ReadingsVal("$name",'GesamtSeiten','') ? "green":"red")}'>[$name:GesamtSeiten]</span>
<br>
Toner: <span style='color:{(ReadingsVal("$name",'x2','') ? "green":"red")}'</span>
{('x2'.ReadingsVal("$name",'TonerStatus',''))}

devStateIcon
x.0:it_printer@red x.1:it_printer@green x.2:it_printer@blue x.*:it_printer@transparent und ich hoffe, dass es so richtig ist (siehe Anhang)...

Herzlichen Dank für die Hilfe @OdfFhem!

Gruß Dusti

2x Debian virtualisiert auf QNAP mit FHEM, 2x HMLAN, VCCU, Homatic Heizung+Licht-Rollläden, Alexa mit 2 Echos, Homebridge, Hue, Instar

OdfFhem

Zitat von: dusti64 am 05 Dezember 2022, 14:07:30
und ich hoffe, dass es so richtig ist
Richtig ist ja (meistens) relativ ... wichtig dabei: es macht das, was Du willst.


stateFormat würde ich etwas straffen und den span-Zweig hinter "Toner:" entfernen ... es wird ja sowieso mit Reading x2 immer der leere String geliefert:

Status: <span style='color:{(ReadingsVal("$name",'aktZustand','') ? "green":"red")}'>[$name:aktZustand]</span><br>
Seitenanz.: <span style='color:{(ReadingsVal("$name",'GesamtSeiten','') ? "green":"red")}'>[$name:GesamtSeiten]</span><br>
Toner:
{('x2'.ReadingsVal("$name",'TonerStatus',''))}


devStateIcon würde ich ebenfalls straffen
... wenn es nur 0 bzw. 1 für das Reading TonerStatus gibt, würde ich den Rest entfernen:

x.0:it_printer@red x.1:it_printer@green

... wenn es doch noch unerwartete Werte geben könnte, dann würde ich das Unerwartete z.B. in das Warnschild übersetzen:

x.0:it_printer@red x.1:it_printer@green x.*:message_attention@orange


dusti64

Zitat von: OdfFhem am 06 Dezember 2022, 10:06:36
wichtig dabei: es macht das, was Du willst.

Wenigstens mal einer :D

Hab vielen Dank, ich habs geändert (y)

Gruß Dusti
2x Debian virtualisiert auf QNAP mit FHEM, 2x HMLAN, VCCU, Homatic Heizung+Licht-Rollläden, Alexa mit 2 Echos, Homebridge, Hue, Instar