[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

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