Demande d'aide Paramétrage connecteur HTTP / json / commandes linux
#1
Bonjour à jours,

Après moulte recherche (et n'étant pas encore très familier avec tout ça) je cherche de l'aide pour paramétrer un connecteur HTTP pour récupérer du json.

En effet pour piloter ma tondeuse, j'ai réussi à récupérer un json via l'API du fabricant, via un terminal linux. Je voudrait essayer de l'intégrer dans la LD proprement mais lorsque je créé un connecteur universel HTTP, impossible de se connecter.

J'en viens donc à demander une aide précieuse à la communauté  Amen-1fb6 :

Lignes de commandes :

Code :
TOKEN=$(curl -v -X POST -d '{"client_id": 1, "grant_type": "password", "scope": "*", "client_secret": "nCH3A0WvMYn66vGorjSrnGZ2YtjQWDiCvjg7jNxK", "username": "monadresse@mail.com", "password":"monmotdepasse"}' -H 'Content-Type: application/json' https://api.worxlandroid.com/api/v2/oauth/token | jq -r '.access_token')

Code :
curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items


et lorsque j'essaye de transposer tout ça dans un connecteur HTTP universel de cette façon : (cf pj car je n'arrive pas à insérer une image)    


ça me retourne connexion impossible.
Par contre si je change le type d'authentification par BASIC ou DIGEST avec juste l'adresse mail et le mdp j'arrive bien à me connecter, mais je n'arrive pas à récupérer les infos du json.
Après je ne fait peut être pas cette action comme il faut :
J'ai créé un equipement universel > connecteur HTTP > variable > là j'ai rentré les id des éléments présent dans mon json.
un extrait du json :

Code :
[
{
"name": "Valerie la Brebis",
"locked": true,
"firmware_version": 3.07,
"firmware_auto_upgrade": false,
"push_notifications": true,
"sim": null,
etc...


Merci d'avance pour votre aide car la je sèche complétement 35-4134
Répondre
#2
Dans l'équipement, voici ce que je renseigne dans le parseur JS de la commande :
Code :
try {
   var obj = JSON.parse(trame);
} catch (e) {
   ldprint("Error parse JSON: " + e.message);
};

variable1 = obj.variable1;
variable2 = obj.variable2;
etc..
Répondre
#3
je te remercie pour ton aide, du coup j'avance un peu dans ma compréhension de la chose.
Si je comprend bien ce qu'il faut que je fasse pour récupérer les variables du json :

1- Création d'un connecteur HTTP universel
> adresse : https://api.worxlandroid.com/ (et non https://api.worxlandroid.com/api/v2/product-items)
> authentification BASIC ou DIGEST avec login/mdp

2 - Création d'un equipement universel
> Connecteur : connecteur HTTP universel créé précédemment
> ajout d'une commande :
  • label : refresh
  • type ASCII
  • Commande : /api/v2/product-items
  • coche de lecture cyclique
  • Méthode : GET
  • Coche de "Parseur JS de la commande"
et là je rajoute le code :
Code :
try {
   var obj = JSON.parse(trame);
} catch (e) {
   ldprint("Error parse JSON: " + e.message);
};

variable1 = obj.variable1;
variable2 = obj.variable2;

> ajout de variables : variable1 et variable2

et du coup ça doit marché ?
Répondre
#4
Oui sauf omission c'est ca !
J'ai tatonné aussi pour y arriver donc mes connaissances sont limitées
Répondre
#5
oui tu as plusieurs solutions avec le connecteur http
- 1 - tu utilises la fonction oauth (oauth2), dans ce cas avec clientid et clientsecret, adresse de validation de la connection , tu dois renseigner une adresse de retour du côté de celui qui reçoit la requête (http://L’IP de votre box lifedomus locale :8080/Domobox/OAuth) , si ce n'est pas le cas alors le retour oauth va n'importe ou et ==> connexion impossible
- 2 - tu utilises login et pwd et tu es en basic et tu renseigne dans domaine le bout de l'adresse qui va être toujours utilisée comme base (donc sans /login à la fin)

j'ai noté que pour certains site la fonction oauth implémenté dans LD ne fonctionne pas (surement parce que pas de respect de toutes les fonctionnalités des protocoles de dialogue d'un côté ou de l'autre)

éviter de mettre une trame d'initialisation dans le connecteur parce que vous ne pouvez pas utiliser le parseur json pour traiter le retour à ce stade.

pour voir ce qui se passe dans vos commandes - actionner la fonction de listen du connecteur qui permet d'avoir la trame json de retour après chaque commande / requête

ensuite tout se passe dans l'équipement associé au connecteur :
les commandes que vuos nommez comme vous voulez :  peuvent être en ascii ou js 
si en ascii :  mettre la partie de la commande sans la base ==> /get_list_device
si en js :  alors command='/get_list_device';

si ascii pas de possibilité d'ajouter des instructions js dans la partie commande , sinon passer en js , par exemple si vous voulez faire ldprint("lancement de la commande toto")
et si on est pas en GET mais en POST alors ==> JS pour remplir les entêtes et paramètres de la requête


pour traiter le retour json (celui que l'on voit avec la fonction listen coché dans le connecteur)

2 solutions:
1 - ajout du code parseur json dans le connecteur lui-même , dans ce cas ce code est executé dans toutes les commandes de tous les équipements associés au connecteur
2 - on code "Parseur JS de la commande" , là on peut mettre son code de récupération et traitement spécifique de la trame json de cette commande, ça remplace le code du de décodage de la trame retour du connecteur pour cette commande.  donc à utiliser si le code de traitement est spécifique à la commande ou pendant la phase de mise au point.


note :  la méthode 2 est interprétée systématiquement et complètement au moment de la validation / sauvegarde et ça prend un certains temps avant de récupérer la main, dans la méthode 1 c'est juste la syntaxe qui est "contrôlée"


exemple de quelques traitement :


Code :
// fichier get_siteId.js
// l'identification sur le site SOMFY à été traitée par le connecteur
// tout démarre ici , la première chose est de récupérer l'identifiant du site SOMFY via la commande 'getsiteId'
try {
    var obj_somfy = JSON.parse(trame);    
} catch (e) {
    ldprint("Error parse JSON: " + e.message);
}
ldprint('get_siteId.js');
// on écrit un message dans 'message_retour_somfy' pour suivre ce qui se passe
// et on met à jour un compteur qui sert pour déclencher l'automate d'enchainement somfy,
// qui va émettre une requête (par la suite 'get_list_device') pour récupérer les données stockées sur le site SOMFY

label = obj_somfy[0].label;
// identifiant du site - on va le stocker dans l'équipement somfy message et aussi dans une variable générale de CS
// attention on doit mettre les variables de retour (general_site_id et somfy_compteur) dans un autre équipement que celui qui déclenche la commande get_siteID
// sinon il y a conflit entre l'éxecution par l'équipement déclencheur et l'automate qui doit capter la modification du compteur pour se déclencher
general_site_id = obj_somfy[0].id;
somfy_compteur = parseInt(somfy_compteur) + 1;
message_retour_somfy = "retour Ok de l'identifiant du site SOMFY: " + label;

// pour débug
ldprint('general_site_id = ' + general_site_id);
ldprint('label: ' + label);

  ou plus complexe :



Code :
try {
    var obj = JSON.parse(trame);
} catch (e) {
    ldprint("Error parse JSON: " + e.message);
}
function get_temps_text(text) {
    // retourne le texte du temps qui est associé au code_temps
        text = text.substring(text.indexOf(',') + 1 , text.indexOf(';'));
    return text;
}
function get_temps_icon(text) {
    // retourne l'icon à utiliser du temps qui est associé au code_temps
        text = text.substring(text.indexOf(';') + 1);
    return text;
}
function translate_dir_vent (dir_vent_degre){
        // transposition entre les ° de la rose des vents et les positions cardinales plus simples à comprendre
    if (dir_vent_degre < 12) {dirvent_cardinal = "N"}
    else if (dir_vent_degre < 33) {dirvent_cardinal = "NNE"}
    else if (dir_vent_degre < 57) {dirvent_cardinal = "NE"}
    else if (dir_vent_degre < 80) {dirvent_cardinal = "ENE"}
    else if (dir_vent_degre < 102) {dirvent_cardinal = "E"}
    else if (dir_vent_degre < 124) {dirvent_cardinal = "ESE"}
    else if (dir_vent_degre < 147) {dirvent_cardinal = "SE"}
    else if (dir_vent_degre < 170) {dirvent_cardinal = "SSE"}
    else if (dir_vent_degre < 192) {dirvent_cardinal = "S"}
    else if (dir_vent_degre < 214) {dirvent_cardinal = "SSO"}
    else if (dir_vent_degre < 237) {dirvent_cardinal = "SO"}
    else if (dir_vent_degre < 260) {dirvent_cardinal = "OSO"}
    else if (dir_vent_degre < 282) {dirvent_cardinal = "O"}
    else if (dir_vent_degre < 304) {dirvent_cardinal = "ONO"}
    else if (dir_vent_degre < 327) {dirvent_cardinal = "NO"}
    else if (dir_vent_degre < 350) {dirvent_cardinal = "NNO"}
    else {dirvent_cardinal = "N"}
    
    return dirvent_cardinal;
}

// table de correspondance entre les codes temps, les libellés, les images à afficher  - par exemple '0' correspond à Soleil, '4' correspond à Nuageux
var table_libelle_text_icon =[
"0,Soleil;forcast_32.png",
"1,Peu nuageux;forcast_30.png",
"2,Ciel voilé;forcast_34.png",
"3,Nuageux;forcast_28.png",
"4,Très nuageux;forcast_26.png",
"5,Couvert;forcast_28.png",
"6,Brouillard;forcast_19.png",
"7,Brouillard givrant;forcast_19.png",
"8,rien;forcast_.png",
"9,rien;forcast_.png",
"10,Pluie faible;forcast_9.png",
"11,Pluie modérée;forcast_11.png",
"12,Pluie forte;forcast_12.png",
"13,Pluie faible verglaçante;forcast_9.png",
"14,Pluie modérée verglaçante;forcast_9.png",
"15,Pluie forte verglaçante;forcast_12.png",
"16,Bruine;forcast_19.png",
"17,rien;forcast_.png",
"18,rien;forcast_.png",
"19,rien;forcast_.png",
"20,Neige faible;forcast_15.png",
"21,Neige modérée;forcast_13.png",
"22,Neige forte;forcast_14.png",
"23,rien;forcast_.png",
"24,rien;forcast_.png",
"25,rien;forcast_.png",
"26,rien;forcast_.png",
"27,rien;forcast_.png",
"28,rien;forcast_.png",
"29,rien;forcast_.png",
"30,Pluie et neige mêlées faibles;forcast_5.png",
"31,Pluie et neige mêlées modérées;forcast_5.png",
"32,Pluie et neige mêlées fortes;forcast_7.png",
"33,rien;forcast_.png",
"34,rien;forcast_.png",
"35,rien;forcast_.png",
"36,rien;forcast_.png",
"37,rien;forcast_.png",
"38,rien;forcast_.png",
"39,rien;forcast_.png",
"40,Averses de pluie locales et faibles;forcast_9.png",
"41,Averses de pluie locales;forcast_11.png",
"42,Averses locales et fortes;forcast_12.png",
"43,Averses de pluie faibles;forcast_9.png",
"44,Averses de pluie;forcast_11.png",
"45,Averses de pluie fortes;forcast_12.png",
"46,Averses de pluie faibles et fréquentes;forcast_9.png",
"47,Averses de pluie fréquentes;forcast_11.png",
"48,Averses de pluie fortes et fréquentes;forcast_12.png",
"49,rien;forcast_.png",
"50,rien;forcast_.png",
"51,rien;forcast_.png",
"52,rien;forcast_.png",
"53,rien;forcast_.png",
"54,rien;forcast_.png",
"55,rien;forcast_.png",
"56,rien;forcast_.png",
"57,rien;forcast_.png",
"58,rien;forcast_.png",
"59,rien;forcast_.png",
"60,Averses de neige localisées et faibles;forcast_15.png",
"61,Averses de neige localisées;forcast_13.png",
"62,Averses de neige localisées et fortes;forcast_14.png",
"63,Averses de neige faibles;forcast_15.png",
"64,Averses de neige;forcast_13.png",
"65,Averses de neige fortes;forcast_14.png",
"66,Averses de neige faibles et fréquentes;forcast_15.png",
"67,Averses de neige fréquentes;forcast_13.png",
"68,Averses de neige fortes et fréquentes;forcast_14.png",
"69,rien;forcast_.png",
"70,Averses de pluie et neige mêlées localisées et faibles;forcast_5.png",
"71,Averses de pluie et neige mêlées localisées;forcast_7.png",
"72,Averses de pluie et neige mêlées localisées et fortes;forcast_7.png",
"73,Averses de pluie et neige mêlées faibles;forcast_7.png",
"74,Averses de pluie et neige mêlées;forcast_5.png",
"75,Averses de pluie et neige mêlées fortes;forcast_5.png",
"76,Averses de pluie et neige mêlées faibles et nombreuses;forcast_5.png",
"77,Averses de pluie et neige mêlées fréquentes;forcast_5.png",
"78,Averses de pluie et neige mêlées fortes et fréquentes;forcast_5.png",
"79,rien;forcast_.png",
"80,rien;forcast_.png",
"81,rien;forcast_.png",
"82,rien;forcast_.png",
"83,rien;forcast_.png",
"84,rien;forcast_.png",
"85,rien;forcast_.png",
"86,rien;forcast_.png",
"87,rien;forcast_.png",
"88,rien;forcast_.png",
"89,rien;forcast_.png",
"90,rien;forcast_.png",
"91,rien;forcast_.png",
"92,rien;forcast_.png",
"93,rien;forcast_.png",
"94,rien;forcast_.png",
"95,rien;forcast_.png",
"96,rien;forcast_.png",
"97,rien;forcast_.png",
"98,rien;forcast_.png",
"99,rien;forcast_.png",
"100,Orages faibles et locaux;forcast_17.png",
"101,Orages locaux;forcast_17.png",
"102,Orages fort et locaux;forcast_3.png",
"103,Orages faibles;forcast_17.png",
"104,Orages;forcast_17.png",
"105,Orages forts;forcast_3.png",
"106,Orages faibles et fréquents;forcast_17.png",
"107,Orages fréquents;forcast_17.png",
"108,Orages forts et fréquents;forcast_3.png",
"109,rien;forcast_.png",
"110,rien;forcast_.png",
"111,rien;forcast_.png",
"112,rien;forcast_.png",
"113,rien;forcast_.png",
"114,rien;forcast_.png",
"115,rien;forcast_.png",
"116,rien;forcast_.png",
"117,rien;forcast_.png",
"118,rien;forcast_.png",
"119,rien;forcast_.png",
"120,Orages faibles et locaux de neige ou grésil;forcast_14.png",
"121,Orages locaux de neige ou grésil;forcast_7.png",
"122,Orages locaux de neige ou grésil;forcast_7.png",
"123,Orages faibles de neige ou grésil;forcast_7.png",
"124,Orages de neige ou grésil;forcast_7.png",
"125,Orages de neige ou grésil;forcast_7.png",
"126,Orages faibles et fréquents de neige ou grésil;forcast_7.png",
"127,Orages fréquents de neige ou grésil;forcast_7.png",
"128,Orages fréquents de neige ou grésil;forcast_7.png",
"129,rien;forcast_.png",
"130,Orages faibles et locaux de pluie et neige mêlées ou grésil;forcast_7.png",
"131,Orages locaux de pluie et neige mêlées ou grésil;forcast_7.png",
"132,Orages fort et locaux de pluie et neige mêlées ou grésil;forcast_5.png",
"133,Orages faibles de pluie et neige mêlées ou grésil;forcast_5.png",
"134,Orages de pluie et neige mêlées ou grésil;forcast_5.png",
"135,Orages forts de pluie et neige mêlées ou grésil;forcast_5.png",
"136,Orages faibles et fréquents de pluie et neige mêlées ou grésil;forcast_5.png",
"137,Orages fréquents de pluie et neige mêlées ou grésil;forcast_5.png",
"138,Orages forts et fréquents de pluie et neige mêlées ou grésil;forcast_5.png",
"139,rien;forcast_.png",
"140,Pluies orageuses;forcast_17.png",
"141,Pluie et neige mêlées à caractère orageux;forcast_17.png",
"142,Neige à caractère orageux;forcast_14.png",
"143,rien;forcast_.png",
"144,rien;forcast_.png",
"145,rien;forcast_.png",
"146,rien;forcast_.png",
"147,rien;forcast_.png",
"148,rien;forcast_.png",
"149,rien;forcast_.png",
"150,rien;forcast_.png",
"151,rien;forcast_.png",
"152,rien;forcast_.png",
"153,rien;forcast_.png",
"154,rien;forcast_.png",
"155,rien;forcast_.png",
"156,rien;forcast_.png",
"157,rien;forcast_.png",
"158,rien;forcast_.png",
"159,rien;forcast_.png",
"160,rien;forcast_.png",
"161,rien;forcast_.png",
"162,rien;forcast_.png",
"163,rien;forcast_.png",
"164,rien;forcast_.png",
"165,rien;forcast_.png",
"166,rien;forcast_.png",
"167,rien;forcast_.png",
"168,rien;forcast_.png",
"169,rien;forcast_.png",
"170,rien;forcast_.png",
"171,rien;forcast_.png",
"172,rien;forcast_.png",
"173,rien;forcast_.png",
"174,rien;forcast_.png",
"175,rien;forcast_.png",
"176,rien;forcast_.png",
"177,rien;forcast_.png",
"178,rien;forcast_.png",
"179,rien;forcast_.png",
"180,rien;forcast_.png",
"181,rien;forcast_.png",
"182,rien;forcast_.png",
"183,rien;forcast_.png",
"184,rien;forcast_.png",
"185,rien;forcast_.png",
"186,rien;forcast_.png",
"187,rien;forcast_.png",
"188,rien;forcast_.png",
"189,rien;forcast_.png",
"190,rien;forcast_.png",
"191,rien;forcast_.png",
"192,rien;forcast_.png",
"193,rien;forcast_.png",
"194,rien;forcast_.png",
"195,rien;forcast_.png",
"196,rien;forcast_.png",
"197,rien;forcast_.png",
"198,rien;forcast_.png",
"199,rien;forcast_.png",
"200,rien;forcast_.png",
"201,rien;forcast_.png",
"202,rien;forcast_.png",
"203,rien;forcast_.png",
"204,rien;forcast_.png",
"205,rien;forcast_.png",
"206,rien;forcast_.png",
"207,rien;forcast_.png",
"208,rien;forcast_.png",
"209,rien;forcast_.png",
"210,Pluie faible intermittente;forcast_9.png",
"211,Pluie modérée intermittente;forcast_11.png",
"212,Pluie forte intermittente;forcast_12.png",
"213,rien;forcast_.png",
"214,rien;forcast_.png",
"215,rien;forcast_.png",
"216,rien;forcast_.png",
"217,rien;forcast_.png",
"218,rien;forcast_.png",
"219,rien;forcast_.png",
"220,Neige faible intermittente;forcast_15.png",
"221,Neige modérée intermittente;forcast_13.png",
"222,Neige forte intermittente;forcast_14.png",
"223,rien;forcast_.png",
"224,rien;forcast_.png",
"225,rien;forcast_.png",
"226,rien;forcast_.png",
"227,rien;forcast_.png",
"228,rien;forcast_.png",
"229,rien;forcast_.png",
"230,Pluie et neige mêlées;forcast_7.png",
"231,Pluie et neige mêlées;forcast_7.png",
"232,Pluie et neige mêlées;forcast_7.png",
"233,rien;forcast_.png",
"234,rien;forcast_.png",
"235,Averses de grêle;forcast_18.png"]



// City infos
var City = new Array();
City = obj.city;
code_commune = City.insee;
code_postal = City.cp;
latitude = City.latitude;
longitude = City.longitude
elevation = City.altitude;
nom_commune = City.name;

// update time  - l'heure de la prise d'info du capteur de météo concept
if (obj.update) {
    update_time = obj.update;
    ldprint("update_time: " + update_time)
}

// ephemeride du jour
if (obj.ephemeride)
    {
        var Ephemeride = new Array ();
        Ephemeride = obj.ephemeride;
        if (Ephemeride.day == 0)
        {
            lever_soleil_j0 = Ephemeride.sunrise;
            coucher_soleil_j0 = Ephemeride.sunset;
            duree_jour_j0 = Ephemeride.duration_day;    
            diff_duree_jour_j0 = Ephemeride.diff_duration_day;
            phase_lune_j0 = Ephemeride.moon_phase;
        }
        if (Ephemeride.day == 1)
        {
            lever_soleil_j1 = Ephemeride.sunrise;
            coucher_soleil_j1 = Ephemeride.sunset;
        }
        if (Ephemeride.day == 2)
        {
            lever_soleil_j2 = Ephemeride.sunrise;
            coucher_soleil_j2 = Ephemeride.sunset;
        }
        if (Ephemeride.day == 3)
        {
            lever_soleil_j3 = Ephemeride.sunrise;
            coucher_soleil_j3 = Ephemeride.sunset;
        }
    }
// Forecasts
else if (obj.forecast) {            // test si on a des données météo sur les heures
    var    Forecast_ = new Array();    // variable générale pour les données 'jour' ou 'heure'
                                    // c'est la requête horaire, traitement de ce qui est spécifique à la requête heure
    Forecast_ = obj.forecast;

// infos horaires    
    if (Forecast_[0].temp2m)                 // c'est la requête horaire, traitement de ce qui est spécifique à la requête heure
    {            
        var    Forecast_hour_now = new Array();    // variable pour stocker les données de l'heure courante
        // les infos
                                                // c'est la requête horaire, traitement de ce qui est spécifique à la requête heure
                                                // on récupère toutes les valeurs à exploiter plus tard  
        Forecast_hour_now = Forecast_[0];        // on prend la première valeur qui est la valeur courante
        
        datetime = Forecast_hour_now.datetime;
        jour = datetime.substr(8, 2) + "-" + datetime.substr(5, 2) + "-" + datetime.substr(0, 4);            // formatage de la date du jour sous la forme jj-mm-aaaa
        heure = datetime.substr(datetime.indexOf('T') + 1, 5);         // on prend juste l'heure et les minutes
        
        vent10m = Forecast_hour_now.wind10m;
        rafale10m = Forecast_hour_now.gust10m;
        dirvent10m = Forecast_hour_now.dirwind10m;
        dirvent = translate_dir_vent (Forecast_hour_now.dirwind10m);
        cumulpluie = Forecast_hour_now.rr10;
        cumulpluiemax = Forecast_hour_now.rr1;
        probapluie = Forecast_hour_now.probarain;
        probagel = Forecast_hour_now.probafrost;
        probabrouillard = Forecast_hour_now.probafog;
        probavent70 = Forecast_hour_now.probawind70;
        probavent100 = Forecast_hour_now.probawind100;
        rafalevent = Forecast_hour_now.gustx;
        
        // traitement de la tendance météo
        code_temps = Forecast_hour_now.weather;                                        // le code temps va permettre de prendre le libellé dans la table table_libelle_text_icon
        libelle_temps = get_temps_text(table_libelle_text_icon[code_temps]);          // on va chercher le libellé du temps         
        icon_temps = get_temps_icon(table_libelle_text_icon[code_temps]);            // on va chercher l'icone du temps

            retour_requete = "heure";
    //        temperature_h0 = Forecast_hour_now.temp2m;        // température courante à 2m du sol
            for (i = 0; i < Forecast_.length - 1 & i < 4; i++){
            eval("temperature_h"+i+" = Forecast_["+i+"].temp2m");        // température h+x à 2m du sol
            eval("hour_h"+i+" = Forecast_["+i+"].datetime.substr(Forecast_["+i+"].datetime.indexOf('T') + 1, 5)");        // heure
            }

            humidite_h0 = Forecast_hour_now.rh2m;            // humidité à 2m du sol
            tsol10 = Forecast_hour_now.tsoil1;                // température du sol entre 0 et 10cm
            tsol40 = Forecast_hour_now.tsoil2;                // température du sol entre 10 et 40cm
            iso0 = Forecast_hour_now.iso0;
            rafaleorage = Forecast_hour_now.gustx;
        
            if ( status_jour_nuit == "nuit")        // on est avant le levé et après le couché on va ajouter une différence entre nuit et jour dans la requête heure
            {
                if (libelle_temps == "Soleil") {libelle_temps = "Claire"}
                libelle_temps = "Nuit " + libelle_temps;                  // comme requête heure, on ajoute une différence entre nuit et jour
                icon_temps = "nuit_" + icon_temps;                        // comme requête heure, on ajoute une différence entre nuit et jour
            }
            
            // on est dans la requête heure et on va construire une liste pour afficher les prévisions des prochaines heures, à utiliser avec le widget List de audio dans DS
            Forecast_xhours = new Array();
            Forecast_xhours[1] = new Array();
            // entête de la liste pour avoir les labels des données restituées
            Forecast_xhours[1][0] = 0;
            Forecast_xhours[1][1] = "  Heure -   T° - % humidité - Vent - Tendance" ; // format du contenu de la liste
            // construction des données par jour
            for (i = 0; i < Forecast_.length - 1; i++)  // on va prendre toutes les heures - attention comme on décale d'un index ligne il faut éviter d'aller trop loin
            {
                j =  i + 1;                                // la 1ère ligne correspond aux données de l'heure courante, déjà affichées
                k =  j + 1;                                // comme la 1ère ligne est réservée aux libéllés on commence à la ligne 2
                Forecast_xhours[k] = new Array();
                Forecast_xhours[k][0] = j;
                datetime_xhours = Forecast_[j].datetime;
                Forecast_xhours[k][1] = datetime_xhours.substr(datetime_xhours.indexOf('T') + 1, 5);         // on prend juste l'heure et les minutes
                Forecast_xhours[k][1] +=  " - " + Forecast_[j].temp2m + "°c";    // température mini en °c    
                Forecast_xhours[k][1] += " - " + Forecast_[j].rh2m + "%";    // pluviométrie en %
                Forecast_xhours[k][1] += " - " + Forecast_[j].wind10m + "km/h";    // vent en km/h
                temp_code_temps = Forecast_[j].weather;
                Forecast_xhours[k][1] += " - " + get_temps_text(table_libelle_text_icon[temp_code_temps]);        // tendance météo pour cette journée
            }
            ldprint("libelle_temps: " + libelle_temps);                        // pour s'assurer que l'on fait fait les bonnes conversions
    }

//infos jour    
    if (Forecast_[0].tmin) {                                // c'est la requête jour, traitement de ce qui est spécifique à la requête
        retour_requete = "jour"
        
        // séquence pour les données spécifiques du jour (day: 0) et qu'on ne stocke que pour le jour         
        vent10m_j0 = Forecast_[0].wind10m;
        rafale10m_j0 = Forecast_[0].gust10m;
        dirvent10m_j0 = Forecast_[0].dirwind10m;
        dirvent_j0 = translate_dir_vent (Forecast_[0].dirwind10m);
        cumulpluie_j0 = Forecast_[0].rr10;
        cumulpluiemax_j0 = Forecast_[0].rr1;
        probapluie_j0 = Forecast_[0].probarain;
        probagel_j0 = Forecast_[0].probafrost;
        probabrouillard_j0 = Forecast_[0].probafog;
        probavent70_j0 = Forecast_[0].probawind70;
        probavent100_j0 = Forecast_[0].probawind100;
        rafalevent_j0 = Forecast_[0].gustx;
        ensoleillement_j0 = Forecast_[0].sun_hours;
        cumulevaporation_j0 = Forecast_[0].etp;
        
        // séquence pour les données qu'on va stocker individuellement pour les 4 jours (day:0 à day:3)
        for (i = 0; i < 4; i++)
        {
        // boucle pour les données des jours 0 à 3        
            eval("tempmin_j" + i + "= Forecast_["+i+"].tmin");                // température minimum du jour
            eval("tempmax_j" + i + "= Forecast_["+i+"].tmax");                // température maximum du jour
            eval("probapluie_j" + i + "= Forecast_["+i+"].probarain");        // pluie en % du jour
            eval("vent_j" + i + "= Forecast_["+i+"].wind10m");                // vent du jour
            eval("cumulpluie_j" + i + "= Forecast_["+i+"].rr10");            // pluie en mm du jour
            eval("jour_j" + i + "= Forecast_["+i+"].datetime.substr(8, 2) + '-' + Forecast_["+i+"].datetime.substr(5, 2) + '-' + Forecast_["+i+"].datetime.substr(0, 4)");            // reconstruction de la date
            
            temp_code_temps = Forecast_[i].weather;                    // variable temporaire à chaque itération change de valeur
            temp_text_temps = get_temps_text(table_libelle_text_icon[temp_code_temps]);
            temp_icon_temps = get_temps_icon(table_libelle_text_icon[temp_code_temps]);
            eval("libelle_temps_j" + i + "= temp_text_temps");            // tendance météo ce jour
            eval("icon_temps_j" + i + "= temp_icon_temps");                // image pour ce jour
        }

        // on est dans la requête jour et on va construire une liste pour afficher les prévisions des prochains jours, à utiliser avec le widget List de audio dans DS
        Forecast_xdays = new Array();
        Forecast_xdays[1] = new Array();
        // entête de la liste pour avoir les labels des données restituées
        Forecast_xdays[1][0] = 0;
        Forecast_xdays[1][1] = "Date - T° min - T° max - mm Pluie - % Pluie - Vent - Tendance" ; // format du contenu de la liste
        // construction des données par jour
        for (i = 0; i < Forecast_.length - 1; i++)  // on va prendre tous les jours - attention comme on décale d'un index ligne il faut éviter d'aller trop loin
        {
            j =  i + 1;                                // la 1ère ligne correspond aux données du jour, déjà affichée
            k =  j + 1;                                // comme la 1ère ligne est réservée aux libéllés on commence à la ligne 2
            Forecast_xdays[k] = new Array();
            Forecast_xdays[k][0] = j;
            datetime_xdays = Forecast_[j].datetime;
            Forecast_xdays[k][1] =  datetime_xdays.substr(8, 2) + "-" + datetime_xdays.substr(5, 2) + "-" + datetime_xdays.substr(0, 4);  // reconstruction de la date         
            Forecast_xdays[k][1] +=  " - " + Forecast_[j].tmin + "°c";    // température mini en °c    
            Forecast_xdays[k][1] += " - " + Forecast_[j].tmax + "°c"    // température max en °c
            Forecast_xdays[k][1] += " - " + Forecast_[j].rr10 + "mm";    // pluviométrie en mm
            Forecast_xdays[k][1] += " - " + Forecast_[j].probarain + "%";    // pluviométrie en %
            Forecast_xdays[k][1] += " - " + Forecast_[j].wind10m + "km/h";    // vent en km/h
            temp_code_temps = Forecast_[j].weather;
            Forecast_xdays[k][1] += " - " + get_temps_text(table_libelle_text_icon[temp_code_temps]);        // tendance météo pour cette journée
        }
    }
}
else {  // on est entre  00:00 et 59:59 et il n'y a pas de retour sur h+1 et h+2 , alors on construit avec des valeurs ""
            retour_requete = "heure";
            temperature_h1 = "";        // température h+1 à 2m du sol    
            temperature_h2 = "";        // température h+2 à 2m du sol
            temperature_h3 = "";        // température h+3 à 2m du sol
            // on est dans la requête heure et on va construire une liste vide
            Forecast_xhours = new Array();
            Forecast_xhours[1] = new Array();
            // entête de la liste pour avoir les labels des données restituées
            Forecast_xhours[1][0] = 0;
            Forecast_xhours[1][1] = "  Heure -   T° - % humidité - Vent - Tendance" ; // format du contenu de la liste
        
}
Répondre
#6
Super ! Merci pour votre aide et ces explications Eek-1e6fb 
Si je comprend bien le retour de la requête est récupéré dans l'objet "trame" qui est à utiliser dans le JS ?

Je n'arrive toujours pas à le faire fonctionner. J'ai découvert le listen dans LD mais c'est dommage qu'il n'y ai pas plus d'info de debug... soit j'ai juste un "Begin", soit un Unauthorized 401...
Voila ce que j'ai essayé :
Côté connecteur :

Adresse = https://api.worxlandroid.com/ // BASIC avec log + mdp
Resultat ==> 401

Adresse = https://api.worxlandroid.com/api/v2/product-items // BASIC avec log + mdp
Resultat ==> rien dans le listener (Begin) et connecteur "connecté" dans LD (enfin dans le listenener j'ai un "toto" "tata" qui tourne en boucle, celui que j'ai ajouté dans un eqpmt avec un ldprint)

Adresse = https://api.worxlandroid.com/api/v2/product-items // sans authentification
Resultat ==> rien dans le listener (Begin) et connecteur "connecté" dans LD Doh-23e2
 
Adresse = https://api.worxlandroid.com/api/v2/product-items // OAUTH tout rempli (sauf l’adresse de retour car je ne peut pas l'ajouter)
Resultat ==> Message "connection impossible" dans LD

Adresse = https://api.worxlandroid.com/ // OAUTH tout rempli (sauf l’adresse de retour car je ne peut pas l'ajouter)
Resultat ==> Message "connection impossible" dans LD

J'ai aussi essayé les variantes suivante avec les memes résultats :
https://api.worxlandroid.com/api/v2/
https://api.worxlandroid.com/api/

En conclusion ça ne marche que lorsque je met l’adresse complète dans le connecteur, avec ou sans authentification. Je me suis donc dis que j'allait essayer de faire passer l'authentification et le header via l'équipement. Ce que j'ai testé :

Eqpmt universel > Connecteur HTTP > Nouvelle commande > JS  avec le code suivant (mais il doit me manquer des objects et je ne connais pas la syntaxe pour transcrire un header http en js)


Code :
ldprint("header");
Accept= 'application/json';
Content-Type = 'application/json';
Authorization = 'Bearer' ;
Token = 'mon_token_récupéré_via_terminal_linux';


ldprint("lancement de la commande");
command= 'product-items';


du coup j'ai essayé de mettre les entêtes via le formulaire LD :

   

mais marche pas non plus (je n'ai qu'un begin dans le listener), il faudrait certainement ajouter une info d'authentification, genre le token mais je n'ai aucune idée comment faire et rien trouvé d'utile sur le net...)

Bref là je désespère Icon_thunder-20740


Que devrais-je obtenir dans le listener si ma requette fonctionne ? je devrais voir le json ?

En tout cas, merci de m'aider ça fait chaud au coeur Eek-1e6fb
Répondre
#7
ok on va essayer de desenmeler tout ça
j'ai regardé d'un peu plus près les programmes qui permettent de fonctionner avec ton équipement :  (que ce soir jeedom, openhab, domoticz, .... c'est pareil)

1 - il n'y a pas d'API officielle worx android, tous les programmes qui ont été écrit pour pouvoir dialoguer et piloter l'équipement sont des "reverse ingenierie" ==> ça veut dire que tu ne peux pas demander au constructeur worx android de fournir une API basée sur Oauth2 réglementée strictement par les normes de ce protocole, 
en l'occurence LD dans la séquence "Oauth2 - token" ne pourra pas fonctionner, il va manquer l'adresse du code retour dans la trame de dialogue entre l'API worx android et LD

2 - le fonctionnement simulé de la séquence via le connecteur et l'équipement ne peux pas récupérer le token directement, car ce dernier n'est pas transporté par le contenu de la trame json , mais dans les données d'entête ==> malheureusement LD ne permet pas d'accéder aux données d'entête (si tu regardes dans le listen , tu n'as que pas la trame d'entête disponible).

3 - à ce stade le seul moyen (que je connaisse) de reproduire la séquence de connexion et donc les étapes successives pour avoir - le token et le certificat - ce sera de faire un programme sur un serveur à côté, donc pas sur le serveur LD qui est fermé et ne permet pas ce type de code (en php ou python ou tout autre language qui va bien) qui permet d'accéder à toutes les infos et séquences , va récupérer le token et le certificat et les transmets à LD - CS via écoute-UniversalListen , une fois cette étape passée les infos stockées dans l'équipement , on pourra les utiliser comme si c'était LD qui les avaient récupérées.
Répondre
#8
j'ai un doute sur 1 point que je voudrais lever (avant de solliciter le support LD pour avancer sur cette partie qui bloque aussi dans d'autres API) pourrais-tu me donner en MP
username : login_application_LANDROID
Pswd : password_application_LANDROID
Client-secret : nCH3A0WvMYn66vGorjSrnGZ2YtjQWDiCvjg7jNxK
Client_id : 1
Répondre
#9
Merci beaucoup pour ton aide Eek-1e6fb .

Oui je suis tout à fait d'accord, il n'y a rien d'officiel, ce qui est fait c'est de la bidouille. Aujourd'hui j'ai un server ubuntu (accessible en SSH) sur lequel j'ai réussi à tout faire fonctionner (récupération du token, les 2 json synthétisant les infos du robot et les certificats permettant d'envoyer des requettes mqtt via mosquitto.

Après je pourrais très bien créer un script et le mettre dans un cron régulier pour récupérer les json pour, par la suite, les récupérer depuis la LD, mais je voulais essayer d'implémenter ça proprement pour que ce soit autonome sur la LD.

Que souhaitais-tu vérifier ? Je peux eventuellement t'éclairer.
Répondre
#10
je souhaitais faire un essai avec un paramétrage particulier et faire des copies d'écran des paramétrages et des retours afin de donner un exemple concret au support , afin qu'il puisse acter le problème .

pour ton implantation sur le serveur à côté , le mieux n'est pas de passer le json direct mais de passer les valeurs que tu veux afficher c'est plus simple et plus propre.

dans ce cas tu crées un connecteur écoute universelle et depuis ton programme tu envois les données sous la forme

http://IP_livedomus:8080/UniversalListen?nom_de_la_donnée_dans_LD=valeur_de_la_donnée&nom_de_la_donnée2_dans_LD=valeur_de_la_donnée2
Répondre


Sujets apparemment similaires...
Sujet Auteur Réponses Affichages Dernier message
  Connecteur API Deezer fransiouz 19 25,295 04-30-2020, 12:47 PM
Dernier message: Jlr
  parser le retour d'une commande initiale connecteur HTTP sud-domotique-expert 2 4,090 01-20-2020, 11:42 PM
Dernier message: sud-domotique-expert
  Demande d'aide Récupération de variable via request HTTP Torrent007 4 6,114 12-25-2019, 06:02 PM
Dernier message: Torrent007
  requette HTTP avec Header Domo 1 3,704 12-28-2018, 07:40 PM
Dernier message: Hsd
  requette http meije 10 12,644 12-12-2018, 09:40 PM
Dernier message: tonyb0t77
  connecteur bluetooth Domo-TIC 0 2,591 10-29-2018, 03:58 PM
Dernier message: Domo-TIC
  Envoyer un retour d'état via http johxx1 3 7,084 05-19-2018, 09:33 PM
Dernier message: johxx1
  Connecteur Synology Surveillance Station grichka 28 35,797 12-21-2017, 07:28 PM
Dernier message: jojo
  Cnx Chaudière via HTTP dts1 2 5,685 11-10-2017, 06:33 PM
Dernier message: dts1
  Requette HTTP Google Home vneil 2 7,218 10-01-2017, 04:07 PM
Dernier message: vneil



Utilisateur(s) parcourant ce sujet : 1 visiteur(s)