FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: x347 am 07 März 2020, 13:00:29

Titel: [gelöst] Wie übergebe ich $NAME an meine funktion
Beitrag von: x347 am 07 März 2020, 13:00:29
Hallo Zusammen,

Ich habe eine Funktion in myutils geschrieben und habe mit der übergabe Probleme. 

Wenn ich:
{funktion1("device1")}
(Name des Devices übergebe) geht alles.

Wenn ich:
{funktion1('$NAME')}
übergebe, wird der Name nicht übergeben.

Was mache ich falsch?
Was ist eigeltich der Unterschied zwischen "" und ''?

Vielen Dank
Alex
Titel: Antw:Wie übergebe ich $NAME an meine funktion
Beitrag von: xenos1984 am 07 März 2020, 13:18:29
In einfachen Anführungszeichen werden Variablen nicht ausgewertet:
{funktion1('$NAME')}
In doppelten dagegen schon:
{funktion1("$NAME")}
gibt das gleiche wie
{funktion1($NAME)}
Titel: Antw:Wie übergebe ich $NAME an meine funktion
Beitrag von: x347 am 07 März 2020, 13:40:00
Also muss ich:
{funktion1($NAME)}
nutzen.

Jetzt bekomme ich aber folgenden Fehler:
attr device1 devStateIcon: Global symbol "$NAME" requires explicit package name (did you forget to declare "my $NAME"?) at (eval 5175388) line 1.

Im Forum habe ich gerade gefunden, dass ich in der myUtils anscheindend nicht auf die Globale Variable $NAME zugreifen kann.
https://forum.fhem.de/index.php/topic,29469.msg222537.html#msg222537 (https://forum.fhem.de/index.php/topic,29469.msg222537.html#msg222537)

Gibt es für $NAME einen workaround, damit das ähnlich wie in dem beispiel mit den Zeiten funktioniert?

Titel: Antw:Wie übergebe ich $NAME an meine funktion
Beitrag von: MadMax-FHEM am 07 März 2020, 14:05:46
Wie sieht denn deine Sub aus?

Du musst dort nat. den übergebenen Parameter "auslesen"...

Wo/wie rufst du denn die Sub mit $NAME auf?

Gibt es "dort" $NAME überhaupt!?

EDIT: also sowas habe ich bei mir beispielsweise in einem Notify und das tut


define nTemperature notify Wand.*_Climate:desired.* {my_StoreDesTemp($NAME, $EVENT)}



sub my_StoreDesTemp($$)
{
  my ($Name, $Event)  = @_;
}


EDIT2: wohingegen es bei z.B. readingsGroud (nutze ich um valueStyle zu "berechnen") $DEVICE ist...

Gruß, Joachim
Titel: Antw:Wie übergebe ich $NAME an meine funktion
Beitrag von: KernSani am 07 März 2020, 14:18:29
$name ist m.E. Keine globale Variable, sondern muß vom jeweiligen Modul ausgewertet werden (kann mich aber täuschen). Wie bzw. In was für einem Device willst du die Sub denn aufrufen?


Gesendet von iPhone mit Tapatalk
Titel: Antw:Wie übergebe ich $NAME an meine funktion
Beitrag von: x347 am 07 März 2020, 17:32:33
schade, wenn man den Devicename nicht via $NAME in die myUtils übergeben kann.
Das hat mich allgemein interressiert, vielleicht brauch ich das mal.

Im aktuellen fall, wollte ich nur zwei Icons von XiaomiBTLESens Devices anzeigen.

Ich habe hier jetzt folgende Lösung gebaut:
Attribut devStateIcon {plantshow("pflanze4")}

sub plantshow($) {
    my ($name) = @_;
    my $icon_m = "";
my $icon_f = "";
    my $moisture = ReadingsVal( $name, "moisture", "" );
my $minMoisture = AttrVal($name, "minMoisture", "");
my $fertility = ReadingsVal( $name, "fertility", "" );
my $minFertility = AttrVal($name, "minFertility", "");
my $state = ReadingsVal( $name, "state", "" );
    if ( $minMoisture > $moisture ) {
        $icon_m = "10px-kreis-rot";
    }
    else {
        $icon_m = "10px-kreis-gruen";
    }
if ( $minFertility > $fertility ) {
        $icon_f = "10px-kreis-rot";
    }
    else {
        $icon_f = "10px-kreis-gruen";
    }
my $img_m = FW_makeImage( $icon_m,$moisture );
my $img_f = FW_makeImage( $icon_f,$fertility );
return "<div>" . "Gießen: " . $img_m . " | " .  "Düngen: " . $img_f  . " | " . "Status: " . $state . "</div>";


es funktioniert. Wahrscheinlich wird das ganze auch elleganter gehen, aber aller anfang ist schwer.

vg.
Alex
Titel: Antw:Wie übergebe ich $NAME an meine funktion
Beitrag von: Beta-User am 07 März 2020, 17:38:14
In devStateIcon kannst du $name verwenden...
{plantshow($name)}
Titel: Antw:Wie übergebe ich $NAME an meine funktion
Beitrag von: x347 am 07 März 2020, 21:19:16
Danke Beta-User.
habe Groß und klein Schreibung nicht beachtet, ...

{plantshow($NAME)} --> {plantshow($name)}

geht.
Titel: Antw:Wie übergebe ich $NAME an meine funktion
Beitrag von: Beta-User am 07 März 2020, 21:28:27
Ja, ist alles etwas gewöhnungsbedürftig, aber auf diese "Kleinigkeiten" muß man extrem achten und ggf. etwas rumtesten, manchmal gibt es "versteckte features". Leider  ist die Doku grade an der Stelle nicht eben besonders gesprächig (gewesen)...
(In attrTemplate brauchen wir das ständig, daher weiß ich das zwischenzeitlich...)

[gelöst]?