Aller au contenu
flamalex

Requete HTTP pour modifier une variable globale

Recommended Posts

Bonjour à tous,

 

j’aurai besoin de vos lumières sur les requêtes http, lancées depuis un script sur jeedom (ou NAS) vers la hc3.  

je lance (depuis jeedom) une requete http pour modifier la variable d'un QA, ça fonctionne très bien

exemple: 

http://192.168.1.45/api/callAction?deviceID=182&name=setVariable&arg1=pluie_ds_lheure&arg2=oui

 

je souhaite le meme genre de requete http mais pour modifier une VG 

qu'est ce que je dois modifer dans la ligne ci dessus (http pour modifier une variableQA )  pour que ca fonction pour une variable Globale (VG), une idée?

 

je sais que ça va tourner autour de ceci

 

http://192.168.1.45/api/globalVariables

 j'ai essayé des choses comme ceci mais rien à faire

http://192.168.1.45/api/globalVariables?name=pluie_dans_lheure&value = non
http://192.168.1.45/api/globalVariables?name=pluie_dans_lheure&value="non"
http://192.168.1.45/api/globalVariables/"name":"pluie_dans_lheure","value":"non"
http://192.168.1.45/api/globalVariables/{pluie_dans_lheure},"value":"non"

Exemple:

si je rentre ceci comme requete

http://192.168.1.45/api/globalVariables/pluie_dans_lheure?"name":"pluie_dans_lheure","value":"non"

reponse:

{"name":"pluie_dans_lheure","value":"oui","readOnly":false,"isEnum":true,"enumValues":["non","oui"],"created":1667552153,"modified":1667552153}

 

j'ai la meme reponse en mettant la requete

http://192.168.1.45/api/globalVariables/pluie_dans_lheure

Partager ce message


Lien à poster
Partager sur d’autres sites

Quand tu ne sais pas et que ce n'est pas documenté, il faut regarder comment Fibaro fait, puisque toute l'interface Web de la HC3 passe par l'API HTTP.

 

Dans ton navigateur, il faut utiliser les outils de développement, normalement accessibles par la touche F12, puis aller dans l'onglet Réseau.

Ensuite tu fais ta modification de VG dans l'interface Web, et tu regardes en bas à quoi ressemble la requête, pour pouvoir le reproduire.
 

Déjà on voit que c'est une requête de type PUT (et non pas GET), donc les arguments ne doivent pas être passés dans l'URL de la requête, mais dans les données associées.

image.thumb.png.06cdd85213d20c2a4260e4a97c12dd56.png

 

Après avoir cliqué sur la requête, dans la fenêtre en bas à droite tu as l'onglet Requête avec le détail des données envoyées :

image.png.dc76aba2fbaa4b4cf1317e3fc602a4f6.png

 

Et pour info, dans l'onglet Réponse tu peux voir ce qui est attendu comme retour :

image.png.1d70a28404a7d143a63a1ec1a5f01457.png

 

Note le petit switch Texte brut qui permet de basculer entre la vue formatée du JSON et l'affichage en texte brut.

 

Dernière remarque :

  • La méthode GET c'est pour la lecture d'une variable globale
  • La méthode POST c'est pour la création d'une variable globale, donc uniquement la première fois
  • La méthode PUT c'est pour la modification d'une variable globale, donc toutes les fois suivantes
  • La méthode DELETE c'est pour la suppression d'une variable globale

Tout cela est conforme au standard CRUD mis en oeuvre de la plupart des API REST : https://fr.wikipedia.org/wiki/CRUD

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@Lazer, merci pour ce petit cours résumé (comme je les aime) sur F12 et les types de requêtes.

 

mais je reste toujours avec la question de l'authentification, même en local, la HC3 requiert une authentification, ici pour l'utilisation générale de l'API, ce devrait être le compte admin ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors là je ne sais pas.... comme je n'ai jamais modifié une variable globale via l'API depuis une machine externe, oui bien sûr il faudra s'authentifier, mais je ne sais pas s'il faut utiliser le compte admin, ou bien si un autre utilisateur peut le faire.

Le mieux c'est de tester, tu seras vite fixé.

Dans ma capture d'écran on voit que le code de retour attendu c'est 200, donc si c'est un code de la famille 4xx, ça sera surement une erreur d’authentification de type droits insuffisants.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui on revient au code de @Steven en 2015 pour la hc2

 
 * ----------------------------------------------
 * Modifie une variable existante
 * ----------------------------------------------
**/
function modify(name, value)
{
   var payload = "{\"name\" : \"" + name + "\", \"value\" : \"" + value + "\"}";

   var url = "http://" + HC2_IP + "/api/globalVariables/" + name;
   var options = {"headers": {"Authorization": "Basic " + Utilities.base64Encode("admin:pass007")}, 
    "Content-Type": "application/json", 
    "method":"put","payload": payload};

   UrlFetchApp.fetch(url, options);
} // modify()


dans le même esprit 

j’utilise dans un arduino qui vient modifier des VG dans la hc3, après avoir relevé les données de l’anémomètre.

 

d’une machine extérieure type jeedom, il faut passer en php et lancer script pour arriver au même résultat. 
 

 

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour, 

de l'exterieur, une requete http fait la mise à jour d'une variable globale  toutes les x secondes (exemple 2 secondes) 

puis je viens chercher cette VG à chaque changement de valeur (GEA -1) pour l'afficher dans un QA

 

ma HC3, n'est pas trop chargée pour le moment, puisque j'en suis toujours à la phase découverte

 

le fait d'envoyer requete sur HC3 toutes les x secondes et que le changement de valeur soit traité en instantané, cela a t il un impact sur la fiabilité de la HC3 (dans le temps)

est ce déconseillé ?

 

 

function config(GEA)
	-- ===================================================
	-- Configuration générale
	-- ===================================================
	GEA.debug = false
	GEA.portables = {57}
end

function setEvents()
	-- ==========================================================
	-- Règles utilisateur
	-- ==========================================================

local id = {
     QA_PUISS_INSTANTANE_PINCE1 = 185
	}

GEA.add ({"Global!", "PuissancePince1", 0},  -1, "",{{"QuickApp", id["QA_PUISS_INSTANTANE_PINCE1"],"actualise"}})
end

 

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

je vois que c'est pour dces pinces ampérométriques.

J'en utilise également pour monitorer le courant global de ma mison et faire du délestage (GEA = -1) de ma PAC si nécessaire.

Mais j'ai des pinces Z-Wave (AEON) qui remonte l'info (A) toutes les 2 sec. Ca va très bien.

Alors, je me pose la question, pourquoi passer par Jeedom ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Lol non jojo

jeedom c’est pour la pluie de meteo france 1h

avec un arduino je gère l’anémomètre et ici pinces, transfo tension.

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 6 heures, flamalex a dit :

le fait d'envoyer requete sur HC3 toutes les x secondes et que le changement de valeur soit traité en instantané, cela a t il un impact sur la fiabilité de la HC3 (dans le temps)

Le déclenchement instantané n'a aucun impact sur l'usure (c'est juste un CPU qui travaille), mais en revanche les écritures (modification de variable globale) ça use la mémoire flash.
Après, est-ce qu'en pratique la HC3 va mourir prématurément, c'est difficile à dire.... je pense qu'il faudrait vraiment y aller comme un goret pour cramer la flash, car le "disque" interne est comme un SSD, avec tous les algorithme de gestion de l'usure, répartition des écritures, etc, comme dans un PC normal (ou un téléphone, c'est pareil maintenant).

Ce qui n'est pas le cas d'une carte mémoire SD ou d'une clé USB (on se souvient de la clé USB recovery de la HC2 qui cramait toujours en premier)

Partager ce message


Lien à poster
Partager sur d’autres sites

oui c'est vrai, comme la SD du jeedom aussi

mais ici, si j'ai bien compris c'est bon (ok c'est le CPU qui encaisse)

à la fin, je devrai avoir 8 ou 10 VG qui seront ecrites toutes les 2 secondes (allé au pire 1 seconde)  par un arduino (via requete http)

Partager ce message


Lien à poster
Partager sur d’autres sites

ah oui j'oubliais sur ma ligne 

{"Global!", "PuissancePince1", 0},  -1, 

le "!" apres Global, veut bien dire "different de"  c'est bien ça?  ( si je note Global+ le symbole +, c'est superieur uniquement ou superieur ou egal?)

ici 0, mais alors si j'ai zero, il ne declenchera (-1) pas ?

existe t il une alternative type  "" ou "_"  ? (quelque chose à mettre à la place de 0, ou un superieur ou egale devant globale)

merci pour vos reponses

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Le CPU embarqué a 4 cœurs, ce n'est vraiment pas un problème sur la HC3, elle peut encaisser.

Perso avec ma box pas mal chargée (modules Z-Wave et QuickApps), ça oscille entre 3 et 15%, donc il reste de la marge.

 

Pour les écritures, 10 VG toutes les 2 secondes.... dis toi qu'avec certains modules Z-Wave type Wall Plug ça peut être bien plus que ça...

 

Pour GEA, tu peux résoudre le problème avec une comparaison {"Global+", "Puissance", -1}

Comme ça il déclenchera tant que la puissance varie en étant supérieure strictement à -1, ce qui sera toujours le cas.


Par contre... plusieurs déclenchements de GEA par seconde, tu nous diras ce que ça donne, niveau charge CPU ça va être intéressant à observer... en espérant que tu n'aies pas des latences de fou.

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 2 heures, jojo a dit :

je vois que c'est pour dces pinces ampérométriques.

J'en utilise également pour monitorer le courant global de ma mison et faire du délestage (GEA = -1) de ma PAC si nécessaire.

Mais j'ai des pinces Z-Wave (AEON) qui remonte l'info (A) toutes les 2 sec. Ca va très bien.

Alors, je me pose la question, pourquoi passer par Jeedom ?

J’avais pensé à l’aeon en effet, mais j’avais l’arduino qui tournait que pour l’anémomètre 

il me manquait juste 2 pinces et 1 mesure de tension. 

Partager ce message


Lien à poster
Partager sur d’autres sites

le GEA en RUN uniquement pour ce declenchement passe de 4% à 9% (et ma box est vide pour le moment) ça va craindre, 

apres la latence sur le reseau, si c'est de cette latence la dont tu fais reference, ras pour le moment

 

bien vu le -1  pour le Global+ thx :13:

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Non latence de GEA.... si trop de déclenchement instantanés, le temps de traiter les règles, ça ne sera plus instantané... tu pourras mesurer la latence, ça risque de dépasser la seconde à un moment donné... selon le nombre de règles.
Peut être qu'il sera judicieux de faire plusieurs instances GEA pour limiter les temps de traitement. Comme à l'époque sur HC2 firmware v4.

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah oui, j’ai un GEA « energy » spécifique pour cette application « monitoring photovoltaïque »

et un GEA « Alarme » spécifique pour mes déclenchement de barrières et capteurs optex  (push IPX) puis la gestion de l’ alarme visonic via ipx 

je fais bien de séparer les GEA

Partager ce message


Lien à poster
Partager sur d’autres sites

je m'en sort avec 1 GEA et des centaines de règles ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Je n'ai peut être pas été clair Jojo, mais ce n'est pas tant le nombre de règle qui compte que la fréquence des déclenchements instantanés (trigger)

Chaque trigger, c'est une instance de GEA qui démarre, filtre les règles avec -1, analyse les règles avec -1, et prend éventuellement les actions correspondantes aux règles qui matchent.

Si tu as 10 triggers par seconde, ça ne va pas bien se passer.


A l'inverse, si tu as 500 règles, dont 50 règles avec trigger, et que les trigger se déclenchent disons 1 fois toutes les 5 minutes, alors il n'y a aucun souci.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

oui sur HC2, j'etais déjà obligé de faire plusieurs GEA, pcq bcp de trigger -1 

si tout sous le meme GEA, il est vrai, comme l'expliquait Lazer, que l'on pouvait sentir une "hésitation" une latence 

ici  je découpe en plusieurs GEA par domaines qui ne devraient pas se télescoper

Partager ce message


Lien à poster
Partager sur d’autres sites

mon intuition de réserver les trigger (-1) à l'indispensable de l'instantané, n'tait donc pas si stupide : le reste (et donc beaucoup) est avec une durée de 0.

Je trouve sympa d'avoir tout centralisé en un endroit, car il aura toujours un cas où une règle aurait de bonnes raisons  de se trouver dans 2 GEA. Alors tant que c'est ok, ...

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 11/10/2022 à 9:36 PM, Lazer a dit :

I may not have been clear Jojo, but it's not so much the number of rules that counts as the frequency of instantaneous triggers (trigger)

Each trigger is an instance of GEA that starts, filters the rules with -1, analyzes the rules with -1, and possibly takes the actions corresponding to the rules that match.

If you have 10 triggers per second, it's not going to go well.


Conversely, if you have 500 rules, including 50 rules with triggers, and the triggers fire say once every 5 minutes, then there is no problem.

For a given event it becomes

<time to select relevant rule(s)> + <time to execute rule(s)>

time-to-execute may be hard to do something about, but If you have a lot of trigger rules, time-to-select will increase, even if the event doesn't trigger any rule at all.

It could be optimized by some smart hash-function with the event as the key and possible matching rules as the value, reducing the number of rules needed to be searched through and filtered.

 

Another thing about GEA as I understand it, is that it runs the non-trigger rules every 30s.

I guess that every 30s then there is a peak when all rules evaluate their tests - a peak that increase with the number of rules?

 

Here again, and it's a bit more complicated, one could analyze the rule tests when the rules are defined to see what events they depend on.

...and then only invoke the rules that have tests that depends on what events have happened the last 30s. (treating also time as an event...)

 

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×