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
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
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 ???
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?
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
das wäre super, danke!
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>
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";} }
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
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>'}
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)
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>";
}
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!
wenn perlcode, dann nur perlcode.
"nicht mischen", sondern alles in einem codeblock in geschweifte klammern und richtig verknüpfen.
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
"
}