Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
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) ?
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)
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) …. ?
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.
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 ?
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:
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($params, null, '&'); 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($params, null, '&'); } 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);
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:
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 …?
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar