Messages : 10
Sujets : 1
Inscription : Mar 2017
Réputation :
0
Version de firmware du serveur: 1.4
04-29-2020, 09:23 PM
(Modification du message : 04-29-2020, 09:26 PM par Popovitch.
Raison de la modification: ajout screenshot en pj
)
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é :
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
Likes Received: 0 in 0 posts
Likes Given: 0
Messages : 123
Sujets : 11
Inscription : Oct 2017
Réputation :
0
Version de firmware du serveur: 3.0.149
Profil : Utilisateur
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..
Likes Received: 12 in 7 posts
Likes Given: 7
Messages : 10
Sujets : 1
Inscription : Mar 2017
Réputation :
0
Version de firmware du serveur: 1.4
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é ?
Likes Received: 0 in 0 posts
Likes Given: 0
Messages : 123
Sujets : 11
Inscription : Oct 2017
Réputation :
0
Version de firmware du serveur: 3.0.149
Profil : Utilisateur
Oui sauf omission c'est ca !
J'ai tatonné aussi pour y arriver donc mes connaissances sont limitées
Likes Received: 12 in 7 posts
Likes Given: 7
Messages : 544
Sujets : 42
Inscription : Dec 2019
Réputation :
0
Version de firmware du serveur: 2.1.148
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
}
Likes Received: 32 in 28 posts
Likes Given: 12
Messages : 10
Sujets : 1
Inscription : Mar 2017
Réputation :
0
Version de firmware du serveur: 1.4
04-30-2020, 11:15 AM
(Modification du message : 04-30-2020, 11:15 AM par Popovitch.)
Super ! Merci pour votre aide et ces explications
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
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
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
Likes Received: 0 in 0 posts
Likes Given: 0
Messages : 544
Sujets : 42
Inscription : Dec 2019
Réputation :
0
Version de firmware du serveur: 2.1.148
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.
Likes Received: 32 in 28 posts
Likes Given: 12
Messages : 544
Sujets : 42
Inscription : Dec 2019
Réputation :
0
Version de firmware du serveur: 2.1.148
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
Likes Received: 32 in 28 posts
Likes Given: 12
Messages : 10
Sujets : 1
Inscription : Mar 2017
Réputation :
0
Version de firmware du serveur: 1.4
Merci beaucoup pour ton aide .
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.
Likes Received: 0 in 0 posts
Likes Given: 0
Messages : 544
Sujets : 42
Inscription : Dec 2019
Réputation :
0
Version de firmware du serveur: 2.1.148
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
Likes Received: 32 in 28 posts
Likes Given: 12
|