Stateformat mit if-abfrage für reading

Begonnen von tklein, 12 Januar 2019, 18:47:21

Vorheriges Thema - Nächstes Thema

tklein

Hallo zusammen,

leider bleibe ich mal wieder an einer Stelle hängen.

Ich möchte in meinem Shellydevice ein Stateformat ausgeben. Abhängig vom Reading "relay" mit den Werten "true" oder "false" möchte ich on oder off ausgeben.
Mein bisheriges nicht funktionierendes stateormat sieht so aus:

Status: {(ReadingsVal("Shelly1_1","state",0))} <br>
Schalter: {
if(ReadingsVal("Shelly1_1","relay",0) == "true")
{"on"}
else
{("off"}
}


Derzeit sieht das stateFormat so aus:
Status: OK
Schalter: { if(ReadingsVal("Shelly1_1","relay",0) == "true") {"on"} else {("off"} }


Wer mag mich in die richtige Richtung schubsen?

Grüße
Thomas
FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

Byte09

Zitat von: tklein am 12 Januar 2019, 18:47:21
Hallo zusammen,

leider bleibe ich mal wieder an einer Stelle hängen.

Ich möchte in meinem Shellydevice ein Stateformat ausgeben. Abhängig vom Reading "relay" mit den Werten "true" oder "false" möchte ich on oder off ausgeben.
Mein bisheriges nicht funktionierendes stateormat sieht so aus:

Status: {(ReadingsVal("Shelly1_1","state",0))} <br>
Schalter: {
if(ReadingsVal("Shelly1_1","relay",0) == "true")
{"on"}
else
{("off"}
}


Derzeit sieht das stateFormat so aus:
Status: OK
Schalter: { if(ReadingsVal("Shelly1_1","relay",0) == "true") {"on"} else {("off"} }


Wer mag mich in die richtige Richtung schubsen?

Grüße
Thomas

was mir ins auge sticht :

stringvergleich nicht mit '==' sondern mit 'eq'

gruss Byte09

edit:
{("off"} das sieht auch merkwürdig aus - klammern mal prüfen

Byte09

#2
so klappt es, device und readingnamen musst du halt anpassen
{ if(ReadingsVal("st","state",0) eq "true") {return "on";} else {return "off";} }

gruss Byte09


edit:das sollte aber auch mit eventmap machbar sein denke ich !  ... war quatsch  ???

tklein

besten dank für die schnellen antworten.

Mit
{ if(ReadingsVal("Shelly1_1","relay",0) eq "true") {return "on";} else {return "off";} } gibt es mir zumindest on/off als iconsymbol zurück.
Sobald ich das hier zuvor mit drin habe:

Status: {(ReadingsVal("Shelly1_1","state",0))} <br>
Schalter:

klappte es wieder nicht. Wie kann ich den vor der Funktionsausführung von Perl einen Text z.B. "Schalter" ausgeben lassen?
FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

Byte09

Zitat von: tklein am 12 Januar 2019, 19:27:39
besten dank für die schnellen antworten.

Mit
{ if(ReadingsVal("Shelly1_1","relay",0) eq "true") {return "on";} else {return "off";} } gibt es mir zumindest on/off als iconsymbol zurück.
Sobald ich das hier zuvor mit drin habe:

Status: {(ReadingsVal("Shelly1_1","state",0))} <br>
Schalter:

klappte es wieder nicht. Wie kann ich den vor der Funktionsausführung von Perl einen Text z.B. "Schalter" ausgeben lassen?


das ist dann gleich etwas aufwendiger und ich würde dann über devstateicon gehen . bin aber auf dem sprung . wenn sich bis nachher niemand findet schreibe ich dir nochwas dazu.

gruss Byte09

tklein

FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

tklein

ist halt komisch bzw verstehe ich nicht. in einem anderen stateFormat klappt das:
attr CN.Dachdauer stateFormat Schaltvorgänge:  {(ReadingsVal("CN.Dachdauer","countsPerDay","error"))}<br>\
Tagesbetrieb:  {(calcDaysBySeconds(ReadingsVal("CN.Dachdauer","pulseTimePerDay","error")))}<br>\
Betrieb insgesamt: {(calcDaysBySeconds(ReadingsVal("CN.Dachdauer","pulseTimeOverall","error")))}<br>
FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

Byte09

#7
Zitat von: tklein am 12 Januar 2019, 19:50:49
ist halt komisch bzw verstehe ich nicht. in einem anderen stateFormat klappt das:
attr CN.Dachdauer stateFormat Schaltvorgänge:  {(ReadingsVal("CN.Dachdauer","countsPerDay","error"))}<br>\
Tagesbetrieb:  {(calcDaysBySeconds(ReadingsVal("CN.Dachdauer","pulseTimePerDay","error")))}<br>\
Betrieb insgesamt: {(calcDaysBySeconds(ReadingsVal("CN.Dachdauer","pulseTimeOverall","error")))}<br>


es geht ja auch , dann aber ohne icon. ausserdem hat mich Rudi die Tage mal aufmerksam gemacht , das stateformat in solchem Fall aus verschiedenen gründen nicht optimal ist und da devstateicon vorzuziehen ist ( hoffe ich habe das nicht falsch verstanden) .

{my $text = "text "; if(ReadingsVal("st","test",0) eq "true") {return $text."on";} else {return $text."off";} }

Byte09

Zitat von: tklein am 12 Januar 2019, 19:37:39
das wäre super, danke!
attr devStateIcon { if(ReadingsVal("testdummy","test",0) eq "true") {return "<div>text<br>on</ div>";} else {return "<div>text<br>off</ div>";} }

nur als Beispiel, bezeichnungen anpassen

gruss Byte09

KernSani

stateformat formatiert auch STATE, das wiederum bei JSONLIST2 u.ä. verwendet wird, daher besser devStateIcon verwenden. Der Trick dabei ist:

ZitatSecond form:
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. Example:
{'<div style="width:32px;height:32px;background-color:green"></div>'}
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

tklein

sorry, aber irgendwie verstehe ich nicht wie ich das im decStateIcon anzeigen lassen kann:
Status: state (aus dem reading)
Schalter: on/off (aus dem reading je nach wert (true/false)
FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

KernSani

Ich verwende in solchen Fällen gerne eine kleine Routine in myUtils. Hier ein Beispiel aus meiner Batterieüberwachung.

sub myUtils_batStatusIcon($) {
    my ($name) = @_;
    my $icon = "";
    my $state = ReadingsVal( $name, "state", "" );
    if ( $state eq "ok" ) {
        $icon = "measure_battery_100\@green";
    }
    else {
        $icon = "measure_battery_25\@red";
    }
    my $img = FW_makeImage( $icon, $state );
    my $text =
        "<a href='fhem?detail=rg_battery'>"
      . ReadingsVal( $name, "nokDev",   0 ) . "/"
      . ReadingsVal( $name, "totalDev", 0 ) . "</a>";
    return "<div>" . $img . $text . "</div>";

}
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

daburli

Hallo zusammen,

ich nehme dieses Thema nochmals auf, weil ich mit einem ähnlichen Problem kämpfe.
Ich möchte für ein Thermostat eine Anzeige bauen, die wie folgt aussieht: "Ist: x.xx °C Soll: x.xx °C Vent: x % Mod: Normal"

Es lassen sich am Thermostat vier Betriebszustände einstellen: Normal, Eco, Nacht und Frostschutz

Mein Code für das stateFormat sieht wie folgt aus:

Ist: {(ReadingsVal("$name", "Ist-get" , ""))}
Soll: {(ReadingsVal("$name", "RM_Soll-get", ""))}
Vent: {(ReadingsVal("$name", "Stellgroesse-get", ""))}
{ my $text = "Mod: "; if(ReadingsVal("$name","Betriebsart-get",0) == 1)  {return $text. "Normal";} else {return $text. "Else";} }


Ist, Soll, und Vent zusammen funktionieren, Mod alleine funktioniert auch - nur zusammen will es einfach nicht klappen.

Was mache ich falsch? Könnt ihr mir weiterhelfen?

Danke!

frank

wenn perlcode, dann nur perlcode.

"nicht mischen", sondern alles in einem codeblock in geschweifte klammern und richtig verknüpfen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

daburli

Danke für den Hinweis! Hab mich nochmals damit befasst und konnte nun auch eine Lösung finden.

Falls wer Interesse hat:

{
my $Ist = "Ist: " . ReadingsVal($name, "Ist-get" , "") ;
my $Soll = "Soll: " . ReadingsVal($name, "RM_Soll-get", "");
my $Vent = "Vent: " . ReadingsVal($name, "Stellgroesse-get", "");
my $Int_Betriebsart = ReadingsVal($name,"Betriebsart-get",0);
my $Betriebsart;

if($Int_Betriebsart == 1)
   { $Betriebsart = ' Mod: Normal'}
elsif ($Int_Betriebsart == 2)
   { $Betriebsart = ' Mod: Eco'}
elsif ($Int_Betriebsart == 3)
   { $Betriebsart = ' Mod: Nacht'}
elsif ($Int_Betriebsart == 4)
   { $Betriebsart = ' Mod: Frost'};

"
<b><span style='color:red'>$Ist</span></b><br>
<b><span style='color:blue'>$Soll</span></b><br>
$Vent<br>
$Betriebsart
"
}