FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Uwe S. am 14 Februar 2021, 19:54:47

Titel: [gelöst] Verwendung Übergabe an Subroutine innnerhalb eines FHEM-Aufrufs
Beitrag von: Uwe S. am 14 Februar 2021, 19:54:47
Hallo zusammen,

ich stelle mich vermutlich wieder mal zu d..F an.

Ich möchte an eine Subroutine in der 99_myUtils ein Literal übergeben, das darin innerhalb eines FHEM-Kommandos genutzt werden soll.
Ganz speziell:
In der Routine soll per TelgramBot eine Nachricht versendet werden, in der das Literal innerhalb der Textnachricht verwendet werden soll.

meine Subroutine sieht wie folgt aus:

#- Aktionen beim Verlassen des Hauses
sub AktionBeiHausVerlassen($)
{
#-- Übergabe: Name desjenigen, der das Haus verlässt ($wer)
  my $wer = @_;

#-- Telegram-Message, das $wer das Haus verlassen hat
  fhem ('set SmartMessenger message $wer hat das Haus verlassen!')

}


Der Aufruf wäre z.B. über ein notify wie folgt:

notify_Nachricht_UweWeg notify SmartPhoneUwe:absent  {AktionBeiHausVerlassen('Uwe')}


Das Ergebnis:
Die Nachricht wird versendet, allerdings wird mein $wer darin nicht ersetzt, sondern die Nachricht lautet
$wer hat das Haus verlassen!

Wie muss ich den Aufrufe des SmartMessengers korrekt gestalten?
Oder anders gefragt: Das $wer klammern, in Anführungszeichen einfach oder doppet setzen, oder ....

Danke für Eure Hilfe



Titel: Antw:Verwendung Übergabe an Subroutine innnerhalb eines FHEM-Aufrufs
Beitrag von: TomLee am 14 Februar 2021, 20:25:47
Zitatfhem ('set SmartMessenger message $wer hat das Haus verlassen!')

Statt der einfachen Hochkomma doppelte verwenden ?

Gruß

Thomas
Titel: Antw:Verwendung Übergabe an Subroutine innnerhalb eines FHEM-Aufrufs
Beitrag von: CoolTux am 14 Februar 2021, 21:15:23

#- Aktionen beim Verlassen des Hauses
sub AktionBeiHausVerlassen {
#-- Übergabe: Name desjenigen, der das Haus verlässt ($wer)
  my $wer = shift;

#-- Telegram-Message, das $wer das Haus verlassen hat
  CommandSet(undef,'SmartMessenger message ' . $wer . ' hat das Haus verlassen!');
Titel: Antw:Verwendung Übergabe an Subroutine innnerhalb eines FHEM-Aufrufs
Beitrag von: TomLee am 14 Februar 2021, 22:04:46
Ich hab in Erinnerung gehabt das mir jemand mal sagte:

Zitat" verwendet man, wo man Variablenersetzung haben will, und ' wo man das vermeiden will.

Warum das auch in fhem("...") zutrifft hab ich noch kein Verständnis zu, aber ist so, nachdem ich es jetzt ausprobiert habe mit dem Pushbullet.- und TelegramBot-Modul (in beiden gibts den message-Befehl).

Welchen Grund gibts jetzt auf CommandSet() zurückzugreifen ?

Gruß

Thomas



Titel: Antw:Verwendung Übergabe an Subroutine innnerhalb eines FHEM-Aufrufs
Beitrag von: CoolTux am 14 Februar 2021, 22:08:58
Zitat von: TomLee am 14 Februar 2021, 22:04:46
Ich hab in Erinnerung gehabt das mir jemand mal sagte:

Warum das auch in fhem("...") zutrifft hab ich noch kein Verständnis zu, aber ist so, nachdem ich es jetzt ausprobiert habe mit dem Pushbullet.- und TelegramBot-Modul (in beiden gibts den message-Befehl).

Welchen Grund gibts jetzt auf CommandSet() zurückzugreifen ?

Gruß

Thomas

Gibt keinen wirklichen Grund. Ist eine Möglichkeit.
Titel: Antw:Verwendung Übergabe an Subroutine innnerhalb eines FHEM-Aufrufs
Beitrag von: Otto123 am 15 Februar 2021, 09:18:30
Zitat von: CoolTux am 14 Februar 2021, 22:08:58
Gibt keinen wirklichen Grund. Ist eine Möglichkeit.
Moin,

ich glaube es kam aber auch schon von verschiedenen Helfern der Hinweis: nur für den User auch dokumentierte Funktionen zu empfehlen.
Insofern sollte man sich an die Doku halten https://fhem.de/commandref_DE.html#command

Für die Variablen Auflösung gibt es in Perl mindestens zwei einfache Möglichkeiten innerhalb von Strings (hier der Perl Funktion fhem():
Wie von Thomas erklärt:
fhem("Text1 $var Text2")
oder wie von Cooltux im Insider Befehl gezeigt:
fhem('Text1 '.$var.' Text2')
fhem("Text1 ".$var." Text2")
Die letzten beiden Beispiele verketten drei Strings miteinander, die hier auch eine Variable enthalten.

Gruß Otto
Titel: Antw:Verwendung Übergabe an Subroutine innnerhalb eines FHEM-Aufrufs
Beitrag von: Uwe S. am 15 Februar 2021, 20:01:16
Hallo und vielen Dank für die Unterstützung!

So funktioniert es:

notify_Nachricht_UweWeg notify SmartPhoneUwe:absent  {AktionBeiHausVerlassen("Uwe")}




#- Aktionen beim Verlassen des Hauses
sub AktionBeiHausVerlassen($)
{
  # Benötigt: Name desjenigen, der das Haus verlässt ($wer)
  my ($wer) = @_;

#-- Telegram-Message, das $wer das Haus verlassen hat
  fhem ("set SmartMessenger message $wer hat das Haus verlassen!")

}


Titel: Antw:[gelöst] Verwendung Übergabe an Subroutine innnerhalb eines FHEM-Aufrufs
Beitrag von: Beta-User am 16 Februar 2021, 09:09:20
Vielleicht noch ein paar allgemeine Anmerkungen zum weiteren Ausbau:
- imo ist es längerfristig gesehen einfacher, wenn man myUtils-Routinen möglichst "Namensunempfindlich" auslegt, also z.B. auch gleich den Nachrichtendienst mit übergibt, der genutzt werden soll.
Das ergäbe sowas:
notify_Nachricht_UweWeg notify SmartPhoneUwe:absent  {AktionBeiHausVerlassen('Uwe', 'SmartMessenger')}
#- Aktionen beim Verlassen des Hauses
sub AktionBeiHausVerlassen
{
  # Benötigt: Name desjenigen, der das Haus verlässt ($wer)
     my $wer = shift;
        my $md  = shift;

#-- Telegram-Message, das $wer das Haus verlassen hat
     return fhem ("set $md message $wer hat das Haus verlassen!");
   
}

(da ist gleich noch der Prototype (sub AktionBeiHausVerlassen($)) weg, das hindert nur, und jede Funktion sollte auch (mind.) eine saubere return-Anweisung haben...)
Wer es ohne prototype "log-Eintragssicher" haben will, checkt, ob beide Argumente da sind mit dem Perl-"defined-or"-Operator:
        my $md  = shift // return;
- Schritt 2 in Richtung "Namensunempfindlich" wäre, das notify dann gleich generisch (=passend für beliebige SmartPhone.*-Geräte) zu machen und z.B. den Namen des "Verlassenden" erst in der Routine zu ermitteln (hier z.B., indem $NAME übergeben wird und dann das "SmartPhone" weggeschnitten wird). Ich mache solche Zuordnungen gerne auch über userAttr, aber da gibt es viele Varianten...