xPL.Arduino, émission de messages

Bonjour, nous avons traité dans l’article précédant la réception des messages xPL grace à la librairie xPL.Arduino. Nous allons donc voir maintenant comment émettre nous meme des messages sur le réseau.
Les sources de la librairie sont toujours accessibles sur google code et la version 0.2 est disponible dans la section download.

[adsGrandRectangleTexte]

Emission des messages xPL

Je ne reviens pas sur les déclarations et initialisations qui reste identique à l’exemple sur la réception. Passons directement à la constitution d’un message et son émission.

Il suffit pour cela de déclarer une variable de type xPL_Message et de remplir les différentes propriétés de celui-ci.

  • Le nombre de sauts, 1 par défaut puisque l’on va émettre un nouveau message.
  • Le vendor, device et instance, dans notre exemple xpl-arduino.test.
  • La target, « * » pour adresser le message à tous les acteurs du réseau xPL, sinon on peut préciser la cible.
  • Le shema, composé de la classe et du type.
  • Vient ensuite la dernière partie, l’ajout des commandes. Leur nombre dépend du shema du message xPL. Ici, on simule une sonde de température. L’id de la sonde est « 1 », son type « temp » et sa valeur courante « 22° »

Le message est finalement envoyé par la méthode SendMessage().

xPL_Message msg;

msg.hop = 1;
msg.type = XPL_TRIG;

msg.SetTarget_P(PSTR("*"));
msg.SetSchema_P(PSTR("sensor"), PSTR("basic"));

msg.AddCommand_P(PSTR("device"),PSTR("1"));
msg.AddCommand_P(PSTR("type"),PSTR("temp"));
msg.AddCommand_P(PSTR("current"),PSTR("22"));

xpl.SendMessage(&msg);

Voila vous pouvez maintenant intégrer facilement vos réalisations à base d’arduino dans votre réseau xPL.
C’est la première deuxième version de la librairie xPL.Arduino, d’autres évolutions viendront. N’hésitez pas à nous faire remonter les éventuels bugs ou évolution que vous souhaiteriez.

Vous aimerez aussi...

27 réponses

  1. Michael dit :

    Bonjour,
    pour la réception ça fonctionne mais pas pour l’émission. je ne trouve pas la fonction SendExternal dans les librairies, c’est normal ?
    j’utilise la version enc28j60 avec un arduino duemilanove.
    avec un logger, je n’ai ni le Hbeat, ni les messages temp (avec l’exemple).
    A+

    • Olivier dit :

      Bonjour,
      Désolé pour le temps de réponse, j’étais en plein déménagment 🙂

      SendExternal est un pointer de fontion, c’est à toi de le définir.
      Si tu regarde l’exemple « xPL_Send_enc28j60.ino », tu verras dans le setup la ligne :
      xpl.SendExternal = &SendUdPMessage;

      Cette ligne permet de dire à la librairie xPL d’utiliser la fonction « SendUdPMessage » (définie au début du sketch dans le meme exemple) à chaque appel de SendExternal.

      Cela permet de rendre la librairie indépendante du shield ethernet utilisé. On laisse à l’utilisateur la possibilité d’écrire sa fonction d’envoi de messages UDP en fonction de son matériel.
      ++

  2. Michael dit :

    oups, je vois bien les messages avec wireshark, ca fonctionne bien 🙂
    avec le logger xpl je ne les voyais pas car la carte reseau n’etait pas en promiscuous mode.
    ++

  3. Alexandre dit :

    Bonjour Olivier,

    Excellent travail et merci pour le partage!

    Cette librairie est bien pratique pour l’envoi de messages XPL! j’ai testé sur une Arduino UNO et pas de problème particulier sauf que j’ai du utilisé les dernières corrections apportées sur le svn du projet(donc > 0.2), le parser envoyait un mauvais format de données(testé avec le xPPL_Hub en C sous Linux et le controlleur ENC28J60). Peut-être qu’une release de version 0.3 serait nécessaire?

    • Olivier dit :

      Bonjour Alexandre,
      Merci. Oui effectivement je dois mettre à jour la version depuis un moment … je traine :/ et même le SVN avec un gros correctif que m’a envoyé un utilisateur.
      Je ferai un petit billet dès que ce sera en ligne.

      Content que ce soit utilisé 🙂

  4. Quentin dit :

    Bonjour pour ma part dans le message XPL j’aimerais remplacé la valeur mis en dur « 22 » par la valeur de mon capteur température Arduino.

    J’ai regardé dans le fichier xPL_Message.h et la valeur rentré est un char
    bool AddCommand_P(const PROGMEM char *,const PROGMEM char *);

    Sachant que la valeur de mon arduino est en float je dois faire une conversion dans mon programme directement ou modifier dans le .h et comment faire ?

    Cordialement Quentin

    • Olivier dit :

      Salut,
      Tu as une fonction qui fait ça dans ma libraire domotique -> http://code.google.com/p/connectingstuff/source/browse/trunk/Tools.cpp

      float floatValue = 19.3;
      char stringValue[10];

      // le résultat (prévoir un tableau avec assez d’espace), la valeur float, la précision souhaitée.
      ftoa(stringValue,floatValue, 2);

      msg.AddCommand(« current », stringValue);

      ++

      • Quentin dit :

        Ah je me demandais quel était la différence entre les AddCommand et et AddCOmmand_P je débute tous juste un projet Arduino-Domogik et je souhaite récupérer les valeurs de capteurs pour ensuite contrôler un relai .

        Merci pour cette réponse très rapide !

        • Olivier dit :

          AddCommand_P() (P pour PROGMEM) permet juste de mettre les chaines de caractères passées en argument en FLASH plutôt qu’en RAM pour gagner de la place en RAM.
          Si tu as des chaines statiques à passer il vaut mieux l’utiliser et si tu dois passer des variables, utilise AddCommand().

          Si tu utilise domogik je ne peux que te conseiller d’aller faire un tour sur le projet xplDuino 🙂

      • Patrick dit :

        Bonjour
        merci pour ce travail qui permet au débutant comme moi de commance avec la domotique
        mais j arrive pas à remplacer la valeur 22 par ma sone de température, j ai essayé avec AddCommand

  5. Ludo dit :

    Bonjour pour ma part je viens de commencer l’envoie de message xPL avec l’arduino et un problème se pose. Un message dont je ne comprends pas le sens est envoyé entre mes messages correctes.

    xpl-stat
    {
    hop=1
    source=xpl-arduino.test
    target=*
    }
    hbeat.app
    {
    interval=15
    port = 3865
    remote-ip=192.168.4.133
    version = 1.0
    }

    Je ne comprends pas du tout ce qu’il vient faire la, il est présent aussi bien sur la réception que sur l’émission des messages, et cette adresse est inconnue pour moi …

  6. Ludo dit :

    void xPL::SendHBeat()
    {
    last_heartbeat = millis();
    char buffer[XPL_MESSAGE_BUFFER_MAX];

    // sprintf_P(buffer, PSTR(« xpl-stat\n{\nhop=1\nsource=%s-%s.%s\ntarget=*\n}\n%s.%s\n{\ninterval=%d\n}\n »), source.vendor_id, source.device_id, source.instance_id, XPL_HBEAT_ANSWER_CLASS_ID, XPL_HBEAT_ANSWER_TYPE_ID, hbeat_interval);

    sprintf_P(buffer, PSTR(« xpl-stat\n{\nhop=1\nsource=%s-%s.%s\ntarget=*\n}\n%s.%s\n{\ninterval=%d\nport=3865\nremote-ip=192.168.4.133\nversion=1.0\n}\n »), source.vendor_id, source.device_id, source.instance_id, XPL_HBEAT_ANSWER_CLASS_ID, XPL_HBEAT_ANSWER_TYPE_ID, hbeat_interval);

    //(*SendExternal)(buffer);
    SendMessage(buffer);
    }

    Je viens de voir qu’il est envoyé par cette fonction mais je ne comprends toujours pas son utilisation

    • Olivier dit :

      Salut,

      Tu as utilisé la version corrigé par Laurent ?
      J’ai expliqué ça dans l’article sur l’émission (dans les commentaires).
      Il à changé le schéma du heartbeat de hbeat.basic vers hbeat.app dans lequel il y a plus d’infos.
      Dans la fonction SendHBeat(), je pense qu’il a mis en dur l’ip de son arduino et a oublié de corriger.

      Tu peux commenter le deuxième sprintf_P et décommenter le premier. Il vaut mieux utiliser le schéma hbeat.basic pour le matériel embarqué.

      Pour information, le heartbeat est un message envoyé toutes les x minutes pour prévenir les autres acteurs xPL qu’un nouveau matériel est sur le réseau ou qu’il est tjs en vie.

  7. Patrick dit :

    Bonsoir
    tout d abord merci pour le travail, mais je suis débutant et je narrive pas a remplacer la valeur « 22 » par la valeur de mon capteur, si je lis se qui est marqué plus il faut faire un tableau
    float floatValue = 19.3;
    char stringValue[10];
    msg.AddCommand(« current », stringValue);
    mais j ai essayé et sa me marque une erreur
    un peut d’aide serais la bienvenue
    merci

  8. Patrick dit :

    bonjour
    j’aurais besoin d’aide pour changer la valeur en dur « 22 » par une valeur de mon capteur
    je suis débutant merci par avance

  9. Jérémy dit :

    Bonjour,

    Merci bien pour cette librairy, je suis avec un shield original et une mega 2560, l’envoi se fait correctement, avec l’exemple tel quel.

    Par contre, moi aussi je n’arrive pas à modifier la valeur en dur « 22 ».
    J’utilise une photoresistance dont j’affiche la valeur sur le moniteur série (la valeur est bonne) :
    val = analogRead(sensorPin);
    Serial.print(« Luminosite : « );
    Serial.println(val);

    J’ai declaré les variables auparavant :
    int val = 0;
    int sensorPin = 0;

    A la compilation j’ai l’erreur :
    xpl.ino: In function ‘void loop()’:
    xpl:48: error: invalid conversion from ‘int’ to ‘char*’

    la ligne surligne est :
    msg.AddCommand_P(PSTR(« current »),val);

    J’ai essayé de mettre « char val » ou « char* val », mais j’ai la même erreur.

    Merci par avance

    • Olivier dit :

      Bonsoir,

      Tu essaies de passer un « int » à la fonction AddCommand_P qui ne prend en argument que des const PROGMEM char *.

      Il faut que tu utilise la fonction AddCommand(…) qui elle prend des char* et que tu transforme ton int en char* via la fonction itoa(). Ca devrait ressembler à ceci :

      int val = analogRead(sensorPin);
      char sVal[12];
      itoa(val, sVal, 10);
      msg.AddCommand(« current », sVal);

      ++

  10. Shuffle dit :

    Bonjour pourriez vous donnez des explications sur cette ligne
    « Le nombre de sauts, 1 par défaut puisque l’on va émettre un nouveau message. »
    Je ne comprends pas le réel intérêt de hop et en mettant un autre chiffre le résultat est le même pourrais je avoir un exemple d’utilisation avec un autre chiffre svp

    Cordialement Shuffle

    • Olivier dit :

      Salut,
      La variable hop est incrémentée à chaque passage d’un réseau à un autre, par exemple d’un réseau Ethernet à un bus RS485.
      Lorsque l’on émet un message, elle est égale à 1 (d’où la fameuse ligne), ensuite si le message passe d’un réseau à un autre elle est incrémenté.

      Cette variable sert à empêcher un message de faire des boucles indéfiniment. Il sera supprimé s’il atteint un hop=10 par exemple.
      Dans le cas où tu utilise seulement un réseau Ethernet, cette variable ne sert par vraiment, mais elle fait partie de la spécification.

  11. cyberdam dit :

    Bonjour

    J’ai essayé de faire marcher l’emission en xpl, ca fonctionne sauf quand je veux emmettre plusieurs type en meme temps , par ex : temp et battery.
    Comment peux-ton faire ?

    Merci

    • Olivier dit :

      Bonjour,

      Si vous vouez être conforme au schéma sensor.basic, vous devez envoyer deux messages distinc, chacun avec une donnée.
      Vous êtes obligé de créer deux variables de type xPL_Message car il n’y a pas de fonction pour réinitialiser un message à vide après l’envoi ou créer cette fonction.

      Il est aussi possible d’inclure les deux données dans le corp du message via un schéma « personnalisé » mais vous ne respecterez pas les schémas officiels et il faudra le gérer coté récepteur aussi.

  12. Frederic Plante dit :

    Bonjours, Je tentes d’envoyer un string dynamique qui n’est pas un nombre dans le

    msg.AddCommand

    Par example, je voudrais depuis le web afficher un message sur un écrant lcd 1,8pouse au besoin.

    Est-ce possible d’envoyer un message qui est du texte statique par la
    commande

    String MessduWeb;
    msg.AddCommand_P(PSTR(« Mess »),PSTR(MessduWeb));

    ???

    • Olivier dit :

      Bonjour,

      Je ne suis pas sûr de bien comprendre votre question mais si l’idée est de passer une variable dans le message, il faudra utiliser la fonction :

      AddCommand(char* _name, char* _value) (sans le _P) qui prend en argument deux chaines de caractères.

  13. Mael dit :

    Bonjour Olivier,
    Tout d’abord, merci pour ton travail sur cette librairie.

    Je cherche actuellement a envoyer en xPL ma teleinfo, mais il semblerait que ta librairie limite à 256 caractères la longueur d’un message.
    J’ai bien essayé de trafiquer un peu le truc, mais la fin de mes messages semblent toujours tronqués, et donc ne passent pas et ça bug.

    Si tu pouvais me dire ce qu’il faut modifier pour pouvoir faire passer un message plus long, je t’en serais infiniment reconnaissant.

    • Olivier dit :

      Salut Mael,
      Quel arduino utilise tu ? si c’est un UNO ou équivalent je pense que c’est un problème de mémoire. L’émission prend pas mal de mémoire et le UNO est assez limité.
      La solution je pense est d’envoyer les info en plusieurs message, un message par valeur par exemple.

  14. Mael dit :

    Pour le moment un Leonardo, mais bientôt un Mega.
    Je vais voir pour faire ça en plusieurs messages. J’espère que ça marchera comme ça.

    Merci pour ta réponse rapide.

  15. patrick dit :

    Bonjour
    je relance le sujet car j’arrive pas a voir mon arduino dans xpl logger j utilise l exemple fourni avec j ai bien mis mon adresse ip et celle du rfcomlan mais rien par contre j arrive a lire les messages xpl sur le moniteur serie quelqu’un aurais une idée merci

Laisser un commentaire

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