Aller au contenu

Messages recommandés

Posté(e)

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.

Posté(e)

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?

Posté(e)

Bonsoir, ou alors utilises mon application HC2 Toolkit disponible ici, tu auras alors accès à  l' API
http://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);
}
Posté(e)

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);

}

Posté(e)

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

Posté(e)
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...

Posté(e)

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.

Posté(e)

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

        });
Posté(e)

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...

Posté(e)

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é ;-)

  • 1 an après...
Posté(e)

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 ?

  • 2 ans après...
×
×
  • Créer...