HS100 über die Cloud steuern

Ich würde gerne versuchen, meine HS100 nicht direkt, sondern über die Cloud steuern. Es gibt da viele Ansätze, meine PHP-Kenntnisse sind aber sehr eingeschränkt und Beispiele transferieren ist nicht ganz einfach.
Ich hab da aber jetzt einen Ansatz gefunden, der vielversprechend aussieht, leider ist der Code für Windows.

Die UUID wird hier generiert Online UUID Generator Tool
Token ermitteln

curl -X POST -H "Content-Type: application/json" 
-d "{ \"method\" : \"login\", \"params\" : {\"appType\" : \"Kasa_Android\", 
\"cloudPassword\" : \"OUR PASSWORD HERE\", \"cloudUserName\" : \"OUR USER NAME HERE\", 
\"terminalUUID\" : \"YOUR JUST ACQUIRED UUID HERE\" }}" https://eu-wap.tplinkcloud.com

Device ID ermitteln

curl -X POST -H "Content-Type: application/json" -d "{ \"method\" : \"getDeviceList\" }" 
https://eu-wap.tplinkcloud.com?token=YOUR JUST ACQUIRED TOKEN HERE

Ein- und Ausschalten

curl -X POST -H "Content-Type: application/json" -d 
"{ \"method\" : \"passthrough\", \"params\" : { \"deviceId\" : \"OUR DEVICE ID HERE\", 
\"requestData\" : '{ \"system\" : { \"set_relay_state\" : { \"state\" : 1}}}'}}" 
https://eu-wap.tplinkcloud.com/?token=OUR TOKEN HERE
curl -X POST -H "Content-Type: application/json" 
-d "{ \"method\" : \"passthrough\", \"params\" : { \"deviceId\" : \"OUR DEVICE ID HERE\", 
\"requestData\" : '{ \"system\" : { \"set_relay_state\" : { \"state\" : 0}}}'}}" 
https://eu-wap.tplinkcloud.com/?token=OUR TOKEN HERE

Den aktuellen Status bekommt man sicher auch noch eirgendwie raus, da such ich noch.

Meine finale Version

Token ermitteln

<?php

$username="";
$password="";

//Token ermitteln
$url = 'https://eu-wap.tplinkcloud.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array (
'method' => 'login',
'params' => array (
'appType' => 'Kasa_Android',
'cloudUserName' => $username,
'cloudPassword' => $password,
'terminalUUID' => ''
)
);
curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);
$token=json_decode($result,true)["result"]["token"];
setvalue(28026/*IPS Variable die den Wert von Token aufnimmt*/,$token);

Instanzen pro Schalter erstellen

<?php
//Token ermitteln
include(IPS_GetScriptFile(18209/*Skript für die Ermittlung des Tokens*/));

$url = 'https://eu-wap.tplinkcloud.com?token='.GetValue(28026/*Token*/);
$devicelist="";
$InsID=0;
$VarID=0;
$root=getvalue(37924/*ID der Kategorie wo die Instanzen erstellt werden sollen*/);
$GUIDDummy=getvalue(39342/*UID der Dummy Instanz*/);
$ActionScriptID=getvalue(50777); /*ID des Skripts füs Schalten */
if ($root>0 and $GUIDDummy != "") /*nur zur Sicherheit, sollten die Werte mal verloren gehen */
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    $content = array (
    'method' => 'getDeviceList'
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
    $result = curl_exec($ch);
    $devicelist=json_decode($result,true)["result"]["deviceList"];

    foreach ($devicelist as $device)
    {
        $instanceID=@IPS_GetInstanceIDByName($device["alias"],$root); /*Prüfen ob die Instanz schon vorhanden ist*/
        if ($instanceID == false)
        {
            //Schalterinstanz
            $InsID = IPS_CreateInstance($GUIDDummy);
            IPS_SetName($InsID, $device["alias"]);
            IPS_SetParent($InsID, $root);

            //Schaltervariable
            $VarID = IPS_CreateVariable(0);
            IPS_SetName($VarID,$device["alias"]); 
            IPS_SetParent($VarID,$InsID); 
            IPS_SetVariableCustomProfile($VarID,"~Switch");
            IPS_SetVariableCustomAction($VarID,$ActionScriptID);

            //DeviceID Variable
            $VarID = IPS_CreateVariable(3);
            IPS_SetName($VarID,$device["alias"]."ID");
            IPS_SetParent($VarID,$InsID); 
            setvalue($VarID,$device["deviceId"]);
        }
    }
}
/* Instanz anlegen eindeutig mit deviceMac
varialbe boolean für ein aus
variable string mit deviceId string*/

Schalten

<?php
$DeviceID="";
$newStatus = 0;
$SchalterID=0;
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$SchalterID=$_IPS['VARIABLE'];
include(IPS_GetScriptFile(18209/*Skript für die Ermittlung des Tokens*/));

$Variablen=IPS_GetChildrenIDs(IPS_GetParent($SchalterID));
foreach ($Variablen as $Variable)
{
    if(IPS_GetVariable($Variable)["VariableType"]==3) $DeviceID=getvalue($Variable);
}
//Ein- und Ausschalten
$url = 'https://eu-wap.tplinkcloud.com?token='.$token;
if (getvalue($SchalterID)==true){
    $newStatus=1;
}
else
{
    $newStatus=0;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array ( 'method' => 'passthrough',
"params" => array( "deviceId" => $DeviceID,
"requestData" => "{\"system\":{\"set_relay_state\":{\"state\": $newStatus }}}" ) );

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);
if (json_decode($result,true)["error_code"] == 0){

    //Gerätestatus abfragen
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    $content = array ( 'method' => 'passthrough',
    "params" => array( "deviceId" => $DeviceID,
    "requestData" => json_encode(array("system" => array("get_sysinfo" => null,),))));

    curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
    $result = curl_exec($ch);
    $result=json_decode(json_decode($result,true)["result"]["responseData"],true);
    setvalue($SchalterID,$result["system"]["get_sysinfo"]["relay_state"]==1);
}
else{
        setvalue($SchalterID,false);
}

Statusaktualisierung

<?php
$Kategorie= getvalue(37924);
$Instanzen=IPS_GetChildrenIDs($Kategorie);
$IDSchalter=0;
$IDDeviceID=0;
include(IPS_GetScriptFile(18209/*Skript für die Ermittlung des Tokens*/)); /*Kategorie wo die Intanzen für die Schalter liegen*/
/*Es werden die Instanzen, also die Schalter, und dann die Variablen der jeweiligen Instanz durchlaufen*/
foreach ($Instanzen as $Instanz)
{
    $Variablen = IPS_GetChildrenIDs($Instanz);
    foreach ($Variablen as $Variable)
    {
        if(IPS_GetVariable($Variable)["VariableType"]==0)
        {
            $IDSchalter=$Variable;
        }
        else
        {
            $IDDeviceID=$Variable;
        }
    }
    //Gerätestatus abfragen
    $url = 'https://eu-wap.tplinkcloud.com?token='.$token;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    $content = array ( 'method' => 'passthrough',
    "params" => array( "deviceId" => getvalue($IDDeviceID),
    "requestData" => json_encode(array("system" => array("get_sysinfo" => null,),))));

    curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
    $result = curl_exec($ch);
    if (json_decode($result,true)["error_code"] == 0){
        $result=json_decode(json_decode($result,true)["result"]["responseData"],true);
        setvalue($IDSchalter,$result["system"]["get_sysinfo"]["relay_state"]==1);
    }
    else
    {
        setvalue($IDSchalter,false);
    }
}

Anbei noch ein paar Screenshots von den Skripten und Instanzen im Objektbaum

Versuch mal ob du so den Token ermitteln kannst:


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://eu-wap.tplinkcloud.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'method'       => 'login',
    'params'       =>  json_encode([
        'appType'       => 'Kasa_Android',
        'cloudPassword'       => 'OUR PASSWORD HERE',
        'cloudUserName'       => 'OUR USER NAME HERE',
        'terminalUUID'        => 'YOUR JUST ACQUIRED UUID HERE',
    ])
]));
$result = curl_exec($ch);

Grüße,
Kai

Damit bekomm ich einen Fehler.
Hab aber in der Zwischenzeit fleißig gesucht und das gefunden

$url = 'https://eu-wap.tplinkcloud.com';
$curl = curl_init( $url );
$content = array (
'method' => 'login',
'params' => array (
'appType' => 'Kasa_Android',
'cloudUserName' => $username,
'cloudPassword' => $password,
'terminalUUID' => ''
)
);
curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode($content) );
curl_setopt( $curl, CURLOPT_HTTPHEADER,
array("Content-type: application/json") );
...
$json_response = curl_exec($curl);
$response = json_decode($json_response, true);
$token = $response['result']['token'];
$content = array ( $content = array ( 'method' => 'getDeviceList' );
.....
$response = json_decode($json_response, true);
$deviceList = $response['result']['deviceList'];
How to get the device status (on/off)
$content = array ( 'method' => 'passthrough',
"params" => array( "deviceId" => $deviceID,
"requestData" => json_encode(array("system" => array("get_sysinfo" => null,),))));

there are two issues here: firstly, the returned JSON is malformed so the php json_decode won’t work; secondly, the status for a plug comes in the “relay_state” field while the status for a light bulb comes in the “on_off” field. Regular expressions can do the job.

$found = preg_match( '/"relay_state":([0-9])/i', $response['result']['responseData'], $matches );
if( $found == 0 )
$found = preg_match( '/"on_off":([0-9])/i', $response['result']['responseData'], $matches );
$status = $matches[1];

How to set the status of a plug and a bulb
For plugs
$content = array ( 'method' => 'passthrough',
"params" => array( "deviceId" => $deviceID,
"requestData" => "{\"system\":{\"set_relay_state\":{\"state\": $newStatus }}}" ) );

for light bulbs
$content = array ( 'method' => 'passthrough', "params" => array( "deviceId" => $deviceID, "requestData" => "{\"smartlife.iot.smartbulb.lightingservice\":{ \"transition_light_state\" : {\"on_off\": $newStatus, \"transition_period\": 0} } }" ) );

Quelle: TP-Link API : same hacks on PHP – SmartHome stuff by mblaya
Damit bekomm ich den Token zuürck. Beim Anderen bin ich noch am basteln :wink:

Was gab es denn für einen Fehler?
Dann hast du ja jetzt einen Ansatz gefunden, mit dem du weiter machen kannst.

Grüße,
Kai

Sorry, das war unhöflich.

Fehler ist:string(69) „{„error_code“:-20105,„msg“:„Parameter has different type with value“}“

Ich bin zwar kein Cloud Freund und verstehe immer noch nicht warum ich einem Server in China oder sonst wo sagen muss das ich meine Steckdose, die sich im gleichen Netzwerk und im gleichen Haus befindet, anschalten will.
Wenn das bei Dir aber so weit funktionieren sollte und Du das ausprobiert hast, kann man ja optional einen Auswahlschalter im Modul ergänzen und das dann auswählen lassen. Vielleicht lassen sich ja die neueren Steckdosen einwandfrei über die Cloud steuern das wäre dann ein Vorteil. Ich bin mal gespannt auf Rückmeldung von Dir was auf dem Weg funktioniert.

Aufgegeben wird ein Brief :smiley:
Den Token bekomme ich jetzt fehlerfrei zurück, und auch das json Format dürfte jetzt passen. Dieser Ansatz ist eine Mischung aus beiden. Bei dem einen hat das eine, beim anderen das andere funktioniert.

$url = 'https://eu-wap.tplinkcloud.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array (
'method' => 'login',
'params' => array (
'appType' => 'Kasa_Android',
'cloudUserName' => $username,
'cloudPassword' => $password,
'terminalUUID' => ''
)
);
curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);
$token=json_decode($result,true)["result"]["token"];
var_dump($token);

Ich mache mal weiter. Wenn ich Fragen habe …

Dann passt das mit dem „params“ nicht, denke liegt am doppelten json_encode.


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://eu-wap.tplinkcloud.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'method'       => 'login',
    'params'       =>  [
        'appType'       => 'Kasa_Android',
        'cloudPassword'       => 'OUR PASSWORD HERE',
        'cloudUserName'       => 'OUR USER NAME HERE',
        'terminalUUID'        => 'YOUR JUST ACQUIRED UUID HERE',
    ]
]));
$result = curl_exec($ch); 

Kannst du es mal so probieren, würde gerne wissen ob es daran lag. :slight_smile:

Grüße,
Kai

Hab ich gemacht und es funktioniert. Bekomme das richtige Ergebnis zurück.

Ich bin auch schon einen Schritt weiter. Nächster Schritt war die Liste der Geräte. Das geht auch schonl.Bekomme ein großes Array mit allen Informationen zurück.

So, der Rumpf funktioniert. Inklusive ein und ausschlaten. Deviceist kann abgefragt werden, Status und Änderung Status. Mein Skript ist ein Anfang. Daher ist z.b. Device ID derzeit fix zum testen eingetragen und auch der neue Status.
Was mir damit vorschwebt ist

  • Neuerstellung von Variablen aufgrund der Gerteliste. Sollte ein neues hinzukommen, dann soll dafür eine neue Variable erstellt werden (ich glaube das geht)
    *Abfrage des Status für alle Geräte in regelmßigen Abständen.
  • und natürich das ein und Ausschalten.

hier mal mein Rumpfskript

<?php
$username="";
$password="";

//Token ermitteln
$url = 'https://eu-wap.tplinkcloud.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array (
'method' => 'login',
'params' => array (
'appType' => 'Kasa_Android',
'cloudUserName' => $username,
'cloudPassword' => $password,
'terminalUUID' => ''
)
);
curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);
$token=json_decode($result,true)["result"]["token"];
//var_dump($token);

//Geräteliste
/*
$url = 'https://eu-wap.tplinkcloud.com?token='.$token;
$devicelist="";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array (
'method' => 'getDeviceList'
);
curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);
$devicelist=json_decode($result,true)["result"]["deviceList"];
var_dump($devicelist);
*/

//Gerätestatus abfragen
/*$url = 'https://eu-wap.tplinkcloud.com?token='.$token;
$status="";
$deviceID = ""; /*die DeviceID ist im Array $devicelist enthalten*/
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array ( 'method' => 'passthrough',
"params" => array( "deviceId" => $deviceID,
"requestData" => json_encode(array("system" => array("get_sysinfo" => null,),))));

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);
//$status=json_decode($result,true)["result"]["deviceList"];
$result=json_decode(json_decode($result,true)["result"]["responseData"],true);
$status = $result["system"]["get_sysinfo"]["relay_state"];*/

//Ein- und Ausschalten
$url = 'https://eu-wap.tplinkcloud.com?token='.$token;
$deviceID = "";
$newStatus = 0;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array ( 'method' => 'passthrough',
"params" => array( "deviceId" => $deviceID,
"requestData" => "{\"system\":{\"set_relay_state\":{\"state\": $newStatus }}}" ) );

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);/' Man bekommt hier das Ergenis zurück, ob es erfolgreich war oder nicht*/

Kosmetische Unzulänglichkeiten bitte ich zu entschuldigen. Ich hab mir das alles zusammengesucht. Learning by doing :smiley:

Ich fürchte ich komme hier ohne ein eigenes Modul nicht weiter. Ich kann es drehen und wenden ich komme auf keinen grünen Zweig.
Wobei dafür geht eh schon viel.

Ein Skript für den Token

<?php

$username="";
$password="";

//Token ermitteln
$url = 'https://eu-wap.tplinkcloud.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array (
'method' => 'login',
'params' => array (
'appType' => 'Kasa_Android',
'cloudUserName' => $username,
'cloudPassword' => $password,
'terminalUUID' => ''
)
);
curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);
$token=json_decode($result,true)["result"]["token"];
setvalue(28026/*IPS Variable die den Wert von Token aufnimmt*/,$token);

Eines für die Geräteliste

<?php
//Token ermitteln
include(IPS_GetScriptFile(18209/*Skript für die Ermittlung des Tokens*/));

$url = 'https://eu-wap.tplinkcloud.com?token='.GetValue(28026/*Token*/);
$devicelist="";
$InsID=0;
$VarID=0;
$root=getvalue(37924/*ID der Kategorie wo die Instanzen erstellt werden sollen*/);
$GUIDDummy=getvalue(39342/*UID der Dummy Instanz*/);
if ($root>0 and $GUIDDummy != "") /*nur zur Sicherheit, sollten die Werte mal verloren gehen */
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    $content = array (
    'method' => 'getDeviceList'
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
    $result = curl_exec($ch);
    $devicelist=json_decode($result,true)["result"]["deviceList"];

    foreach ($devicelist as $device)
    {
        $instanceID=@IPS_GetInstanceIDByName($device["alias"]."-".$device["deviceMac"],$root); /*Prüfen ob die Instanz schon vorhanden ist*/
        if ($instanceID == false)
        {
            //Schalterinstanz
            $InsID = IPS_CreateInstance($GUIDDummy);
            IPS_SetName($InsID, $device["alias"]);
            IPS_SetParent($InsID, $root);

            //Schaltervariable
            $VarID = IPS_CreateVariable(0);
            IPS_SetName($VarID,$device["alias"]); 
            IPS_SetParent($VarID,$InsID); 
            IPS_SetVariableCustomProfile($VarID,"~Switch");

            //DeviceID Variable
            $VarID = IPS_CreateVariable(3);
            IPS_SetName($VarID,$device["alias"]."ID");
            IPS_SetParent($VarID,$InsID); 
            setvalue($VarID,$device["deviceId"]);
        }
    }
}

Ich dachte mir, ich leg für jeden Schalter eine Dummy Instanz mit zwei Variablen an. Eine für das Webfront zur Visualisierung und eine, die mir die DeviceID hält, da die Instanz ja keine Eigenschaften besitzt. Soweit funktioniert auch alles. Gott sei dank hatte ich ein Backup, weil ich mir beim Testen 100% meine Konfig zerschossen habe.
Also eine Warnung für die, die das verwenden: Extrem aufpassen.
Als nächstes hätte ich dann pro Schaltervariablen (bool) eine Aktion bei Änderung erstellt. das muss ich eh händisch machen, Wo ich aber ein Probelm sehe ist dann in dem Skript das mir den Schalter ein bzw. ausschaltet. Ich brauche in diesem Skritp irgendwie den Wert der DeviceID Variablen und genau aus der Instanz wo die Änderung passiert ist.
Dann hätten wir noch das Skript mit dem Statusupdate. Es müssten alle Instanzen durchgesucht werden nach der einen Variable damit ich die entsprechend setzen kann. Die Variablen werden ja z.b. durch die Alexa oder auch Zeitgesteuert verändert, und ich möchte diese Änderung natürich in IPS sehen.

Sollte jemand sachdienliche Hinweise haben, bitte gerne. Ich stehe im Moment an und hab keinen Plan wie eich das umsetzen sollte. Vorallem nicht mit den vorahndenen Bordmitteln, die ja umfangreich sind.

Für den Anfang ist nur mal wichtig das man mit einem Skript mit fest hinterlegter ID Daten abrufen und schalten kann. Der Rest ist das letztlich nur eine Sache das in das bestehende Modul einzubauen. Hier werden schließlich schon Instanzen angelegt. Das einzige was man da anpassen muss ist einen Auswahl schalter und das dann anders kommuniziert wird. Ich habe mir mal aus Spaß an der Freund eine neue HS100 bestellt, war gerade im Angebot. Die soll ja eine neue Firmware haben und daher nicht mehr so ohne weiteres mit dem jetzigen Modul funktionieren. ich werde mir das dann aber mal dank Deiner Recherche näher anschauen, wenn das grundsätzlich geht sollte das nicht so umständlich sein das in das existente Modul einzubauen.

Super, danke.
Ich mache trotzdem mal weiter, weil es mir Freude mache UND ich hab einen wesentlichen Durchbruch geschafft. Das Schalten mit einem einzigen Skript ohne Hardcodierung funktioniert

<?php
$DeviceID="";
$newStatus = 0;
$SchalterID=0;
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$SchalterID=$_IPS['VARIABLE'];
include(IPS_GetScriptFile(18209/*Skript für die Ermittlung des Tokens*/));

$Variablen=IPS_GetChildrenIDs(IPS_GetParent($SchalterID));
foreach ($Variablen as $Variable)
{
    if(IPS_GetVariable($Variable)["VariableType"]==3) $DeviceID=getvalue($Variable);
}
//Ein- und Ausschalten
$url = 'https://eu-wap.tplinkcloud.com?token='.$token;
if (getvalue($SchalterID)==true){
    $newStatus=1;
}
else
{
    $newStatus=0;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array ( 'method' => 'passthrough',
"params" => array( "deviceId" => $DeviceID,
"requestData" => "{\"system\":{\"set_relay_state\":{\"state\": $newStatus }}}" ) );

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);

//Gerätestatus abfragen
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$content = array ( 'method' => 'passthrough',
"params" => array( "deviceId" => $DeviceID,
"requestData" => json_encode(array("system" => array("get_sysinfo" => null,),))));

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Content-type: application/json"));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
$result = curl_exec($ch);
//$status=json_decode($result,true)["result"]["deviceList"];
$result=json_decode(json_decode($result,true)["result"]["responseData"],true);
setvalue($SchalterID,$result["system"]["get_sysinfo"]["relay_state"]==1);

Der wesentliche Teil ist ganz oben

SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$SchalterID=$_IPS['VARIABLE'];
include(IPS_GetScriptFile(18209/*Skript für die Ermittlung des Tokens*/));

$Variablen=IPS_GetChildrenIDs(IPS_GetParent($SchalterID));
foreach ($Variablen as $Variable)
{
    if(IPS_GetVariable($Variable)["VariableType"]==3) $DeviceID=getvalue($Variable);
}

Hier hol ich mir die ID der Variablen für die Device ID aufgrund des Perents der Schaltervariablen heraus. Die ID des Schalters liefert mir das Webfront. Der Rest ist Geschichte.

Ich bin soweit fertig. Ich werde im ersten Beitrag meine finale Version ablegen.
Benutzung auf eigene Gefahr :wink:

Mir ist hier ein Fehler passiert. Ich habe leider meine Zugangsdaten hier für meine Steckdosen gepostet. Ich wurde freundlicherweise darauf hingewiesen. Das Passwort ist in der zwischenzeit geändert. Wenn hier jemand meinen Code bitte kontrollieren ob hier noch meine Daten drinnen sind. Mich schmeißt es regelmäßig raus und ich muss den Alexa Skill neu anlernen.
Und sollte sich jemand damit einen Spaß erlauben, ich find das nicht lustig :mad:

Wie oft rufst du den denn Daten so ab bzw. aktualisierst Du die Daten? Da die API ja nicht offiziell dokumentiert ist kann es auch einfach sein das Du zu häufig anfragst und gegen ein API Limit läufst.

Ich nehme alles zuürck:D :banghead:
Ich war es selber. Ja, wie geht das?
Ich hab bei mir im Haus 4 TP-Link Accesspoints und OC200 Controller mit Coud Zugrif…kligelts irgendwo?
Ich hab mein Kennwort für Kasa geändert. Alles gut. Ich wollte von außen auf meinen OC200 - geht nicht. Probiert, geht nicht. Also Passwort geändert. Dann, keine Steckdosen. Fix, geht wieder nicht. Also Passwort wieder geändert. Steckdosen funktioniert, Coudzugriff auf mein WLAN nicht…
Bis ich dann in der Omada Cloud Anmeldung das Passwort für die Steckdosen probiert hab…das geht :D. Die müssen das irgendwann zusammengelegt haben. Ich bin mir sicher, das waren zwei unterschiedliche Accounts oder ich konnte mich daran nicht mehr erinnern. Jedenfalls ist der Account für die Omada Cloud ident wie für die Steckdosen bzw. Kasa.

Ansonsten läuft das Cloud-Schaltern perfekt. Der Status wird alle 20 Sekunden aufgerufen. Mal schauen ob es da ein Limit gibt.

Hallo hfichtinger,

Habe Heute meine Dosen bekommen und möchte Deine Scipte mal ausprobieren. Das Token auslesen hat sofort geklappt, aber beim anlegen der Geräte bekomme ich immer eine Fehlermeldung beim auslesen der Kategorie.
$root=getvalue(16480);/ID der Kategorie wo die Instanzen erstellt werden sollen/

Die Kategorie ist aber vorhanden, ist es egal wo die Kategorie liegt ?

Die ID muss natürlich zu deiner passen. In der Variable steht die ID der Kategorie unter der die Geräte angelegt werden sollen. Du könntest root auch direkt mit der ID der Kategorie versorgen.

Danke für die schnelle Antwort, muss ich die Variable mit der ID selber erstellen? Ich dachte ich lege eine Kategorie an.
Wie ist eigentlich die Reihenfolge der Abarbeitung der Scripte? Und welche Variablen muss ich händisch eingeben.