FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: tklein am 12 Januar 2019, 18:47:21

Titel: Stateformat mit if-abfrage für reading
Beitrag 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
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: Byte09 am 12 Januar 2019, 19:09:16
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
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: Byte09 am 12 Januar 2019, 19:15:37
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  ???
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag 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?
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: Byte09 am 12 Januar 2019, 19:32:32
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
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: tklein am 12 Januar 2019, 19:37:39
das wäre super, danke!
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag 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>
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: Byte09 am 12 Januar 2019, 20:02:19
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";} }
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: Byte09 am 12 Januar 2019, 22:35:42
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
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: KernSani am 12 Januar 2019, 22:36:31
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>'}
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: tklein am 13 Januar 2019, 10:30:17
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)
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: KernSani am 13 Januar 2019, 10:48:47
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>";

}
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: daburli am 15 April 2020, 21:26:10
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!
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: frank am 16 April 2020, 09:56:13
wenn perlcode, dann nur perlcode.

"nicht mischen", sondern alles in einem codeblock in geschweifte klammern und richtig verknüpfen.
Titel: Antw:Stateformat mit if-abfrage für reading
Beitrag von: daburli am 17 April 2020, 09:58:38
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
"
}