FHEM Forum

FHEM => Frontends => FHEMWEB => Thema gestartet von: connormcl am 11 Januar 2018, 02:17:14

Titel: Dummy Icon schaltet erst nach Abarbeitung des notify um?
Beitrag von: connormcl am 11 Januar 2018, 02:17:14
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!
Titel: Antw:Dummy Icon schaltet erst nach Abarbeitung des notify um?
Beitrag von: connormcl am 11 Januar 2018, 02:41:33
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)?
Titel: Antw:Dummy Icon schaltet erst nach Abarbeitung des notify um?
Beitrag von: rudolfkoenig am 11 Januar 2018, 09:41:38
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.
Titel: Antw:Dummy Icon schaltet erst nach Abarbeitung des notify um?
Beitrag von: connormcl am 11 Januar 2018, 15:52:53
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"\
       }

Titel: Antw:Dummy Icon schaltet erst nach Abarbeitung des notify um?
Beitrag von: CoolTux am 11 Januar 2018, 16:42:27
Wenn Du Rudis Link gefolgt wärst hättest Du es schon gelöst.

Mal der Neugier wegen, was für Kerzen sind das?
Titel: Antw:Dummy Icon schaltet erst nach Abarbeitung des notify um?
Beitrag von: connormcl am 11 Januar 2018, 18:13:37
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
Titel: Antw:Dummy Icon schaltet erst nach Abarbeitung des notify um?
Beitrag von: rudolfkoenig am 11 Januar 2018, 21:39:18
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.

Titel: Antw:Dummy Icon schaltet erst nach Abarbeitung des notify um?
Beitrag von: connormcl am 11 Januar 2018, 22:30:02
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...