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
Zitatfhem ('set SmartMessenger message $wer hat das Haus verlassen!')
Statt der einfachen Hochkomma doppelte verwenden ?
Gruß
Thomas
#- 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!');
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
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.
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
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!")
}
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...