devStateStyle dynamisch ändern?

Begonnen von tomcat.x, 05 Februar 2021, 19:41:49

Vorheriges Thema - Nächstes Thema

tomcat.x

Da ich entsprechend dem Icon auch die Farbe von angezeigten Werten anhand des Status ändern wollte (z. B. bei Temperaturen), hatte ich zuerst versucht im Attribut devStateStyle ähnlich dem devStateIcon etwas einzutragen. Als das nicht funktioniert hat, dann mit einer Perl-Funktion. Das hat natürlich auch nicht geklappt, aber ich bin erst danach auf die Idee gekommen, in der Commmandref nachzuschauen ;-) devStateStyle akzeptiert halt einfach nur einen festen String und interpretiert den Inhalt nicht.

Also habe ich ein paar Zeilen in Perl in ein notify geschrieben, die devStateStyle entsprechend setzen und mache das so. Das funktioniert ohne Probleme. Nachteil ist, dass so ständig Geräte-Definitionen geändert werden und man über das rote ? auf ungespeicherte Änderungen hingewiesen wird, auch wenn man keine Änderungen durchgeführt hat, die gespeichert werden müssten.

Gibt es eine bessere Lösung? Ich nutze die Anzeige in einem Floorplan, denke aber, dass das hier nicht relevant ist. Daher der Post unter FHEMWEB.
FHEM: 6.1 auf Raspi 3, Raspbian (Buster), Perl v5.28.1
Sender/Empfänger: 2 x CULv3, Duofern Stick, HM-MOD-RPI-PCB
Gateways: FRITZ!Box 6591 (OS: 7.57), Trädfri, ConBee 2,  piVCCU, OpenMQTTGateway
Sensoren/Aktoren: FRITZ!DECT, FS20, FHT, HMS, HomeMatic, Trädfri, DuoFern, NetAtmo

MadMax-FHEM

#1
Attribut stateFormat...

Ein Beispiel was ich habe:


{
# color code https://html-color-codes.info/
# https://www.computerhope.com/htmcolor.htm
  my $TempHour = ReadingsNum($name,"statTemperatureHourAvg",0);
  my $TempDay = ReadingsNum($name,"statTemperatureDayAvg",0);
  my $State = "hour: ";
 
  if($TempHour < 7.0)
  {
    # blue
    $State .= "<span style='color:#0000FF'>$TempHour °C</span>";
  }
  elsif($TempHour < 9.0)
  {
    # orange
    $State .= "<span style='color:#FFA500'>$TempHour °C</span>";
  }
  elsif($TempHour >= 9.0)
  {
    # red
    $State .= "<span style='color:#FF0000'>$TempHour °C</span>";
  }
 
  $State .= " day: ";
 
  if($TempDay < 7.0)
  {
    # blue
    $State .= "<span style='color:#0000FF'>$TempDay °C</span>";
  }
  elsif($TempDay < 9.0)
  {
    # orange
    $State .= "<span style='color:#FFA500'>$TempDay °C</span>";
  }
  elsif($TempDay >= 9.0)
  {
    # red
    $State .= "<span style='color:#FF0000'>$TempDay °C</span>";
  }
  return $State;
}


EDIT: return ergänzt ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

tomcat.x

Super, vielen Dank! Der Tipp mit dem Attribut stateFormat hätte schon gereicht, aber dann auch gleich noch mit komplettem Beispiel.

stateFormat nutze ich schon an allen möglichen Stellen, werte zu formatieren. Aber "formatieren" wirklich nur im Sinne eines Zahlenformats. Auf die Idee, dort die Farbe als Style-Tag rein zu packen, bin ich noch nicht gekommen.

Viele Grüße
Thomas
FHEM: 6.1 auf Raspi 3, Raspbian (Buster), Perl v5.28.1
Sender/Empfänger: 2 x CULv3, Duofern Stick, HM-MOD-RPI-PCB
Gateways: FRITZ!Box 6591 (OS: 7.57), Trädfri, ConBee 2,  piVCCU, OpenMQTTGateway
Sensoren/Aktoren: FRITZ!DECT, FS20, FHT, HMS, HomeMatic, Trädfri, DuoFern, NetAtmo

rudolfkoenig

Wobei sowas eher nach devStateIcon gehoert, da stateFormat STATE modifiziert, was wiederum in der Ausgabe von list, jsonlist2, xmllist, etc auftaucht, und HTML an dieser Stelle eher unerwuenscht ist.

MadMax-FHEM

Zitat von: rudolfkoenig am 06 Februar 2021, 12:31:10
Wobei sowas eher nach devStateIcon gehoert, da stateFormat STATE modifiziert, was wiederum in der Ausgabe von list, jsonlist2, xmllist, etc auftaucht, und HTML an dieser Stelle eher unerwuenscht ist.

Jep, habe beides.
War nur das erste was mir bei meiner Installation "untergekommen" ist ;)

Werde mal sehen, vielleicht baue ich um...

Danke, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

tomcat.x

Ok, ich war gerade fertig, habe es aber dann noch mal umgebaut. Wobei ich an devStateIcon noch weniger gedacht hätte, um den Wert zu formatieren.

Übrigens fehlt am Ende bzw. kurz davor ein return, falls jemand anders das liest und sich fragt, wie das ermittelte  Format zurückgegeben wird:


  }
  return $State;
}



FHEM: 6.1 auf Raspi 3, Raspbian (Buster), Perl v5.28.1
Sender/Empfänger: 2 x CULv3, Duofern Stick, HM-MOD-RPI-PCB
Gateways: FRITZ!Box 6591 (OS: 7.57), Trädfri, ConBee 2,  piVCCU, OpenMQTTGateway
Sensoren/Aktoren: FRITZ!DECT, FS20, FHT, HMS, HomeMatic, Trädfri, DuoFern, NetAtmo

MadMax-FHEM

Funktioniert bei mir wie gepostet...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

tomcat.x

Hab ich erst nicht verstanden, aber jetzt ist es klar. Das funktioniert, weil Du zufällig (oder bewusst?) "$State .= ..." als letztes Statement hast. Wenn man nicht explizit etwas per Return zurück gibt, wird dafür der zuletzt berechnete Ausdruck verwendet.
FHEM: 6.1 auf Raspi 3, Raspbian (Buster), Perl v5.28.1
Sender/Empfänger: 2 x CULv3, Duofern Stick, HM-MOD-RPI-PCB
Gateways: FRITZ!Box 6591 (OS: 7.57), Trädfri, ConBee 2,  piVCCU, OpenMQTTGateway
Sensoren/Aktoren: FRITZ!DECT, FS20, FHT, HMS, HomeMatic, Trädfri, DuoFern, NetAtmo

MadMax-FHEM

Zitat von: tomcat.x am 07 Februar 2021, 17:27:24
Hab ich erst nicht verstanden, aber jetzt ist es klar. Das funktioniert, weil Du zufällig (oder bewusst?) "$State .= ..." als letztes Statement hast. Wenn man nicht explizit etwas per Return zurück gibt, wird dafür der zuletzt berechnete Ausdruck verwendet.

:)

Hast aber Recht.
Man soll ja (und mache ich eigentlich auch immer / warum ich grad das als Beispiel als erstes gefunden habe... ;)  ) immer explizit returnen...

Ich hab auch sonst eher devStateIcon...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TomLee

Hallo,

falls von Interesse, man kann das ganze auch mit der in FHEM bereits verfügbaren Funktion Color::pahColor umsetzen.

Der kann man auch ein selbst definiertes Farbmodell übergeben, das Beispiel zeigt die Umsetzung von Joachim in devstateIcon.

Ja man kann das auch anders definieren, denke wenn man sich in das Beispiel (von Joachim) eingedacht hat so aber auch gut nachzuvollziehen ist:

defmod du_testx dummy
attr du_testx devStateIcon {\
my $TempHour = ReadingsNum($name,"statTemperatureHourAvg",0);;\
my $TempDay = ReadingsNum($name,"statTemperatureDayAvg",0);;\
my $pahch = substr(Color::pahColor(0,5,10,$TempHour,0),0,6);;\
my $pahcd = substr(Color::pahColor(0,5,10,$TempDay,0),0,6);;\
my $State = "hour: ";;\
$State .= "<span style='color:\x23".$pahch."'>".$TempHour." °C</span>";;\
$State .= " day: ";;\
$State .= "<span style='color:\x23".$pahcd."'>".$TempDay." °C</span>";;\
"<div>$State</div>";;\
}
attr du_testx readingList statTemperatureDayAvg statTemperatureHourAvg
attr du_testx room Test
attr du_testx setList statTemperatureDayAvg:slider,0,1,100 statTemperatureHourAvg:slider,0,1,100

setstate du_testx off
setstate du_testx 2021-02-07 20:25:20 statTemperatureDayAvg 9
setstate du_testx 2021-02-07 20:23:47 statTemperatureHourAvg 4


Gruß

Thomas