NEWS
PC Booten / Herunterfahren und Befehle ausführen (v2)
-
Hi.
Da ich meinen PC gerne über ioBroker booten und herunterfahren möchte, habe ich mir ein keines Script geschrieben, dass es mir ermöglicht über WOL zu booten und über einen HTTP GET request ein
shutdown
Befehl auszuführen.Das Script kann beliebig erweitert werden und es können somit beliebig viele Systembefehle ausgeführt werden!
Als voraussetzung hierfür ist nur ein Mainboard das WOL unterstützt und ein installierter Web server.
Am einfachsten ist es ihr installiert XAMPP mit der minimalinstallation (nur Apache) und lässt dann Apache als Dienst laufen. Somit bekommt ihr nichts davon mit.Im webroot (htdocs) müsst ihr ein .php file (z.b. index.php) mit den folgenden Inhalt erstellen:
<?php if (isset($_GET['cmd'])) { switch ($_GET['cmd']) { case 'info': echo('info'); break; case 'shutdown': exec('shutdown -s -f -t 0'); break; } } ?>
In der script Engine erstellt ihr ein neues Javascript mit folgenden Inhalt:
var wol = require('wake_on_lan'); var ping = require('ping'); const objTarget = 'pc.0.power'; const ip = '192.168.0.XXX'; const macAddr = 'XX:XX:XX:XX:XX:XX'; const pollingInterval = 10000; createState(objTarget, false, { read: false, write: true, desc: 'PC Power switch', type: 'boolean', def: false }); function sendRequest(cmd) { try { var request = require('sync-request'); var result = request( 'GET', 'http://'+ip+'/index.php?cmd='+cmd, { timeout: 10000 } ); if (!result.error && result.statusCode) { return result.body; } } catch(e) {} return 'error'; } setInterval(function () { ping.sys.probe(ip, function(isAlive) { setState(objTarget, isAlive, true); }); }, pollingInterval); on({ id: 'javascript.0'+objTarget, change: 'any', ack: false }, function (obj) { if (obj.state.val == false) { sendRequest('shutdown'); log('powered off '+objTarget, 'info'); } else { wol.wake(macAddr); log('powered on '+objTarget, 'info'); } });
Ihr müsst die Module
sync-request
,ping
undwake_on_lan
in den settings der Script Engine hinzufügen, damit sie auch geladen werden undverfügbar sind (Instanz einstellungen).Schlussendlich könnt ihr mit dem Objekt javascript.0.pc.0.power (wie im Javascript file festgelegt) erstellen um den State zu triggern.
Wie gesagt, es ist möglich das Ganze zu erweitern und es können noch parameter für die Befehle hinzugefügt werden usw...
-
@schreda
Hey, könntest du das bitte etwas verständlicher für anfänger erklären.über WOL kann ich mein PC schon anmachen.
Das ausmachen klappt leider nicht so..1.Ich habe den XAMPP Apache Server Installiert ( Hier in der installation bei service nur apache ausgewählt)
2. Dann hab ich die index.php mit editor geändert so wies oben steht.
Apache Server Starten
3. Das Script in auf Common eingefügt ( IP und Mac vom PC eingetragen)
Wenn ich das Script dann ausführe bekomme ich folgenden Fehler05:28:50.261 [error] javascript.0 script.js.common.Shutdown: Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/node_modules/sync-request' 05:28:50.261 [error] javascript.0 at sendRequest (script.js.common.Shutdown:15:23) 05:28:50.261 [error] javascript.0 at updateState (script.js.common.Shutdown:32:21) 05:28:50.261 [error] javascript.0 at Object. (script.js.common.Shutdown:40:26)
hat wahrscheinlich mit Punkt 4 zu tun
4. "Ihr müsst die Module sync-request und wake_on_lan in den settings der Script Engine hinzufügen, damit sie auch geladen werden unverfügbar sind." steh hier iwie aufem schlauch? Wie muss ich das jetzt einfügen? werd bestimmt fündig aber dann erst nach 10 Stunden
5.Das "Objekt" habe ich im IoBroker im Cloud Adapter angelegt hier dann das eingefügte Script aus Common ausgewählt. - in Alexa dann nach neue Geräten suchen und den Adapter ausprobieren-Wie füge ich weitere befehle ein?
Wird mir irgendwie aus dem Script nicht ersichtlich wo ich da jetzt Beispielweise den Befehl für den Ruhezustand also "rundll32.exe powrprof.dll,SetSuspendState" einfügen soll?Danke für die Hilfe!!
-
@Grace13
In den Einstellungen für den Script Adapter kannst du “zusätzliche Module” angeben, die dann in den Skripten genutzt werden können.A.
-
@Asgothian
Hmm meinst du jetzt bei Instanzen? Den Javascript Adapter? Hier finde ich nichtsBei Objekte dann das gewünschte JavaScript auf "Einstellungen" hier steht abee auch nur "Weitere" und "Raw"
Wo muss ich denn hin
-
@Grace13 sagte in PC Booten / Herunterfahren und Befehle ausführen:
@Asgothian
Hmm meinst du jetzt bei Instanzen? Den Javascript Adapter? Hier finde ich nichtsBei Objekte dann das gewünschte JavaScript auf "Einstellungen" hier steht abee auch nur "Weitere" und "Raw"
Wo muss ich denn hin
-
@mikiline na ja, da wo in hellgrau Modul hinzufügen steht. Reinblicken und die Namen der fehlenden Module eintippen
A.
-
hab die Module hinzugefügt.
Wenn ich nun aber das Script ausführe bekomme ichjavascript.0 2019-03-02 15:45:04.034 warn at Object.<anonymous> (script.js.common.WoL:40:26) javascript.0 2019-03-02 15:45:04.034 warn at updateState (script.js.common.WoL:36:9) javascript.0 2019-03-02 15:45:04.034 warn State "pc.0.power" not found javascript.0 2019-03-02 15:45:04.034 warn at Object.<anonymous> (script.js.common.WoL:40:26) javascript.0 2019-03-02 15:45:04.033 warn at updateState (script.js.common.WoL:31:20) javascript.0 2019-03-02 15:45:04.032 warn getState "pc.0.power" not found (3)
Die Host IP ist die Ip meines PCs, Mac Adresse auch.
In XAMPP habe ich die index nun in idex.php umgenannt. Hier werde ich jetzt auch im Browser weitergeleitet wenn ich auf Admin klicke. Muss ich hier noch irgendetwas einstellen?
Wo liegt mein Fehler?
-
@Grace13
Du musst noch ein objekt anlegen mit dem du den aktuellen Zustand des Rechners steuerst. Im Script ist dazu pc.0.power vorgesehen.Also - Objekt anlegen,Skript entsprechend anpassen das es dieses Objekt auch nutzt
var obj_root = 'pc.0'; var obj_state = 'power';
-
@Asgothian
Also nochmal zusätzlich eins wo nur die zwei Zeilen drin stehn?Das dann als Objekt auswählen.
Und das ist dann mein schalter?Das ausgewählte Objekt ist dann sozusagen der Pc der im hauptsächlichen Skript das oben steht angegeben wurde?
-
@Grace13
Nein, die 2 Zeilen sollten in dem Script das du hast schon drin sein. Du musst sie ändern um das richtige Objekt anzusprechen. Ich würde das so machen:Im Objektbaum unter JavaScript.0 ein Objekt „rechnerstatus“ anlegen (Art Status, Typ Zahl)
Dann musst du bei obj_root „javascript.0“ stehen und bei obj_state „rechnerstatus“.
A.
-
12:29:19.968 [warn] javascript.0 at updateState (script.js.common.rechnerstatus:31:20) 12:29:19.968 [warn] javascript.0 at Object. (script.js.common.rechnerstatus:40:26) 12:29:19.968 [warn] javascript.0 at updateState (script.js.common.rechnerstatus:36:9) 12:29:19.968 [warn] javascript.0 at Object. (script.js.common.rechnerstatus:40:26)
Irgdnwie bin ich nicht viel weiter gekommen.
Ich hab die zwei Zeilen
var obj_root = 'pc.0'; var obj_state = 'power';
in
var obj_root = 'javascript.0; var obj_state = 'rechnerstatus';
geändert..
Damit keine Verständnissfehler aufkommen hab ich das gleiche nochmal als Skript in Common angelegt ( war mir nicht ersichtlich das direkt unter objektem - javascript.0 einzutragen)
könnte der fehler vll bei XAMPP liegen?
Wohl eher kaufm das Script kann ja nicht ausgeführt werden ?
-
@Asgothian sagte in PC Booten / Herunterfahren und Befehle ausführen:
Im Objektbaum unter JavaScript.0 ein Objekt „rechnerstatus“ anlegen (Art Status, Typ Zahl)
Das musst du auch machen - sonst geht es nicht.
-
Füge doch bitte in das script den Befehl
createState(obj_root+'.'+obj_state, false)
ein, direkt unter den Zeilen wo du obj_root und obj_state gesetzt hast.
Dann sollte Ruhe sein.
-
Ich schon wieder..
Ich hab was du gesagt hast in zeile 10 eingefügt? Oder soll ichs doch bei zeile 3 einfügen?
Der PC macht aber kein muchs
Liegt das vll am Appache?Wo könnte der Fehler noch liegen?
-
@Grace13
Bei Zeile 10 ist schon einmal richtig.Was hast du denn getan um den pc zu einer Aktion zu bewegen ?
A.
-
Also
Ich hab das erste Script mit Editor in die.php vom xampp eingefügt.
Das zwei im common eingefügt dann so geändert wie du gesagt hast.
Ein Gerät im Cloud Adapter eingefügt und das geschrieben Java Script mit dem Namen rechnerstatus ausgewählt
Dann bei alexa das übliche prozeder
Nun kann ich auf An klicken hier bekomm ich im Log dann den Eintrag "javascript.js.common.rechnerstatus: registered 1 subscription and 0 schedules"
Das wars.. Wenn ich auf aus klicke kommt wird das Script gestoppt.Bei im Objektbaum und JavaScript bei Vis hab wird mir "rechnerstatus" auch angezeigt kann es aber aus irgend einem Grund nicht im Cloud Adapter einfüge bzw wird mir nicht angezeigt
Hab in nem anderen forum das hier
"EDIT:Ich glaube es leigt daran, weil das Script nicht in javascript.0 liegt sondern in javascript.0->ScriptEnabled"
Gefunden mal sehn obs was bringt wenn ichs ändere
-
Immer mit dr Ruhe - teste mal bitte folgendes:
-
Script starten
-
Rechner starten (den du steuern willst
-
datenpunkt javascript.0.rechnerstatus im objektbaum auf true setzen.
-
datenpunkt javascript.0.rechnerstatus auf false setzen
-
ins log schauen - da müsste “powered off” auftauchen
-
Rechner beobachten - er sollte jetzt herunter gefahren werden wenn das kein offenes Programm blockiert. Wenn der Rechner nach 5 Minuten noch läuft bitte herunter fahren
-
wenn der Rechner aus ist den datenpunkt wieder auf wahr setzen - jetzt müsste der Rechner starten.
-
wieder ins log schauen - da müsste “powered on” auftauchen.
A.
Nachtrag - nur zur Sicherheit: du hast im Kopf des scriptes die pi und mac Adresse deines zu steuernden Rechners eingetragen ?
var host_ip = '192.168.X.X'; var mac_addr = 'XX:XX:XX:XX:XX:XX';
-
-
@Asgothian
Ich probiers später mal ausAber dir schonmal vielen Dank für die Mühe!!
Mit rechner aus meinst du ganz normal herunterfahren?
Das Script dann am besten über nen anderen Computer starte?Okay, guter Tipp werd drauf auchten das alle Programme zu sind.
Mit Script false und true einfach nur die hacken bei setzen, hab ich das richtig verstanden?
-
@Grace13 ja
-
Hey,
generell eine coole Sache.
Aber ist das ganze nicht mit dem GetAdmin wesentlich einfacher und schlanker?Grüße