Ankündigung

Einklappen
Keine Ankündigung bisher.

Home-Connect | 2nd

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • jonofe
    antwortet
    Mein Punkt war, dass du den Code im LBS nicht benötigst wenn du in der hc.php schon das refresh token generierst.

    Das würde die Funktion im LBS geringer halten und bei neuem Scope wird das hc.php ohnehin wieder ausgeführt. Der LBS brauchte effektiv nur das refresh token.

    Man kann sogar das hc.php in den EXEC Bereich integrieren, dann wäre es insgesamt nur eine Datei

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    OK, ich beantworte mir die Frage selbst - in der Hoffnung, dass ich nichts elementares vergessen habe und oder falsch gemacht habe ...

    Ich habe die hc.php um drei Zeilen Code ergänzt:

    PHP-Code:
        $json 'code.json';
        
    $tokens = array('code' => $code);
        
    file_put_contents($jsonjson_encode($tokens)); 
    HTML-Code:
    <!DOCTYPE html>
    <html>
    <head>
        <title>REDIRECT</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <link rel="stylesheet" type="text/css" href="hc.css" />
    </head>
    <body>
    
    <?php
        $code        = $_GET['code'];
        $grant_type = $_GET['grant_type'];
        $state        = $_GET['state'];
        $remote        = $_SERVER['REMOTE_ADDR'];
        $name        = $_SERVER['SERVER_NAME'];
        $self        = $_SERVER['PHP_SELF'];
        $host        = $_SERVER['HTTP_HOST'];
        $session    = 'offen';
    
    
        $json = 'code.json';
        $tokens = array('code' => $code);
        file_put_contents($json, json_encode($tokens));                    
    ?>
    
    <center>
    <table>
        <thead>
            <tr>
                <th>key</th>
                <th>value</th>
            </tr>
        </thead>
    
        <tbody>
            <tr>
                <td>code</td>
                <td><?php echo "$code"?></td>
            </tr>
            <tr>
                <td>grant</td>
                <td><?php echo "$grant_type"?></td>
            </tr>
            <tr>
                <td>state</td>
                <td><?php echo "$state"?></td>
            </tr>
            <tr>
                <td>remote</td>
                <td><?php echo "$remote"?></td>
            </tr>
            </tr>
            <tr>
                <td>redirect</td>
                <td><?php echo "$name"."$self"?></td>
            </tr>
            <tr>
                <td>self</td>
                <td><?php echo "$self"?></td>
            </tr>
            <tr>
                <td>host</td>
                <td><?php echo "$host"?></td>
            </tr>
            <tr>
                <td><?php echo "$session"?></td>
                <td>SESSION state ist gleich GET state</td>
            </tr>
        </tbody>
        
        <tfoot>
        </tfoot>
    </table>
    </center>
    
    </body>
    </html>

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Ich vermute, wir sprechen aneinander vorbei ...

    Zumindest in HC ... Wenn ich mich das erste Mal mit der API verbinde (oder wenn sich - warum auch immer - der SCOPE ändert), muss ich mich als CLIENT autorisieren (Request) ... dazu brauch ich "nur" den API-KEY.
    Code:
    https://api.home-connect.com/security/oauth/authorize?client_id=[COLOR=#FF0000]{API-KEY}[/COLOR]&redirect_uri=http://10.0.10.3/visu/hc.php&response_type=code&scope=IdentifyAppliance%20Dishwasher&state=homeconnect_auth
    Als Antwort, nach der Freigabe des Zugriffs und des SCOPEs durch den User, erhalte ich den CODE ... als Autorisation-Antwort (Response) ...
    Code:
    <redirect_uri>?code={[COLOR=#FF0000]code[/COLOR]}&grant_type=authorization_code
    Mit diesem CODE kann ich mich dann zum ersten Mal (oder wenn der Code aufgrund eines neuen SCOPEs erneuert wird) authentifizieren ... Request for ACCESS- und REFRESH-token.
    Code:
     
    https://api.home-connect.com/security/oauth/token/client_id={client_id}&client_secret={client_secret}&redirect_uri={redirect_uri}&grant_type=authorization_code&code={[COLOR=#FF0000]code[/COLOR]}
    Als Response erhalte ich den ersten ACCESS- und REFRESH-token ...
    Code:
    { "id_token": "{id_token}", "[COLOR=#FF0000]access_token[/COLOR]": "{access_token}", "expires_in": 86400, "scope": "{scope}", "refresh_token": "{[COLOR=#FF0000]refresh_token[/COLOR]}", "token_type": "Bearer", "state": "{state}" }
    Danach wie Du es oben beschrieben hast - alle 24h den ACCESS- (und REFRESH-) Token mit dem REFRESH-token erneuern ...

    Und mir geht es darum, wie kann ich den CODE, nicht die anderen zwei Token, automatisch aus der redirect_uri in meinen LBS übernehmen ?
    Ich vermute nicht allzu schwer, aber mir fehlt derzeit irgendwie die Phantasie ...

    DANKE vorab !!

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Zitat von coliflower Beitrag anzeigen
    Und genau diesen Code möchte ich automatisch in den LBS übernehmen ...
    Und genau das brauchst du nicht. Denn du brauchst nur den Refresh_Token. Damit kannst du immer einen neuen Access_Token generieren, falls dieser abgelaufen ist. Du solltest beim ersten Aufruf der Callback URI durch HomeConnect, direkt das Access&Refresh Token mit dem empfangenen Code anfragen und das Refreshtoken dann in eine Datei speichern. Mehr brauchst du dann für den LBS nicht. Im LBS generierst du dann mit dem Refreshtoken ein AccessToken. Und wenn bei der Nutzung des AccessTokens ein 401 zurückkommt, dann musst du es refreshen und den Befehl wiederholen.

    Zuletzt geändert von jonofe; 02.11.2018, 16:10.

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Das o.g. Statement generiert eine php-Datei, die du später in deinem LBS includen kannst. Damit kannst du die Token remanent ablegen und sie bleiben auch über einen Neustart hinaus erhalten.
    OK, das passiert bei mir eh in der KLASSE ...

    Eigentlich brauchst du aber nach der Autorisierung durch den Nutzer nur noch das Refresh-Token.
    Grundsätzlich ja aber ... nach der Autorisierung bekommt der HC Client (LBS) den Code auf das redirect_uri und erst mit diesem Code erhält der Client (User) den Access- und Refresh-Token.
    Und genau diesen Code möchte ich automatisch in den LBS übernehmen ...

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Das o.g. Statement generiert eine php-Datei, die du später in deinem LBS includen kannst. Damit kannst du die Token remanent ablegen und sie bleiben auch über einen Neustart hinaus erhalten. Eigentlich brauchst du aber nach der Autorisierung durch den Nutzer nur noch das Refresh-Token. Beim Neustart von EDOMI holst du damit einfach ein neues Access Token. Mehr brauch man eigentlich nicht. Client Key (API-Key) und Client Secret sind ja an den Eingängen vorhanden.

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    jonofe Hallo André,

    bezugnehmend auf deine Antwort hier ...
    https://knx-user-forum.de/forum/proj...38#post1282538

    insbesondere dieser Punkt ...
    Code:
    file_put_contents('/usr/local/edomi/www/admin/include/php/alexa/eventGatewayConfig.php', '<?php $acceptGrantCode=' . var_export($acceptGrantCode, true) . ';');

    ... zwei Fragen.

    a) Speicherst Du die Tokens in einer PHP-Datei (Array) ? Dann sind diese Werte bei Edomi-Neustart nicht mehr verfügbar - oder übersehe ich hier etwas ?
    Ich habe mir gedacht, diese Tokens in eine JSON zu speichern, damit diese den Neustart überlebt ...

    b) Nach der Authentifizierung mit dem API_key und CLIENT_secret (Link), kommt als Rückgabewert grundsätzlich der CODE auf die vorher (statisch) definierte Redirect_URI (bei mir Edomi-WebServer ... /usr/local/edomi/www/visu/hc.php).

    Um den User nicht unnötig mit weiteren Interaktionen zu "belästigen", wie den Code aus der URI heraus zu kopieren und im LBS einzufügen (Fehlerquelle / Supportaufwand), würde ich gerne - wenn das geht - in der hc.php ein paar Zeilen Code einfügen, die mir hier ...
    Code:
    require_once(dirname(__FILE__).'/../../../../main/include/php/HOME-CONNECT-API-PHP/scr/HomeConnect/[B]code.json[/B]
    ... den CODE speichert.
    Im LBS selbst (Daemon), wenn dieser getriggert wird (zB Neustart), den vorhandenen $code (in permanenter Variable gespeichert) mit dem "neuen" CODE in der JSON vergleichen und wenn dieser Wert ungleich ist, den "alten Wert" mit dem Wert der JSON überschreiben.

    Die eigentliche Frage(n) ist, geht das, hast Du das irgendwie ähnlich umgesetzt, wie kann ich das in der hc.php umsetzen, kannst Du mir mit Codezeilen aushelfen, da ich hier (bewusst) noch nie etwas gemacht habe ?

    Vielen DANKvorab !
    Dariusz

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Zitat von coliflower Beitrag anzeigen
    $status ... a:1:{s:4:"data";a:1:{s:6:"status";a:4:{i:0;a:2:{s: 3:"key";s:27:"BSH.Common.Status.DoorState";s:5:" va lue";s:34:"BSH.Common.EnumType.DoorState.Open";}i:1;a:2:{s:3:"key";s:32:"BSH.Common.Status. Oper ationState";s:5:"value";s:43:"BSH.Common.EnumType.OperationState.Inactive";}i:2;a:2:{s:3:"key";s:37:"BSH.Common.Status.RemoteControlActive";s:5:"value";b:1;}i:3;a:2:{s:3:"key";s:43:"BSH.Common.Status.RemoteControlStartAllowed";s:5:"value";b:0;}}}}
    Nun hat sich auch die (extra) Abfrage BSH.Common.Setting.PowerState dazu gesellt, auch das EIN-/AUS-schalten ist nunmehr auch möglich ...
    Wenn dann auch noch das Setzen (Lesen) der Programme/Optionen fertig umgesetzt wird, dann ist der 71er LBS grob fertig ...

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Zitat von coliflower Beitrag anzeigen
    Wird kommen - ich muss mir noch die Funktion fertig basteln die die aktuelle Statusabfrage macht und die Werte auf die Ausgänge aufdröselt ;-)
    Der erste Test zeigt, bei ausgeschaltetem GS werden nachfolgende Werte zurückgegeben (alle die die API hergibt) - diese Abfrage wird zukünftig / einmalig im 71er ausgeführt (nachdem der 70er LBS gestartet und abgearbeitet wurde ...)

    $status ... a:1:{s:4:"data";a:1:{s:6:"status";a:4:{i:0;a:2:{s: 3:"key";s:27:"BSH.Common.Status.DoorState";s:5:"va lue";s:34:"BSH.Common.EnumType.DoorState.Open";}i:1;a:2:{s:3:"key";s:32:"BSH.Common.Status.Oper ationState";s:5:"value";s:43:"BSH.Common.EnumType.OperationState.Inactive";}i:2;a:2:{s:3:"key";s:37:"BSH.Common.Status.RemoteControlActive";s:5:"value";b:1;}i:3;a:2:{s:3:"key";s:43:"BSH.Common.Status.RemoteControlStartAllowed";s:5:"value";b:0;}}}}

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Steht auch unter " " ...

    Somit eher, sobald der neue Wert zwischen der Appliance bei dir zuhause und dem Endpoint (HC-Server) upgedated wird, wird der neue Wert an den SSE-Server (bei HC) übermittelt, danach wird dieser Wert über die API von EDOMI übernommen.

    Verzögerungen durch das Internet, Bandbreite/-auslastung, HC "Eigenheiten"/Einstellungen und dem PHP Code im 70er LBS, muss man in Kauf nehmen - kann ich nicht ändern, außer jemand kann das WLAN sniffen, entschlüsseln und die Daten zur Verfügung stellen, dann ist die Limitation "nur" in eigenem LAN zu suchen :-)

    Bin aber für jede Vorschläge dankbar !!

    Zitat von Bernator Beitrag anzeigen
    "sofort" wäre bei der Restlaufzeit ja jede Sekunde, was bei mir aber definitiv nicht jede Sekunde geupdated wird?
    Ich habe das Update-Intervall mit alle 1% Progress beobachtet ...

    Einen Kommentar schreiben:


  • Bernator
    antwortet
    "sofort" wäre bei der Restlaufzeit ja jede Sekunde, was bei mir aber definitiv nicht jede Sekunde geupdated wird?

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Zitat von Bernator Beitrag anzeigen
    ganz einfach wie von mir oben beschrieben das [$i] anstatt wie bisher [0] als array index angeben, schaus dir an das ises logisch was ich mein
    Oups, sorry, dachte ohne in den Code zu schauen, dass am $i etwas falsch ist (dachte eh dass da $i steht) - DANKE für den Hinweis.

    v0.2.01 released ... ungetestet

    Zitat von Bernator Beitrag anzeigen
    Aja das update intervall ist fix oder lässt sich das beeinflussen? Da es sich aber um events von HC handelt nehme ich an das dies nicht beeinflussbar ist?
    Wenn der GS nicht läuft, dann gibt es seitens SSE alle 1:50 Minuten ein Keep-Alive, ansonsten "sofort" wenn es eine Wertänderung gibt, zB Power ON, Start, Programmänderung am GS, etc.
    Somit nein, aus meiner Sicht nicht beeinflussbar (außer wie geplant und gewünscht eine Statusabfrage nach Edomi Start).
    Zuletzt geändert von coliflower; 28.10.2018, 19:10.

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Zitat von ak68 Beitrag anzeigen
    - kein Ausgangswert von A4 (A5 funktioniert korrekt !)
    Wenn der GS bereits läuft, dann gibt es keine Wertänderung am A4, wenn der GS in Power-ON ist, dann wird schon was angezeigt - bei mir funktioniert es.

    Zitat von ak68 Beitrag anzeigen
    - keine Ausgangswerte von A12 + A13 (Wasser/ Energievorhersagen)
    HC liefert diese Werte via API noch (wieder) nicht - warum auch immer ...

    Zitat von ak68 Beitrag anzeigen
    - keine Ausgangswerte von A15 - A20 (hier wäre z.B. "0" sinnvoll, wenn keine dieser Optionen aktiviert sind)
    A15 liefert bei mir ab ...
    A16 bis A20 könnten 0 liefern wenn es Sinn macht ... Was meinen die anderen ?

    Zitat von ak68 Beitrag anzeigen
    Evtl. wäre bei allen Ausgängen die Ausgabe von z.B. N/A sinnvoll, wenn keine aktuellen Werte vorliegen, sprich "leer" sind (einfacher für die Visu).

    Wunsch (wie schon von Dir erwähnt), nach Neustart ALLE Werte abzufragen.
    Wird kommen - ich muss mir noch die Funktion fertig bastel die Statusabfrage macht und die Wert auf die Ausgänge aufdröselt ;-)

    Einen Kommentar schreiben:


  • Bernator
    antwortet
    Zitat von coliflower Beitrag anzeigen
    as mit dem Array muss ich mir dann anschauen - oder hast du schon einen Vorschlag :-) ?
    ganz einfach wie von mir oben beschrieben das [$i] anstatt wie bisher [0] als array index angeben, schaus dir an das ises logisch was ich mein

    Zitat von coliflower Beitrag anzeigen
    Der SEE ist EVENT basierend
    OK dann ist das Verhalten plausibel und nicht nur bei mir so, alle Werte bei Start einmal abzufragen wäre natürlich spitze

    Aja das update intervall ist fix oder lässt sich das beeinflussen? Da es sich aber um events von HC handelt nehme ich an das dies nicht beeinflussbar ist?
    Zuletzt geändert von Bernator; 28.10.2018, 13:32.

    Einen Kommentar schreiben:


  • ak68
    antwortet
    Erst einmal vielen Dank für die super LBS´en, die schon recht gut funktionieren.

    Folgende Probleme treten bei mir noch auf beim LBS x71:
    - kein Ausgangswert von A4 (A5 funktioniert korrekt !)
    - keine Ausgangswerte von A12 + A13 (Wasser/ Energievorhersagen)
    - keine Ausgangswerte von A15 - A20 (hier wäre z.B. "0" sinnvoll, wenn keine dieser Optionen aktiviert sind)

    Evtl. wäre bei allen Ausgängen die Ausgabe von z.B. N/A sinnvoll, wenn keine aktuellen Werte vorliegen, sprich "leer" sind (einfacher für die Visu).

    Wunsch (wie schon von Dir erwähnt), nach Neustart ALLE Werte abzufragen.

    Einen Kommentar schreiben:

Lädt...
X