Schaltsteckdose EDIMAX SP-1101W mit IPS

Mir sind die Allnet-Steckdosen aktuell zu teuer und die 433-MHz-Kisten von der Reichweite her zu dünn. Also habe ich mir so eine EDIMAX SP-1101W WLAN-Steckdose besorgt und damit etwas rumgespielt. Herausgekommen ist das untenstehende Script. Für mich reicht’s, auch wenn man’s zweifelsohne noch optimieren kann.

Installation:

  1. Script in IPS anlegen, dabei die URL anpassen (User ist immer admin, Standardpasswort ist 1234)
  2. Zyklisches Ereignis anlegen, um das Script automatisch zu starten (holt bei mir alle 2 Minuten den aktuellen Status der Steckdosen, notwendig weil man die Dosen auch direkt am Gerät, also an IPS vorbei, schalten kann)
  3. Bool-Variable anlegen und dabei Skript im Profil hinterlegen
<?

    // [TODO] Fehlerbehandlung

    define('EDIMAX_ID', 12345); // ID der Variable
    define('EDIMAX_URL', 'http://admin:1234@hostname_oder_ip:10000/smartplug.cgi');

    // Wir holen erst mal den aktuellen Status. Das brauchen wir als Grundlage der Schaltentscheidung bei Aufruf via WebFront und sowieso für das zyklische Ereignis (s. unten).
    $state = edimax_status();

    if ($_IPS['SENDER'] == 'WebFront')
    {
        if ($_IPS['VALUE'] == false AND $state == true)
        {
            edimax_off();
            $state = false;
        }
        else if ($_IPS['VALUE'] == true AND $state == false)
        {
            edimax_on();
            $state = true;
        }
    }

    // Immer gut
    SetValueBoolean(EDIMAX_ID, $state);

	// http://www.elv.at/topic/edimax-sp-1101w-funktionsweise-installation-ansteuerung-im-lokalen-netzwerk-vom-pc-aus.html
    function edimax_on() {
        $xml = '<?xml version="1.0" encoding="utf-8"?><SMARTPLUG id="edimax"><CMD id="setup"><Device.System.Power.State>ON</Device.System.Power.State></CMD></SMARTPLUG>';
        $r = edimax($xml);
        if (!empty($r) AND array_key_exists('CMD', $r) AND $r['CMD'] == 'OK') return true;
        return false;
    }

    function edimax_off() {
        $xml = '<?xml version="1.0" encoding="utf-8"?><SMARTPLUG id="edimax"><CMD id="setup"><Device.System.Power.State>OFF</Device.System.Power.State></CMD></SMARTPLUG>';
        $r = edimax($xml);
        if (!empty($r) AND array_key_exists('CMD', $r) AND $r['CMD'] == 'OK') return true;
        return false;
    }

    function edimax_status() {
        $xml = '<?xml version="1.0" encoding="UTF8"?><SMARTPLUG id="edimax"><CMD id="get"><Device.System.Power.State></Device.System.Power.State></CMD></SMARTPLUG>';
        $r = edimax($xml);
        if (!empty($r) AND array_key_exists('CMD', $r) AND array_key_exists('Device.System.Power.State', $r['CMD']))
        {
            if ( $r['CMD']['Device.System.Power.State'] == 'ON' ) return true;
        }
        return false;
    }

    function edimax($xml) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, EDIMAX_URL);
        curl_setopt($ch, CURLOPT_POSTFIELDS, "xmlRequest=" . $xml);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
        $data = curl_exec($ch);
        curl_close($ch);
        $r = json_decode(json_encode(simplexml_load_string($data)), true);
        return $r;
    }


?>

EDIT Freitag, 11. Juli 2014, 23:40h: SetValueBoolean statt SetValueInteger facepalm

Hallo,

Danke für die Anleitung. Habe das wie beschrieben versucht, aber ich bekomme es nicht hin. IP der Ersten Dose stimmt.

Bei mir sieht das im IPS so aus: http://screencast.com/t/SYCshruC5uQ

Kannst Du mir sagen was ich falsch mache?

Danke und Grüße - CB

Probier mal einfach ein neues Skript, hau da mal ein

edimax_off();
sleep(5);
edimax_on();
sleep(5);
edimax_off();

rein und führe es aus. Dann sollte die Dose aus, nach 5 Sekunden an und nach weiteren 5 Sekunden wieder aus gehen.

Und natürlich müssen die ganzen Edimax-Funktionen auch in dem Skript stehen oder includet werden.

Habs hinbekommen, Die Variable der define('EDIMAX_ID… war falsch.

Dankeschön und schöne Woche :slight_smile:

Vielen dank für das script aber wie bekomt man das EDIMAX_ID

Danke und Grüße

Naja, das ist die ObjektID, die zeigt dir IPS ja an.