System.exec durch CuxD ersetzen

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

zwaenn
Beiträge: 11
Registriert: 01.10.2013, 20:09
Wohnort: Meck-Pom

Re: Sytem.exc durch CuxD ersetzen

Beitrag von zwaenn » 11.02.2014, 15:53

Ich wollte "Homematic und Google Apps" (http://homematic-forum.de/forum/viewtop ... 31&t=11386) in der Versoin 1.5 mit cuxd aufrufen:
Alter Aufruf:

Code: Alles auswählen

string stdout;
string stderr;
string url="https://script.google.com/macros/s/-----------/exec?pwd=------&cmd=urlaub&d=0";
system.Exec ("curl -s -k -L " # url # "'", &stdout, &stderr);
if (stdout == "1") 
Versucht habe ich:

Code: Alles auswählen

var url="https://script.google.com/macros/s/-----------/exec?pwd=------";
var curl="LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl --trace-ascii /var/log/curl.trace -s -k -L " # url # "";
var cmd=""#curl#"&cmd=urlaub";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
wobei die Variable v leer bleibt. Wenn ich aber nur:

Code: Alles auswählen

var url="https://script.google.com/macros/s/-----------/exec?pwd=------";
var curl="LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl --trace-ascii /var/log/curl.trace -s -k -L " # url # "";
var cmd=""#curl#"";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
versuche (Also nur das pwd mitgebe aber nicht cmd) bekomme ich als Antwort "1.5 Fehlende oder unbekannte Angabe von "cmd"".
Also denke ich das es Probleme gibt pwd UND cmd zu übergeben.

Benutzeravatar
uwe111
Beiträge: 4820
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 246 Mal
Kontaktdaten:

Re: Sytem.exc durch CuxD ersetzen

Beitrag von uwe111 » 11.02.2014, 18:58

Auf den ersten Blick würde ich erstmal die URL in Anführungszeichen setzen, sonst wird das &-Zeichen durch die Shell ausgewertet.

Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

zwaenn
Beiträge: 11
Registriert: 01.10.2013, 20:09
Wohnort: Meck-Pom

Re: Sytem.exc durch CuxD ersetzen

Beitrag von zwaenn » 13.02.2014, 11:28

-Danke-
So funktioniert es

Code: Alles auswählen

var url="'https://script.google.com/macros/s/-----------/exec?pwd=------'";
var curl="LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl --trace-ascii /var/log/curl.trace -s -k -L " # url # "";
var cmd=""#curl#"'&cmd=urlaub'";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();

hoffmakl
Beiträge: 51
Registriert: 29.11.2010, 17:45

Re: Sytem.exc durch CuxD ersetzen

Beitrag von hoffmakl » 13.10.2014, 21:13

Hallo,
folgende tcl scriptzeile schreibt mir ins Verzeichnis /etc/config/addons die Datei test.txt (mit den Wetterdaten).

Code: Alles auswählen

string stderr;
string stdout;
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /etc/config/addons/test.txt http://api.openweathermap.org/data/2.5/find?q=Berlin");
Wie kann ich die Ausgabe direkt in die Variable stdout schreiben?

cu Herbert

jm1536
Beiträge: 25
Registriert: 24.11.2014, 11:22
Hat sich bedankt: 1 Mal

Re: Sytem.exc durch CuxD ersetzen

Beitrag von jm1536 » 24.11.2014, 13:08

Hallo,

ich habe in einem Kanal des CuxD-Gerätes "System.Exec" als CMD_LONG den Aufruf von setparam.tcl geschrieben und wollte im HM-Script die Parameter mit PARAMETER_L_1 bis PARAMETER_L_4 übergeben.

Leider werden die Parameter URL-encoded an $1$ bis $4$ in die Befehlszeile geschrieben (steht ja auch so in der Dokumentation). Im Kanal (übergebe ich als Parameter 1) wird dann zB das ":" als %3A codiert, es kommt also zB LEQxxxxxx%3A2 statt LEQxxxxxx:2 an.

Kann man das URL-encoding irgenwie verhindern, oder wenn nicht, im TCL-Script wieder decodieren (kenne mich leider mit TCL nicht gut aus)?

CMD_LONG (im Kanal "CuxdSetParam"):

Code: Alles auswählen

tclsh /usr/local/setparam.tcl $1$ $2$ $3$ $4$
HM-Script:

Code: Alles auswählen

object cuxdSetParam = dom.GetObject("CuxdSetParam");
object cuxdSetParamAddr  = cuxdSetParam.DPByHssDP("PARAMETER_L_1");
object cuxdSetParamParam = cuxdSetParam.DPByHssDP("PARAMETER_L_2");
object cuxdSetParamType  = cuxdSetParam.DPByHssDP("PARAMETER_L_3");
object cuxdSetParamValue = cuxdSetParam.DPByHssDP("PARAMETER_L_4");
object cuxdSetParamRun   = cuxdSetParam.DPByHssDP("CMD_RUNL");
...
cuxdSetParamAddr.State(dom.GetObject("xyz"));
cuxdSetParamParam.State("TEMPERATURE_COMFORT");
cuxdSetParamType.State("double");
cuxdSetParamValue.State(temp);
cuxdSetParamRun.State(1);
Viele Grüße, Jürgen

Benutzeravatar
uwe111
Beiträge: 4820
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 246 Mal
Kontaktdaten:

Re: Sytem.exc durch CuxD ersetzen

Beitrag von uwe111 » 24.11.2014, 17:32

Hallo Jürgen,
jm1536 hat geschrieben:Kann man das URL-encoding irgenwie verhindern, oder wenn nicht, im TCL-Script wieder decodieren (kenne mich leider mit TCL nicht gut aus)?
Nein, bisher nicht. Aber ich könnte mir das einmal ansehen.
Im TCL-Script geht's natürlich. Beispiele dazu findest Du im Internet: http://wiki.tcl.tk/14144

Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

jm1536
Beiträge: 25
Registriert: 24.11.2014, 11:22
Hat sich bedankt: 1 Mal

Re: Sytem.exc durch CuxD ersetzen

Beitrag von jm1536 » 26.11.2014, 09:36

Hallo,

das decodieren habe ich jetzt hingekriegt. Es wäre natürlich schöner, wenn das in CuxD gehen würde...

Jetzt bekomme ich im Syslog jede Menge dieser Meldungen:
Nov 26 01:00:22 homematic-ccu2 daemon.warn cuxd[13601]: CUX2801001:3 [1] - pid(24097) already running -> new pid!
Liegt das daran, dass meine Aufrufe von CMD_RUNL zu schnell hintereinander sind, und die gleiche PID verwendet wird? Beim Aufruf mit CMD_EXEC kommen sie nicht.

Viele Grüße, Jürgen

Benutzeravatar
uwe111
Beiträge: 4820
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 246 Mal
Kontaktdaten:

Re: Sytem.exc durch CuxD ersetzen

Beitrag von uwe111 » 26.11.2014, 19:52

Hallo Jürgen,
jm1536 hat geschrieben:Liegt das daran, dass meine Aufrufe von CMD_RUNL zu schnell hintereinander sind, und die gleiche PID verwendet wird? Beim Aufruf mit CMD_EXEC kommen sie nicht.
Das liegt daran, dass der neue Aufruf gestartet wird, während der vorherige Aufruf noch läuft. Da CMD_RUNL den Exit-Code des Befehls an das Gerät zurückmeldet, kann man so nicht mehr herausbekommen, von welchem Aufruf der gesetzte Exit-Code eigentlich kam. Deshalb gibt es eine Warnung im Syslog. Bei CMD_EXEC ist das nicht der Fall, deshalb auch keine Warnung.

Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

Accuracy
Beiträge: 749
Registriert: 22.05.2013, 16:37
Hat sich bedankt: 1 Mal

Re: Sytem.exc durch CuxD ersetzen

Beitrag von Accuracy » 18.01.2015, 12:13

Hi,
ich schicke via System.Exec Nachrichten auf mein iPhone und würde das in einen CuxD Befehl umwandeln.
Hat jemand eine Idee das zugehörige Script aussehen muss?

hier mal mein altes Script:
string stdout;
string stderr;
system.Exec("wget -q -O /dev/null 'http://prowl.weks.net/publicapi/add?api ... iption=Das Haus hat dich jetzt als abwesend erkannt und schaltet bis Du wiederkommst alle Lichter aus.'", &stdout, &stderr);

Accuracy
Beiträge: 749
Registriert: 22.05.2013, 16:37
Hat sich bedankt: 1 Mal

Re: Sytem.exc durch CuxD ersetzen

Beitrag von Accuracy » 24.01.2015, 10:55

hat keiner eine Idee? Kennt man gar nicht aus diesem Forum so :-)

Antworten

Zurück zu „CUxD“