L’art de communiquer en HTTP des données reçues par la Zibase7 minute(s) de lecture

Pour de multiples raisons on peut vouloir utiliser les données reçues via l’un des multiples protocoles gérés par la Zibase dans un système externe.  On peut vouloir faire en sorte par exemple que la Zibase communique à chaque réception de nouveau relevé de température ces données reçues vers un système tiers.  L’utilisation du protocole HTTP est pratique pour cela.  Il permet de ne pas avoir à installer de couche applicative intermédiaire entre ces 2 systèmes.  Il y a cependant quelques petites précautions à prendre…

Présentation

La Zibase permet de communiquer avec d’autres systèmes via Internet ou son réseau local en HTTP.  Cela permet d’utiliser un mode de communication informatique standard pour effectuer des choses qui ne le sont pas forcément…  Pourquoi faire cela?  Plusieurs raisons par exemple :

  • On utilise la Zibase en tant que serveur principal et on souhaite envoyer des données à des systèmes autres  afin par exemple de sauvegarder l’historique des relevés dans une base de donnée personnelle ou vers un système de gestion de données du Cloud.
  • On utilise la Zibase en tant que serveur principal et l’on doit envoyer des données vers des systèmes d’alertes tels que PushingBox.
  • On utilise la Zibase en tant que passerelle RF en exploitant l’un des points forts de cette box domotique à savoir la gestion de multiples protocoles et on souhaite communiquer ce relevé au système domotique principal

Mise en œuvre

Dans les scénarii de la Zibase tout se passe via l’utilisation de l’action “Fonctions Spéciales” => “Commander par HTTP”. Le paramétrage de cette action permet de spécifier l’adresse URL de la ressource à contacter pour par exemple déclencher une action sur le système distant ou bien afin de lui communiquer une donnée qu’il doit prendre en compte.

Cette URL peut être communiquée à l’action “Commander par HTTP”:

  • soit directement en la spécifiant dans la zone prévue à cet effet.
  • soit indirectement en affectant l’URL dans une variable “chaine de caractères” et en indiquant à l’action qu’elle doit se baser sur cette variable pour y trouver l’URL à contacter.

Si l’on spécifie l’URL directement

Si l’on spécifie l’URL directement dans la zone prévue à cet effet, l’URL est fixe. Elle ne peut pas varier.  Elle ne peut pas être créée dynamiquement pour permettre la communication d’éléments comme des relevés de températures par exemple. 

Si l’on spécifie l’URL indirectement: il faut faire appel à l’utilisation d’une variable

 

 

Si l’on utilise une variable intermédiaire pour renseigner l’URL elle peut être fixe ou dynamique.  On pourra communiquer au système distant des éléments comme des relevés de températures par exemple.  La longueur maximale d’une URL sera alors limitée à ce jour à 100 caractères.

Spécificités de l’utilisation des variables pour instruire une URL

L’URL peut être dynamique

L’utilisation d’une variable pour stocker une URL est très pratique.  Cela permet d’écrire une URL générique en faisant référence à des variables pour la générer à la volée lorsque le scénario sera exécuté.   La référence à la variable est lors remplacée par sa valeur.

Exemple:

Si la variable V0 = 12 et que l’URL contenue dans la variable V1 :

 V1 = http://toto.com?id=V0

Lorque le scénario est exécuté la variable V1 sera interprétée et cela donnera:

 V1 = http://toto.com?id=12

L’URL doit respecter les caractères réservés

Compte tenu du fait que la chaine de caractère que l’on renseigne en tant qu’URL sera interprétée pour que la Zibase remplace le code d’une variable par sa valeur il peut y avoir quelques surprises.  Si l’on doit utiliser dans l’URL des suites de lettres :

  • I0, I1, I2… à I41 elles seront remplacées par la valeur des variables de sondes correspondantes
  • V0, V1, V2… à V31 elles seront remplacées par la valeur des variables globales correspondantes
  • S0, S1, S2, … à S19 elles seront remplacées par la valeur des variables systèmes correspondantes

Ce remplacement arrive uniquement si dans l’URL les lettres I, V ou S sont suivies par les nombres cités respectivement ci-dessus.

Pour éviter ce remplacement on écrira l’URL en remplaçant la lettre I, V ou S par son code hexadécimal.  On remplacera donc :

  • I par %49
  • V par %56
  • S par %53

Exemple: 

Pour ecrire dans la variable V1 l’URL : http://toto.com?devid=V501206 

On écrira dans la variable V1 l’URL : http://toto.com?devid=%56501206 

L’URL qui sera utilisée sera http://toto.com?devid=%56501206 qui est une URL tout à fait valide.

Cela évite que la Zibase en utilisant le contenu de la variable V1 ne remplace les caractères V5 par la valeur de la variable V5…

Le stockage de données décimalisées dans des variables entières

Dans la mémoire de la Zibase les données numériques sont stockées en nombres entiers.  C’est à dire qu’un relevé de température de 22.3 degrés sera récupéré par la Zibase non pas sous le nombre 22.3 mais sous le nombre entier 223.  La Zibase ne connait pas les virgules.  Ce n’est pas un souci en tant que tel lorsque l’on utilise cette donnée à l’intérieur de la Zibase mais c’est plus gênant dès que l’on souhaite l’exporter.

Afin de communiquer ce relevé de température il peut être pratique de le faire en valeur décimalisée et non pas en nombre entier.  Voici comment faire pour retrouver la donnée avec sa décimale.

Admettons que l’on ait la valeur 223 dans la variable I0 de la Zibase on souhaite donc transmettre “22.3” dans la communication avec le système distant.  Il suffit de prendre le nombre 223 de repérer la partie entière de la garder dans une variable, de repérer la partie décimale de la garder dans une autre variable et de placer la virgule au bon endroit:

  • On prend 223 on le divise par 10.  Comme il n’y a pas de gestion de décimales lors du calcul par la Zibase on obtient 22. Le “3” des unités est perdu.  On garde se nombre bien au chaud dans une variable (V3 par exemple). Il représente la partie entière de notre température.
  • Si l’on re-multiplie ce nombre 22 par 10 on obtient sans surprises… 220.
  • En faisant la soustraction de notre nombre d’origine avec le chiffre obtenu par la multiplication de la partie entière *10 on obtient la partie décimale de notre température : 223 – (22 *10) = 223 -220 = 3! On garde ce nombre également dans une variable (V4 par exemple)

Lorsque l’on souhaite communiquer la température décimalisée il suffit alors d’utiliser la partie entière (V3) de lui accoler le séparateur décimal (le ‘.’ par exemple) et de lui rajouter la partie décimale (V4).

Exemple:

La température reçue par al Zibase dans la variable :

I0 = 223

On récupère dans la variable V3 la partie entière :

V3 = I0 /10

On récupère dans la variable V4 la partie décimale :

V4 = I0 – ((I0/10) * 10)

Pour gérer par la suite le cas de nombres négatifs on pourra préférer :

V4 = ABS(I0 – ((I0/10) * 10))

On aura avec l’utilisation des variables V3 et V4 à paramétrer  l’URL :

 http://toto.com?temp=V3.V4

L’URL contacté sera alors en réalité :

http://toto.com?temp=22.3

Concrètement dans un scénario voici ce que l’on obtient.

Conclusion

Vous voici mieux armé pour établir les discussions entre une Zibase et d’autres systèmes via HTTP.

Faites-en bon usage!

[modification du 18/04/2012] Il est maintenant possible d’utiliser des URL de plus de 100 caractères! [fin de la modification]

8 Comments

    • Avatar photo Hervé said:

      Merci MisterQuelleGoule 😉
      C’est en effet une belle illustration de ce que permet de faire la fonctionnalité HTTP.
      Merci pour le partage.

      17 avril 2012
      Reply
  1. Domotics said:

    Merci pour cet article très clair.
    Domotics

    17 avril 2012
    Reply
    • Avatar photo Hervé said:

      Je t’en prie. Il ne reste plus “que” l’augmentation de la taille de la chaine de caractères pour pouvoir utiliser des URL de taille > 100 caractères et ce sera parfait… Cette demande est quasiment prète chez Zodianet.

      17 avril 2012
      Reply
  2. bzhplus said:

    Merci, bel article de vulgarisation zibasienne.

    Pour moi, le soucis du moment, c’est la gestion des variables : j’en utilises 4 pour la gestion de 2 valeurs décimalisées (conso élec et température) et 7 pour les chaines de caractères dynamiques.

    Autre chose : dans ton exemple de gestion de la décimale de température, V4 peut être obtenue différemment en utilisant la fonction MOD n (reste positif de la division par n), ce qui donne V4 = I0MOD10. Cela fonctionne parfaitement chez oim.

    Bonne soirée

    17 avril 2012
    Reply
    • Avatar photo Hervé said:

      Je t’en prie.

      Il te faut utiliser l’action “commander par http”

      Ci c’est une donnée numérique cela ne pose pas trop de soucis. Dans le cas présent il s’agit d’une adresse IP donc d’une chaîne de caractères. La Zibase dans ce cas là ne retourne pas la valeur chaine de caractères lue mais… la valeur Ascii du premier caractère!

      Dans le XML de l’exemple du forum donné on a le lien suivant: http://monip.toolsit.fr/api?type=xml&loadpage
      En retour on a a quelque chose du style :


      127.0.0.1
      localhost

      La Zibase ne saura restituer que le code ascii du “1” de “127.0.0.1”. Ce qui ne t’avancera à … pas grand chose. C’est plus fait pour récupérer des données numériques…
      Pour obtenir cela il faut :

      • affecter dans un scénario à la variable V0 par exemple la chaine de caractère : response/ip
      • utiliser l’action “commander par http” en précisant l’URL = http://monip.toolsit.fr/api?type=xml&loadpage ET “lire en retour une variable balisée par :” puis sélectionner V0

      En retour, lorsque le script est exécuté, tu auras dans V0 ce fameux code ascii de la première “lettre” de ton adresse IP.

      16 janvier 2013
      Reply
  3. André said:

    Merci !

    Donc si je comprends bien, il m’est impossible de récupérer d’une façon ou d’une autre l’IP publique du réseau local sur lequel se trouve ma zibase ?

    17 janvier 2013
    Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain: * Time limit is exhausted. Please reload CAPTCHA.