[gelöst] Verwendung Übergabe an Subroutine innnerhalb eines FHEM-Aufrufs

Begonnen von Uwe S., 14 Februar 2021, 19:54:47

Vorheriges Thema - Nächstes Thema

Uwe S.

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




TomLee

Zitatfhem ('set SmartMessenger message $wer hat das Haus verlassen!')

Statt der einfachen Hochkomma doppelte verwenden ?

Gruß

Thomas

CoolTux


#- 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!');
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

TomLee

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




CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Uwe S.

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!")

}



Beta-User

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

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors