FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: 87insane am 08 August 2019, 15:29:02

Titel: [GELÖST] - devstateicon PERL - Das geht doch besser?
Beitrag von: 87insane am 08 August 2019, 15:29:02
Hallo zusammen,

ich wollte ein DevStateIcon für die Steckdose am Trockner bauen. Das ist auch alles soweit okay und klappt.

{
my $pic = ReadingsVal($name,"running","") eq "true"?'scene_clothes_dryer@green':'scene_clothes_dryer';;
my $text = ReadingsVal($name,"running","") eq "true"?"Trockner läuft - Aktuell: ".ReadingsVal($name,"power","")." W":'Standby';;
"<div><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>&nbsp;&nbsp;&nbsp;".FW_makeImage($pic)." $text </div>"
}



Ziel hiervon:
- In FHEM-WEB soll es nicht klickbar sein. Deswegen habe ich den Standard toggle ins nichts gelenkt (on/off/toggle).
- Hinzu sollen alle Symbole bei mir, auf gleicher höhe sein, weswegen auch &nbsp; als Leerzeichen benötigt wird.

Meine Frage:
Ich denke, man kann die beiden IFs auch besser machen. Ich frage zwei mal das gleiche ab und setze dann zwei Variablen. Das geht doch sicher besser oder mit nur einer Abfrage gegen das Reading running...?

Danke schon mal !
Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: DeeSPe am 08 August 2019, 16:17:26
Mache doch davor:
my $val = ReadingsVal($name,"running","");

Und dann einfach 'ReadingsVal($name,"running","")' mit '$val' ersetzen.

Oder:

my $pic;
my $text;
if (ReadingsVal($name,"running","") eq "true")
{
  $pic = "scene_clothes_dryer\@green";
  $text = "Trockner läuft - Aktuell: ".ReadingsVal($name,"power","")." W";
} else {
  $pic = "scene_clothes_dryer";
  $text = "Standby";
}
return "<div><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>&nbsp;&nbsp;&nbsp;".FW_makeImage($pic)." $text </div>"


Welche Lösung Du eleganter findest ist Dir überlassen.

Gruß
Dan
Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: 87insane am 08 August 2019, 16:54:32
Danke Dir!

Jetzt hatte ich den PC gewechselt und mir die zweite deiner Lösungen auch gebastelt. Ich finde das in FHEM immer so doof bei devStateIcon z.B. hat man nur diese kleine Zeile. Mittlerweile mache ich das einfach in Notepad++ und da sieht man dann auch den Wald, trotz Bäumen ;)

DANKE DANKE




Zitatif (ReadingsVal($name,"running","") eq "true")
{
  my $pic = "scene_clothes_dryer@green";
  my $text = "Trockner läuft - Aktuell: ".ReadingsVal($name,"power","")." W";
} else {
  my $pic = "scene_clothes_dryer";
  my $text = "Standby";
}
return "<div><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>&nbsp;&nbsp;&nbsp;".FW_makeImage($pic)." $text </div>"

Der hier geht auch nicht ... Bekomme das auch nicht hin. Es scheint eine Kleinigkeit zu sein...grrr...

2019.08.08 17:08:57 1: PERL WARNING: Possible unintended interpolation of @green in string at (eval 12892) line 1.
2019.08.08 17:08:57 1: ERROR evaluating my $name='1';my $type='1';my $state='1';{return undef; { if (ReadingsVal($name,"running","") eq "true") {   my $pic = "scene_clothes_dryer@green";   my $text = "Trockner läuft - Aktuell: ".ReadingsVal($name,"power","")." W"; } else {   my $pic = "scene_clothes_dryer";   my $text = "Standby"; } return "<div><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>   ".FW_makeImage($pic)." $text </div>" }}: Global symbol "@green" requires explicit package name (did you forget to declare "my @green"?) at (eval 12892) line 1.
Global symbol "$pic" requires explicit package name (did you forget to declare "my $pic"?) at (eval 12892) line 1.
Global symbol "$text" requires explicit package name (did you forget to declare "my $text"?) at (eval 12892) line 1.
Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: KölnSolar am 08 August 2019, 18:58:14
Evtl. muss das @ maskiert werden ?  :-\ also scene_clothes_dryer\@green
Grüße Markus
Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: 87insane am 08 August 2019, 20:09:00
Teste ich morgen.. Danke schon mal Markus!

Hatte das eigentlich schon mal jemand so gepostet oder gesagt, dass man das "FHEM-WEB, zwangs toggle bei on/off" ins nichts senden kann? Hatte mir heute Mittag die Zähne ausgebissen.

...
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>...


Wenn ja, wie geht es noch besser/eleganter? :)
Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: DeeSPe am 09 August 2019, 08:58:44
Zitat von: KölnSolar am 08 August 2019, 18:58:14
Evtl. muss das @ maskiert werden ?  :-\ also scene_clothes_dryer\@green
Grüße Markus

Ja, das @ muss natürlich maskiert werden, darauf hatte ich gar nicht geachtet.

Gruß
Dan

P.S. Hab's mal oben in meinem Lösungsvorschlag ergänzt!
Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: 87insane am 09 August 2019, 09:00:59
Danke ihr Beiden!

Super schnell und gute Hilfe.
Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: Wzut am 09 August 2019, 09:13:51
Zitat von: 87insane am 08 August 2019, 16:54:32
Global symbol "$pic" requires explicit package name (did you forget to declare "my $pic"?) at (eval 12892) line 1.
Global symbol "$text" requires explicit package name (did you forget to declare "my $text"?) at (eval 12892) line 1.


ist klar die beiden sind nur gültig innerhalb der jeweiligen geschweiften Klammer (if bzw else) , aber dann nicht mehr beim return :)

Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: DeeSPe am 09 August 2019, 09:14:05
Zitat von: 87insane am 08 August 2019, 20:09:00
Hatte das eigentlich schon mal jemand so gepostet oder gesagt, dass man das "FHEM-WEB, zwangs toggle bei on/off" ins nichts senden kann? Hatte mir heute Mittag die Zähne ausgebissen.

Das "Zwangs-Toggle" beim Klick auf das devStateIcon wird man dadurch los indem man als dritten Wert des devStateIcon "noFhemwebLink" übergibt.
Also um bei z.B. einem dummy das "Zwangs-Toggle" zu entfernen einfach:
attr [dummy] devStateIcon on:on:noFhemwebLink off:off:noFhemwebLink

Gruß
Dan
Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: DeeSPe am 09 August 2019, 09:15:34
Zitat von: Wzut am 09 August 2019, 09:13:51
ist klar die beiden sind nur gültig innerhalb der jeweiligen geschweiften Klammer (if bzw else) , aber dann nicht mehr beim return :)

Ja, richtig. Das kommt davon wenn man ungetesteten Code postet.
Habe es oben ausgebessert.

Gruß
Dan
Titel: Antw:devstateicon PERL - Das geht doch besser?
Beitrag von: 87insane am 09 August 2019, 09:26:07
Zitat von: DeeSPe am 09 August 2019, 09:14:05
Das "Zwangs-Toggle" beim Klick auf das devStateIcon wird man dadurch los indem man als dritten Wert des devStateIcon "noFhemwebLink" übergibt.
Also um bei z.B. einem dummy das "Zwangs-Toggle" zu entfernen einfach:
attr [dummy] devStateIcon on:on:noFhemwebLink off:off:noFhemwebLink

Gruß
Dan

Das bedeutet, ich kann mir den Link sparen und direkt noFhemwebLink nutzen. Danke Dir. Wird ja immer besser hier :)
Titel: Antw:[GELÖST] - devstateicon PERL - Das geht doch besser?
Beitrag von: 87insane am 09 August 2019, 12:18:23
Hey,

nochmal zurück zum Ursprung....

Kann man in der Kurz-Schreibweise von if auch mehrere Dinge ausführen lassen? So etwa, nur in richtig?

if ReadingsVal($name,"running","") eq "true" ? my $v1='123' my $v2='abc' my $v3='12ab' : .........;
Titel: Antw:[GELÖST] - devstateicon PERL - Das geht doch besser?
Beitrag von: DeeSPe am 09 August 2019, 13:15:37
Zitat von: 87insane am 09 August 2019, 12:18:23
Hey,

nochmal zurück zum Ursprung....

Kann man in der Kurz-Schreibweise von if auch mehrere Dinge ausführen lassen? So etwa, nur in richtig?

if ReadingsVal($name,"running","") eq "true" ? my $v1='123' my $v2='abc' my $v3='12ab' : .........;

Nein.

Gruß
Dan
Titel: Antw:[GELÖST] - devstateicon PERL - Das geht doch besser?
Beitrag von: 87insane am 09 August 2019, 13:21:38
Also habe ich korrekt gelesen....

Bei ternary IF gibt es nur:
? = Dann
: = Sonst

Schade... Danke!
Titel: Antw:[GELÖST] - devstateicon PERL - Das geht doch besser?
Beitrag von: 87insane am 15 August 2019, 10:42:40
Hey zusammen,

nochmal ne Frage zu:
on:on:noFhemwebLink off:off:noFhemwebLink

Wie baut man das in folgendes ein?
{ my $amp = ReadingsVal($name,"online","false") eq "false" && ReadingsVal($name,"new_fw","false") eq "false" || ReadingsVal($name,"online","false") eq "false" && ReadingsVal($name,"new_fw","false") eq "true" ? "rot" : ReadingsVal($name,"online","false") eq "true" && ReadingsVal($name,"new_fw","false") eq "true" ? "gelb" : "gruen";;
my $pic = ReadingsVal($name,"running","") eq "true"?'scene_laundry_room_fem@green':'scene_laundry_room_fem';;
my $text = ReadingsVal($name,"running","") eq "true"?"Waschmaschine läuft - Aktuell: ".ReadingsVal($name,"power","")." W":'Standby';;
my $show = "$amp" eq "gelb" ? "<a href=\"/fhem?cmd.dummy=set $name x_update&XHR=1\">".FW_makeImage("10px-kreis-".$amp)."</a>" : "<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage("10px-kreis-".$amp)."</a>";;
"<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>".FW_makeImage($pic)." $text </div>" }


Habe es aktuell über:
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>

gelöst. Das geht auch wie gewünscht aber ich hätte es gerne richtig.

Danke!
Titel: Antw:[GELÖST] - devstateicon PERL - Das geht doch besser?
Beitrag von: DeeSPe am 15 August 2019, 11:45:15
Zitat von: 87insane am 15 August 2019, 10:42:40
Hey zusammen,

nochmal ne Frage zu:
on:on:noFhemwebLink off:off:noFhemwebLink

Wie baut man das in folgendes ein?
{ my $amp = ReadingsVal($name,"online","false") eq "false" && ReadingsVal($name,"new_fw","false") eq "false" || ReadingsVal($name,"online","false") eq "false" && ReadingsVal($name,"new_fw","false") eq "true" ? "rot" : ReadingsVal($name,"online","false") eq "true" && ReadingsVal($name,"new_fw","false") eq "true" ? "gelb" : "gruen";;
my $pic = ReadingsVal($name,"running","") eq "true"?'scene_laundry_room_fem@green':'scene_laundry_room_fem';;
my $text = ReadingsVal($name,"running","") eq "true"?"Waschmaschine läuft - Aktuell: ".ReadingsVal($name,"power","")." W":'Standby';;
my $show = "$amp" eq "gelb" ? "<a href=\"/fhem?cmd.dummy=set $name x_update&XHR=1\">".FW_makeImage("10px-kreis-".$amp)."</a>" : "<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage("10px-kreis-".$amp)."</a>";;
"<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>".FW_makeImage($pic)." $text </div>" }


Habe es aktuell über:
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>

gelöst. Das geht auch wie gewünscht aber ich hätte es gerne richtig.

Danke!

Gar nicht.
Das ist bei Deinem Code nicht anwendbar, da Du mehrere Icons mit verschiedener Funktionalität anzeigen lassen möchtest.

Der Code
on:on:noFhemwebLink off:off:noFhemwebLink
ist nur anwendbar bei der Verwendung von einem einzelnen devStateIcon.

Gruß
Dan
Titel: Antw:[GELÖST] - devstateicon PERL - Das geht doch besser?
Beitrag von: 87insane am 15 August 2019, 12:20:37
Bedeutet für mich, ich muss bei meiner Variante bleiben und die ist somit nicht "schlechter"?

Danke schon mal!
Titel: Antw:[GELÖST] - devstateicon PERL - Das geht doch besser?
Beitrag von: DeeSPe am 15 August 2019, 12:45:38
Zitat von: 87insane am 15 August 2019, 12:20:37
Bedeutet für mich, ich muss bei meiner Variante bleiben und die ist somit nicht "schlechter"?

Danke schon mal!

Genau.
Wenn es so funktioniert wie Du möchtest, dann lass es.

Gruß
Dan