Commande javascript & paramètres
#1
Bonsoir à tous !

Je rencontre un problème pour envoyer une commande en javascript à un connecteur IP que j'ai créé.
La connexion, aucun problème, l'envoi de la commande également puisqu'il me renvoie une réponse JSON que je parse, par contre j'aimerais envoyer des paramètres à la commande et là je ne trouve pas comment faire dans mon cas :

- j'ai créé 3 variables : p_hash, p_code & p_ts

- ma commande :

   

Le problème que j'ai c'est que je n'arrive pas à passer en paramètre la valeur de mes variables préalablement calculées.
J'ai essayé plusieurs formes, dont $(p_ts) qui fonctionnerait si j'étais en format "application/json" mais seul le "application/x-www-form-urlencoded" est supporté par mon équipement.

J'ai également essayé de créer un fichier .js que j’envoie dans le connecteur mais il n'affecte pas plus la valeur à la variable...

Vous auriez une idée ou vous pouvez m'éclairer s'il vous plait ?  01xx-9acf6

Merci beaucoup et belle soirée à vous
Répondre
#2
j'ai pas forcément compris ce que tu veux faire

tu veux passer dans ta ligne de commande une variable calculée ?
tu veux écrire une valeur calculée après retour de ta requête ?
tu veux stocker une valeur en même temps que tu passes une ligne de commande ?


ce que tu montres dans ta copie d'écran c'est la chose suivante :


tu créé une variable p_ts qui stocke le résultat du calcul  de ""+Math.floor(Date.now()/1000)   ==> j'ai déjà un gros doute sur cette syntaxe qui agrège du string et du numérique issue de format date ???
puis tu déclenches la commande "URL_connecteur"/open

tu ne peux pas exécuter du Date.now() dans ta ligne de commande , la partie haute est un interpréteur de logique et n’exécute pas de fonction système
si tu veux mettre quelque chose dans ta variable d'équipement p_ts , qui doit être déclarée dans l'équipement dans la partie variable (donc en String  ou double)
alors tu peux affecter comme cela p_ts = "une valeur"
je ne suis pas certains que Math.floor (xxx) soit executé dans cette partie , mais c'est peut-être possible


dans la commande "URL_connecteur"/open  POST tu as un argument   hash=$(p_hash)&identifier=5893&ts={p_ts} 
dans cette partie les variables sont du format $(variable)
donc la syntaxe sera : hash=$(p_hash)&identifier=5893&ts=$(p_ts)

tu peux mettre dans les entêtes Nom: content-type Valeur: application/json


je ne sais pas à quoi correspond hash=$(p_hash) ????
Répondre
#3
Merci pour ton aide Lol-161b

Je veux effectivement passer une variable calculée dans ma ligne de commande.

Concernant p_hash ça doit être un hmac256 en fonction :
- d'un code de partage (que je possède)
- et de ce fameux ts (= timestamp) qui est l'heure en cours au moment de l'envoi de la commande.
D'ailleurs j'aurai besoin de fonctions javascript pour calculer ce Hmac (le module "crypto-js") et j'ai vu que dans cette partie commande on ne peut pas faire de "require". Si j’envoie cette fonction dans le js du connecteur, elle pourra ensuite être appelée dans la commande ?

Mais d'abord, je veux déjà réussir à passer la variable calculée à ts puisque c'est le 1er retour du connecteur que j'ai :

J'ai donc adopté la syntaxe : hash=$(p_hash)&identifier=5893&ts=$(p_ts)

   

Et voici maintenant ce que j'ai dans le listener :

   

On voit donc bien que ma variable p_ts = 1584426812, et s'affiche correctement lors du ldprint. D'ailleurs quand on regarde le json de retour on voit que le timestamp attendu est proche de celui affiché.
Par contre le json indique qu'il reçoit une toute autre valeur (4282861759). La variable p_ts n'est donc pas passée correctement dans mes paramètres : hash=$(p_hash)&identifier=5893&ts=$(p_ts)

Ou j'ai loupé quelque chose ?
Répondre
#4
c'est pas du tout cuit Lol-161b 

comme le comportement du LD / CS n'est pas forcément que ce l'on attend, on est souvent (quasiment tout le temps) amené à tâtonner.

1 - si ce n'est déjà le cas déclare p_ts comme variable de l'équipement (donc enlève var p_ts et remplace par p_ts)
2 - dans la partie DS affiche le contenu de p_ts avec un widget component / Etat
3 - tu compares avec ce que te donne le ldprint et le retour dans le lsitener
4 - test en passant p_ts en double et string

ça va permettre de lever des doutes et de s'assurer du contenu, mais surtout de voir quel type de variable est affecté à p_ts et le contenu sous différentes formes

revient on verra la suite en fonction.
Répondre
#5
tu peux aussi ajouter dans la partie en-tête cache: no-cache

dans la partie paramètre tu as aussi la syntaxe suivante

{
"Hash" : $(p_hash),
"identidier" : "5893",
"ts" : $(p_ts)
}


je ne sais pas si ça peut jouer différemment

déjà si tu mets à la main à la place de p_ts une valeur correcte , regardes si ta réponse est code: 200 OK
Répondre
#6
Bien vu ! La variable p_ts est bien remplie :

   

   

   

Mais toujours pas envoyée dans les paramètres de la requête.

Comme tu l'as suggéré, j'avais essayé la syntaxe json :

{
"Hash" : $(p_hash),
"identidier" : "5893",
"ts" : $(p_ts)
}

mais l'équipement ne reconnaît pas ce format... et demande bien un format "hash=$(hash)&identifier=5893&ts=$(p_ts)"

J'ai testé avec succès cette méthode en python mais bon ça ne va pas m'être utile ici Bye2-2c12
Répondre
#7
si tu mets en dur la valeur du p_ts qu'est-ce ça donne ?
Répondre
#8
Si je la mets en dur, pas de soucis, il passe à la vérification du hash.
Et si je lui mets ensuite le hash en dur qui correspond au ts, il me renvoie que le timestamp est trop ancien puisque plus le même que l'heure au moment de l'envoi de la commande.
Répondre
#9
Enfin en la mettant en dur direct dans les paramètres genre : hash=$(hash)&identifier=5893&ts=1584447108

Mais si je la mets en dur dans la commande genre : p_ts = 1584447108, là ce n'est toujours pas transmis.

En fait j'ai peur que la récupération de la variable via l'instruction $(p_ts) ne fonctionne que par l'envoi de paramètre en format json...
Répondre
#10
si tu passes par une variable qui sera typée en numérique puis que lui affecte la valeur p_ts

dans la partie commande :

var temp_ts = 1;   ===> pour la forcer en numérique
p_ts = Math.floor(Date.now()/1000);  ==> calcul de la valeur
temp_ts = parseInt (p_ts);  ==> conversion en numérique de la valeur


puis dans les paramètres tu utilises $(temp_ts)
Répondre


Sujets apparemment similaires...
Sujet Auteur Réponses Affichages Dernier message
  Demande d'aide Commande led hue avec inter knx 889laurent 0 3,741 05-07-2019, 03:24 PM
Dernier message: 889laurent
  Commande plancher chauffant atena-ps 9 18,497 09-23-2017, 08:40 AM
Dernier message: Ives
  Copie équipement avec paramètres impossible? iHabitation 8 13,062 03-05-2015, 08:14 AM
Dernier message: tilleul



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