razowski Posté(e) le 23 janvier 2014 Signaler Posté(e) le 23 janvier 2014 Bonjour, J'ai parcouru le forum mais ne trouve pas réponse à mon problème. Je tente d'utiliser l'API proposée par Fibaro pour interfacer ma propre interface graphique. Je suis capable de lancer un ordre sur un device via un browser (safari, chrome, ...) mais je ne m'en sors pas en PHP pour exécuté cette même requête. D'après ce que je comprends à ce stade, cela doit être l'authentification qui ne passe pas. Ma requête est de la forme : http://admin:password@IP_DE_MA_BOX_FIBARO/api/callAction?deviceID=59&name=turnOn Dans un navigateur web, j'obtiens une alerte de phising mais en validant, la requête s'exécute et j'obtiens le résultat désiré. Est-ce quelqu'un est en mesure de m'indiquer comment lancer cette même requête via un simple script PHP ou JS? Cela semble pour tant tout simple, mais en vain, je sèche après bien des essais. Merci de votre aide, ouvert à toutes questions / échanges.
clarkkent609 Posté(e) le 23 janvier 2014 Signaler Posté(e) le 23 janvier 2014 Bonjour, Il y a une liste de commande dispo ici: http://tutoriels.domotique-store.fr/content/5/45/fr/api-commander-le-home-center-2-par-des-requêtes-http.html Essayes tu de faire la manip avec ton compte admin ou un autre? Chez moi ça fonctionne mais uniquement pour le compte admin, j'ai pas réussi àfaire la manip avec un autre compte, malgré que je lui ai accordé les droits Es tu delogué de la box lorsque tu tapes la commande http?
Krikroff Posté(e) le 23 janvier 2014 Signaler Posté(e) le 23 janvier 2014 Bonsoir, ou alors utilises mon application HC2 Toolkit disponible ici, tu auras alors accès à l' APIhttp://www.domotique-fibaro.fr/index.php/topic/239-hc2-toolkit-application-v1005-beta/N'importe quelle librairie JS peut communiquer avec le HC2 cf. http://fr.wikipedia.org/wiki/XMLHttpRequest, voir du côté de JQuery (le plus accessible) Tu peux essayer avec cela en PHP: $response = file_get_contents('http://admin:password...'); ou avec cUrl http://php.net/manual/en/book.curl.php // Method: POST, PUT, GET etc // Data: array("param" => "value") ==> index.php?param=value function CallAPI($method, $url, $data = false) { $curl = curl_init(); switch ($method) { case "POST": curl_setopt($curl, CURLOPT_POST, 1); if ($data) curl_setopt($curl, CURLOPT_POSTFIELDS, $data); break; case "PUT": curl_setopt($curl, CURLOPT_PUT, 1); break; default: if ($data) $url = sprintf("%s?%s", $url, http_build_query($data)); } // Optional Authentication: curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($curl, CURLOPT_USERPWD, "username:password"); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); return curl_exec($curl); }
razowski Posté(e) le 24 janvier 2014 Auteur Signaler Posté(e) le 24 janvier 2014 Bonjour, Merci pour les exemples, cela fonctionne en PHP ainsi. J'essaie de le faire au travers d'une requête AJAX. Je me suis inspiré de ce que j'ai réalisé sur ma box eedomus, mais avec la Fibaro, cela ne passe pas. J'ai tout mis en dure dans la requête (user, password et id du device). Lorsque j'appelle le JS via mon browser, j'obtiens une pop-up pour l'authentification. Je pense que cela ne passe pas au niveau de l'authentification mais je n'en suis pas certain.... //Fonction permettant de retourner le status du périphérique function getDeviceValue() { var req = new XMLHttpRequest(); req.open("GET", "http://admin:password@192.168.12.151/api/devices?id=44", true); req.onreadystatechange = function () { var doc = eval("(" + req.responseText + ")"); var val = doc.properties.value; alert(val); //Je n'obtiens rien hormis une popup qui demande user/password et même en saisissant ces derniers, rien ne se passe }; req.send(null); }
Krikroff Posté(e) le 24 janvier 2014 Signaler Posté(e) le 24 janvier 2014 C'est normal, tu dois ajouter manuellement au header, l’autorisation comme ceci: var credentials = btoa(user + ":" + password); red.setRequestHeader("Authorization", "Basic " + credentials); btoa permettant l'encodage en base 64 du couple user/password cf. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding mais attention à la compatibilité avec les navigateurs, je te conseil d'utiliser une classe Javascript pour encoder en base64... j'ai la flemme d'uploader un fichier alors https://www.google.com/search?q=javascript+base64+encode
razowski Posté(e) le 24 janvier 2014 Auteur Signaler Posté(e) le 24 janvier 2014 Je suis navré mais je ne te suis pas dans l'explication. Je comprends qu'il s'agit d'un problème d'authentification àpriori. Selon les informations que tu m'indiques, j'ai modifié en cela : //Fonction permettant de retourner le status du périphérique function getDeviceValue() { var req = new XMLHttpRequest(); var credentials = btoa("admin:pass"); req.open("GET", 'http://192.168.12.151/api/devices?id=44', true); req.setRequestHeader("Authorization", "Basic " + credentials); req.onreadystatechange = function () { if (req.readyState == 4 && req.status==200) { var doc = eval("(" + req.responseText + ")"); var val = doc.properties.value; alert(val); } }; req.send(null); } Mais cela ne semble pas fonctionner. Mon "alert(val);" ne me retourne rien alors que je devrais obtenir la valeur du device...
Krikroff Posté(e) le 24 janvier 2014 Signaler Posté(e) le 24 janvier 2014 Il faut ajouter le header avant l'ouverture du socket ! Je pense que vous devriez voir du côté de JQuery ou autre framework ou la majorité du code est écrit et surtout consulter des tutos. Ps: pensez bien àremplacer admin et pass par vos identifiants.
razowski Posté(e) le 24 janvier 2014 Auteur Signaler Posté(e) le 24 janvier 2014 Je regarde mais n'ai rien trouvé jusqu'ici... Merci tout de même pour les pistes.
razowski Posté(e) le 27 janvier 2014 Auteur Signaler Posté(e) le 27 janvier 2014 Après différentes recherches, debugging et autre, j'ai trouvé la réponse. En fait, la requête n'est pas autorisée en "XMLHttpRequest" car considérée comme "Cross-Domain"... Je propose une autre alternative si d'autres personnes sont un jour confrontées à la même problématique: réaliser une requête ajax : $.ajax({ type: "GET", url: "http://user:password@xxx.xxx.xxx.xxx/api/callAction", dataType: "jsonp", contentType: "application/javascript", data: {deviceID: "XX", name: "turnOn"}, crossDomain: true, xhrFields: { withCredentials: true }, jsonp: 'jsonp_callback', success: jsonp_callback });
Krikroff Posté(e) le 27 janvier 2014 Signaler Posté(e) le 27 janvier 2014 il n'y a cross-domaine que si l’hôte appelant est sur un réseau différent que celui du HC2. Oui, comme je vous le disais, JQuery était la solution la plus simple pour arriver à vos fins . Personnellement j'aurais utilisé password et username pour passer l'identification et pas inline...
razowski Posté(e) le 27 janvier 2014 Auteur Signaler Posté(e) le 27 janvier 2014 Sauf erreur de ma part, dans ce cas il y a du "cross-domaine", car le HC2 est sur le domaine "192.168.xx.xx" (exemple) et la requête "user:password@192.168.xx.xx", la policy XMLHttpRequest identifie cela comme deux domaines distincts. Ma première réaction était identique, on reste sur le même domaine, mais non... Le "inline" était car je n'ai pas réussi à passer le user/password via paramètre, pas faute d'avoir essayé ;-)
nettrust Posté(e) le 10 février 2015 Signaler Posté(e) le 10 février 2015 Bonsoir, Je viens de me mettre un peu à l'api HC2 pour faire quelques tests, malheureusement en utilisant ta solution razowski j'obtiens toujours une erreur ?? .. je fais juste appel au GET pour me retourner les variables globales et il me retourne erreur:JQuery11116333_66555 was not called... une idée ?
971jmd Posté(e) le 18 mars 2017 Signaler Posté(e) le 18 mars 2017 Salut à tous je suis à la recherche d'une âme charitable ça fait +6mois que je cherche a faire fonctionne ce truc : https://www.domotique-fibaro.fr/topic/4807-enregistrer-un-json/?do=findComment&comment=157006 ça fonctionne 99% il manque juste le moyen, le code, le truc..... @pepite ma mis sur la bonne voie
Messages recommandés