Attribut als Parameter an Shellscript übergeben

Begonnen von Tsadan, 09 August 2023, 12:13:02

Vorheriges Thema - Nächstes Thema

Tsadan

Hallo liebe Mitstreiter,

ich habe eine eher kosmetische Frage zu Shellcripts.

Ich verwende das Modul PRESENCE um festzustellen, ob bestimmte Geräte in meinem WLAN eingeloggt sind, oder nicht.
Herfür habe ich ein shellscript geschrieben, welches die MAC-Adresse des zu überprüfenden Gerätes als Parameter verlangt.
Ich möchte, wenn möglich, zukünftig den Wert eines Attributs an das Script übergeben, anstatt die MAC-Adresse im "def"-Teil des  Device zu verwenden.

Das Listing meines PRESENCE devices sieht so aus:

DEF        shellscript "/opt/scripts/wlc_client_present.sh 8c:b8:4a:d3:d5:d9"

   FUUID      61d736f0-f33f-9996-e966-e6c70707e4ae388b
   INTERVAL_NORMAL 30
   INTERVAL_PRESENT 30
   MODE       shellscript
   NAME       P_Markus
   NOTIFYDEV  global
   NR         166
   NTFY_ORDER 50-P_Markus
   STATE      present
   TYPE       PRESENCE
   eventCount 21249
   READINGS:
     2023-08-09 11:22:48   model           shellscript
     2023-08-09 11:25:57   presence        present
     2023-08-09 11:25:57   state           present
   helper:
     CURRENT_STATE present
     DISABLED   0
     call       /opt/scripts/wlc_client_present.sh 8c:b8:4a:d3:d5:d9
Attributes:
   alias      Markus
   group      Presence
   mac        8c:b8:4a:d3:d5:d9
   room       FHEM->Presence,Startseite
   userattr   mac
   verbose    5

Dem erfahrenen Mitstreiter wird aufgefallen sein, dass ich bereits ein userattr "mac" angelegt und mit der MAC-Adresse des zu suchenden Gerätes befüllt habe.

Was mir bisher leider nicht gelungen ist, ist das Attribut "mac" so an das shellscript zu übergeben, dass das Script funktioniert.

Ich habe bisher folgende Versuche unternommen, welche alle mit der Fehlermeldung
fork failed, rescheduling next check in 30 seconds
abbrachen:
shellscript ""/opt/scripts/wlc_client_present.sh" {AttrVal("$name","mac","")}"
shellscript "/opt/scripts/wlc_client_present.sh" ´fhem{AttrVal("$name","mac","")}´
shellscript "/opt/scripts/wlc_client_present.sh fhem{AttrVal("$name","mac","")}"

Ich habe auch schon probiert, zuerst Variablen zu definieren, noch dem Prinzip
my $mac = {AttrVal("$name","mac","")} ; shellscript "/opt/scripts/wlc_client_present.sh $mac"
, das mag aber das Modul PRESENCE offenbar nicht und verlangt, dass mein def mit einer der zulässigen Optionen beginnt.

Hat da evtl. jemand einen Tipp, was ich noch probieren könnte ?

Vielen lieben Dank schon mal und viele Grüße
Tsadan 

TomLee

Vermutlich kann man kein Perl verwenden im shell-script Modus ?

Lies doch den Attributwert im Script aus statt ihn zu übergeben:

mac=$(perl fhem.pl 7072 "{AttrVal('P_Markus','mac','none')}")

Tsadan

Hallo TomLee,

danke für deine Antwort. Grundsätzlich könnte man das machen, allerdings wird das Script an vielen Stellen, nicht nur in FHEM genutzt. Ich könnte vllt. ein Wrapper-Script schreiben, welches die FHEM-Abfrage erledigt.

Wie wäre denn der Syntax, wenn ich an Stelle von P_Markus den Namen des aufrufenden PRESENCE-Devices verwenden möchte (ich habe ja nicht nur ein PRESENCE_Device und möchte ja nicht für jedes einzelne einen Wrapper benötigen) ?

Ob sich das lohnt, muss ich allerdings noch mal für mich bewerten. Am Ende wollte ich es mir vereinfachen, die MAC-Adresse von Geräten anpassen zu können. Mein Gefühl geht in die Richtung, dass es besser funktioniert, ein Attribut zu ändern, als die Definition des Gerätes.

Geht es denn grundsätzlich, ein Attribut an ein PRESENCE-shellscript zu übergeben ?

Danke und Gruß
Tsadan

TomLee

#3
Ich hab nur wenig Erfahrung mit der Programmierung, das war nur so eine Idee, wie ich es halt verstanden hab, viel mehr helfen kann ich auch nicht.

ZitatWie wäre denn der Syntax, wenn ich an Stelle von P_Markus den Namen des aufrufenden PRESENCE-Devices verwenden möchte (ich habe ja nicht nur ein PRESENCE_Device und möchte ja nicht für jedes einzelne einen Wrapper benötigen) ?

Ich denke/vermute das müsste der Modulautor in dem Modul ergänzen, das der Devicename als Parameter übergeben werden kann / Perl in der DEF im shell-script angegeben werden kann.

TomLee

ZitatMein Gefühl geht in die Richtung, dass es besser funktioniert, ein Attribut zu ändern, als die Definition des Gerätes.

Mein Gefühl sagt mir, das es evtl. noch besser/einfacher ist die MAC ganz simpel in ein Reading zu schreiben (mit setreading), statt in einem Attribut einzutragen.

TomLee

#5
Vlt. noch was (manche User haben jetzt schon Schweißausbrüche und bekommen langsam Pickel):

ZitatModule: 73_PRESENCE.pm Maintainer: JoWiemann Forum: Unterstützende Dienste

Tsadan

Jupp, dann werde ich mal dort weiterschauen.

Danke trotzdem !

betateilchen

Das ist doch kein Problem des PRESENCE devices (schon gar nicht des zugehörigen Moduls), sondern mangelndes Verständnis der FHEM Logik.

Zum Zeitpunkt des DEF eines fhem-devices gibt es in diesem device weder readings noch attribute, auf die man zugreifen oder mit denen man irgendwas anfangen könnte.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Tsadan

@Betateilchen
ZitatDas ist doch kein Problem des PRESENCE devices (schon gar nicht des zugehörigen Moduls)
... dessen bin ich mir vollkommen bewusst und habe es auch nicht behauptet.
Zitat,sondern mangelndes Verständnis der FHEM Logik.
... daher frage ich...

ZitatZum Zeitpunkt des DEF eines fhem-devices gibt es in diesem device weder readings noch attribute, auf die man zugreifen oder mit denen man irgendwas anfangen könnte.
So habe ich das auch verstanden. Aber ich kann ja ein Attribut für das PRESENCE-Device anlegen, sobald es existiert.
Ich verstehe nur nicht, wie ich den Inhalt dieses manuell hinzugefügten Attributs and das shellscript übergeben kann und ob das überhaupt geht.

Vielleicht bin ich ja total auf dem Holzweg mit meiner Idee.

Viele Grüße
Tsadan

betateilchen

Von wo aus willst Du denn nach dem define des device und dem attr Deines Parameters das shellscript aufrufen?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoWiemann

Zitat von: Tsadan am 09 August 2023, 17:18:04So habe ich das auch verstanden. Aber ich kann ja ein Attribut für das PRESENCE-Device anlegen, sobald es existiert.

Dann kannst Du aber auch im Define die MAC angeben.

Grüße Jörg

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

betateilchen

Zitat von: JoWiemann am 10 August 2023, 13:45:17Dann kannst Du aber auch im Define die MAC angeben.

Grüße Jörg

Vermutlich ist das aber hier gar nicht das Thema, das versuche ich ja gerade herauszufinden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Tsadan

Moin und sorry für die Verzögerung,

ich habe im Urlaub noch mal über das ganze nachgedacht und bin zu dem Schluss gekommen, dass mein Ansatz wohl keine wirklichen Vorteile bringt.
Ich habe ja bisher auch einfach im define die MAC geändert, wenn jemand ein neues Telefon verwendet.

Im Grunde ging es von der Idee her darum, ein Inventar von Geräten in einem Verzeichnisdienst zu pflegen. Wenn ich in diesem Verzeichnis-Eintrag dann für einen Nutzer ein neues Telefon mit neuer MAC eintrage, sollte die neue MAC automatisiert in das Presence device eingetragen werden. Somit ändert sich ja nicht die "Person", deren Anwesenheit ich mit dem Presence device überwachen möchte, sondern nur die MAC des Telefons dieser Person. Logisch wäre also für mich, dass das Presence device (aka der Nutzer) unangetastet bleibt, sich aber die MAC als Attribut ändert.

Das muss natürlich nicht aus jedem Blickwinkel Sinn ergeben. Ich denke, wir können das Thema auch beenden, es ist ja nicht so, dass etwas gar nicht klappt, sondern eher eine Art kosmetische Frage.

Ich danke Euch für Eure Beiträge und Antworten, mir hat es trotzdem weitergeholfen !
Bis Bald

Tsadan