NEWS
JScript führt keine CMD-exe aus (W10P)
-
Hallo,
bin neu bei ioBroker, und habe gleich mal ein ProblemioBroker unter Win10Pro x64 installiert, PC startet mit automatischer Anmeldung als Benutzer "iobroker", startet dann automatisch HABpanel in Chrome (Vollbildansicht). Habe ein Iiyama-24"-Touch-Display (HDMI, Touch über USB) dran, welches nach 2 min abschaltet.
Will nun per JScript, dass das Display einschaltet, sobald von BlueIris (Vollversion als Service auf dem selben Rechner) ein Trigger-Alert per MQTT kommt (=Bewegung auf Video erkannt).
Das MQTT-Ereignis kommt, das Script wird auch gestartet und ausgeführt (da im Log "exec: dispay on" angezeigt wird).
Nur leider wird die EXE (hier nircmd.exe) nicht ausgeführt! (hatte bereits mit einer eigenen exe , welche nur ein Fenster anzeigt, getestet - es scheint, als ob keine Programme ausgeführt werden mit exec).Script:
on({id: 'mqtt.0.BlueIris.doorcam', change: 'any'}, function dp(){ exec('c:\iobroker_tools\nircmd.exe sendkeypress shift', function(err, stdout, stderr) { if (err) log(stderr,'error'); }); log("exec: display on"); });
In der Instanz des Script-Adapters ist natürlich konfiguriert/aktiviert:
- Erlaube das Kommando "setObject"
- Erlaube das Kommando "exec"
Woran kann das liegen? Wer hat Tipps?
Danke schon mal,
Paul -
Hallo,
habe das Skript mal überflogen, Zeile 1 hat einen Fehler. So wird die Funktion ausgeführt:
on({id: 'mqtt.0.BlueIris.doorcam', change: 'any'}, function (dp) {
(<Klammer auf> war falsch gesetzt).
Ausserdem würde ich den Log-Befehl auch innerhalb von exec packen, um ein Kontrolle zu haben.
Ich glaube, exec kann nur Skripte ausführen.
on({id: "mqtt.0.BlueIris.doorcam", change: "any"}, function (dp){ exec("c:\iobroker_tools\nircmd.exe sendkeypress shift", function(err, stdout, stderr) { if (err) log(stderr,"error"); else log("exec: display on"); }); });
Pix
-
@pix sagte in JScript führt keine CMD-exe aus (W10P):
Ich glaube, exec kann nur Skripte ausführen.
Nee, ich hab damit auch schon shutdown ausgeführt.
-
Danke für die Tipps!
Das Script wie folgt läuft auch durch. Leider weckt es den Monitor nicht auf.on({id: "mqtt.0.BlueIris.doorcam", change: "any"}, function (dp){ exec("c:/iobroker_tools/nircmd.exe sendkeypress shift", function(err, stdout, stderr) { if (err) { log(stderr,"error"); } else log("exec: display on (new)"); }); });
Ich habe einen Touch Iiyama TF2415MC-B2, welcher sich vor Ort, also wenn ich über das Touch streiche, aktivieren lässt. Aber eben nicht über die Kommandos im Script.
Hat jemand eine Iiyama-Touch erfolgreich im Einsatz unter Windows?Ich muss mal in BIOS schauen, ob ich dort etwas finde.
-
Öhm, hast du dass jetzt genau so im Einsatz?
Eingangs war es in dem Part zumindest richtig, jetzt aber...Windows ==> "c:/iobroker_tools/nircmd.exe sendkeypress shift" ?
sollte dann wohl eher "c:\iobroker_tools\nircmd.exe sendkeypress shift" sein -
Hi,
läuft der ioBroker als Windows Dienst oder in einer Benutzersitzung (mit vielen schwarzen Fenstern auf dem Desktop)?
-
@SBorg said in JScript führt keine CMD-exe aus (W10P):
Öhm, hast du dass jetzt genau so im Einsatz?
Ehrlich gesagt, ja:
c:\...\..
führte zu Fehlermeldungen, es hätte noch funktioniert
C:\\...\\...
(also mit 2 x backslash), dann hat mich die jetzige Variante auch interessiert, und diese führt ebenfalls zu keinem Fehler.
-
läuft der ioBroker als Windows Dienst oder in einer Benutzersitzung (mit vielen schwarzen Fenstern auf dem Desktop)?
Ja, als Service.
-
Dann wird das mit dem Tastendruck nicht klappen. Der Dienst läuft in einer unsichtbaren Consol Sitzung 0 ohne Ausgabe. Tastendrücke verschwinden im Nirwana.
Da musst Du eher ein kleines Programm in Deiner Benutzersitzung laufen lassen, das sozusagen „von remote“ das Aufweckkommando empfängt. Das Programm könnte z.B. als ein kleiner http-Server in JavaScript geschrieben sein:
/* Examples http://<ip>:3000/brightness/10 switches brightness of server display to 10% http://<ip>:3000/battery returns a number containing the battery level 0..1 */ const brightness = require('brightness'); const batteryLevel = require('battery-level'); const http = require('http'); const port = 3000; const requestHandler = (request, response) => { console.log(request.url); var payload = request.url; var arr = payload.split("/"); if (arr[1] == "battery") { batteryLevel().then(level => { console.log(level); response.end(''+level); }); } if (arr[1] == "brightness") { var value = Number(arr[2])/100; brightness.set(value).then(() => { console.log('Changed brightness to ' + value); }); response.end('Changed brightness to ' + value); } } const server = http.createServer(requestHandler); server.listen(port, (err) => { if (err) { return console.log('something bad happened', err) } console.log(`server is listening on ${port}`) });
Oder halt dort den Keypress-Aufruf rein.
-
Eieiei, das klingt natürlich logisch Vielen Dank!