NEWS

PC Booten / Herunterfahren und Befehle ausführen (v2)


  • Starter

    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 und wake_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...


  • Starter

    @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 Fehler

    05: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!!


  • Developer

    @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.


  • Starter

    @Asgothian
    Hmm meinst du jetzt bei Instanzen? Den Javascript Adapter? Hier finde ich nichts

    Bei Objekte dann das gewünschte JavaScript auf "Einstellungen" hier steht abee auch nur "Weitere" und "Raw"

    Wo muss ich denn hin 😅


  • Starter

    @Grace13 sagte in PC Booten / Herunterfahren und Befehle ausführen:

    @Asgothian
    Hmm meinst du jetzt bei Instanzen? Den Javascript Adapter? Hier finde ich nichts

    Bei Objekte dann das gewünschte JavaScript auf "Einstellungen" hier steht abee auch nur "Weitere" und "Raw"

    Wo muss ich denn hin 😅

    js.PNG


  • Developer

    @mikiline na ja, da wo in hellgrau Modul hinzufügen steht. Reinblicken und die Namen der fehlenden Module eintippen

    A.


  • Starter

    hab die Module hinzugefügt.
    Wenn ich nun aber das Script ausführe bekomme ich

    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.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?


  • Developer

    @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';
    

  • Starter

    @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?


  • Developer

    @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.


  • Starter

    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 ?


  • Developer

    @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.


  • Developer

    @Asgothian

    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.


  • Starter

    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?


  • Developer

    @Grace13
    Bei Zeile 10 ist schon einmal richtig.

    Was hast du denn getan um den pc zu einer Aktion zu bewegen ?

    A.


  • Starter

    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


  • Developer

    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';
    

  • Starter

    @Asgothian
    Ich probiers später mal aus

    Aber 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?


  • Developer



  • Hey,
    generell eine coole Sache.
    Aber ist das ganze nicht mit dem GetAdmin wesentlich einfacher und schlanker?

    Grüße


Log in to reply
 

Suggested Topics

  • 9
  • 379
  • 71
  • 3
  • 21
  • 3
  • 23
  • 8

1.7k
Online

29.9k
Users

37.0k
Topics

495.3k
Posts