Ankündigung

Einklappen
Keine Ankündigung bisher.

Redirect_URL | OAuth2 | Edomi

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

    #16


    Das werde ich wohl nie schaffen …

    Was läuft falsch wenn wenn ich die hc.php die am Webserver abgelegt ist aufrufe „http://10.0.100.150/hc.php“ und dann nur folgendes im Browser sehe (der Code in Post #14) ?


    Bildschirmfoto 2016-11-20 um 14.20.09.png


    Hier ohne das HTML Zeug ...

    Bildschirmfoto 2016-11-20 um 14.26.52.png
    Zuletzt geändert von coliflower; 20.11.2016, 14:27.
    Danke und LG, Dariusz
    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

    Kommentar


      #17
      Hier steht eigentlich alles was du brauchst, inkl. Beispiele:

      http://hayageek.com/php-curl-post-get/

      Musst nur vorher php-curl installieren.

      Code:
       
       yum install php-curl

      Kommentar


        #18
        Dein Code ist schon fast richtig, aber statt <?php nimm' mal nur <?

        Und das <br> am Ende einer Zeile gehört da nicht hin...
        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

        Kommentar


          #19
          gaert

          Das <br> ist schon weg, war noch ein altes Bild :-)
          auch mit <? erscheint im Browser nur der Code selbst :-(

          Als müsste irgendwo der Apache am MacBook „konfiguriert werden ….?
          Danke und LG, Dariusz
          GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

          Kommentar


            #20
            Ahso... Das Script läuft nicht im EDOMI-Kontext?! Dann musst Du natürlich Apache entsprechend konfigurieren... (und PHP)
            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

            Kommentar


              #21
              Ahso … Wenn ich die hc.php irgendwo in EDOMI-Kontext kopieren könnte, dann wäre das noch besser :-)
              Wohin müsst die Datei kopiert werden ?
              DANKE !
              Danke und LG, Dariusz
              GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

              Kommentar


                #22
                Davon bin ich die ganze Zeit ausgegangen - schließlich soll Dein Script ja irgendwann mit EDOMI sprechen...

                Im Prinzip kann die PHP-Datei irgendwo unter /usr/local/edomi/www liegen, allerdings könnte diese u.U. bei einem Update oder Projektaktivierung gelöscht werden. Für's Erste kannst Du die Datei ja z.B. in www/admin ablegen (oder www/visu) und in Ruhe experimentieren.
                EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                Kommentar


                  #23
                  i werd narrisch … es geht - die ganze Zeit war es nur das „depperte“ hc.php Skript weil es nicht unter Edomi lief ...

                  Es Geht sowohl mit:

                  PHP-Code:
                      $url_authorize    'https://developer.home-connect.com/security/oauth/authorize?response_type=code&redirect_uri='.$rURL.'&client_id='.$E[1]['value'].'&scope='.$scope.'&state=homeconnect_auth';
                      
                  $ctxx            stream_context_create(array('http' => array('timeout' => 3'method' => 'GET')));
                      
                  $authorize        file_get_contents($url_authorizefalse$ctxx);

                      if (isset(
                  $authorize)) {
                          
                  LB_LBSID_Debug($id'Home-Connect | '.$haid.' | '.$E[8]['value'].' | $authorize = '.$authorize6$E[9]['value'], false);
                      }
                      else {
                          
                  LB_LBSID_Debug($id'Home-Connect | '.$haid.' | '.$E[8]['value'].' | $authorize not set .... '3$E[9]['value'], true);
                      } 


                  wie auch mit:

                  PHP-Code:
                      $ch curl_init();
                      
                  curl_setopt($chCURLOPT_URL$url_authorize);
                      
                  curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
                      
                  curl_setopt($ch,CURLOPT_FOLLOWLOCATIONtrue);
                      
                  $output curl_exec($ch);
                      
                  curl_close($ch);

                      
                  LB_LBSID_Debug($id'Home-Connect | '.$haid.' | '.$E[8]['value'].' | $ch = '.$ch6$E[9]['value'], false);
                      
                  LB_LBSID_Debug($id'Home-Connect | '.$haid.' | '.$E[8]['value'].' | $output = '.$output6$E[9]['value'], false); 


                  DANKE !!!!


                  Kann man noch sagen dass die eine oder andere Lösung die bessere / elegantere ist ?
                  Insbesondere wenn man vorher die Verbindung zu Home-Connect prüfen möchte (nicht dass der Code läuft obwohl der Server nicht verfügbar ist) …. ?
                  Danke und LG, Dariusz
                  GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                  Kommentar


                    #24
                    Nach meiner Erfahrung unterstützt curl deutlich mehr Optionen und ist deutlich schneller. Ersteres ist vernachlässigbar, wenn du diese Optionen nicht benötigst.

                    Zweites kannst du testen mit

                    Code:
                    time php <skriptname.php>
                    Für jedes Skript aufrufen und Ergebnisse vergleichen.

                    Kommentar


                      #25
                      Danke André !

                      Mehr Optionen benötige ich - so wie es aussieht nicht aber schnell ist fast nie schlecht :-)

                      Eine Frage habe ich noch zum Output in LOG bzw. der gespeicherten Werte in der Variable ...

                      In CUSTOMLOG habe ich das Ergebnis, den CODE = yyyyyyyy + authorization_code in einem String = yyyyyyyyyyauthorization_code … kann man das irgendwie elegant wieder trennen um es a.) im Log leserlich darstellen zu können und b.) damit ich beide Werte in getrennte Variablen speichern kann, damit ich diese in der darauf folgenden POST-Abfrage verwenden kann um den Access-Token von Home-Connect zu erhalten ?

                      Nochmals DANKE !!
                      Danke und LG, Dariusz
                      GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                      Kommentar


                        #26
                        Hallo Dariusz,

                        du suchst wahrscheinlich die PHP Funktion "substr": http://php.net/manual/de/function.substr.php
                        Damit kannst du feste Positionen aus dem String "heraus schneiden".

                        Wenn es ein definiertes Trennzeichen gibt, kannst du auch split() verwenden.

                        Kommentar


                          #27
                          Hallo DerSeppel,

                          danke für den Hinweis, das muss ich noch prüfen ob der „Code“ immer die gleiche Länge hat, denke aber schon.
                          Werde mal schauen und testen :-)

                          Danke und LG, Dariusz
                          GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                          Kommentar


                            #28
                            Hallo an die cURL Spezialisten :-)

                            Ich hänge wieder mal … Ich erhalte, wenn ich bestimmte „Einstellungen“ am Geschirrspüler vornehmen möchte, eine Fehlermeldung: Method not allowed.

                            Wenn ich mich Authentifiziere, keine Problem (GET),
                            wenn ich mir den Access-Token „hole“, kein Problem (POST),
                            wenn ich mir die Statusinformationen „hole“, auch kein Problem (GET).

                            Um zB: Einstellungen and den Geschirrspüler zu übertragen, wie oben erwähnt, muss ich die PUT Methode verwenden.

                            Hier einmal wie die cURL (Terminal) aufgebaut ist:

                            Code:
                            curl -X PUT --header 'Content-Type: application/vnd.bsh.sdk.v1+json' --header 'Accept: application/vnd.bsh.sdk.v1+json' --header 'Authorization: Bearer [COLOR=#0000FF]API-Key-XXX[/COLOR]' -d '{
                              "data": {
                                "key": "BSH.Common.Setting.PowerState",
                                "value": "BSH.Common.EnumType.PowerState.On"
                              }
                            }' 'https://api.home-connect.com/api/homeappliances/SIEMENS-SX578S06TE-68A40E0021F0/settings/BSH.Common.Setting.PowerState'


                            Send:
                            Body = {"data": {"key": "BSH.Common.Setting.PowerState","value": "BSH.Common.EnumType.PowerState.On"}}

                            Response:
                            Response Body = no content
                            Response Code = 204
                            Response Headers = {"content-type": "application/vnd.bsh.sdk.v1+json"}​​​​​


                            Hier die Funktion:

                            PHP-Code:
                                public static $CURL_OPTS = array
                                (
                                    
                            CURLOPT_CONNECTTIMEOUT => 10,
                                    
                            CURLOPT_RETURNTRANSFER => true,
                                    
                            CURLOPT_HEADER         => true,
                                    
                            CURLOPT_TIMEOUT        => 60,
                                    
                            CURLOPT_USERAGENT      => 'homeconnectclient',
                                    
                            CURLOPT_SSL_VERIFYPEER => true,
                                    
                            CURLOPT_HTTPHEADER     => array()
                                );

                                public function 
                            makeRequest($path$method 'GET'$params = array(), $body NULL
                                {       
                            //    $params = URL-args/-parameter für den Zugriff
                                    
                            $ch curl_init();
                                    
                            $options self::$CURL_OPTS;

                                    if (
                            $params) {
                                        if (isset(
                            $params['access_token'])) {
                                            
                            $options[CURLOPT_HTTPHEADER][] = 'Accept: application/vnd.bsh.sdk.v1+json';
                                            
                            $options[CURLOPT_HTTPHEADER][] = 'Authorization: Bearer '.$params['access_token'];
                                            unset(
                            $params['access_token']);
                                        }
                                        switch (
                            $method)
                                        {
                                            case 
                            'GET':  //    API-call via GET + AUTHENTIFICATION beim Endpoint
                                                
                            $path .= '?'.http_build_query($paramsnull'&');
                                            break;

                                            case 
                            'POST':  //    API-call via POST
                                                
                            if ($this->getVariable('file_upload_support')) {  //    Access-Token aus Code + Refresh
                                                    
                            $options[CURLOPT_POSTFIELDS] = $params;
                                                }
                                                else {
                                                    
                            $options[CURLOPT_HTTPHEADER][] = 'Content-Type: application/x-www-form-urlencoded';
                                                    
                            $options[CURLOPT_POSTFIELDS] = http_build_query($paramsnull'&');
                                                }
                                            break;

                                            case 
                            'PUT':  //    API-call via PUT
                                                
                            if ($this->getVariable('file_upload_support')) {  //    Settings + Progams
                                                    
                            $options[CURLOPT_POSTFIELDS] = $params;
                                                }
                                                else {
                                                    
                            $options[CURLOPT_HTTPHEADER][] = 'Content-Type: application/vnd.bsh.sdk.v1+json';
                                                    
                            $options[CURLOPT_POSTFIELDS] = $body;
                                                }
                                            break;
                                        }
                                    }
                                    
                            $options[CURLOPT_URL] = $path;

                                    if (isset(
                            $options[CURLOPT_HTTPHEADER])) {   // Disable the 'Expect: 100-continue' behaviour. This causes CURL to wait
                                        
                            $existing_headers $options[CURLOPT_HTTPHEADER]; // for 2 seconds if the server does not support this header.
                                        
                            $existing_headers[] = 'Expect:';
                                        
                            $ip $this->getVariable('ip');     // in $config['ip'] gespeichert
                                        
                            if ($ip)
                                            
                            $existing_headers[] = 'CLIENT_IP: '.$ip;
                                        
                            $options[CURLOPT_HTTPHEADER] = $existing_headers;
                                    }
                                    else {
                                        
                            $options[CURLOPT_HTTPHEADER] = array('Expect:');
                                    }
                                    
                            curl_setopt_array($ch$options);   // um viele curl_setopt() zu vermeiden ...
                                    
                            $result curl_exec($ch);
                                    
                            $errno curl_errno($ch);

                                    if (
                            $errno == 60 || $errno == 77)   // CURLE_SSL_CACERT || CURLE_SSL_CACERT_BADFILE
                                    
                            {
                                        
                            curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
                                        
                            $result curl_exec($ch);
                                    }
                                    if (
                            $result === false) {
                                        
                            $e = new HcCurlErrorType(curl_errno($ch), curl_error($ch));
                                        
                            curl_close($ch);
                                        throw 
                            $e;
                                    }
                                    
                            curl_close($ch);


                                                                                                            
                            // PHP5, Zuweisung der Werte von RECHTS beginnend ... PHP7 von LINKS    
                                    
                            list($headers$body) = explode("\r\n\r\n"$result);                    // Zuordnung der Daten zu $headers und zu $body bei 0 beginnend ...
                                        
                            $headers explode("\r\n"$headers);                                // Zuordnung der Daten in $headers zur "Position" in $headers
                                                                                                            // explode(delimeter, string) ...
                                    
                            if (strpos($headers[0], 'HTTP/1.1 2') !== false) {                        // Nur 2xx Codes werden als Antwort/Erfolg gewertet
                                        
                            $decode json_decode($bodytrue);                                    // /r = carriage return, /n = newline
                                                                                                            // /r/n = for Windows, /r = Unix/Linux/OSX
                                        
                            if (!$decode) {
                                            if (
                            preg_match('/^HTTP\/1.1 ([0-9]{3,3}) (.*)$/'$headers[0], $matches))
                                            {
                                                throw new 
                            HcJsonErrorType($matches[1], $matches[2]); // [1] = passt auf 1. eingeklamertes Ergebnis, 
                                            
                            }
                                            else throw new 
                            HcJsonErrorType(200'OK');
                                        }
                                        return 
                            $decode;
                                    }
                                    else {
                                        if (!
                            preg_match('/^HTTP\/1.1 ([0-9]{3,3}) (.*)$/'$headers[0], $matches)) {
                                            
                            $matches = array(""400'bad request');
                                        }
                                        
                            $decode json_decode($bodytrue);

                                        if (!
                            $decode) {
                                            throw new 
                            HcApiErrorType($matches[1], $matches[2], null);
                                        }
                                        throw new 
                            HcApiErrorType($matches[1], $matches[2], $decode);
                                    }
                                } 

                            Ich weiß echt nicht weiter
                            Würde mich über jeden Hinweis sehr freuen


                            DANKE
                            Danke und LG, Dariusz
                            GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                            Kommentar


                              #29
                              Hi,

                              hier noch eine kleine Ergänzung - wenn ich den ‚case/put‘ Bereich folgend ändere dann erhalte ich die Meldung „Conflict“ anstatt „Method not allowed".
                              PHP-Code:
                                              case 'PUT'
                                                  
                              $options[CURLOPT_HTTPHEADER][] = 'Content-Type: application/vnd.bsh.sdk.v1+json';
                                                  
                              $options[CURLOPT_HTTPHEADER][] = 'Content-Length: '.strlen($put_body);

                              //                     $options[CURLOPT_PUT] = true;
                              //                     $options[CURLOPT_INFILE] = $put_body;   
                              //                     $options[CURLOPT_INFILESIZE] = 10240;   

                                                  
                              $options[CURLOPT_CUSTOMREQUEST] = 'PUT';
                                                  
                              $options[CURLOPT_POSTFIELDS] = $put_body;

                                                  
                              $options[CURLOPT_URL] = $path;
                                                      
                              writeToCustomLog("LBSLBSID"' ......... ''make/put/url ... '.$path);
                                              break; 

                              In der Variable $put_body ist der JSON-String der im BODY übergeben werden muss ...

                              DANKE
                              Danke und LG, Dariusz
                              GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                              Kommentar


                                #30
                                Hallo zusammen,

                                vielleicht können jetzt mehr helfen, es schein möglicherweise an der JSON zu liegen ...

                                Grundsätzlich konvertiere ich ein ARRAY via $body = json_encode($params, true);
                                und erhalte folgenden String: {"data":{"key":"BSH.Common.Settings.PowerState","v alue":"BSH.Common.EnumType.PowerState.On"}}

                                Wenn ich diese in der oben genannten PUT-Option absende, dann erhalte ich den 409er Code mit Conflict und folgender Error-Meldung zurück:
                                {[LF] "error": {[LF] "key": "SDK.Error.UnsupportedSetting",[LF] "description": "Setting is not supported"[LF] }[LF]}

                                Wenn ich die Übertragung via einem eigenen Client von Home-Connect mache, dann funktioniert die Übertragung ohne Probleme:

                                Bildschirmfoto 2016-12-30 um 23.17.01.png


                                Als nächstes habe ich versucht den „body“ Inhalt zu kopieren und in mein Code zu kopieren:

                                Bildschirmfoto 2016-12-30 um 23.18.59.png


                                Nun erhalte ich einen 400er Code mit Bad Request und folgender Meldung zurück:
                                {"error":{"key":"400","description":"The request content was malformed:\nUnexpected end-of-input at input index 93 (line 4, position 36), expected '"':\n "value": "BSH.Common.EnumType.P\n ^\n"}}


                                Nun vermute ich - kann mich aber auch sehr täuschen - dass ich den ARRAY falsch, in JSON umwandle …?

                                Bin weiterhin für Unterstützung dankbar
                                Danke und LG, Dariusz
                                GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                                Kommentar

                                Lädt...
                                X