+ Antworten
Seite 2 von 2 ErsteErste 1 2
Ergebnis 11 bis 17 von 17
  1. #11
    Registriert seit
    Jun 2020
    Ort
    Wachau, Österreich
    Beiträge
    207

    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-Code:
    <?php

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

    //Token ermitteln
    $url 'https://eu-wap.tplinkcloud.com';
    $ch curl_init();
    curl_setopt($chCURLOPT_URL$url);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_POSTtrue);
    $content = array (
    'method' => 'login',
    'params' => array (
    'appType' => 'Kasa_Android',
    'cloudUserName' => $username,
    'cloudPassword' => $password,
    'terminalUUID' => ''
    )
    );
    curl_setopt($chCURLOPT_HTTPHEADER,array("Content-type: application/json"));
    curl_setopt($chCURLOPT_POSTFIELDSjson_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-Code:
    <?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>and $GUIDDummy != ""/*nur zur Sicherheit, sollten die Werte mal verloren gehen */
    {
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_POSTtrue);
        
    $content = array (
        
    'method' => 'getDeviceList'
        
    );
        
    curl_setopt($chCURLOPT_HTTPHEADER,array("Content-type: application/json"));
        
    curl_setopt($chCURLOPT_POSTFIELDSjson_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.
    Geändert von hfichtinger (26.07.20 um 12:05 Uhr)

  2. #12
    Registriert seit
    Oct 2011
    Ort
    Hattersheim (Hessen)
    Beiträge
    7,415

    Zitat Zitat von hfichtinger Beitrag anzeigen
    Sollte jemand sachdienliche Hinweise haben, bitte gerne. Ich stehe im Moment an und hab keinen Plan wie eich das umsetzen sollte.
    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.

  3. #13
    Registriert seit
    Jun 2020
    Ort
    Wachau, Österreich
    Beiträge
    207

    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-Code:
    <?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($chCURLOPT_URL$url);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_POSTtrue);
    $content = array ( 'method' => 'passthrough',
    "params" => array( "deviceId" => $DeviceID,
    "requestData" => "{\"system\":{\"set_relay_state\":{\"state\": $newStatus }}}" ) );

    curl_setopt($chCURLOPT_HTTPHEADER,array("Content-type: application/json"));
    curl_setopt($chCURLOPT_POSTFIELDSjson_encode($content));
    $result curl_exec($ch);

    //Gerätestatus abfragen
    $ch curl_init();
    curl_setopt($chCURLOPT_URL$url);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_POSTtrue);
    $content = array ( 'method' => 'passthrough',
    "params" => array( "deviceId" => $DeviceID,
    "requestData" => json_encode(array("system" => array("get_sysinfo" => null,),))));

    curl_setopt($chCURLOPT_HTTPHEADER,array("Content-type: application/json"));
    curl_setopt($chCURLOPT_POSTFIELDSjson_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

    PHP-Code:
    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.

  4. #14
    Registriert seit
    Jun 2020
    Ort
    Wachau, Österreich
    Beiträge
    207

    Ich bin soweit fertig. Ich werde im ersten Beitrag meine finale Version ablegen.
    Benutzung auf eigene Gefahr ;-)

  5. #15
    Registriert seit
    Jun 2020
    Ort
    Wachau, Österreich
    Beiträge
    207

    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

  6. #16
    Registriert seit
    Oct 2011
    Ort
    Hattersheim (Hessen)
    Beiträge
    7,415

    Zitat Zitat von hfichtinger Beitrag anzeigen
    Mich schmeißt es regelmäßig raus und ich muss den Alexa Skill neu anlernen.
    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.

  7. #17
    Registriert seit
    Jun 2020
    Ort
    Wachau, Österreich
    Beiträge
    207

    Zitat Zitat von Fonzo Beitrag anzeigen
    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
    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 . 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.

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 12.07.20, 10:21
  2. Befehle TP-Link HS100
    Von hfichtinger im Forum Skripte, PHP, SQL
    Antworten: 4
    Letzter Beitrag: 29.06.20, 13:43
  3. Antworten: 34
    Letzter Beitrag: 17.03.20, 15:48
  4. ESP8266 Geräte und die Cloud
    Von tomgr im Forum Bastel-Ecke
    Antworten: 18
    Letzter Beitrag: 29.01.19, 09:30
  5. Automatisches IPS Backup in die Cloud (copy.com)
    Von drapple im Forum Allgemeine Diskussion
    Antworten: 13
    Letzter Beitrag: 31.12.15, 12:13