﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Catégorie Arduino / ESP API - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/client-api/arduino-esp-api/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/client-api/arduino-esp-api/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Thu, 19 Apr 2018 07:50:01 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.11</generator>

<image>
	<url>https://developer.myconstellation.io/wp-content/uploads/2016/02/256x256-e1457476015859.png</url>
	<title>Catégorie Arduino / ESP API - Constellation</title>
	<link>https://developer.myconstellation.io/client-api/arduino-esp-api/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Connecter un Arduino ou un ESP8266 à Constellation</title>
		<link>https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/</link>
					<comments>https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 19 Aug 2016 09:22:50 +0000</pubDate>
				<category><![CDATA[Guide de démarrage]]></category>
		<category><![CDATA[Arduino / ESP API]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[PushStateObject]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[Virtuel]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[WriteLog]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2342</guid>

					<description><![CDATA[<p>Vous pouvez connecter tout type d’objet ou système dans Constellation à partir du moment où vous disposez d’une connectivité IP pour réaliser des appels HTTP. Introduction Par exemple si vous disposez d’un Arduino il vous faudra un shield Ethernet ou</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">Connecter un Arduino ou un ESP8266 à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Vous pouvez connecter tout type d’objet ou système dans Constellation à partir du moment où vous disposez d’une connectivité IP pour réaliser des appels HTTP.</p>
<h3>Introduction</h3>
<p>Par exemple si vous disposez d’un Arduino il vous faudra un shield Ethernet ou Wifi bien que ces derniers ont été retirés du support Arduino.</p>
<p>Arduino propose en alternative des modèles déjà équipés d’une connectivité Ethernet et/ou Wifi comme le <a href="https://www.arduino.cc/en/Main/ArduinoMKR1000">MKR1000</a>, le <a href="https://www.arduino.cc/en/Main/ArduinoYunShield">Yun Shield</a> ou le <a href="https://www.arduino.cc/en/Main/ArduinoWiFiShield101">Wifi Shield 101</a>.</p>
<p align="center"><a href="https://www.arduino.cc/en/Main/ArduinoMKR1000"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-25.png" alt="image" width="240" height="145" border="0" /></a><a href="https://www.arduino.cc/en/Main/ArduinoYunShield"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-26.png" alt="image" width="225" height="145" border="0" /></a><a href="https://www.arduino.cc/en/Main/ArduinoWiFiShield101"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-27.png" alt="image" width="176" height="145" border="0" /></a></p>
<p align="left">En alternative vous avez les ESP8266 que j’ai <a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/">pu vous présenter sur mon blog personnel</a>.</p>
<blockquote>
<p align="left">Ce microcontrôleur est cadencé à 80Mhz par un processeur 32bits RISC avec 96K de RAM et une mémoire flash de 512Ko à 4Mo selon les modèles.</p>
<p align="left">Il dispose d’une connectivité Wifi 802.11 b/g/n supportant le WEP, WPA/2/WPS et réseau ouvert et 16 GPIO dont le support du SPI, I²C, UART et un port ADC (pour les I/O analogiques).</p>
</blockquote>
<p align="center"><a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-22.png" alt="image" width="204" height="132" border="0" /></a></p>
<p align="left">Vous trouverez différents modèles sur internet, comme ceux produit par AI-Thinker mais il faudra réaliser vous même la carte de programmation comme <a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/#prettyPhoto">je l’explique sur mon blog</a> ou bien des modules “tout en un” comme ceux d’<a href="https://www.adafruit.com/product/2821">Adafruit</a> ou <a href="https://www.sparkfun.com/products/13231">Sparkfun</a> disposant d’un port USB intégré pour une programmation facile :</p>
<p align="center"><a href="https://www.adafruit.com/product/2821"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-28.png" alt="image" width="240" height="185" border="0" /></a> <a href="https://www.sparkfun.com/products/13231"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-29.png" alt="image" width="231" height="185" border="0" /></a></p>
<p align="left">Si vous débutez je vous recommande la Wemos D1 Mini qui intègre un ESP8266 avec 4M de mémoire Flash, 11 I/O digitales et 1 analogique (ADC) ainsi qu’une interface USB le tout pour moins de 5€ :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/mini_v2.jpg"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="mini_v2" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/mini_v2_thumb.jpg" alt="mini_v2" width="305" height="211" border="0" /></a></p>
<p align="left">Pour bien comprendre les ESP8266, je vous recommande une nouvelle fois mon article <a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/#prettyPhoto"><strong>Découverte des ESP8266 : le microcontrôleur connecté par Wifi pour 2€ au potentiel phénoménal avec Constellation</strong></a></p>
<p align="left">Le plus important étant que les ESP8266 peuvent être programmés comme les Arduino avec l’IDE Arduino.</p>
<h3 align="left">Arduino/ESP8266 = package virtuel</h3>
<p>Ce <a href="/concepts/sentinels-packages-virtuels/">concept a déjà été abordé ici</a>. En clair le micro-programme d’un Arduino ou d’un ESP est stocké dans la puce elle même et il n’y a pas de concept de “processus” sur ce genre de device. Il n’est donc pas possible d’avoir une véritable sentinelle qui tourne ce genre d’objet pour déployer et superviser des packages Constellation à la volée comme sur un système Windows ou Linux.</p>
<p>C’est pour cela qu’on parle de sentinelle et de package “<strong>virtuel</strong>” : on déclare bien dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/">configuration de notre Constellation</a> une sentinelle (par exemple nommée “Arduino” et associée à un credential) et contenant un package (par exemple nommé  “TemperatureSensor”). Ce package peut être joint à des groupes et avoir des settings qui lui sont propres.</p>
<p>Dans le microprogramme téléversé sur votre Arduino/ESP vous allez vous connecter en spécifiant le nom de la sentinelle et du package virtuel (ici Arduino/TemperatureSensor) et la clé d’accès associée. Votre device sera alors connecté à Constellation comme étant le package “TemperatureSensor” sur la sentinelle “Arduino”. Comme n&rsquo;importe quel package il pourra produire des logs, publier des StateObjects, récupérer ses settings, envoyer ou recevoir des messages ou encore consommer les StateObjects d’autres packages.</p>
<p>Techniquement parlant l’Arduino/ESP utilise <a href="/client-api/rest-api/interface-rest-constellation/">l’API REST “Constellation”</a>.</p>
<h3>Installer la librairie Constellation dans l’IDE Arduino</h3>
<p>Ouvrez le « Gestionnaire de bibliothèque » dans le menu « <i>Croquis &gt; Inclure une bibliothèque &gt; Gérer les bibliothèques</i> » :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/12/image-2.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/12/image_thumb-2.png" alt="image" width="450" height="274" border="0" /></a></p>
<p>Avec le moteur de recherche, recherchez le terme « <i>ArduinoJson</i> » :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/12/image-3.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/12/image_thumb-3.png" alt="image" width="450" height="253" border="0" /></a></p>
<p>Vous trouverez lors la bibliothèque « ArduinoJson » de Benoit Blanchon (dépendance de la librairie Constellation) ainsi que la librairie Constellation.</p>
<p>Pour ces deux bibliothèques, cliquez sur le bouton « Installer » (ou « Mise à jour » si la librairie est déjà installée).</p>
<h3>Hello World, Hello Constellation</h3>
<p>Commencez par créer un nouveau sketch et ajoutez la librairie Constellation :</p>
<p></p><pre class="crayon-plain-tag">#include &lt;Constellation.h&gt;</pre><p></p>
<p>Vous pouvez maintenant déclarer le client “Constellation” en l’initialisant avec l’adresse (IP ou DNS) de votre serveur Constellation, le port et les informations de connexion de Constellation, c’est à dire le nom de votre sentinelle et package ainsi que la clé d’accès que vous aurez déclarés sur votre serveur :</p>
<p></p><pre class="crayon-plain-tag">Constellation&lt;WiFiClient&gt; constellation("IP or DNS du serveur constellation", 8088, "MyVirtualSentinel", "MyVirtualPackage", "123456789");</pre><p></p>
<p>Pour ajouter <a href="/constellation-platform/constellation-console/gerer-sentinelles-avec-la-console-constellation/#Ajouter_une_sentinelle">une sentinelle virtuelle</a> cliquez sur le bouton “Add sentinel” sur la page “Sentinels” de la Console Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-61.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-50.png" alt="image" width="350" height="111" border="0" /></a></p>
<p align="left">Puis ajoutons un <a href="/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/#Les_packages_virtuels">package virtuel</a> en cliquant sur le bouton contextuel de notre sentinelle “Deploy package” ou directement depuis la package “Packages” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-62.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-51.png" alt="image" width="350" height="124" border="0" /></a></p>
<p align="left">Déclarez ensuite le nom de votre package, ici “MyVirtualPackage” utilisant la même clé que celle définie au niveau de la sentinelle :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-63.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-52.png" alt="image" width="350" height="143" border="0" /></a></p>
<p>Vous remarquerez que dans la déclaration du client Constellation nous avons spécifié dans le template de la classe Constellation le type de notre client réseau, qui dans le cas d’un ESP8266 ou d’un Arduino MKR1000 est “WifiClient”.</p>
<p>N’oubliez pas d’ajouter les librairies de votre client réseau, quelques exemples :</p>
<p></p><pre class="crayon-plain-tag">/* Arduino Wifi (ex: Wifi Shield) */
#include &lt;SPI.h&gt;
#include &lt;WiFi.h&gt;

/* Arduino Wifi101 (for WiFi Shield 101 and MKR1000 board) */
#include &lt;SPI.h&gt;
#include &lt;WiFi101.h&gt;

/* Arduino Ethernet */
#include &lt;SPI.h&gt;
#include &lt;Ethernet.h&gt;

/* ESP8266 Wifi */
#include &lt;ESP8266WiFi.h&gt;</pre><p></p>
<p>Au démarrage du programme, nous allons d’abord connecter votre client réseau sur le réseau. Dans le cas d’un ESP8266, on se connecte au réseau Wifi de cette façon :</p>
<p></p><pre class="crayon-plain-tag">void setup(void) {
  Serial.begin(115200);

  // Connect to Wifi  
  WiFi.begin("MY-SSID", "MY-WIFI_KEY");  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // For WiFi101, wait 10 seconds for connection!
  // delay(10000);

  Serial.println("WiFi connected. IP: ");
  Serial.println(WiFi.localIP());
}</pre><p></p>
<p>Une fois connecté au réseau, on peut utiliser les méthodes de la librairie Constellation.</p>
<p>Par exemple, produisons un log avec la méthode “WriteInfo” :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeInfo("Hello Constellation");</pre><p></p>
<p>Cette méthode gère nativement le formatage “à la printf”, par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeInfo("Hello Constellation, I'm '%s !", constellation.getSentinelName());</pre><p></p>
<p>Notez que vous pouvez produire de la même façon des messages de type “Info”, “Warning” ou “Error” :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeInfo("This is an information"); 
constellation.writeWarn("This is a warning"); 
constellation.writeError("This is an error");</pre><p></p>
<p>Bien entendu, comme n’importe quel package, les logs sont remontés en temps réel dans la Constellation ce qui permet à n’importe quel “contrôleur” de voir les logs de votre Arduino/ESP en temps réel.</p>
<p>Par exemple, en ouvrant la Console Constellation on pourra suivre votre Arduino/ESP en temps réel :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-37.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-26.png" alt="image" width="425" height="118" border="0" /></a></p>
<h3>Accès aux settings</h3>
<p>Tous les settings des packages de votre Constellation sont déclarés depuis <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Les_parametres_de_configuration">le fichier de configuration</a> de votre Constellation. Vous pouvez aussi utiliser la <a href="/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/#Editer_les_settings_dun_package">Console Constellation pour les administrer</a>.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-68.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-57.png" alt="image" width="230" height="118" border="0" /></a> <a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-69.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-58.png" alt="image" width="240" height="118" border="0" /></a></p>
<p align="left">Dans votre code Arduino, vous devez utiliser la méthode “getSettings” pour récupérer un objet JSON contenant les settings (clé/valeur).</p>
<p></p><pre class="crayon-plain-tag">JsonObject&amp; settings = constellation.getSettings();</pre><p></p>
<p align="left">Par exemple pour récupérer la valeur du setting “MonChiffre” déclarée sur le serveur à 42 :</p>
<p></p><pre class="crayon-plain-tag">JsonObject&amp; settings = constellation.getSettings();
static int monChiffre= settings["MonChiffre"].as&lt;int&gt;()</pre><p></p>
<p align="left">La variable “monChiffre” sera donc affectée à la valeur “42”. Dans l’exemple ci-dessus, la variable est statique pour pouvoir être utilisée n’importe où dans votre code.</p>
<p align="left">Pour les chaines de caractères vous pouvez utiliser la classe “String” :</p>
<p></p><pre class="crayon-plain-tag">JsonObject&amp; settings = constellation.getSettings();
static String strMaChaine = String(settings["MaChaine"].as&lt;char *&gt;());</pre><p></p>
<p>Encore une fois la variable est statique pour pouvoir l’utiliser n’importe où dans votre code.</p>
<p>Si vous devez convertir votre chaîne de caractères en <em>const char *</em>, vous pouvez utiliser la fonction <em>c_str()</em> :</p>
<p></p><pre class="crayon-plain-tag">const char* maChaine = strMaChaine.c_str();</pre><p></p>
<p>Vous pouvez également tester la présence d&rsquo;un setting avec la méthode « containsKey » :</p>
<p></p><pre class="crayon-plain-tag">if(settings.containsKey("MySetting")) {  
  // Do something with settings["MySetting"]  
}</pre><p></p>
<p>Par exemple vous pouvez gérer les valeurs par défaut. Imaginez un code où la valeur d&rsquo;un timeout est de 5 secondes par défaut mais vous vous laissez la possibilité de surcharger cette variable depuis les settings Constellation :</p>
<p></p><pre class="crayon-plain-tag">// Default value
int timeout = 5; // sec

setup() {
  // .....
  JsonObject&amp; settings = constellation.getSettings();
  if(settings.containsKey("Timeout")) {  
    timeout = settings["Timeout"].as&lt;int&gt;();
  }
}

void loop() {
   // DO something with 'timeout'
}</pre><p></p>
<p>Si le setting « Timeout » est défini dans les settings de votre package sur Constellation, la variable « timeout » sera affectée à votre valeur, autrement, si le setting n&rsquo;existe pas, la valeur de cette variable sera de 5.</p>
<h3>Publier des StateObjects</h3>
<p>Pour produire et publier un StateObject dans votre Constellation vous devez invoquer la méthode “pushStateObject” :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject(name, value);</pre><p></p>
<p>Vous pouvez aussi passer le “type” de votre StateObject :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject(name, value, type);</pre><p></p>
<p>Notez que pour les types simples (int,bool, long, float et double) le type est spécifié implicitement.</p>
<p>Par exemple, pour publier un StateObject dont la valeur est un chiffre :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("Temperature", 21);</pre><p></p>
<p>Vous pouvez aussi publier des StateObject avec un objet complexe en utilisant la fonction “stringFormat” pour formater votre valeur en JSON.</p>
<p>Par exemple pour publier un StateObject nommé “Lux” étant un objet contenant 3 propriétés :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("Lux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir));</pre><p></p>
<p>Vous pouvez également faire la même chose en construisant un “JsonObject” :</p>
<p></p><pre class="crayon-plain-tag">StaticJsonBuffer&lt;200&gt; jsonBuffer;
JsonObject&amp; root = jsonBuffer.createObject();

root["Lux"] = lux;
root["Broadband"] = full;
root["IR"] = ir;
constellation.pushStateObject("Lux", &amp;root);</pre><p></p>
<p>Une fois vos StateObjects publiés, ils sont accessibles en temps réel aux autres packages et consommateurs de votre Constellation. Vous pouvez également utiliser le “StateObject Explorer” de la Console Constellation pour explorer tous les StateObjects de votre Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-70.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-59.png" alt="image" width="240" height="181" border="0" /></a></p>
<h3>Next steps</h3>
<ul>
<li><a href="/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/">Publier des StateObjects</a></li>
<li><a href="/client-api/arduino-esp-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-depuis-arduino-esp/">Envoyer des messages</a></li>
<li><a href="/client-api/arduino-esp-api/recevoir-des-messages-et-exposer-des-methodes-messagecallback-sur-arduino-esp/">Recevoir des messages</a></li>
<li><a href="/client-api/arduino-esp-api/consommer-des-stateobjects-depuis-arduino-esp/">Consommer des StateObjects</a></li>
<li><a href="/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/">Connectez vos ESP8266 à Constellation en Lua avec NodeMCU</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">Connecter un Arduino ou un ESP8266 à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Produire des StateObjects depuis un Arduino/ESP</title>
		<link>https://developer.myconstellation.io/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/</link>
					<comments>https://developer.myconstellation.io/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 23 Aug 2016 13:17:28 +0000</pubDate>
				<category><![CDATA[Arduino / ESP API]]></category>
		<category><![CDATA[PushStateObject]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[StateObject]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2455</guid>

					<description><![CDATA[<p>Publication de valeur “simple” Pour produire et publier un StateObject dans votre Constellation vous devez invoquer la méthode “pushStateObject” en spécifiant au minimum le nom du StateObject et sa valeur : [crayon-69705ce117857437877540/] Vous pouvez aussi spécifier “type” de votre StateObject</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/">Produire des StateObjects depuis un Arduino/ESP</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Publication de valeur “simple”</h3>
<p>Pour produire et publier un StateObject dans votre Constellation vous devez invoquer la méthode “pushStateObject” en spécifiant au minimum le nom du StateObject et sa valeur :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject(name, value);</pre><p></p>
<p>Vous pouvez aussi spécifier “type” de votre StateObject :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject(name, value, type);</pre><p></p>
<p>Notez que pour les types simples (int,bool, long, float et double) le type est spécifié implicitement. Par exemple, pour publier un StateObject dont la valeur est un chiffre :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("Temperature", 21);</pre><p></p>
<p>Vous pouvez aussi spécifier le “lifetime” de votre StateObject, c’est à dire sa durée de vie (en seconde) avant qu’il soit considéré comme “expiré”. Par exemple si votre valeur de T° (variable ‘temp’) est considérée comme valide que 60 secondes, on écrira :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("Temperature", temp, 60);</pre><p></p>
<p>En ouvrant le “StateObject Explorer” de la Console Constellation vous retrouverez votre StateObject :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-2.png"><img class="colorbox-2455"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-2.png" alt="image" width="350" height="251" border="0" /></a></p>
<p style="text-align: left;" align="center">Si le StateObject n&rsquo;est pas mis à jour dans les 60 secondes il sera marqué comme expiré.</p>
<h3>Publication de valeur “complexe”</h3>
<h4>Avec un “string format”</h4>
<p>Vous pouvez publier des StateObject avec un objet complexe en utilisant la fonction “stringFormat” pour formater votre valeur en JSON. Par exemple pour publier un StateObject nommé “Lux” étant un objet contenant 3 propriétés, on pourrait écrire :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("Lux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir));</pre><p></p>
<h4>Avec un JsonObject</h4>
<p>Vous pouvez également faire la même chose en créant un JsonObject de la façon suivante :</p>
<p></p><pre class="crayon-plain-tag">StaticJsonBuffer&lt;JSON_OBJECT_SIZE(3)&gt; jsonBuffer;
JsonObject&amp; myStateObject = jsonBuffer.createObject();
myStateObject["Lux"] = lux;
myStateObject["Broadband"] = full;
myStateObject["IR"] = ir;
constellation.pushStateObject("Lux", myStateObject);</pre><p></p>
<p>Sur l’explorateur de StateObjects de la Console :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-3.png"><img class="colorbox-2455"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-3.png" alt="image" width="350" height="252" border="0" /></a></p>
<h3>Définir la durée de vie de votre StateObject</h3>
<p>Comme pour une valeur simple, vous pouvez également spécifier un “type” et le “lifetime” de votre StateObject. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("DemoLux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir), "MyLuxData", 20);</pre><p></p>
<p>Ou en utilisant le JsonObject “myStateObject” créé ci-dessus :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("DemoLux", myStateObject, "MyLuxData", 20);</pre><p></p>
<p>Dans les deux cas nous avons publié un StateObject nommé “DemoLux” de type “MyLuxData” avec une durée de vie de 20 secondes contenant comme valeur un objet avec trois propriétés (Lux, Broadband et IR).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-4.png"><img class="colorbox-2455"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-4.png" alt="image" width="350" height="140" border="0" /></a></p>
<h3>Décrire ses types complexes</h3>
<p>Lorsque vous utilisez des types personnalisés (ici “MyLuxData”) il vivement recommandé de les décrire dans le “<a href="/concepts/messaging-message-scope-messagecallback-saga/#Auto-description_des_MessageCallbacks">Package Descriptor</a>”.</p>
<p>Pour ce faire, au démarrage, invoquez la méthode “addStateObjectType” pour chaque type à déclarer puis appelez la méthode “declarePackageDescriptor” pour envoyer le “Package Descriptor” dans la Constellation.</p>
<p>Dans notre exemple nous écrirons :</p>
<p></p><pre class="crayon-plain-tag">// Describe your custom StateObject types  
constellation.addStateObjectType("MyLuxData", TypeDescriptor().setDescription("MyLuxData demo").addProperty("Broadband", "System.Int32").addProperty("IR", "System.Int32").addProperty("Lux", "System.Int32")); 

// Declare the package descriptor
constellation.declarePackageDescriptor();</pre><p></p>
<p>Vous remarquerez que le type “MyLuxData” est surligné vous permettant d’afficher le descriptif de votre StateObject :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-5.png"><img class="colorbox-2455"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-5.png" alt="image" width="350" height="124" border="0" /></a></p>
<h3>Ajout de metadatas</h3>
<p>Pour finir vous pouvez également ajouter des méta-données sur vos StateObjects.</p>
<p>Par exemple ajoutons l’ID de la puce ESP (ChipID) et le timestamp (millis) dans les méta-données de notre StateObject :</p>
<p></p><pre class="crayon-plain-tag">const int BUFFER_SIZE = JSON_OBJECT_SIZE(6);
StaticJsonBuffer&lt;BUFFER_SIZE&gt; jsonBuffer;
JsonObject&amp; myStateObject = jsonBuffer.createObject();
myStateObject["Lux"] = lux;
myStateObject["Broadband"] = full;
myStateObject["IR"] = ir;
JsonObject&amp; metadatas = jsonBuffer.createObject();
metadatas["ChipId"] = ESP.getChipId();
metadatas["Timestamp"] = millis();
constellation.pushStateObject("Lux", myStateObject, "MyLuxData", 20, &amp;metadatas);</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-6.png"><img class="colorbox-2455"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-6.png" alt="image" width="254" height="321" border="0" /></a></p>
<p>Note : dans ce dernier exemple vous remarquerez que nous avons défini la taille du buffer JSON (<em>BUFFER_SIZE</em>) à “JSON_OBJECT_SIZE(6)”, c’est à dire 6 propriétés et non 3 comme dans les exemples précédents de façon à tenir compte des propriétés JSON rajoutées par les metadatas (l’objet “Metadatas” lui même et ses deux propriétés “ChipId” et “Timestamp”). Pour plus d’info, consultez la documentation d’<a href="https://github.com/bblanchon/ArduinoJson/wiki">ArduinJson</a> et plus particulièrement l’article concernant <a href="https://github.com/bblanchon/ArduinoJson/wiki/Memory%20model">la gestion de la mémoire</a>.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/">Produire des StateObjects depuis un Arduino/ESP</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Envoyer des messages et invoquer des MessageCallbacks depuis un Arduino/ESP</title>
		<link>https://developer.myconstellation.io/client-api/arduino-esp-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-depuis-arduino-esp/</link>
					<comments>https://developer.myconstellation.io/client-api/arduino-esp-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-depuis-arduino-esp/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 23 Aug 2016 13:20:13 +0000</pubDate>
				<category><![CDATA[Arduino / ESP API]]></category>
		<category><![CDATA[Message]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Saga]]></category>
		<category><![CDATA[SendMessage]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[ESP]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2461</guid>

					<description><![CDATA[<p>Envoyer des messages Pour envoyer des messages et invoquer des méthodes (MessageCallbacks) d’autres packages (ou consommateurs, pages Web, apps mobile, etc… ), vous pouvez utiliser la méthode “sendMessage” : [crayon-69705ce117cb5690244735/] C’est une fonction “variadic“ qui peut prendre plusieurs arguments qui</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-depuis-arduino-esp/">Envoyer des messages et invoquer des MessageCallbacks depuis un Arduino/ESP</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Envoyer des messages</h3>
<p>Pour envoyer des <a href="/concepts/messaging-message-scope-messagecallback-saga/">messages et invoquer des méthodes (MessageCallbacks)</a> d’autres packages (ou consommateurs, pages Web, apps mobile, etc… ), vous pouvez utiliser la méthode “sendMessage” :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(scope, args, messageKey, data);</pre><p></p>
<p>C’est une fonction “variadic“ qui peut prendre plusieurs arguments qui seront utilisés pour formater le contenu (data) du message :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(scope, args, messageKey, data, ...);</pre><p></p>
<p>Par exemple pour envoyer un message “DemoMessage” avec en contenu un objet contenant deux propriétés (c’est à dire invoquer le MessageCallback “DemoMessage” en passant en paramètre un objet à deux propriétés) au package “MyCsharpPackage“ :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(Package, "MyCsharpPackage", "DemoMessage", "{ A: '%s', B: %d  }",  myStringVal, myIntVal);</pre><p></p>
<p>Autre exemple : envoyer un message “SignalReceive” au groupe “IR” (dans lequel plusieurs packages ou consommateurs peuvent s’inscrire) avec en paramètre une valeur de type ”long” formatée en hexadécimal :</p>
<p></p><pre class="crayon-plain-tag">unsigned long value = results.value; // the IR signal decoded
constellation.sendMessage(Group, "IR", "SignalReceive", "%#x", value);</pre><p></p>
<h4>Le scope</h4>
<p>Le scope permet de définir les destinataires du message (<a href="/concepts/messaging-message-scope-messagecallback-saga/">plus d’information ici</a>).</p>
<p>Dans la libraire Arduino/SP, l’argument Scope est une énumération définie de la façon suivante :</p>
<p></p><pre class="crayon-plain-tag">enum ScopeType : uint8_t {
  None = 0,
  Group = 1,
  Package = 2,
  Sentinel = 3,
  Other = 4,
  All = 5
};</pre><p></p>
<p>L’argument “args” spécifie les arguments du scope, par exemple le ou les noms des packages, des sentinelles ou des groupes où envoyer le message. Pour cibler une instance d’un package vous spécifierez le nom de l’instance complet “SENTINEL/Package” (<a href="/concepts/messaging-message-scope-messagecallback-saga/">plus d’information ici</a>).</p>
<p>Si vous avez plusieurs “args” vous devez les séparer par des virgules. Par exemple pour envoyer un message “HelloWorld” au groupe A et au groupe B :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(Group, "A,B", "HelloWorld", "{}");</pre><p></p>
<h4>Le contenu (Data) du message</h4>
<p>Dans la <a href="/concepts/messaging-message-scope-messagecallback-saga/">philosophie des MessageCallbacks</a>, le contenu du message (Data) permet de stocker les arguments d’une fonction (MessageCallback) à invoquer.</p>
<p>Si vous invoquez un MC sans paramètre, vous devez spécifier un objet vide “{}” :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(Package, "DemoPackage", "HelloWorld", "{}");</pre><p></p>
<p>Si vous avez plusieurs paramètres à passer, vous formaterez vos arguments dans un tableau :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(Package, "DemoPackage", "SayHello", "[ 'Sebastien', 'Warin' ]");</pre><p></p>
<p>Vous pouvez également envoyer en tant qu’argument un objet complexe, par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(Package, "DemoPackage", "SayHello", "{ 'FirstName':'Sebastien', 'LastName':'Warin' }");</pre><p></p>
<p>Ou bien même un mixte, par exemple un MC prenant en paramètre un objet complexe et un entier :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(Package, "DemoPackage", "SayHello", "[ { 'FirstName':'Sebastien', 'LastName':'Warin' }, 42 ]");</pre><p></p>
<p>Ici le contenu du message est formaté en JSON via une chaine de caractère mais vous pouvez également passer un JsonObject à cette méthode :</p>
<p></p><pre class="crayon-plain-tag">const int BUFFER_SIZE = JSON_OBJECT_SIZE(2);
StaticJsonBuffer&lt;BUFFER_SIZE&gt; jsonBuffer;
JsonObject&amp; data = jsonBuffer.createObject();
myStateObject["FirstName"] = "Sebastien";
myStateObject["LastName"] = "Warin";
constellation.sendMessage(Package, "DemoPackage", "SayHello", data);</pre><p></p>
<p>Notez aussi que la Console Constellation liste les MessageCallbacks déclarés par l’ensemble des packages de votre Constellation et vous génère le code pour chaque API.</p>
<p>Par exemple, si vous souhaitez invoquer le MessageCallback “PushNote” du package “PushBullet” qui vous permettra d’envoyer une notification sur un smartphone vous pouvez cliquez sur l’icone de génération de code :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-66.png"><img class="colorbox-2461"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-55.png" alt="image" width="350" height="147" border="0" /></a></p>
<p align="left">Sélectionnez ensuite le langage “Arduino” pour avoir le modèle correspondant :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-67.png"><img class="colorbox-2461"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-56.png" alt="image" width="350" height="220" border="0" /></a></p>
<p>Ainsi pour envoyer une notification sur mon smartphone depuis un Arduino/ESP :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(Package, "PushBullet", "PushNote", "[ 'Demo from Arduino', 'Ceci est une demo', 'Device', '' ]");</pre><p></p>
<p>Bien entendu, n’importe quel package ou consommateur peut recevoir des messages. Vous pouvez donc invoquer des méthodes C#, Python, JS, etc.. depuis un Arduino/ESP.</p>
<h3>Envoyer des messages avec réponse : les Sagas</h3>
<p>Les <a href="/concepts/messaging-message-scope-messagecallback-saga/">Sagas</a> permettent de lier des messages et donc de créer des couples de “requêtes / réponses”.</p>
<p>Avec la libraire Arduino/ESP, il est possible d’envoyer des messages dans une saga afin d’enregistrer un callback de traitement de la réponse.</p>
<p>Par exemple, le package “NetworkTools” expose entre autre un MessageCallback “Ping” permettant de pinger une machine. Si le MC est invoqué dans une saga, le package répondra dans la saga un message contenant le temps de réponse du ping.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-19.png"><img class="colorbox-2461"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-19.png" alt="image" width="350" height="106" border="0" /></a></p>
<p>De ce fait, si nous souhaitons invoquer cette méthode depuis notre Arduino et traiter la réponse, nous pouvons écrire :</p>
<p></p><pre class="crayon-plain-tag">const char* ip = "192.168.0.10";
constellation.sendMessageWithSaga([](JsonObject&amp; json) {
    constellation.writeInfo("Ping response in %s ms", json["Data"].as&lt;char *&gt;()); 
  }, Package, "NetworkTools", "Ping", "[ '%s' ]", ip);</pre><p></p>
<p>La signature de la méthode “<em>sendMessageWithSaga</em>” est la même que la méthode “<em>sendMessage</em>” présentée ci-dessus à la seule différence qu’elle prend comme 1er argument un callback vers une fonction traitant la réponse ici passée en tant que lambda.</p>
<p>Dans l’exemple ci-dessus, votre Arduino envoie donc un message “Ping” avec une adresse IP en paramètre au(x) package(s) “NetworkTools” en associant un n° de saga. Ce package exécutera le ping et vous retournera un message de réponse avec le résultat du ping. Cette réponse sera traitée par la fonction lambda qui dans l’exemple affichera dans les logs Constellation le résultat du ping.</p>
<p>Ainsi vos Arduino/ESP peuvent très facilement invoquer des méthodes (MessageCallback) avec ou sans retour des différents packages (virtuels ou non) ou consommateurs de votre Constellation; scripts Javascripts, Powershell, Bash, programmes .NET, Python, etc…</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-depuis-arduino-esp/">Envoyer des messages et invoquer des MessageCallbacks depuis un Arduino/ESP</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/arduino-esp-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-depuis-arduino-esp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MessageCallback : exposer des méthodes et recevoir des messages sur un Arduino/ESP</title>
		<link>https://developer.myconstellation.io/client-api/arduino-esp-api/recevoir-des-messages-et-exposer-des-methodes-messagecallback-sur-arduino-esp/</link>
					<comments>https://developer.myconstellation.io/client-api/arduino-esp-api/recevoir-des-messages-et-exposer-des-methodes-messagecallback-sur-arduino-esp/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 23 Aug 2016 13:19:35 +0000</pubDate>
				<category><![CDATA[Arduino / ESP API]]></category>
		<category><![CDATA[Message]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[ESP]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2459</guid>

					<description><![CDATA[<p>Pour exposer des méthodes de votre Arduino/ESP dans la Constellation, vous pouvez enregistrer et par la même occasion déclarer auprès de Constellation des MessageCallbacks avec la méthode registerMessageCallback. Enregistrer un MessageCallback Par exemple enregistrons un MessageCallback “HelloWorld” via une expression</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/recevoir-des-messages-et-exposer-des-methodes-messagecallback-sur-arduino-esp/">MessageCallback : exposer des méthodes et recevoir des messages sur un Arduino/ESP</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Pour exposer des méthodes de votre Arduino/ESP dans la Constellation, vous pouvez enregistrer et par la même occasion déclarer auprès de Constellation des MessageCallbacks avec la méthode <em>registerMessageCallback</em>.</p>
<h3>Enregistrer un MessageCallback</h3>
<p>Par exemple enregistrons un MessageCallback “HelloWorld” via une expression lambda C++ à l’initialisation de votre Arduino/ESP (c’est à dire dans la méthode <em>setup()</em>):</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("HelloWorld",
  [](JsonObject&amp; json) {
    constellation.writeInfo("Hello Constellation !");
 });</pre><p></p>
<p>Enfin dans la boucle principal (loop), invoquez la méthode “constellation.loop” pour traiter et dispatcher les messages reçu par votre package virtuel :</p>
<p></p><pre class="crayon-plain-tag">constellation.loop();</pre><p></p>
<p>Dès lors que votre Arduino/ESP recevra un message dont la clé (<em>MessageKey</em>) est “HelloWorld”, votre méthode associée (représentée ci-dessus par une lambda) sera invoquée.</p>
<h4>Décrire son MessageCallback</h4>
<p>Le MessageCallback enregistré ci-dessus est dit “caché”, car il n’est pas référencé sur Constellation ! Vous pouvez bien sur envoyer un message “HelloWorld” à votre package pour invoquer votre fonction lambda mais cela suppose que vous connaissez par avance que votre package a enregistré le MessageCallback ci-dessus nommé “HelloWorld”.</p>
<p>Pour enregistrer<u> ET déclarer</u> un MessageCallback vous devez ajouter un “<em>MessageCallbackDescriptor</em>” dans les arguments de la méthode. Par exemple pour reprendre notre exemple “HelloWorld” :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("HelloWorld",
  MessageCallbackDescriptor().setDescription("Hello World !"),
  [](JsonObject&amp; json) {
    constellation.writeInfo("Hello Constellation !");
 });</pre><p></p>
<p>On a ici ajouté un “<em>MessageCallbackDescriptor</em>” en spécifiant la description de notre MC. Pour que la description du MC soit envoyée à Constellation, vous devez nécessairement publier le “Package Descriptor” à la fin de l’initialisation de votre Arduino/ESP par la ligne :</p>
<p></p><pre class="crayon-plain-tag">constellation.declarePackageDescriptor();</pre><p></p>
<p>Maintenant, depuis la Console Constellation, ouvrez le “MessageCallback Explorer” et vous retrouvez un MC nommé “HelloWorld” pour votre package :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-7.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-7.png" alt="image" width="350" height="96" border="0" /></a></p>
<p>Vous pouvez cliquer sur le bouton “Invoke” pour envoyer un message “HelloWorld” au package “MyVirtualPackage” et donc invoquer le code de la lambda.</p>
<p>On retrouvera donc dans la Console Log Constellation un “Hello Constellation” tel que programmé dans la lambda (via un <em>constellation.writeInfo</em>)  :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-8.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-8.png" alt="image" width="350" height="101" border="0" /></a></p>
<h4 align="left">Récupérer le contexte</h4>
<p align="left">Vous pouvez également récupérer le contexte de réception du message dans la fonction liée en ajoutant un argument « <em>MessageContext</em> » dans la signature du callback :</p>
<p></p><pre class="crayon-plain-tag">(*)(JsonObject&amp;, MessageContext);</pre><p></p>
<p>Le type “MessageContext” décrit de la façon suivante :</p>
<p></p><pre class="crayon-plain-tag">typedef struct {
    const char* sagaId;
    bool isSaga;
    const char* messageKey;
    MessageSender sender;
    ScopeType scope;
} MessageContext;</pre><p></p>
<p>Avec :</p>
<p></p><pre class="crayon-plain-tag">enum SenderType : uint8_t {
   ConsumerHub = 0,
   ConsumerHttp = 1,
   ConstellationHub = 2,
   ConstellationHttp = 3
};

typedef struct {
    SenderType type;
    const char* friendlyName;
    const char* connectionId;
} MessageSender;</pre><p></p>
<p>Ainsi vous pouvez obtenir des informations sur le contexte de réception du message à savoir :</p>
<ul>
<li>Si le message est dans une saga, si oui obtenir l’identifiant de la saga</li>
<li>Connaitre le scope dans lequel a été envoyé le message</li>
<li>Connaitre l’émetteur du message (ID de connexion, friendly name, …)</li>
</ul>
<p align="left">Par exemple, pour afficher le nom de l’émetteur (son <em>FriendlyName</em>) nous pourrions écrire :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("HelloWorld",
  MessageCallbackDescriptor().setDescription("Hello World !"),
  [](JsonObject&amp; json, MessageContext ctx) {
    constellation.writeInfo("Hello %s from Constellation !", ctx.sender.friendlyName);
 });</pre><p></p>
<p align="left">En invoquant le MC depuis le “MessageCallback Explorer” en étant connecté sous l’utilisateur “seb”, nous obtiendrons dans les logs :</p>
<p></p><pre class="crayon-plain-tag">[MyVirtualSentinel/MyVirtualPackage] 17:28:41 : Hello Consumer/ControlCenter:seb from Constellation !</pre><p></p>
<h3>Décrire les paramètres de vos MessageCallbacks</h3>
<p>Dans la <a href="/concepts/messaging-message-scope-messagecallback-saga/">philosophie des MessageCallbacks</a> Constellation, un MessageCallback sert à invoquer des méthodes où la clé du message (MessageKey) est comme le nom d’une méthode.</p>
<p>Pour passer des paramètres à ces méthodes, on utilisera le contenu du message (Data).</p>
<h4>Paramètres de types simples</h4>
<p>Imaginez vouloir exposer une méthode “SayHello” qui prend en paramètre deux chaines de paramètres (= des types simples), le nom et prénom pour les afficher dans les logs.</p>
<p>On déclarera le MessageCallback suivant :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("SayHello",
  MessageCallbackDescriptor().setDescription("Say hello !").addParameter("FirstName", "System.String").addParameter("LastName", "System.String"),
  [](JsonObject&amp; json) {
    constellation.writeInfo("Hello %s %s", json["Data"][0].as&lt;char *&gt;(), json["Data"][1].as&lt;char *&gt;()); 
 });</pre><p></p>
<p>On a ajouté deux paramètres de type “String” dans le <em>MessageCallbackDescriptor</em> via la méthode “addParameter”. Dans le code de notre MessageCallback, nous exploitons les valeurs des paramètres via la propriété “Data” de notre message “json”.</p>
<p>Le 1er paramètre (<em>json[« Data »][0]</em>) étant ici le “FirstName” d’après la description et le 2ème (<em>json[« Data »][1]</em>) le “LastName”.</p>
<p><u>Attention</u> :</p>
<ul>
<li>lorsque plusieurs paramètres sont passés comme dans l’exemple ci-dessus, la propriété “Data” est un tableau contenant la valeur de chaque argument (ici [0] est “FirstName” et [1] le “LastName”)</li>
<li>Si un seul paramètre est passé dans votre MC, la propriété “Data” est la valeur de l’argument directement et non un tableau.</li>
</ul>
<p>Vous pouvez tester votre MC depuis le “MessageCallback Explorer” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-9.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-9.png" alt="image" width="350" height="105" border="0" /></a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-10.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-10.png" alt="image" width="350" height="15" border="0" /></a></p>
<p align="left">Bien entendu vous pouvez déclarer un ou plusieurs paramètres de type différent.</p>
<p align="left">Les types de base sont :</p>
<ul>
<li>
<div align="left">System.String</div>
</li>
<li>
<div align="left">System.Char</div>
</li>
<li>
<div align="left">System.Boolean</div>
</li>
<li>
<div align="left">System.Int16</div>
</li>
<li>
<div align="left">System.Int32</div>
</li>
<li>
<div align="left">System.Int64</div>
</li>
<li>
<div align="left">System.Double</div>
</li>
<li>
<div align="left">System.Decimal</div>
</li>
<li>
<div align="left">System.Float</div>
</li>
</ul>
<p>Pour simplifier l’enregistrement des paramètres de type de base, vous pouvez les déclarer en utilisant la forme générique.</p>
<p>Par exemple pour un paramètre de type “String” on écrira :</p>
<p></p><pre class="crayon-plain-tag">addParameter&lt;const char*&gt;("FirstName")</pre><p></p>
<p>Autre exemple pour ajouter des paramètres de type “Boolean” et “Int32” :</p>
<p></p><pre class="crayon-plain-tag">addParameter&lt;bool&gt;("IsEnable")
addParameter&lt;int&gt;("MyNumber")</pre><p></p>
<p>De ce fait notre MC “SayHello” pourrait s’écrire :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("SayHello",
  MessageCallbackDescriptor().setDescription("Say hello !").addParameter&lt;const char*&gt;("FirstName").addParameter&lt;const char*&gt;("LastName"),
  [](JsonObject&amp; json) {
    constellation.writeInfo("Hello %s %s", json["Data"][0].as&lt;char *&gt;(), json["Data"][1].as&lt;char *&gt;()); 
 });</pre><p></p>
<h4>Paramètre de types complexes</h4>
<p>Il est également possible de spécifier des objets complexes contenant des propriétés.</p>
<p>Reprenons l’exemple précédent “SayHello” sauf qu’au lieu de passer deux paramètres de type “simple”, passons qu’un seul paramètre : un objet contenant deux propriétés (LastName et FirstName).</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("SayHello",
  MessageCallbackDescriptor().setDescription("Say hello with complex object!").addParameter("User", "SampleUserData"),
  [](JsonObject&amp; json) {
    constellation.writeInfo("Hello %s %s", json["Data"]["FirstName"].as&lt;char *&gt;(), json["Data"]["LastName"].as&lt;char *&gt;());
});</pre><p></p>
<p>Dans le MessageCallbackDescriptor de notre MessageCallback nous déclarons qu’un seul paramètre nommé “User” et de type “SampleUserData”.</p>
<p>Au niveau du code de notre MessageCallback, nous récupérons nos deux valeurs via le 1èr et unique paramètre (<em>json[« Data »]</em>) en accédant à la propriété “FirstName” et “LastName”.</p>
<p>Bien entendu pour que cela fonctionne il faut déclarer le type “SampleUserData” via la méthode “addMessageCallbackType” :</p>
<p></p><pre class="crayon-plain-tag">constellation.addMessageCallbackType("SampleUserData", TypeDescriptor().setDescription("This is a smaple user data").addProperty&lt;const char*&gt;("FirstName").addProperty&lt;const char*&gt;("LastName");</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-11.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-11.png" alt="image" width="350" height="117" border="0" /></a></p>
<p align="left">Il n’y a donc plus maintenant qu’un seul paramètre, un objet complexe contenant deux propriétés de type “string”. Vous pouvez d’ailleurs cliquez sur le type “SampleUserData” pour afficher sa description :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-12.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-12.png" alt="image" width="240" height="93" border="0" /></a></p>
<p align="left">Noter que vous pouvez enregistrer et déclarer des MessagesCallbacks mixant paramètre simple et paramètre complexe :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("MultipleParameters",
  MessageCallbackDescriptor().setDescription("Mixte de parametre simple &amp; complexe").addParameter("User", "SampleUserData").addParameter&lt;const char*&gt;("Password"),
  [](JsonObject&amp; json) {
    // json["Data"][0] is SampleUserData
    // json["Data"][1] is String
});</pre><p></p>
<h3>Exposer des MessageCallbacks avec réponse : les sagas</h3>
<p>Pour finir un MessageCallback peut retourner un message de réponse, c’est ce que l’on appelle <a href="/concepts/messaging-message-scope-messagecallback-saga/#Les_Sagas">les sagas</a>. C’est un peu comme une méthode en programmation, elle peut être “procédure” (sans retour, un void) ou “fonction” (retourne un type simple ou complexe).</p>
<p>Votre Arduino/ESP peut également enregistrer des MC retournant une réponse. Pour cela deux choses sont nécessaire :</p>
<ul>
<li>Appeler la méthode “sendReponse” dans votre callback pour envoyer la réponse</li>
<li>Appeler la méthode “setReturnType” sur le MessageCallbackDescriptor de votre MC pour déclarer le type de retour</li>
</ul>
<p>Par exemple exposons un MessageCallback “Addition” pour réaliser des additions sur un Arduino/ESP. Ce MessageCallback prend en paramètre deux entiers et retourne le résultat de type entier (Int32) également :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("Addition",
  MessageCallbackDescriptor().setDescription("Do addition on this tiny device").addParameter&lt;int&gt;("a").addParameter&lt;int&gt;("b").setReturnType&lt;int&gt;(),
  [](JsonObject&amp; json, MessageContext ctx) {        
    int a = json["Data"][0].as&lt;int&gt;();      
    int b = json["Data"][1].as&lt;int&gt;();
    int result = a + b;
    constellation.writeInfo("Addition %d + %d = %d", a, b, result);      
    if(ctx.isSaga) {
      constellation.writeInfo("Doing additoon for %s (sagaId: %s)", ctx.sender.friendlyName, ctx.sagaId);   
    // Return the result :
      constellation.sendResponse&lt;int&gt;(ctx, result);
    }
    else {
      constellation.writeInfo("No saga, no response !");
    }
 });</pre><p></p>
<p>Pour retourner une réponse vous devez disposer du contexte de réception du message (le “MessageContext”). Vous noterez qu’ici, nous testons que le message appartient bien à une saga afin de renvoyer la réponse car il ne sert à rien d’envoyer une réponse sans saga, il ne sera jamais reçu par l’émetteur.</p>
<p>En déclarant le type de retour (ici un Int32), le <em>MessageCallback Explorer</em> reconnait ce MC comme une saga. Vous pouvez donc envoyer le message dans une saga (c’est à dire avec un identifiant de Saga) ou non grâce à la case à cocher :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-13.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-13.png" alt="image" width="350" height="70" border="0" /></a></p>
<p align="left">Si le message est envoyé dans une saga, notre code Arduino ci-dessus retournera une réponse, ici à la Console Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-14.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-14.png" alt="image" width="350" height="185" border="0" /></a></p>
<p align="left">La Console Constellation vous présentera ici toutes informations quant à la réponse et au message initial.  On retrouve ici la réponse de notre addition :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-15.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-15.png" alt="image" width="350" height="239" border="0" /></a></p>
<p align="left">Dans la Console Log, on retrouvera bien les logs produits par notre Arduino :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image52.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image52_thumb.png" alt="image" width="450" height="19" border="0" /></a></p>
<p align="left">Vous pouvez également rejouer ce test mais cette fois ci en décochant la case “With Saga”, c’est à dire que nous invoquons le MC “Addition” sans n° de saga :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-17.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-17.png" alt="image" width="240" height="126" border="0" /></a></p>
<p align="left">Dans la Console Log, notre Arduino réalise bien l’addition mais ne retourne pas de message de réponse car il ne dispose pas de n° de saga pour répondre :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-18.png"><img class="colorbox-2459"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-18.png" alt="image" width="350" height="20" border="0" /></a></p>
<h3>Recevoir tous les messages dans une méthode</h3>
<p>Vous pouvez aussi “attraper” tous les messages que votre package virtuel reçoit en définissant un “callback”, c’est à dire une fonction prenant en paramètre le message sous forme d’un JsonObject et qui sera appelée à chaque message reçu.</p>
<p>Par exemple, écrivez la méthode suivante pour afficher le “MessageKey” de chaque message reçu (si nécessaire n’hésitez pas à lire ou relire <a href="/concepts/messaging-message-scope-messagecallback-saga/">les fondamentaux du Messaging Constellation</a>) :</p>
<p></p><pre class="crayon-plain-tag">void messageReceive(JsonObject&amp; json) {
  Serial.print("MSG RCV : ");
  Serial.println(json["Key"].as&lt;char *&gt;());
}</pre><p></p>
<p>Au “setup”, attachez cette méthode à la réception des messages (<em>setMessageReceiveCallback</em>) et abonnez-vous à la réception des messages (<em>subscribeToMessage</em>) :</p>
<p></p><pre class="crayon-plain-tag">constellation.setMessageReceiveCallback(messageReceive); 
constellation.subscribeToMessage();</pre><p></p>
<p>Avec les expression lambda en C++, vous auriez pu aussi écrire directement :</p>
<p></p><pre class="crayon-plain-tag">constellation.setMessageReceiveCallback([](JsonObject&amp; json) { 
  constellation.writeInfo("Message received ! Message key = %s", json["Key"].as&lt;char *&gt;());     
});
constellation.subscribeToMessage();</pre><p></p>
<p>Enfin dans la boucle principal (loop), invoquez la méthode “constellation.loop” pour traiter et dispatcher les messages reçu par votre package virtuel :</p>
<p></p><pre class="crayon-plain-tag">constellation.loop();</pre><p></p>
<p>Par exemple, imaginez un ESP8266 avec 2 MessageCallbacks : “Restart” sans paramètre qui redémarre l’ESP et “SendCode” avec un objet JSON en paramètre pour envoyer un signal infrarouge.</p>
<p>Le code pourrait être :</p>
<p></p><pre class="crayon-plain-tag">constellation.setMessageReceiveCallback([](JsonObject&amp; json) { 
  Serial.print("Message receive : ");
  const char * key = json["Key"].as&lt;char *&gt;();  
  if (stricmp (key, "SendCode") == 0) {

    const char * encoder = json["Data"]["Encoding"].as&lt;char *&gt;();  
    unsigned long code = strtoul(json["Data"]["Code"].as&lt;char *&gt;(), NULL, 0);

    // TODO : send the IR signal "code"

    else {
      constellation.writeInfo("Unable to send IR code : encoding '%s' not found !", encoder); 
    }    
    irrecv.enableIRIn();
  }
  else if (stricmp (key, "Restart") == 0) {
    ESP.restart();
  }
});  
constellation.subscribeToMessage();</pre><p></p>
<p>Avec cette façon de faire, votre “MessageReceiveCallback” est invoqué à chaque message reçu mais c’est à vous de “dispatcher” les messages en fonction de leur “MessageKey”.</p>
<p>De plus côté Constellation, il n’y a aucun “Message Callback” déclaré sur Constellation, c’est a vous de connaitre les “MessageKey” que votre package virtuel acceptent, ici “SendCode” et “Restart” !</p>
<h4>Obtenir contexte de réception</h4>
<p>Comme pour l&rsquo;enregistrement d&rsquo;un MessageCallback, vous pouvez ajouter un 2ème argument de type MessageContext pour récupérer le contexte de réception du message.</p>
<p>Par exemple nous pourrions écrire très simplement :</p>
<p></p><pre class="crayon-plain-tag">constellation.setMessageReceiveCallback([](JsonObject&amp; json, MessageContext ctx) { 
  constellation.writeInfo("Message receive from %s. Message key = %s", ctx.sender.friendlyName, json["Key"].as&lt;char *&gt;());  
});  
constellation.subscribeToMessage();</pre><p></p>
<h3>S&rsquo;abonner à un groupe Constellation</h3>
<p>Jusqu’a présent votre package virtuel recevra les messages :</p>
<ul>
<li>Du Scope “All” (c’est à dire tout le monde connecté à Constellation)</li>
<li>Du Scope “Others” si votre package n’est pas l’émetteur du message</li>
<li>Du Scope de votre sentinelle</li>
<li>Du Scope de votre package</li>
</ul>
<p>Si nécessaire n’hésitez pas à lire ou relire <a href="/concepts/messaging-message-scope-messagecallback-saga/">les fondamentaux du Messaging Constellation</a>.</p>
<p>Vous pouvez également vous abonner à des groupes pour recevoir les messages qui seraient envoyés dans ces groupes.</p>
<p>Pour cela il suffit d’invoquer la méthode “<em>subscribeToGroup</em>” en spécifiant le nom du groupe à joindre. Exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.subscribeToGroup("MonGroupe");</pre><p></p>
<p>Noter cependant que l’appartenance d’un package, virtuel ou non, à un groupe <a href="/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/#Editer_les_groupes_dun_package">peut être défini au niveau de la configuration de la Constellation éditable simplement via la Console Constellation</a> afin de pouvoir faire évoluer ces appartenances à la volée sans devoir reprogrammer vos Arduino/ESP.</p>
<h3></h3>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/recevoir-des-messages-et-exposer-des-methodes-messagecallback-sur-arduino-esp/">MessageCallback : exposer des méthodes et recevoir des messages sur un Arduino/ESP</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/arduino-esp-api/recevoir-des-messages-et-exposer-des-methodes-messagecallback-sur-arduino-esp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Consommer des StateObjects depuis un Arduino/ESP</title>
		<link>https://developer.myconstellation.io/client-api/arduino-esp-api/consommer-des-stateobjects-depuis-arduino-esp/</link>
					<comments>https://developer.myconstellation.io/client-api/arduino-esp-api/consommer-des-stateobjects-depuis-arduino-esp/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 23 Aug 2016 13:20:32 +0000</pubDate>
				<category><![CDATA[Arduino / ESP API]]></category>
		<category><![CDATA[Subscribe]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[StateObject]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2463</guid>

					<description><![CDATA[<p>Interroger des StateObjects à un instant T Pour récupérer un ou plusieurs StateObject (à un instant T), vous pouvez utiliser la méthode “requestStateObjects” : [crayon-69705ce118927426394761/] Utilisez le wildcard “” pour ne pas appliquer de filtre. Le symbole “” est aussi</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/consommer-des-stateobjects-depuis-arduino-esp/">Consommer des StateObjects depuis un Arduino/ESP</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Interroger des StateObjects à un instant T</h3>
<p>Pour récupérer un ou plusieurs StateObject (à un instant T), vous pouvez utiliser la méthode “requestStateObjects” :</p>
<p></p><pre class="crayon-plain-tag">JsonArray&amp; myStateObject = constellation.requestStateObjects(sentinel, package, name, type);</pre><p></p>
<p>Utilisez le wildcard “<em>” pour ne pas appliquer de filtre. Le symbole “</em>” est aussi accessible via la constante “WILDCARD”.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">// All StateObjects for MyPackage on MySentinel
JsonArray&amp; so = constellation.requestStateObjects("MySentinel", "MyPackage", "*", "*");
// All StateObjects named "Demo" in your Constellation
JsonArray&amp; so = constellation.requestStateObjects(WILDCARD, WILDCARD, "Demo", WILDCARD);</pre><p></p>
<p>Autre exemple, vous souhaitez afficher dans les logs Constellation, la consommation CPU de toutes vos machines Windows (vous avez au préalable déployé le package “HWMonitor” sur toutes vos sentinelles Windows) depuis votre Arduino :</p>
<p></p><pre class="crayon-plain-tag">// Example : print the all SO's value named "/intelcpu/0/load/0" and produced by the "HWMonitor" package (on all sentinels)
JsonArray&amp; cpus = constellation.requestStateObjects("*", "HWMonitor", "/intelcpu/0/load/0");
for(int i=0; i &lt; cpus.size(); i++) { 
  constellation.writeInfo("CPU on %s is currently %d %", cpus[i]["SentinelName"].as&lt;char *&gt;(), cpus[i]["Value"]["Value"].as&lt;float&gt;());
}</pre><p></p>
<h3>S’abonner aux mises à jours des StateObjects en temps réel</h3>
<p>Vous pouvez également vous abonnez aux mises à jour des StateObjects pour être notifié en temps réel de la modification des StateObjects.</p>
<h4>En utilisant un callback global</h4>
<p>Vous pouvez déclarer une fonction callback qui sera appelée à chaque mise à jour de StateObjects pour lesquels vous vous êtes abonné en invoquant la méthode <em>setStateObjectUpdateCallback</em>. Notez qu&rsquo;il ne peut y avoir qu&rsquo;une seule méthode callback enregistrée.</p>
<p>Ensuite vous abonnez aux différents StateObjects que vous souhaitez “suivre” avec la méthode “<em>subscribeToStateObjects</em>”.</p>
<p>Par exemple, pour être notifié en temps réel de la consommation CPU des différentes sentinelles Windows, on écrira :</p>
<p></p><pre class="crayon-plain-tag">// set a StateObject update callback and subscribe to SO
constellation.setStateObjectUpdateCallback([] (JsonObject&amp; so) {
    constellation.writeInfo("StateObject updated ! StateObject name = %s", so["Name"].as&lt;char *&gt;()); 
});
// Subscribe to SO named "/intelcpu/0/load/0" and produced by the "HWMonitor" package (on all sentinels)
constellation.subscribeToStateObjects("*", "HWMonitor", "/intelcpu/0/load/0");</pre><p></p>
<p>Nous avons ici défini notre fonction callback dans une expression lambda mais vous pouvez aussi bien “extraire” cette fonction callback dans une fonction distincte.</p>
<p>Enfin dans la boucle principale (loop), vous devez invoquer la méthode “<em>constellation.loop()</em>” aussi souvent que possible afin que la libraire puisse dispatcher les SO dans votre méthode callback :</p>
<p></p><pre class="crayon-plain-tag">constellation.loop();</pre><p></p>
<h4>En utilisant des StateObjectLinks</h4>
<p>Avec la méthode “<em>subscribeToStateObjects</em>” présentée ci-dessous vous avez une fonction callback qui recevra tous les StateObjects pour lesquels vous êtes abonné. Vous devez donc “dispatcher” vous même les différents StateObjects que vous recevrez.</p>
<p>Pour simplifier les choses, la libraire Arduino propose comme en <a href="/client-api/net-package-api/consommer-des-stateobjects/#Les_StateObjectLink">.NET</a> ou en <a href="/client-api/python-api/consommer-des-stateobjects-en-python/">Python</a>, la notion de StateObjectLink : il s’agit de “lier” un abonnement à des StateObjects à une fonction de votre code.</p>
<p>Pour reprendre l’exemple du suivi des CPU en temps réel, nous pourrions écrire :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerStateObjectLink("*", "HWMonitor", "/intelcpu/0/load/0", [](JsonObject&amp; so) {
  constellation.writeInfo("CPU on %s is currently %d %", so["SentinelName"].as&lt;char *&gt;(), so["Value"]["Value"].as&lt;float&gt;());
});</pre><p></p>
<p>Vous pouvez enregistrer autant de StateObjectLink que vous le désirez. Là encore nous utilisé une expression lambda mais vous pouvez aussi bien “extraire” cette fonction callback dans une fonction distincte.</p>
<p>N&rsquo;oubliez pas non plus d&rsquo;appeler la méthode <em>constellation.loop()</em>” aussi souvent que possible dans la boucle principale de votre programme.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/consommer-des-stateobjects-depuis-arduino-esp/">Consommer des StateObjects depuis un Arduino/ESP</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/arduino-esp-api/consommer-des-stateobjects-depuis-arduino-esp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Utiliser Lua sur NodeMCU pour connecter des ESP8266 à Constellation</title>
		<link>https://developer.myconstellation.io/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/</link>
					<comments>https://developer.myconstellation.io/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 23 Aug 2016 13:21:29 +0000</pubDate>
				<category><![CDATA[Arduino / ESP API]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[Lua]]></category>
		<category><![CDATA[NodeMCU]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[WriteLog]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Virtuel]]></category>
		<category><![CDATA[ESP8266]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2465</guid>

					<description><![CDATA[<p>Développer sur ESP8266 en Lua avec NodeMCU Développer des applications natives sur ESP peut être assez compliqué pour celui qui ne connait pas le développement bas niveau ! NodeMCU a eu l’idée de créer un firmware ESP8266 embarquant eLua, un</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/">Utiliser Lua sur NodeMCU pour connecter des ESP8266 à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Développer sur ESP8266 en Lua avec NodeMCU</h3>
<p>Développer des applications natives sur ESP peut être assez compliqué pour celui qui ne connait pas le développement bas niveau !</p>
<p style="text-align: center;"><img loading="lazy" class="alignnone wp-image-4491 size-full colorbox-2465" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/nodemcu-style5-150px.png_150x150.png" alt="" width="100" height="100" /></p>
<p><a href="http://nodemcu.com/index_en.html">NodeMCU</a> a eu l’idée de créer un firmware ESP8266 embarquant eLua, un interpréteur Lua très minimaliste pour système embarqué. Grace à ce firmware vous pouvez développer des programmes pour votre ESP très facilement en Lua.</p>
<p>Concrètement il faut commencer par flasher votre ESP avec le firmware NodeMCU en utilisant un outil comme ESP Flash Download (<a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/">voir ici</a>). Vous pouvez télécharger le firmware directement sur le <a href="https://github.com/nodemcu/nodemcu-firmware">GitHub de NodeMCU</a> ou bien sur <a href="http://nodemcu-build.com/">http://nodemcu-build.com/</a>  pour compiler son firmware à la demande en personnalisant différentes options (branche à compiler, modules à inclure, support ou non du SSL, activation du mode debug, etc..).</p>
<p>Une fois installé utilisez l’outil <a href="https://esp8266.ru/esplorer/">Esplorer</a>, une application Java (compatible Linux/Windows et Mac OS) pour éditer les scripts Lua directement depuis le système de fichier de votre ESP.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-5-1.png"><img class="colorbox-2465"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image-5" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-5_thumb.png" alt="image-5" width="354" height="195" border="0" /></a></p>
<p>A gauche vous retrouverez l’éditeur, à droite la sortie de votre ESP. Chaque fichier est enregistré dans le système de fichier de votre ESP avant d’être exécuté.</p>
<p>Par exemple pour se connecter au Wifi :</p>
<p></p><pre class="crayon-plain-tag">print("Démarrage")
wifi.setmode(wifi.STATION)
print("set mode=STATION (mode="..wifi.getmode()..")")
wifi.sta.config{ssid="MON RESEAU WIFI", pwd="Ma clé Wifi"}

tmr.alarm(0, 1000, 1, function()
   if wifi.sta.getip() == nil then
      print("Connecting to AP...")
   else
      print("Connected! IP: ",wifi.sta.getip())
      tmr.stop(0)
   end
end)</pre><p></p>
<p>On commence par définir le mode Wifi à Station (client) puis on se connecte en spécifiant le SSID et la clé Wifi. Ensuite on lance une tache qu’on exécute sur le timer « 0 » (vous pouvez aller de 0 à 6), à une seconde d’intervalle (1000ms) de façon répétitive afin de récupérer l’IP. Si la connexion n’est pas encore effective on affiche le message « Connecting » sinon on coupe le timer « 0 » et on affiche l’adresse IP de votre ESP.</p>
<p>Pour plus d’information je vous invite à lire ou relire cet article : <a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/">http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/</a></p>
<h3>Connexion à Constellation</h3>
<p>Commencez tout d’abord par télécharger la librairie “<em>Constellation pour NodeMCU</em>” et transférez les fichiers du fichier ZIP sur votre ESP avec Esplorer.</p>

<p>Créez ensuite un script Lua en incluant cette librairie afin d&rsquo;initialiser le client Constellation avec l’adresse du serveur, votre Sentinelle &amp; package virtuel ainsi que la clé d’accès :</p>
<p></p><pre class="crayon-plain-tag">local constellation = require("constellation")
constellation.init("constellation.monserveur.com", 8088, "MyVirtualSentinel", "MyVirtualPackage", "123456789")</pre><p></p>
<h3>Fonctionnalités de base</h3>
<p>Vous pouvez écrire dans les logs Constellation grâce à la méthode “writeLog”. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeLog("Je suis pret avec " .. node.heap())</pre><p></p>
<p>Par défaut les logs sont envoyés comme “Information”, mais vous pouvez spécifier “Warn” ou “Error” dans le 2ème arguments de cette méthode :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeLog("Ceci est un warning", "Warn")
constellation.writeLog("Ceci est une erreur", "Error")</pre><p></p>
<p>Vous pouvez également récupérer les settings de votre package virtuel du serveur Constellation avec la méthode “getSettings” :</p>
<p></p><pre class="crayon-plain-tag">constellation.getSettings(function(messages)
      print("Settings received :")
      for k,v in pairs(messages) do
          print(" -&gt; " .. k .. " = " .. v)
      end        
  end)</pre><p></p>
<h3>Publier des StateObjects</h3>
<p>Pour publier un StateObject, vous disposez de la méthode “push” prenant en paramètre le nom et la valeur. Dans la version 1.0 le “lifetime”, “type” ou les “métadatas” ne sont pas supportés.</p>
<p>Vous pouvez publier soit des types simples, par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.push("Lux", math.floor(lux))</pre><p></p>
<p>Soit des types complexes, c’est à dire des objets formatés en JSON. Vous pouvez formater vous même vos objets par concaténation :</p>
<p></p><pre class="crayon-plain-tag">constellation.push("Lux", "{ Broadband:" .. broadband .. ", IR:" .. ir .. ", Lux:" .. math.floor(lux) .. "}")</pre><p></p>
<p>Ou bien via le module Lua “cjson” :</p>
<p></p><pre class="crayon-plain-tag">constellation.push("Lux", cjson.encode({ Broadband=broadband, IR=ir, Lux= math.floor(lux) }))</pre><p></p>
<h3>Recevoir des messages</h3>
<p>Vous pouvez également recevoir des messages sur votre ESP8266 en enregistrant une fonction “callback” qui sera invoquée à chaque message reçu.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.subscribeToMessage(function(message)
    print(message["Sender"]["FriendlyName"], message["Key"], message["Data"][2])  
    if message["Key"] == "Restart" then
        node.restart()
    end        
end)</pre><p></p>
<p>Dans cette première version de la librairie la description des messages callback (<em>Package Descriptor</em>) n’est pas supportée.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/">Utiliser Lua sur NodeMCU pour connecter des ESP8266 à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 

Served from: developer.myconstellation.io @ 2026-01-21 05:58:09 by W3 Total Cache
-->