[GELÖST] Kann man die Farbe von stateFormat Werte-abhängig ändern?

Begonnen von Gisbert, 06 Mai 2018, 17:49:29

Vorheriges Thema - Nächstes Thema

Gisbert

Hallo,

ich möchte den state bzw. stateFormat in Abhängigkeit vom Wert farbig gestalten.

Konkret geht es um folgendes:
define Device MQTT
attr Device stateFormat Lüftung: an (bzw. aus)


Ich hätte gerne "Lüftung: an" in rot und "Lüftung: aus" in schwarz.

Kann man das innerhalb des Devices lösen, ohne Verwendung eines zusätzlichen notify's oder DOIF's?

Viele Grüße Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Otto123

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

Gisbert

Hallo Otto,

ich hab im Forum, commandref und Wiki gesucht, aber nichts Greifbares gefunden.

Man kann Attribute mit Hilfe von notifys und DOIFs setzen, was aber mehr Einträge erzeugt. Das würde ich gerne vermeiden, bzw. es wäre in dieser Konstellation für mich uninteressant.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

tarum

Hallo,

probier es so

devStateIcon on:phone_call@limegreen off:phone_call_end@red
Linux Server 22.04 CUL 868+433, CCU3, Homematic, Intertechno, FritzDect 200, JeeLink+LaCrosse, Duofern Stick+Rollotron Gurtwickler,smartVISU-3.0.0

mumpitzstuff

Ist ganz einfach:

<span style="color:#FF0000">Dein stateFormat in Rot.</span>

Das in Kombination mit Perlcode dann in etwa so:

{
  my $value = ReadingsVal('device', 'reading', 'aus');
  if ('an' eq $value)
  {
    return "an in rot";
  }
  else
  {
    return "aus";
  }
}

Otto123

Oder so (mit rot/grün):{(ReadingsVal($name,"state","") eq "off") ? "<span style='color:#FF0000'>Gerät Aus</span>":"<span style='color:#00FF00'>Gerät Ein</span>"}

Wieder was gelernt  ;D Danke!

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

Gisbert

Zitat von: mumpitzstuff am 07 Mai 2018, 12:19:54
Ist ganz einfach:

<span style="color:#FF0000">Dein stateFormat in Rot.</span>

Das in Kombination mit Perlcode dann in etwa so:

{
  my $value = ReadingsVal('device', 'reading', 'aus');
  if ('an' eq $value)
  {
    return "an in rot";
  }
  else
  {
    return "aus";
  }
}


Hallo mumpitzstuff,

Vielen Dank für deine Anregung.
Vielleicht sollte ich an dieser Stelle erwähnen, dass ich nicht programmieren kann - ich weiß, dass das keine Entschuldigung ist, aber es ist nun mal so, und wird sich leider nicht in absehbarer Zeit wesentlich ändern.

Mein Problem ist jetzt, deine Information in stateFormat und/oder userReadings in der richtigen Reihenfolge unterzubringen, so dass es funktioniert.

---------------------------------

Zitat von: Otto123 am 07 Mai 2018, 13:06:09
Oder so (mit rot/grün):{(ReadingsVal($name,"state","") eq "off") ? "<span style='color:#FF0000'>Gerät Aus</span>":"<span style='color:#00FF00'>Gerät Ein</span>"}

Wieder was gelernt  ;D Danke!

Gruß Otto

Hallo Otto,

es funktioniert, so wie du es vorgeschlagen hast, wenn man die Definition in ein userReadings packt.
Vielen Dank.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

mumpitzstuff


Otto123

Zitat von: Gisbert am 07 Mai 2018, 21:56:21
es funktioniert, so wie du es vorgeschlagen hast, wenn man die Definition in ein userReadings packt.
Hallo Gisbert,

das habe ich so direkt im stateFormat stehen!

Noch zu Erklärung des Programmcodes:Mein Konstrukt macht quasi das Gleiche wie das von mumpitzstuff, nur seines ist noch etwas sprechender.
Das Konstrukt ist -> Bedingung | Frage | Rückgabe:
{(Bedingung) ? Auswertung der Bedingung ist wahr : ... ist falsch}
Die roten Elemente sind sozusagen die Pflichtteile der Text ist auszustauschen.

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

Gisbert

Hallo Otto und mumpitzstuff,

vielen Dank für die Erklärung.
Ich hatte vorher eine Definition in userReadings, die ich beibehalten habe - jetzt mit der Variante Farbe -, und dieses Reading wurde dann in stateFormat aufgerufen.

Wenn ich es gleich in stateFormat definiere, spare ich mir den Zwischenschritt über userReadings.

Damit ist die Aufgabe für mich gelöst; ich gebe das dann noch im ersten Beitrag bekannt.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Gisbert

Zitat von: Otto123 am 08 Mai 2018, 13:48:37
Das Konstrukt ist -> Bedingung | Frage | Rückgabe:
{(Bedingung) ? Auswertung der Bedingung ist wahr : ... ist falsch}
Die roten Elemente sind sozusagen die Pflichtteile der Text ist auszustauschen.

Hallo Otto,

könnte man auch statt "Auswertung der Bedingung ist wahr" ein Reading reinschreiben, welches numerisch ist und sich entsprechend ändern kann?
Ich hab's versucht, aber statt des Readingswertes wird der eingetippte Text (mit geschweften Klammern, runden Klammern, etc.) rausgeschrieben.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Otto123

Hallo Gisbert,

ja klar, so in der Art {Perlausdruck}:
{return ReadingsVal("SensorAussen","temperature",0)}
Du rufst quasi wieder eine Perl Funktion auf und gibst eine Wert zurück (deswegen return)

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

Gisbert

Hallo Otto,

attr Device stateFormat {(ReadingsVal($name,'Summe','') <= 0) ? "<span style='color:#000000'>{return ReadingsVal($name,'Summe',0)}</span>":"<span style='color:#FF0000'>{return ReadingsVal($name,'Summe',0)}</span>"}
liefert:
{return ReadingsVal(Device,'Summe',0)}
in schwarzer Farbe, da der Wert (Summe) kleiner Null war; d.h. den String, aber nicht Wert "Summe".

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Otto123

Hallo Gisbert,

nach der Farbe hast Du diesmal nicht gefragt.  ;D
Also ohne die Farbe geht das, statt "<span style ...." nur der {} Ausdruck.
Geht sicher auch mit Farbe, aber da bin ich adhock nicht so fit und zu müde  ;)

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

Gisbert

Hallo Otto,

falls dir in den nächsten Tagen eine Lösung einfällt, dann bin ich nach wie vor sehr interessiert.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

rudolfkoenig

Mehrzeilig, damit man es einfacher lesen kann, den Wert bitte in FHEMWEB eingeben, oder Zeilenende mit \ versehen.
attr Device stateFormat {
  ReadingsVal($name,'Summe','') <= 0 ?
    "<span style='color:#0000FF'>".ReadingsVal($name,'Summe',0)."</span>" :
    "<span style='color:#FF0000'>".ReadingsVal($name,'Summe',0)."</span>"
}


Doppelte Schreibweise vermeidend:
attr Device stateFormat {
  sprintf("<span style='color:#%s'>%s</span>",
      ReadingsVal($name,'Summe','') <= 0 ? "0000FF":"FF0000",
      ReadingsVal($name,'Summe',0))
}


Mit der FHEM SetMagic, kuerzer aber kryptischer:
attr Device stateFormat <span style='color:{(ReadingsVal("$name",'Summe','')<=0 ? "blue":"red")}'>[$name:Summe]</span>

Gisbert

Hallo Rudi,

:) :) :) Vielen herzlichen lieben Dank. Ich habe nur die dritte Variante getestet, diese funktioniert !  :) :) :)

Eine Ergänzung:
Wenn man weitere Readings in stateFormat darstellen will, dann muss man das anscheindend im folgenden Format machen.
Nur den Namen des Readings anzugeben, führt zur Ausgabe des Readingsnamens, nicht aber zum Wert des Readings.
Beispiel  mit Zeilenumbruch:
attr Device stateFormat <span style='color:{(ReadingsVal("$name",'Summe','')<=0 ? "blue":"red")}'>[$name:Summe]</span><br/>[$name:Readings]
Diese erscheinen dann in der Standardfarbe.
Will man das weitere Readings in einer anderen Farbe haben, dann funktioniert es genauso wie für das 1. Reading.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Otto123

Hallo Gisbert,

jetzt war ich auch gerade fertig und Rudi war schneller.
So geht es auch (im FHEMWEB ins attr eintragen):
{
my $val = ReadingsVal("$name",'Summe',''
if ($val <= 0) {
return "<span style='color:#FF0000'>$val</span>";
}
else {
return "<span style='color:#00FF00'>$val</span>";
}
}

Oder mit falls die Farbe noch flexibler werden soll  ;)
{
my $val = ReadingsVal("SensorAussen","temperature",0);
my $col = "red";
if (ReadingsVal($name,"state","") eq "off") {
$col = "red";
}
else {
$col = "blue";
}
return "<span style='color:".$col."'>".$val."</span>";
}


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

mimue

Hallo Leute,

ich hatte mal vor Jahren das gleiche Bedürfnis, Rudi hat damals ein eigenes Attribut dafür eingeführt: devStateStyle

Das kann man vergleichsweise leicht programmatisch verändern. Ich nutze es als Indikator für kritische Readings (rot, gelb, grün).

Wäre das was für Euch ?

mimue
Gigabyte Brix, Arch Linux, CUL_MAX, TCM310, HM-Lan, LevelJET, VIERA, Fritz AHA, Fritz RC, FBDECT, NetIO, Alexa, Netatmo Presence

Shadow3561

Moin,
bevor ich einen neuen Thread aufmache frage ich hier noch einmal die Profis unter euch.

Ich habe ein HTTPMOD Device in dem ich auch Readings von anderen Devices anzeigen lasse.

Jetzt schaffe ich es einfach nicht einige Readings im State farbig dar zu stellen.

Hier mein Stateformat:
{return "
PV aktuell: ".sprintf("%.0f",ReadingsVal($name,"Produktion_P_Generate",0))." W <br/>
PV Eigenverbrauch: ".sprintf("%.0f",ReadingsVal($name,"PV_Eigenverbrauch_Aktuell_in_Watt",0))." W  <br/>
PV Einspeisung: ".sprintf("%.0f",ReadingsVal($name,"PV_Einspeisung_Aktuell_in_Watt",0))." W <br/>
Netzbezug: ".sprintf("%.0f",ReadingsVal($name,"Strombezug_Aktuell_in_Watt",0))." W <br/>
Stromverbrauch: ".sprintf("%.0f",ReadingsVal($name,"Strom_Gesamtverbrauch_Aktuell_in_Watt",0))." W<br/>
Autarkiegrad: ".sprintf("%.1f",ReadingsVal($name,"Relative_Current_Autonomy",0))." % <br/>
PV-Tagesertrag: ".sprintf(ReadingsVal("WR_Fronius","Energy_Day__kWh",0))." kWh<br/>
PV-Peak-Heute: ".sprintf("%.0f",ReadingsVal("Solar","Body_Data_DAY_PMAX_Value",0))." W<br/>
PV-Eigenverbrauch: ".sprintf("%.1f",ReadingsVal($name,"Eigenverbrauch_Current_SelfConsumption",0))." %<br/>
String-Spannung: ".sprintf("%.0f",ReadingsVal("WR_Fronius_MPPT","Voltage_String1__V",0))." V<br/>
String-Strom: ".sprintf("%.2f",ReadingsVal("WR_Fronius_MPPT","Current_String1__A",0))." A
";}


Wie schaffe ich es jetzt das vorltzte Reading(String-Spannung:) farbig zu gestalten?
Es soll zwischen 0 und 100 rot sein, zwischen 100 und 150 gelb, zwischen 150 und 200 grün und danach wieder gelb.

Für einen Denkanstoss wäre ich sehr dankbar.

MfG

Otto123

Hi,

schau Dir doch mal dies hier an: https://wiki.fhem.de/wiki/HomeMatic_Firmware_Update

Da werden bestimmte Sachen farbig gestaltet im stateFormat.

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

TomLee

Zitat von: Gisbert am 08 Mai 2018, 22:48:36

könnte man auch statt "Auswertung der Bedingung ist wahr" ein Reading reinschreiben, welches numerisch ist und sich entsprechend ändern kann?


Hallo,

da würd ich gerne nochmal anknüpfen, statt einen neuen Thread aufzumachen, die Frage ist ja eigentlich noch offen.

Mit pahcolor hab ich mir in den Kopf gesetzt das irgendwie umzusetzen. Habs jetzt soweit nach etlichen Versuchen das ich keine Fehlermeldung mehr bekomme, nix mehr im LogFile steht aber der Wert weiterhin schwarz dargestellt wird.

Wie macht mans den richtig:

<span style='color:{substr(Color::pahColor(0,40,80,ReadingsVal('MQTT2_ebusd_bai','1_Vorlauf',0),0,0),0,6)}>[$name:1_Vorlauf]</span>


Gruß

Thomas


edit:

Ups, jetzt hab ich ja ganz den # vergessen, da muss ich nochmal ran

edit 2:

ändert auch nix
<span style='color:{"#".substr(Color::pahColor(0,40,80,ReadingsVal('MQTT2_ebusd_bai','1_Vorlauf',0),0,0),0,6)}'>[$name:1_Vorlauf]</span>

TomLee

Hallo nochmal,

Mit
{"#".substr(Color::pahColor(0,40,80,ReadingsVal('MQTT2_ebusd_bai','1_Vorlauf',0),0,0),0,6)}
aus der Befehlszeile bekomme ich #B9770C zurück und das ist auch korrekt würd ich sagen

Mit
Zitat<span style='color:{"#".substr(Color::pahColor(0,40,80,ReadingsVal('MQTT2_ebusd_ba'i,'1_Vorlauf',0),0,0),0,6)}'>[$name:1_Vorlauf]</span>
in stateformat wird aber scheinbar #B9770C nicht in das Html übergeben, ob color in einfachen oder doppelten Hochkommas ist egal, die Schriftfarbe bleibt schwarz.




Mit
{"style=\"color:\x23".substr(Color::pahColor(0,15,30,ReadingsVal('MQTT2_ebusd_bai','1_Vorlauf',0),0),0,6)."\""}
aus der Befehlszeile bekomme ich style="color:#B9770C" zurück, auch das ist korrekt bin ich der Meinung.

Mit
Zitat<span {"style=\"color:\x23".substr(Color::pahColor(0,15,30,ReadingsVal($name,'1_Vorlauf',0),0),0,6)."\""}>[$name:1_Vorlauf]</span>
in stateformat wird auch nix nach Html übergeben, zumindest bleibt die Schriftfarbe auch hier schwarz, ob in einfachen oder doppelten Hochkommas ist auch hier egal.


Mit diesen Feststellungen bin ich als Nicht-Programmierer erstmal am Ende angelangt und weiß nicht mehr weiter.

Gruß

Thomas

mumpitzstuff

Was steht denn letztendlich im HTML Code drin? Schau dir den mal an und poste die Zeile.

TomLee

Danke für die Rückmeldung.

Wenn ich wüsste wo ich sehe was letztendlich im HTML-Code drin steht würd ich vlt. selbst auf die Lösung kommen, darum schreib ich "scheinbar" im 1. Beispiel und im 2. Beispiel "auch nix", weil ich einfach nicht weiss was das Ergebnis genau ist / was übergeben wird / was wo steht, wenn du so fragst.

Wie gesagt es kommen keine Meldungen mehr im FileLog und letztendlich bei attr stateformat ... drücken wird auch kein Fehler mehr moniert.

mumpitzstuff

Du lässt dir das Device in deinem Browser anzeigen und schaust dir dort den HTML Code der Webseite an.

https://www.google.com/search?q=firefox+show+html+code

TomLee

Bei dem 1. Beispiel

<span style='{"color:#".substr(Color::pahColor(0,40,80,ReadingsVal($name,'1_Vorlauf',0),0,0),0,6)}'>[$name:1_Vorlauf]</span>

werden diese Fehler beim öffnen der Konsole direkt angezeigt

HTML1423: Falsch formatierte Startmarkierung. Attribute sollten durch Leerzeichen getrennt werden.
HTML1409: Ungültiges Attributnamenzeichen. Attributnamen sollten nicht ("),('),() oder (=) enthalten.

Weiß sie aber (noch) nicht zu deuten

Im HTML-Code steht:

["MQTT2_ebusd_bai","<span style='{\u0022color:#\u0022.substr(Color::pahColor(0,40,80,ReadingsVal(MQTT2_ebusd_bai,'1_Vorlauf',...(426)

Ich denke der Fehler ist das die Funktion selbst zurückgegeben wird und nicht der Rückgabewert ?




Beim 2. Beispiel

<span '{"style=\'color:\x23".substr(Color::pahColor(0,15,30,ReadingsVal($name,'1_Vorlauf',0),0),0,6)."\'"}'>[$name:1_Vorlauf]</span>


werden diese Fehler beim öffnen der Konsole direkt angezeigt

HTML1409: Ungültiges Attributnamenzeichen. Attributnamen sollten nicht ("),('),() oder (=) enthalten.
HTML1410: Ungültiger Attributwert ohne Anführungszeichen. Die Attributwerte ohne Anführungszeichen sollten nicht ("), ('), (), (=) oder (`) enthalten.


Im HTML-Code steht:

["MQTT2_ebusd_bai","<span '{\u0022style=\u005c'color:\u005cx23\u0022.substr(Color::pahColor(0,15,30,ReadingsVal(MQTT2_ebusd_bai,'1_V...(478)

Auch hier, die Funktion selbst wird übergeben und nicht das was sie zurückgeben soll ?






rudolfkoenig

Ich gehe davon aus, dass Ihr die Dokumentation (https://fhem.de/commandref_modular.html#stateFormat) "If the value of this attribute is enclosed in {}, then it is evaluated." als "if there is {} somewhere in the attribute, then it will be evaluated" interpretiert. Das ist leider nicht der Fall.

TomLee

Mit Sicherheit steh ich auf dem Schlauch: bei deinem kryptischen  Beispiel ist doch {} somewhere in the attribute too   ???

Jamo

Hier mal mein Beispiel für ein Stateformat, in dem in Abhängigkeit von der Regenmenge der State in verschiedenen Farben angezeigt wird.

{ my $Amount = ReadingsNum($name,"rainAmount",0);
    my $string  = sprintf("Amnt:%.1fl/m² ",$Amount);
  if ($Amount > 1 && $Amount < 7) {
    return '<font color="teal"><b>' . $string . '</b></font>'}
  elsif ($Amount >= 7 && $Amount < 20 ) {
    return '<font color="DeepSkyBlue"> <b>' . $string . '</b></font>'}
  elsif ($Amount >= 20 && $Amount < 25 ) {
    return '<font color="MediumVioletRed"><b>' . $string . '</b></font>'}
  elsif ($Amount >= 25 || $Max >= 2.5) {
    return '<font color="BlueViolet"><b>' . $string . '</b></font>'}
  else {return $string }
}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

rudolfkoenig

ZitatMit Sicherheit steh ich auf dem Schlauch: bei deinem kryptischen  Beispiel ist doch {} somewhere in the attribute too 
Stimmt, aber bei kryptischen Loesungen muss man genau aufpassen. Stichwort war dabei SetMagic (https://fhem.de/commandref_modular.html#set), was bei set, setreading, und bei Auswerten von stateFormat verwendet werden kann. Wenn man Perl-Code via SetMagic  verwenden will, dann ist {...} nicht ausreichend, es muss schon {(..)} sein, damit (wegen der nachtraeglichen Einfuehrung) Probleme mit alten Werten (wie JSON, etc) vermieden werden.

stateFormat wird so ausgewertet:
- falls der Wert in {} eingeschlossen ist, dann wird es als Perl String ausgewertet
- sonst  wird SetMagic angewendet
- falls SetMagic nichts gefunden hat, werden im Text alle ReadingNamen durch deren jeweiligen Wert ersetzt.

TomLee

Denk  ich habs   :P

{"<span style=\'color:\x23".substr(Color::pahColor(0,30,60,ReadingsVal($name,'1_Vorlauf',0),0),0,6)."\'>".ReadingsVal($name,'1_Vorlauf',0)."</span>"}

DANKE

devien

Hi,
ich habe ein etwas ähnliches Problem,

ich habe via stateFormat {sprintf("%.1f&deg;",ReadingsVal("DS18B20_PSP_1_01","temperature",0))."C"} die Ausgabe eine DS18b20 hübsch gemacht.
Dadurch ist "state" variabel also z.B. 32.5&deg;C

Ich möchte nun bei einer Temperatur unter 45 Grad das Icon in Rot und drüber in grün darstellen. Das ganze hätte ich gern über devStateIcon gelöst, aber ohne gleich an einem div herrumzuschrauben.

Mir ist klar das devStateIcon bei einem klar definierten Wert anspringt, aber nach einem Vergleich ist der wert ja klar.

ich habs bereits mit folgendem versucht:

{ReadingsVal("DS18B20_PSP_1_01","temperature",0)<46}:sani_buffer_temp_down@red ReadingsVal("DS18B20_PSP_1_01","temperature",0)>45}:sani_buffer_temp_down@green

<45:security@red >44:security@green

<=45.*:security@red >=44.*:security@green


leider reagiert die Darstellung darauf nicht

Habt ihr einen Tipp für mich?

edit: hier noch ein List von dem Sensor
Internals:
   CFGFN      FHEM/sensoren.cfg
   CHANGED   
   DEF        28.FFA738011604 60
   FUUID      5c66e4d4-f33f-52e2-1b32-2a512342621c1182
   IODev      ows
   LAST_READ_FAILED 0
   NAME       DS18B20_PSP_1_01
   NOTIFYDEV  global
   NR         230
   NTFY_ORDER 50b-DS18B20_PSP_1_01
   STATE      32.5&deg;C
   TYPE       OWDevice
   Helper:
     DBLOG:
       temperature:
         myDbLog:
           TIME       1581787680.51336
           VALUE      32.5
   READINGS:
     2020-02-15 18:57:00   alarm           0
     2020-02-15 18:57:00   state           temperature: 32.5  alarm: 0
     2020-02-15 18:57:00   temperature     32.5
   fhem:
     address    28.FFA738011604
     alerting   1
     bus        bus.0
     interfaces temperature
     interval   60
     getters:
       address
       crc8
       family
       fasttemp
       id
       locator
       r_address
       r_id
       r_locator
       temperature
       temperature10
       temperature11
       temperature12
       temperature9
       temphigh
       templow
       type
     polls:
       temperature
     setters:
       temphigh
       templow
     state:
       temperature
Attributes:
   DbLogExclude state , alarm
   IODev      ows
   event-min-interval 600
   event-on-change-reading temperature.*:0.5
   fp_Heizung 416,508,0,DS18B20_SSP_1_01,
   icon       sani_buffer_temp_down
   model      DS18B20
   resolution 9
   room       Pufferspeicher
   stateFormat {sprintf("%.1f&deg;",ReadingsVal("DS18B20_PSP_1_01","temperature",0))."C"}
FHEM + UniPi + Arduino = gute Lösung

Otto123

In Deinem Codeabschnitt:
Zitatich habs bereits mit folgendem versucht:
stimmt doch quasi nix?!?
Packe den Teil mal in einen Editor und versuche mal allein das Klammer auf / Klammer zu Thema zu lösen :)

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

devien

aha, ich hatte also bei
{ReadingsVal("DS18B20_PSP_1_01","temperature",0)<46}:sani_buffer_temp_down@red {ReadingsVal("DS18B20_PSP_1_01","temperature",0)>45}:sani_buffer_temp_down@green
die 2te öffnende klammer vergessen.

Funktionieren tuts deshalb trotzdem nicht. Ist aber auch verständlich, da der Ausdruck zwar ein true oder false zurück gibt aber dann keinen match mit dem aktuellen state darstellt.

Ich werde das Gefühl nicht los das ich die Funktion auslagern muss, aber das macht die Angelegenheit unübersichtlicher. Ich bin ja kein Freund von klickybunti, aber die Wartungsfreundlichkeit für DAU's wird damit doch erheblich verringert.
FHEM + UniPi + Arduino = gute Lösung

rudolfkoenig

Ich finde es irrefuehrend und stoerend, devStateIcon Probleme in einem Thema mit stateFormat Ueberschrift zu diskutieren.

devStateIcon selbst hat zwei Formate. Ausschnitt aus dem Commandref:
- space separated list of regexp:icon-name:cmd triples, icon-name and cmd may be empty.
- perl code enclosed in {}. If the code returns undef, then the default icon is used, if it retuns a string enclosed in <>, then it is interpreted as an html string. Else the string is interpreted as a devStateIcon of the first fom, see above.

Eine Variante des ersten Formats, wo regexp durch {} ersetzt werden kann, ist weder dokumentiert, noch implementiert.

devien

Zitat von: rudolfkoenig am 16 Februar 2020, 11:58:44
Ich finde es irrefuehrend und stoerend, devStateIcon Probleme in einem Thema mit stateFormat Ueberschrift zu diskutieren.
danke, mein Problem basierte mit auf dem Inhalt von stateFormat daher wollte ich dafür kein extra Thread aufmachen, in Zukunft bin ich schlauer

Zitat von: rudolfkoenig am 16 Februar 2020, 11:58:44
Eine Variante des ersten Formats, wo regexp durch {} ersetzt werden kann, ist weder dokumentiert, noch implementiert.

Nochmal Danke, ich habe in der Commandref völlig übersehen das es sich um Regex handelt, mit regex kann ich umgehen, das löst auch mein Problem.

Manchmal bedarf es nur eines Trittes in die richtige Richtung

Gruß
FHEM + UniPi + Arduino = gute Lösung

ak323

RaspberryPi 2 im 19" Rack mit 16x2 i2c LCD, FHEM, diverse HomeMatic, 1-Wire (8x DS18B20, 3x DS2408, 2x DS2413, 5x DS2401, DS2423 ATTiny) über DS9490R#, Waterkotte Ai1QE (WWPR) Wärmepumpe über Modbus, WH1080 über Signalduino, 433MHz Funksteckdosen, WiFi RGBWW via Tasmota, ...

thymjan

Zitat von: Otto123 am 16 Mai 2018, 17:51:30
[...]
So geht es auch (im FHEMWEB ins attr eintragen):
{
my $val = ReadingsVal("$name",'Summe',''
if ($val <= 0) {
return "<span style='color:#FF0000'>$val</span>";
}
else {
return "<span style='color:#00FF00'>$val</span>";
}
}

[...]

Hallo Otto, welches attr in FHEMWEB wäre das denn?
Gruß, Stefan

Otto123

es ging hier im Thread immer um das Attribute stateFormat.
IM FHEMWEB - damit meinte ich in der FHEM Standard WEB Oberfläche ... ;)
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

thymjan

Ah, ok. Dachte im ersten Moment das wäre eine Art globale Definition.

Aber da fehlt dann noch eine Klammer und ein Strichpunkt, oder?

{
my $val = ReadingsVal("$name",'Summe','');
if ($val <= 0) {
return "<span style='color:#FF0000'>$val</span>";
}
else {
return "<span style='color:#00FF00'>$val</span>";
}
}


Wenn weitere Readings im stateFormat angezeigt werden sollen, wie mache ich das dann in diesem Konstrukt?
So?
{
my $val = ReadingsVal($name,"temperature",3);
my $val2 = ReadingsVal($name,"dewpoint",0);
my $col = "red";
if ($val >= 3) {
$col = "red";
}
else {
$col = "blue";
}
return "<span style='color:".$col."'>Temperatur: ".$val." °C</span><br>Taupunkt: $val2 °C";
}


Wenn ich die geschweiften Klammern mal aufgemacht habe, muss ich da auch alles drin machen, oder geht das einfacher?

Otto123

Zitat von: thymjan am 06 Dezember 2022, 15:45:40
Aber da fehlt dann noch eine Klammer und ein Strichpunkt, oder?
Ich wüsste jetzt nicht wo  ???
das $name in " " steht ist eventuell überflüssig, bin mir aber sicher das probiert zu haben. Manchmal ist das notwendig wenn der Parser zweimal läuft, die erste Runde löst die variable auf und die zweite Runde führt den Code aus. Siehe Rudi sein Konstrukt mit set magic.

Ob dein Vorschlag läuft musst Du einfach testen, ich bin da im Theorietest nicht so sattelfest bei solchen HTML Konstrukten.
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