Dummy Icon schaltet erst nach Abarbeitung des notify um?

Begonnen von connormcl, 11 Januar 2018, 02:17:14

Vorheriges Thema - Nächstes Thema

connormcl

Hallo Zusammen!

Ich versuche gerade etwas in FHEM einzubinden, zu dem es kein (natives)FHEM-Modul gibt.
Das heisst soviel, wie dass ich ein Shell-Skript aufrufen möchte und das remote über SSH.

Die ganze Kette bis zum Schaltvorgang funktioniert zufriedenstellend, wenn auch langsam.

Ich habe zunächst ein dummy erstellt, das man ein und ausschalten kann.
Auf das Dummy hört ein notify und führt über einen system()-Aufruf das Schalten über ssh aus.

Nun dauert das wie gesagt einige Zeit und erst wenn sich das Ganze zurückmeldet (erfolgreich oder fehlerhaft), dann wird am Dummy erst das Status-Icon umgeschaltet.

Kann man das irgendwie einstellen, so dass am Dummy das Icon direkt umgeschaltet wird und dann erst das notify greift?


Dummy Definition:

defmod kerzen dummy
attr kerzen devStateIcon on:on:off off:off:on
attr kerzen webCmd on:off


Notify Definition:

defmod n_kerzen notify kerzen:(on|off) {\
if (ReadingsVal("kerzen", "state", "off") eq "on") {\
          system("ssh user\@192.168.x.x /kerzen_an.sh");;\
       }\
if (ReadingsVal("kerzen", "state", "off") eq "off") {\
       system("ssh user\@192.168.x.x /kerzen_aus.sh");;\
       }\
}



Wenn ich hier im FHEMWEB Bereich falsch bin, bitte ich um Verschiebehinweise!

connormcl

Nachtrag:

Habe es darüber gelöst, dass der Aufruf in ein weiteres Shell-Skript gepackt wurde und hier zur Ausführung in den Hintergrund geschoben wurde.
Damit kommt das Wrapper-Skript sofort zurück und FHEM aktualisiert das Icon des Dummy, bevor der Schaltvorgang im Hintergrund ausgeführt wird.

Im Notify wird nun das Skript aufgerufen:

defmod n_kerzen notify kerzen:(on|off) {\
if (ReadingsVal("kerzen", "state", "off") eq "on") {\
          system("kerzen_an.sh");;\
       }


Im Skript steht:

#/bin/sh
ssh user@192.168.x.x /kerzen_an.sh &


Wollte mich nochmal rückversichern, dass das in dem Fall eine Valide vorgehensweise ist, oder ob man aus irgendwelchen Gründen das anders machen sollte (einschl. des system-Aufrufs)?

rudolfkoenig

system() in perl blockiert, deswegen sollte man das FHEM "" verwenden (https://fhem.de/commandref.html#command)
Ich wuerde das so aufziehen:
defmod n_kerzen notify kerzen "ssh user@192.168.x.x /kerzen.sh $EVENT"

und in /kerzen.sh im Shell auf $1 abfragen.
Apropos /kerzen.sh: bei diesem Pfad rollen sich jedem Unix-Erfahrenen die Fussnaegel hoch.
Eher bin/kerzen.sh, und damit in $HOME/bin von user.

ZitatWenn ich hier im FHEMWEB Bereich falsch bin, bitte ich um Verschiebehinweise!
Knopf "Thema verschieben" unten links nach Sonstiges, da wo fhem.pl (siehe MAINTAINER.txt) behandelt wird.

connormcl

Danke für die Antwort. Die Pfade habe ich zwecks Lesbarkeit reduziert.


Kann ich das auch innerhalb Perl nicht-blockierend lösen?

In der FHEM-Kommandozeile kann ich "kerzen_an.sh" ohne Probleme ausführen...

Folgendes wirft aber unknown command:


if (ReadingsVal("kerzen", "state", "off") eq "on") {\
          fhem("kerzen_an.sh");;\
       }


und folgendes wirft
Useless use of a constant ("/kerzen_an.sh") in void context


if (ReadingsVal("kerzen", "state", "off") eq "on") {\
          "kerzen_an.sh"\
       }


CoolTux

Wenn Du Rudis Link gefolgt wärst hättest Du es schon gelöst.

Mal der Neugier wegen, was für Kerzen sind das?
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

connormcl

Ich bin dem Link gefolgt...

Dort steht:
ZitatThere are three types of commands: "fhem" commands (described in this document), shell commands (they must be enclosed in double quotes ") and perl expressions (enclosed in curly brackets {}). shell commands or perl expressions are needed for complex at or notify arguments, but can also issued as a "normal" command.

Und keine der drei Möglichkeiten funktioniert in meinem Statement...nur der system()-Aufruf wird ausgeführt. Wie beschrieben.


Das sind Christbaumkerzen, die über einen Broadlink IR angesteuert werden.

Ansteuerung erfolgt über python-broadlink wie hier beschrieben:
https://wiki.fhem.de/wiki/Broadlink

rudolfkoenig

ZitatUnd keine der drei Möglichkeiten funktioniert in meinem Statement
Was auch immer das meint. Wenn man ein FHEM-Befehl ueber fhem() aufruft, dann muss der Parser das Argument so bekommen, wie im verlinkten Text beschrieben. fhem("kerzen_an.sh") uebergibt kerzen_an.sh an dem Parser, und das wird laut verlinkten Doku als ein FHEM-Befehl interpretiert, was bei mir mit
ZitatUnknown command kerzen_an.sh, try help.
schiefgeht. Richtig waere fhem("\"kerzen_an.sh\"") oder fhem('"kerzen_an.sh"').

Alternativ ruft man system mit & auf, also system("kerzen_an.sh &"), damit system nicht blockiert. Wenn man dabei auch noch die STDIO Umleitung erledigt (system("kerzen_an.sh </dev/null > fhem.log 2>&1 &") ist man bei der "" Implementation von FHEM angekommen.

Ich frage mich, warum als Anfaenger unbedingt auf eine komplizierte Methode besteht, und die vorgeschlagene Einfache ignoriert.


connormcl

Danke!

Ich habe das Beispiel ja wie gesagt stark vereinfacht und verkürzt dargestellt.

Das "einfache Beispiel" mag berechtigt sein; verwende es in dem Fall nur ungern, da ich in bestimmten Fällen viel mehr Info als nur den  Event an das Skript übergeben müsste und das dann auch noch auf einem anderen Rechner läuft.

Daher wollte ich die Schaltlogik in FHEM haben und nicht ins Skript auslagern, um alles an einem Platz zu haben.

Es funktionierte ja wie gesagt bei mir  auch schon mit system() und der Abarbeitung im Hintergrund im Skript mittels "&", die Frage war nur, ob es eleganter geht. Am Ende kommt es somit aufs gleiche raus und blockiert nicht mehr...