[GELÖST] - devstateicon PERL - Das geht doch besser?

Begonnen von 87insane, 08 August 2019, 15:29:02

Vorheriges Thema - Nächstes Thema

87insane

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 !

DeeSPe

#1
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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

87insane

#2
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.

KölnSolar

Evtl. muss das @ maskiert werden ?  :-\ also scene_clothes_dryer\@green
Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

87insane

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? :)

DeeSPe

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!
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

87insane

Danke ihr Beiden!

Super schnell und gute Hilfe.

Wzut

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 :)

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

87insane

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 :)

87insane

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' : .........;

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

87insane

Also habe ich korrekt gelesen....

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

Schade... Danke!

87insane

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!