﻿<?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>Tag StateObject - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/tag/stateobject/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/tag/stateobject/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Mon, 30 Apr 2018 13:10:59 +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>Tag StateObject - Constellation</title>
	<link>https://developer.myconstellation.io/tag/stateobject/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Décrire les MessagesCallbacks en Python avec la mise à jour du PythonProxy 1.8.4</title>
		<link>https://developer.myconstellation.io/blog/decrire-les-messagescallbacks-en-python-avec-la-mise-a-jour-du-pythonproxy-1-8-4/</link>
					<comments>https://developer.myconstellation.io/blog/decrire-les-messagescallbacks-en-python-avec-la-mise-a-jour-du-pythonproxy-1-8-4/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Mon, 30 Apr 2018 13:10:59 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[PythonProxy]]></category>
		<category><![CDATA[CLI]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5954</guid>

					<description><![CDATA[<p>Passée inaperçue sur le repository Nuget, une nouvelle version 1.8.4 du PythonProxy a été publié en début d’année. Cette mise à jour de version accompagne désormais le SDK Visual Studio ainsi que les templates du Constellation Package Tools CLI depuis</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/decrire-les-messagescallbacks-en-python-avec-la-mise-a-jour-du-pythonproxy-1-8-4/">Décrire les MessagesCallbacks en Python avec la mise à jour du PythonProxy 1.8.4</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Passée inaperçue sur le repository Nuget, une <strong>nouvelle version 1.8.4 du </strong><a href="https://developer.myconstellation.io/client-api/python-api/"><strong>PythonProxy</strong></a> a été publié en début d’année.</p>
<p>Cette mise à jour de version accompagne désormais le SDK Visual Studio ainsi que les templates du <a href="https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/"><em>Constellation Package Tools CLI</em></a> depuis la semaine dernière.</p>
<p>Au programme de cette nouvelle version : <strong>la description des arguments des MessageCallbacks</strong> et <strong>des types de StateObjects</strong>.</p>
<p>En effet, comme <a href="/client-api/python-api/messagecallbacks-exposer-des-methodes-python/" target="_blank" rel="noopener">vous le savez</a> déjà, pour déclarer un MessageCallback en Python il suffit d’ajouter le décorateur <em>Constellation.MessageCallback()</em> :</p>
<p></p><pre class="crayon-plain-tag">@Constellation.MessageCallback()
def MultipleParameterCallback(a, b, c):
    '''
    MessageCallback with 3 parameters
    '''
    Constellation.WriteInfo("a = %s - type: %s" % (a, type(a)))
    Constellation.WriteInfo("b = %s - type: %s" % (b, type(b)))
    Constellation.WriteInfo("c = %s - type: %s" % (c, type(c)))</pre><p></p>
<p>Dans l&rsquo;exemple ci-dessus, une méthode Python avec 3 paramètres, le simple fait d&rsquo;ajouter le décorateur <em>Constellation.MessageCallback() </em>permet d&rsquo;invoquer cette méthode depuis n&rsquo;importe quel client (package ou consommateur) connecté dans notre Constellation.</p>
<p>D&rsquo;ailleurs, ce MC est également référencé dans Constellation. Nous pouvons le découvrir sur le ControlHub ou via le <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallbacks Explorer</a> de la Console Constellation :<a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-71.png"><img loading="lazy" class="alignnone size-medium wp-image-2517 aligncenter colorbox-5954" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-71-300x172.png" alt="" width="300" height="172" srcset="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-71-300x172.png 300w, https://developer.myconstellation.io/wp-content/uploads/2016/08/image-71-768x440.png 768w, https://developer.myconstellation.io/wp-content/uploads/2016/08/image-71.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Seulement à l&rsquo;<a href="/client-api/net-package-api/messagecallbacks/">inverse de l&rsquo;API .NET</a>, les parametres d&rsquo;une méthode Python (et les variables de manière globale) ne sont pas fortement typés comme en .NET. Autrement dit, il n&rsquo;y a rien qui indique le type des arguments de notre MessageCallback. Côté <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallbacks Explorer</a> les arguments sont alors reconnus comme « Objects ».</p>
<p><strong>Cette mise à jour 1.8.4 permet la description des arguments</strong> en utilisant une syntaxe empruntée à S<em>phinx </em>dans les commentaires.</p>
<p>Pour cela utilisez la syntaxe suivante dans la description du MC :</p>
<p></p><pre class="crayon-plain-tag">:param &lt;type&gt; &lt;name&gt; : &lt;description&gt;</pre><p></p>
<p>Par exemple pour décrire les 3 arguments de notre exemple :</p>
<p></p><pre class="crayon-plain-tag">@Constellation.MessageCallback()
def Demo(a, b, c):
    '''
    Ceci est un exemple de MC avec 3 parametres

    :param int a: My int value
    :param bool b: My boolean value
    :param string c: My string value
    '''
    Constellation.WriteInfo("a = %s - type: %s" % (a, type(a)))
    Constellation.WriteInfo("b = %s - type: %s" % (b, type(b)))
    Constellation.WriteInfo("c = %s - type: %s" % (c, type(c)))</pre><p></p>
<p align="left">Ainsi en retournant sur le MC Explorer, chaque argument est correctement typé dans Constellation :</p>
<p style="text-align: center;" align="left"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/04/image-10.png"><img loading="lazy" class="aligncenter colorbox-5954" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Description des arguments d'un MC en Python" src="https://developer.myconstellation.io/wp-content/uploads/2018/04/image_thumb-9.png" alt="Description des arguments d'un MC en Python" width="484" height="166" border="0" /></a></p>
<p align="left">Notez que vous pouvez également<a href="/client-api/python-api/messagecallbacks-exposer-des-methodes-python/#Decrire_les_arguments_de_type_complexe"> décrire des types complexes utilisés</a> comme type de paramètre d&rsquo;entrée, <a href="/client-api/python-api/messagecallbacks-exposer-des-methodes-python/#Parametres_optionnels_avec_valeur_par_defaut">définir les paramètres qui sont optionnels</a>, ou encore <a href="/client-api/python-api/messagecallbacks-exposer-des-methodes-python/#Repondre_aux_Sagas">décrire les types de retour</a>.</p>
<p align="left">Egalement compris dans cette mise à jour la <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Publier_des_StateObjects">description des types complexe utilisés comme modèle de données de vos StateObjects</a>.</p>
<p align="left">Pour en profiter il suffit de mettre à jour le package Nuget depuis Visual Studio ou de taper la commande « <a href="/client-api/python-api/developper-avec-le-package-tools-cli/#Mise_a_jour_du_template">ctln update</a> » si vous utilisez la CLI.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/decrire-les-messagescallbacks-en-python-avec-la-mise-a-jour-du-pythonproxy-1-8-4/">Décrire les MessagesCallbacks en Python avec la mise à jour du PythonProxy 1.8.4</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/blog/decrire-les-messagescallbacks-en-python-avec-la-mise-a-jour-du-pythonproxy-1-8-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Créer une boite aux lettres connectée avec Constellation</title>
		<link>https://developer.myconstellation.io/showcases/creer-une-boite-aux-lettres-connectee-constellation/</link>
					<comments>https://developer.myconstellation.io/showcases/creer-une-boite-aux-lettres-connectee-constellation/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 27 Sep 2017 10:29:50 +0000</pubDate>
				<category><![CDATA[Showcases]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[Cordova]]></category>
		<category><![CDATA[Ionic]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Capteur]]></category>
		<category><![CDATA[PushBullet]]></category>
		<category><![CDATA[Constellation]]></category>
		<category><![CDATA[smartphone]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5519</guid>

					<description><![CDATA[<p>Projet réalisé par Judith Caroff, Jeanne Leclercq, Luc Fermaut, Pierre Hourdé, Jean-Baptiste Lavoine et Victorien Renault. Introduction Étudiants en 3ème année à l’ISEN-Lille, nous avons eu l’idée de développer une boîte aux lettres connectée en utilisant la plateforme Constellation. En</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/showcases/creer-une-boite-aux-lettres-connectee-constellation/">Créer une boite aux lettres connectée avec Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>Projet réalisé par Judith Caroff, Jeanne Leclercq, Luc Fermaut, Pierre Hourdé, Jean-Baptiste Lavoine et Victorien Renault.</em></p>
<h2>Introduction</h2>
<p>Étudiants en 3<sup>ème</sup> année à l’ISEN-Lille, nous avons eu l’idée de développer une boîte aux lettres connectée en utilisant la plateforme Constellation.</p>
<p>En réalisant ce projet, nous voulions proposer une solution de boîte aux lettres connectée à un prix raisonnable et possédant une interface fluide pour améliorer l’expérience de l’utilisateur. Pour cela, nous avons acheté des composants peu coûteux à placer sur notre boîte aux lettres, et développé une application Ionic.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/Schma-de-prsentation.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Schéma de fonctionnement global de notre boîte aux lettres" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/Schma-de-prsentation_thumb.png" alt="Schéma de fonctionnement global de notre boîte aux lettres" width="450" height="225" border="0" /></a></p>
<p>Notre boîte aux lettres est connectée à la plateforme Constellation par le biais d’un ESP8266, vous pouvez le connecter facilement à votre Constellation en suivant <a href="https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">cette documentation sur le site Constellation</a>.</p>
<p>Nous détectons ensuite la présence de courriers à l’aide de capteurs à ultrasons.</p>
<p>Avec un lecteur de cartes NFC, nous contrôlons l’accès à notre boîte aux lettres. Celui-ci nous permet de savoir qui a ouvert la boîte aux lettres et donc d’envoyer les bonnes informations à notre Constellation. Le lecteur NFC nous permet également de vérifier qu’une carte ou qu’un badge a les autorisations nécessaires afin de commander l’ouverture via un servo-moteur.</p>
<p>L’application, développée avec le framework ionic nous permet d’offrir une interface utilisateur ergonomique. En la connectant à Constellation, l’utilisateur a accès à toutes les informations nécessaires très facilement.</p>
<h2>La boîte aux lettres connectée</h2>
<p><i>Prérequis : Avoir connecté l’ESP8266 à Constellation.</i></p>
<h3>Composants utilisés</h3>
<p>Pour connecter notre boîte aux lettres à Constellation, nous avons utilisé :</p>
<ul>
<li>Un ESP8266 D1 Mini (8€ sur Amazon)</li>
<li>Des capteurs à ultrasons HC SR04 (3€ sur Amazon)</li>
<li>Un lecteur de cartes NFC (8€ sur Amazon)</li>
<li>Un servo-moteur (6€ sur eBay)</li>
</ul>
<p>Voici la correspondance pour définir les différents pins avec cet ESP :</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">D0</td>
<td valign="top">D1</td>
<td valign="top">D2</td>
<td valign="top">D3</td>
<td valign="top">D4</td>
<td valign="top">D5</td>
<td valign="top">D6</td>
<td valign="top">D7</td>
<td valign="top">D8</td>
<td valign="top">RX</td>
<td valign="top">TX</td>
</tr>
<tr>
<td valign="top">16</td>
<td valign="top">5</td>
<td valign="top">4</td>
<td valign="top">0</td>
<td valign="top">2</td>
<td valign="top">14</td>
<td valign="top">12</td>
<td valign="top">13</td>
<td valign="top">15</td>
<td valign="top">3</td>
<td valign="top">1</td>
</tr>
</tbody>
</table>
<h3>Etape 1 : Détecter la présence d’une lettre grâce à un capteur ultrason</h3>
<p><i>Nos capteurs fonctionnent avec une alimentation de 5V</i><i></i></p>
<p>Les capteurs à ultrasons nous permettent de mesurer une distance en créant une impulsion sur une des broches. Grâce à cette mesure, nous pouvons détecter une variation de la distance lorsqu’un courrier et inséré dans la boîte aux lettres. Nous envoyons alors l’information à Constellation grâce à un MessageCallback.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/capteur-ultrason.jpg"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Capteur ultrason" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/capteur-ultrason_thumb.jpg" alt="Capteur ultrason" width="300" height="136" border="0" /></a></p>
<p>Relier le capteur à notre ESP est assez simple, notre capteur à ultrasons possède 4 branches, chacune branchée sur un pin de notre ESP.</p>
<p>Ci-dessous, les correspondances entre les branches du capteur à ultrasons et les pins de l’ESP8266 :</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="63%">
<p style="text-align: left;">Branche du capteur à ultrasons</p>
</td>
<td valign="top" width="36%">Pin de l’ESP8266</td>
</tr>
<tr>
<td valign="top" width="63%">VCC</td>
<td valign="top" width="36%">5V</td>
</tr>
<tr>
<td valign="top" width="63%">GND</td>
<td valign="top" width="36%">GND</td>
</tr>
<tr>
<td valign="top" width="63%">TRIG</td>
<td valign="top" width="36%">D4</td>
</tr>
<tr>
<td valign="top" width="63%">ECHO</td>
<td valign="top" width="36%">D3</td>
</tr>
</tbody>
</table>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/Module-ultrasons.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Module à ultrasons connecté à notre ESP8266" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/Module-ultrasons_thumb.png" alt="Module à ultrasons connecté à notre ESP8266" width="354" height="205" border="0" /></a></p>
<p style="text-align: left;">Dans notre code, nous configurons les pins dans le setup afin de préparer l’impulsion.</p>
<p></p><pre class="crayon-plain-tag">void setup() {
   pinMode(TRIGGER, OUTPUT);
   digitalWrite(TRIGGER, LOW); //La broche TRIGGER doit être à LOW au repos
   pinMode(ECHO, INPUT);
   Serial.begin(9600);
 }</pre><p></p>
<p style="text-align: left;">Nous envoyons ensuite de façon continue des impulsions pour savoir si un obstacle est présent puis, s’il y en a un, nous envoyons un Message Callback.</p>
<p></p><pre class="crayon-plain-tag">void loop() {    
    /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10 µs sur la broche TRIGGER */
   digitalWrite(TRIGGER, HIGH);
   delayMicroseconds(10);
   digitalWrite(TRIGGER, LOW);
   
   /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonore et son écho (s'il existe) */
   long measure = pulseIn(ECHO, HIGH);                
                                                                                 
   /* 3. Calcul la distance à partir du temps mesuré */
   long distanceMeasured = measure *vitesse ;
  
   /* 4. Envoie d'un MessageCallback à Constellation si on rentre dans le if */ 
   if(distanceMeasured &lt; defaultValue){
     constellation.sendMessage(Package, "Brain", "message");
   }
}</pre><p></p>
<p style="text-align: center;"><img loading="lazy" class="size-full wp-image-5527 aligncenter colorbox-5519" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/video1-2-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/09/video1-2.gif" alt="" width="196" height="350" /></p>
<h3 style="text-align: left;">Etape 2 : Gérer les accès à la boîte aux lettres grâce à un lecteur de carte NFC</h3>
<p style="text-align: left;">Dans cette partie, nous allons envoyer un Message Callback à Constellation grâce à l’ID du badge NFC détecté par notre lecteur de cartes.</p>
<p style="text-align: left;">Cela nous permettra par la suite de gérer les autorisations d’accès à la boîte aux lettres, de contrôler l’ouverture par notre servo-moteur, et d’avertir l’utilisateur qu’un colis a été livré ou que le courrier a été récupéré. Nous devrons donc enregistrer les différents utilisateurs en renseignant leur ID de badge et leur statut (facteur ou utilisateur).</p>
<p style="text-align: left;">Voici le câblage réalisé pour cette partie entre le NFC et l’ESP :</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="49%">Branche du NFC</td>
<td valign="top" width="50%">Pin de l’ESP8266</td>
</tr>
<tr>
<td valign="top" width="49%">RST</td>
<td valign="top" width="50%">D1</td>
</tr>
<tr>
<td valign="top" width="49%">SDA(SS)</td>
<td valign="top" width="50%">D2</td>
</tr>
<tr>
<td valign="top" width="49%">MOSI</td>
<td valign="top" width="50%">D7</td>
</tr>
<tr>
<td valign="top" width="49%">MISO</td>
<td valign="top" width="50%">D6</td>
</tr>
<tr>
<td valign="top" width="49%">SCK</td>
<td valign="top" width="50%">D5</td>
</tr>
<tr>
<td valign="top" width="49%">GND</td>
<td valign="top" width="50%">GND</td>
</tr>
<tr>
<td valign="top" width="49%">3.3 V</td>
<td valign="top" width="50%">3.3 V</td>
</tr>
</tbody>
</table>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/Lecteur-NFC.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Lecteur NFC connecté à notre ESP8266" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/Lecteur-NFC_thumb.png" alt="Lecteur NFC connecté à notre ESP8266" width="354" height="183" border="0" /></a></p>
<p style="text-align: left;">Il faut commencer par télécharger la bibliothèque suivante :</p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/bibliothque-arduino-1.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="bibliothèque arduino 1" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/bibliothque-arduino-1_thumb.png" alt="bibliothèque arduino 1" width="354" height="71" border="0" /></a></p>
<p style="text-align: left;">Voici ensuite la fonction nécessaire à l’envoi d’un Message Callback lorsque nous captons un nouveau badge.</p>
<p></p><pre class="crayon-plain-tag">void NFC() {
    // Regarde s'il y a une nouvelle carte, s'il n'y en a pas on quitte la fonction
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }
    // S'il n'arrive pas à lire la carte on quitte la fonction
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }
    char sochar[256]; // 256 correspond à un octet
    String UID= dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); 
    /* Permet de transformer un tableau de bit en String */
    UID.toCharArray(sochar, 256);
    constellation.sendMessage(Package, "Brain", "Authorisation", sochar); /* envoie un message Callback du package Brain appelé Authorisation*/
}</pre><p></p>
<h3 style="text-align: left;">Etape 3 : Ouvrir et fermer la porte grâce à un servo-moteur</h3>
<p style="text-align: left;">Le servomoteur va nous servir à commander notre verrou. Ce dernier va donc s’abonner à un State Object nous donnant l’état de la porte (verrouillée ou déverrouillée). Ainsi, lorsque notre lecteur NFC captera un ID autorisé, notre State Object changera, ainsi que l’état de verrouillage de la porte.</p>
<p style="text-align: left;">Voici les branchements qui relient notre moteur à l’ESP :</p>
<table class=" aligncenter" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="59%">PIN DU MOTEUR</td>
<td valign="top" width="40%">Pin de l’ESP8266</td>
</tr>
<tr>
<td valign="top" width="59%">5 V (câble orange)</td>
<td valign="top" width="40%">5 V</td>
</tr>
<tr>
<td valign="top" width="59%">GND (câble marron)</td>
<td valign="top" width="40%">GND</td>
</tr>
<tr>
<td valign="top" width="59%">Commande (câble jaune)</td>
<td valign="top" width="40%">D8</td>
</tr>
</tbody>
</table>
<p style="text-align: left;">Avant d’utiliser le code ci-dessous, il faut vérifier que vous avez bien installé les bibliothèques suivantes :</p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/bibliothque-arduino-2.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="bibliothèque arduino 2" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/bibliothque-arduino-2_thumb.png" alt="bibliothèque arduino 2" width="354" height="128" border="0" /></a></p>
<p style="text-align: left;">Dans le Setup ci-dessous, nous nous abonnons à un StateObject qui nous permet d’ouvrir et de fermer la porte lorsqu’il change d’état.</p>
<p></p><pre class="crayon-plain-tag">void setup() {
    monServo.attach(15); // Définit le moteur au D8
    monServo.write(0); // ServoMoteur à sa position initiale
    constellation.registerStateObjectLink("*", "Brain", "Porte_ouverte", [](JsonObject&amp; so) {
     delay(100); // délai afin d'attendre la connexion à  Constellation
     if (so["Value"]== true){   
       monServo.write(90);  // Position de la porte ouverte
       }
 
    if (so["Value"]== false){
       monServo.write(0);   // Position de la porte fermée
       }
       delay(3000); // attendre au minimum 3 secs avant que la porte ne change d'état.
   });  
 }</pre><p></p>
<p style="text-align: center;"><img loading="lazy" class="alignnone size-full wp-image-5528 aligncenter colorbox-5519" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/video2-2-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/09/video2-2.gif" alt="" width="196" height="350" /></p>
<h3 style="text-align: left;">Etape 4 : Synchroniser toutes nos parties avec un package Constellation</h3>
<p style="text-align: left;">Vous pouvez retrouver notre code complet pour la boîte aux lettres sur GitHub pour plus de précision (<a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fgithub.com%2FSqyluck%2FBoite-aux-lettres-connectee&amp;h=ATO-A7kid-AyGmrtD0hCDSOEWcwWMsyF8aAuEcrDY3b1Q9b-_NEMOnsJ9DOWADshjfo8FwRAmqfoT5MoHe3RwBJ1U_2af1vgeNd_XHbk_4LNVdA4-AYBgC-v6mcC5YakbL12cgMSWJFFBA">https://github.com/Sqyluck/Boite-aux-lettres-connectee</a>).</p>
<p style="text-align: left;">Il est ensuite nécessaire de créer un package Constellation, qui va nous permettre de traiter toutes les données de nos différents éléments.</p>
<p style="text-align: left;">→ Voici les différents Message Callbacks créent dans le package afin de répondre à nos besoins.</p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/Message-Callbacks.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Message Callbacks" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/Message-Callbacks_thumb.png" alt="Message Callbacks" width="354" height="357" border="0" /></a></p>
<p style="text-align: left;">→ Voici la liste des State Objects générés par le package pour permettre l’affichage de nos données dans l’application et l’envoi d’ordre au servomoteur via l’ESP8266.</p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/State-Objects.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="State Objects" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/State-Objects_thumb.png" alt="State Objects" width="354" height="166" border="0" /></a></p>
<h3 style="text-align: left;">Etape 5 : Fabrication de la boîte aux lettres</h3>
<p style="text-align: left;">Nous avons utilisé des planches en bois afin de réaliser notre boîte aux lettres. Nous avons vissé les planches entre elles, puis nous avons fixé nos éléments sous le toit de la boîte.</p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/Visuel-boite-au-lettre-extrieur.jpg"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Visuel boite au lettre extérieur" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/Visuel-boite-au-lettre-extrieur_thumb.jpg" alt="Visuel boite au lettre extérieur" width="254" height="310" border="0" /></a></p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/Visuel-boite-au-lettre-composants.jpg"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Visuel boite au lettre composants" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/Visuel-boite-au-lettre-composants_thumb.jpg" alt="Visuel boite au lettre composants" width="223" height="244" border="0" /></a> <a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/Visuel-boite-au-lettre-intrieur.jpg"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Visuel boite au lettre intérieur" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/Visuel-boite-au-lettre-intrieur_thumb.jpg" alt="Visuel boite au lettre intérieur" width="207" height="244" border="0" /></a></p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/Schma-composants.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Schéma composants" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/Schma-composants_thumb.png" alt="Schéma composants" width="450" height="232" border="0" /></a></p>
<h2 style="text-align: left;">L’interface utilisateur</h2>
<p style="text-align: left;"><i>Prérequis : disposer de Node.js et de npm</i></p>
<h3 style="text-align: left;">Etape 1 : Créer une application avec ionic</h3>
<p style="text-align: left;">Afin de réaliser notre interface utilisateur, nous avons décidé dans un premier temps de développer notre application avec Ionic 2 dans Visual Studio. Mais avec cette méthode nous étions obligé de développer notre application en langage typescript ce qui était plus compliqué pour connecter l’application à la plateforme Constellation. Nous avons donc décidé d’utiliser Ionic 1 afin de développer notre application en javascript et de la connecter plus facilement.</p>
<p style="text-align: left;">Avant de commencer, il faut lancer l’installation de Ionic 1 depuis l’invite de commande :</p>
<p></p><pre class="crayon-plain-tag">npm install – g cordova ionic</pre><p></p>
<p style="text-align: left;"><i>(Attention : cette commande ne fonctionnera pas si vous ne disposez pas auparavant de node.js et de npm)</i><i></i></p>
<p style="text-align: left;">Une fois que nous nous sommes placé dans le dossier dans lequel nous souhaitons développer notre application, nous pouvons utiliser la commande suivante pour lancer la création d’un nouveau projet.</p>
<p></p><pre class="crayon-plain-tag">ionic start myApp tabs --type ionic1</pre><p></p>
<p style="text-align: left;"><i>(Nous venons ici de créer un nouveau projet ionic 1 de type tabs intitulé myApp)</i></p>
<p style="text-align: left;">Dans l’invite de commande, placez-vous dans le dossier de l’application (en utilisant la commande cd).</p>
<p style="text-align: left;">La commande ionic serve permet d’exécuter l’application dans un navigateur.</p>
<p style="text-align: left;">Lorsque le projet est créé, vous devez éditer vos différentes pages (par ex. sur Notepad++). Les fichiers à modifier se trouvent dans le dossier « www » :</p>
<ul style="text-align: left;">
<li>Le fichier index.html</li>
<li>Les fichiers .html appartenant au dossier “templates” → C’est ici que vous pouvez modifier le contenu de chaque page de votre application.</li>
<li>Le fichier app.js dans le dossier “js” → Vous devez définir votre constellation à cet endroit.</li>
<li>Le fichier controllers.js dans le dossier “js” → Chaque controller est associé à une page html. Vous pouvez utiliser les variables et les fonctions définies dans ces pages grâce aux “Scopes”.</li>
</ul>
<h3 style="text-align: left;">Etape 2 : Visualiser notre application sur un smartphone</h3>
<p style="text-align: left;">Si vous souhaitez utiliser votre application sur votre smartphone, vous pouvez utiliser l’application “ionic view” disponible sur l’App Store et Google Play. Cette application vous permettra de visualiser directement l’application que vous êtes en train de développer sur votre smartphone.</p>
<p style="text-align: left;">Une fois l’application installée, vous devez ensuite vous rendre <a href="https://apps.ionic.io/apps/">sur ce site</a>, créer un compte, puis cliquez sur “New App”. Il ne vous reste plus qu’à faire le lien avec votre application et l’envoyer sur votre appareil. Pour cela, dans le dossier de votre application, utilisez les deux commandes suivantes dans votre invite de commande</p>
<p></p><pre class="crayon-plain-tag">ionic link 
ionic upload</pre><p></p>
<p style="text-align: left;">Ouvrez ensuite ionic view et visualisez votre application.</p>
<p style="text-align: left;">Vous pouvez également, après avoir branché votre téléphone et avoir activé le mode debug, utiliser la commande cordova run android afin de simuler directement votre application sur votre téléphone android.</p>
<h3 style="text-align: left;">Etape 3 : Connecter notre application à constellation</h3>
<p style="text-align: left;">Afin de connecter notre application à la plateforme constellation, nous allons modifier le fichier app.js ainsi que le index.html.</p>
<p style="text-align: left;">Pour cela, nous allons importer les bibliothèques suivantes dans le fichier index.html :</p>
<ul style="text-align: left;">
<li>jquery-2.2.4.min.js</li>
<li>jquery.signalr-2.2.1.min.js</li>
<li>Constellation-1.8.1.min.js</li>
<li>ngConstellation-1.8.1.min.js</li>
</ul>
<p style="text-align: left;">Les librairies sont disponibles sur cette <a href="http://cdn.myconstellation.io/js/">page</a>. Nous vous conseillons de créer un dossier intitulé constellation dans le dossier « lib » et d’y enregistrer ces différentes bibliothèques.</p>
<p style="text-align: left;">Il ne vous restera plus qu’à ajouter les lignes de code suivantes dans le fichier index.html :</p>
<p></p><pre class="crayon-plain-tag">&lt;script type="text/javascript" src="lib/constellation/jquery-2.2.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="lib/constellation/jquery.signalr-2.2.1.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="lib/constellation/Constellation-1.8.1.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="lib/constellation/ngConstellation-1.8.1.min.js"&gt;&lt;/script&gt;</pre><p></p>
<p style="text-align: left;">Puis nous allons ajouter le code suivant à notre fichier app.js :</p>
<p style="text-align: left;">1. Modifier la ligne angular.module, y ajouter ‘ngConstellation’ comme ci-dessous :</p>
<p></p><pre class="crayon-plain-tag">angular.module('starter', ['ionic', 'starter.controllers', 'ngConstellation'])</pre><p></p>
<p style="text-align: left;">2. Modifier la fonction .run, y ajouter $rootScope et constellationConsumer :</p>
<p></p><pre class="crayon-plain-tag">.run(function($ionicPlatform, $rootScope, constellationConsumer)</pre><p></p>
<p style="text-align: left;">3. Ajouter le code suivant dans la fonction .run :</p>
<p></p><pre class="crayon-plain-tag">constellationConsumer.initializeClient("http://192.168.43.171:8088", "123456789", "Application Ionic");
    constellationConsumer.onConnectionStateChanged(function (change) {
        if (change.newState === $.signalR.connectionState.connected) {
            console.log("Connecté à constellation");
            $rootScope.isConnected = true;
        }
    });
    constellationConsumer.connect();
    $rootScope.constellation = constellationConsumer;</pre><p></p>
<p style="text-align: left;">Vous pouvez maintenant vérifier que vous êtes bien connecté à votre constellation en regardant dans votre console (f12 dans votre navigateur).</p>
<h3 style="text-align: left;">Etape 4 : Connecter notre application à la boîte aux lettres</h3>
<p style="text-align: left;">Un certain nombre de State Objects et de Message Callbacks ont été réalisés dans notre package constellation afin de traiter nos différentes informations (ce package est disponible sur gitHub).</p>
<p style="text-align: left;">Le rôle de notre application ici est simplement de s’abonner aux State Objects et d’envoyer des messages Callbacks à notre constellation.</p>
<p style="text-align: left;">→ <b>Exemple de récupération d’un State Object</b> :</p>
<p style="text-align: left;">Les StateObjects se récupèrent dans le fichier app.js, à l’endroit où nous avons défini notre constellation. Voici un exemple de code correspondant à notre State Object « Users » :</p>
<p></p><pre class="crayon-plain-tag">//State Object Utilisateurs
constellationConsumer.registerStateObjectLink("*", "Brain", "Users", "*", function(so) {
    $rootScope.Users = so.Value;
    $rootScope.$apply();
});</pre><p></p>
<p style="text-align: left;">Pour afficher nos utlisateurs, il nous suffit maintenant, dans notre page html d’utiliser le code suivant :</p>
<p></p><pre class="crayon-plain-tag">&lt;ion-item ng-repeat="user in Users"&gt;
  &lt;h2&gt;{{user.firstName}} {{user.name}}&lt;/h2&gt;
  &lt;p&gt;{{user.client ? "client":"facteur"}}&lt;/p&gt;
&lt;/ion-item&gt;</pre><p></p>
<p style="text-align: left;">→ <b>Exemple d’envoi d’un message Callback</b> :</p>
<p style="text-align: left;">Les messages Callbacks s’envoient dans le fichier controllers.js. Voici l’exemple de code pour le Message Callback « DeleteUser » :</p>
<p></p><pre class="crayon-plain-tag">//Message CallBack DeleteUser
$scope.name = $stateParams.name
$scope.firstName = $stateParams.firstName;
$scope.deleteUser = function() {
    var deleteUser = $ionicPopup.confirm({
      title: 'Supprimer cet utilisateur',
      template: 'Etes vous sur de vouloir supprimer cet utilisateur ?'
    });
    deleteUser.then(function(res) {
      if(res) {
          $rootScope.constellation.sendMessage({ Scope: 'Package', Args: ['Brain'] }, 'DeleteUser', [$scope.firstName, $scope.name ]);
          $state.go('tab.utilisateurs');
          console.log('deleted');
      } 
      else {
          console.log('do nothing');
      }
    });
};</pre><p></p>
<p style="text-align: left;">Dans notre page html, on appelle maintenant la fonction créée dans notre controller.js dans un bouton par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;button ng-click="deleteUser()"&gt;Supprimer cet utilisateur&lt;/button&gt;</pre><p></p>
<p style="text-align: left;">En vous servant de cette base, vous pouvez réaliser une application vous permettant de recevoir un message sur votre application lorsque vous recevez un courrier ou un colis mais aussi d’ajouter ou de supprimer des accès à la boite aux lettres.</p>
<p style="text-align: center;"><img loading="lazy" class="alignnone size-full wp-image-5530 aligncenter colorbox-5519" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/video3-2-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/09/video3-2.gif" alt="" width="196" height="350" /></p>
<p style="text-align: left;">Il est également possible de réutiliser des packages existants, par exemple, nous nous sommes servis du package PushBullet afin de recevoir des notifications sur notre smartphone.</p>
<p style="text-align: left;">Voici un aperçu de notre application ionic :</p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/notifications.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="notifications" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/notifications_thumb.png" alt="notifications" width="150" height="295" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/paramtres.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="paramètres" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/paramtres_thumb.png" alt="paramètres" width="150" height="295" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/utilisateurs.png"><img class="colorbox-5519"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="utilisateurs" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/utilisateurs_thumb.png" alt="utilisateurs" width="150" height="295" border="0" /></a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/showcases/creer-une-boite-aux-lettres-connectee-constellation/">Créer une boite aux lettres connectée avec Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/showcases/creer-une-boite-aux-lettres-connectee-constellation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>S-Fit : Concevez un miroir connecté orienté fitness</title>
		<link>https://developer.myconstellation.io/showcases/s-fit-concevez-un-miroir-connecte-oriente-fitness/</link>
					<comments>https://developer.myconstellation.io/showcases/s-fit-concevez-un-miroir-connecte-oriente-fitness/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 27 Sep 2017 10:05:42 +0000</pubDate>
				<category><![CDATA[Showcases]]></category>
		<category><![CDATA[ForecastIO]]></category>
		<category><![CDATA[Domotique]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Miroir]]></category>
		<category><![CDATA[Constellation]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[IoT]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5474</guid>

					<description><![CDATA[<p>C’est l’été, la saison des maillots de bains, il est grand temps de se prendre en main et de se sculpter un corps de rêve. Pourquoi ne pas utiliser une des nombreuses solutions de tracker d’activités présentes sur le marché</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/showcases/s-fit-concevez-un-miroir-connecte-oriente-fitness/">S-Fit : Concevez un miroir connecté orienté fitness</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><i>C’est l’été, la saison des maillots de bains, il est grand temps de se prendre en main et de se sculpter un corps de rêve. Pourquoi ne pas utiliser une des nombreuses solutions de tracker d’activités présentes sur le marché ? Ce n’est pas assez drôle pour des makers, nous avons donc décidé de créer notre propre solution fitness axée autour d’un miroir connecté !</i></p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig1.png"><img class="colorbox-5474"  loading="lazy" title="Résultat final du miroir connecté à Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig1_thumb.png" alt="Résultat final du miroir connecté à Constellation" width="300" height="381" border="0" /></a></p>
<h2>Introduction</h2>
<p>Nous sommes 5 étudiants en troisième année de Cycle Informatique et Réseaux à l’ISEN et nous avons conçu un nouveau concept de solution fitness basée sur un miroir. Pour réaliser notre projet, nous avions un budget de 0€ mais nous avions surtout une grande motivation pour créer un produit innovant et agréable à utiliser.</p>
<p>C’est pour cela que nous avons utilisé des produits de récupérations. En effet, nous avons tous dans notre garage un ordinateur portable que nous n’utilisons plus, une ancienne webcam, et quelques planches de contreplaqué. Concernant l’aspect miroir, nous avons utilisé du film sans tain car nous en avions déjà, cependant, pour une dizaine d’euros de plus, vous pourrez utiliser une vitre sans tain. Cette dernière donnera un rendu bien meilleur à votre miroir. Voilà qui devrait suffire pour la partie matérielle de notre projet.</p>
<p>Pour la partie logicielle, nous avons utilisé la plateforme Constellation. Les lecteurs réguliers de ce magazine la connaissent déjà, pour les autres, il s’agit d’une plateforme technique d’orchestration et d’interconnexion des objets, des services et des applications. Elle s’appuie sur des paquets qui peuvent publier et consommer des messages ainsi que sur des fonctions partagées. Concrètement, avec Constellation, en quelques lignes, il devient très simple de connecter des objets (ou applications) entre eux. Ces derniers vont donc dialoguer via Constellation comme le feraient des micro-services. L’avantage d’utiliser cette plateforme pour un tel projet c’est la facilité avec laquelle nous avons pu connecter et déployer les différentes briques de notre miroir. Pour en savoir plus sur cette technologie, vous pouvez vous rendre sur <a href="http://www.myconstellation.io/">http://www.myconstellation.io/</a></p>
<p>Pour résumer, en raison d’un coût très faible et d’un développement simplifié, S-Fit est le projet parfait pour vous occuper cet été.</p>
<h2>Fonctionnement général</h2>
<p>Nous avons tout d’abord pensé S-Fit comme une application dotée d’un podomètre. Cette dernière synchronise les différents profils des membres de la famille en temps réel grâce à Constellation. Vous pouvez ainsi y gérer vos propres objectifs et surveiller votre progression. Vous ne perdrez pas votre motivation grâce à notre système de trophées qui vous donnera envie de repousser vos limites chaque jour. Comme il n’existe pas de meilleure motivation que la compétition, vous pourrez vous comparer à vos proches grâces à des outils d’analyse s’appuyant sur une série de graphiques.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig7.png"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Les sources d’informations du miroir" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig7_thumb.png" alt="Les sources d’informations du miroir" width="240" height="240" border="0" /></a></p>
<p>Pour vous rappeler vos objectifs chaque matin, nous avons ajouté à S-Fit un miroir compagnon. Ce dernier a demandé beaucoup de réflexion car il s’agit d’un nouvel objet avec lequel il faut interagir de manière naturelle. De plus, il fallait faire de ce dernier un bel objet que l’on puisse retrouver chez soi. Nous avons donc fait le choix d’une interface minimaliste qui affiche seulement les informations pertinentes : la météo, les évènements à venir et votre progression. De ce fait, pas besoin de toucher le miroir et d’y laisser des traces de doigts.</p>
<p>Pour gérer les multiples profils, nous avons également intégré un module de reconnaissance faciale qui permettra au miroir d’afficher des informations personnalisées en fonction de son utilisateur.</p>
<p>Comme vous vous en doutez surement, le lien entre l’application et le miroir se fait par l&rsquo;intermédiaire de la plateforme Constellation. Tout est synchronisé en temps réel et cela fonctionne comme par magie.</p>
<h3>Etape 1 : Conception du boîtier</h3>
<p>Pour commencer, il faut démonter votre vieil ordinateur, afin d’en récupérer la dalle LCD. On utilise ensuite la référence de cette dernière pour pouvoir se procurer le contrôleur adapté.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig2.jpg"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="La dalle récupérée et son contrôleur" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig2_thumb.jpg" alt="La dalle récupérée et son contrôleur" width="236" height="244" border="0" /></a></p>
<p>Ensuite, il faut concevoir un boîtier capable d’accueillir l’ensemble de votre appareil. Son épaisseur et ses dimensions dépendent donc de votre miroir. Nous ne fournirons donc pas de plans pour rendre votre création unique.</p>
<p>Attention toutefois à prévoir des espaces pour l’aération, l’alimentation et les contrôles de la dalle.</p>
<p>C’est la partie la plus personnelle du projet, c’est le moment de libérer votre créativité pour mettre en place votre vision de S-Fit.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig3.jpg"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Assemblage du boîtier et vernissage" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig3_thumb.jpg" alt="Assemblage du boîtier et vernissage" width="244" height="125" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig4.jpg"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Assemblage du boîtier et vernissage" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig4_thumb.jpg" alt="Assemblage du boîtier et vernissage" width="244" height="127" border="0" /></a></p>
<p>Nous avons également prévu une trappe d’accès à l’arrière pour pouvoir modifier notre miroir plus tard.</p>
<p>Si vous avez fait le choix du film sans tain, il va falloir le poser. Pour cela, voici les quelques étapes à suivre :</p>
<ul>
<li>Nettoyer votre dalle à l’aide d’un chiffon doux</li>
<li>Appliquer un peu d’eau savonneuse sur celle-ci</li>
<li>Poser le film sans tain petit à petit en vous aidant d’un grattoir. Attention à ne pas rayer le film avec, c’est très fragile !</li>
<li>Chassez, toujours avec ce grattoir, les dernières bulles d’air</li>
</ul>
<p>Prenez bien votre temps lors de la pose, c’est une partie très délicate et elle affectera directement l’esthétique de votre miroir.</p>
<p>Vous avez maintenant l’ensemble des pièces qui vont constituer votre miroir. Pour terminer, il ne vous reste plus qu’à tout assembler en faisant attention à bien aligner la dalle et le boîtier.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig5.jpg"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Le miroir assemblé, prêt à être refermé" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig5_thumb.jpg" alt="Le miroir assemblé, prêt à être refermé" width="354" height="266" border="0" /></a></p>
<p>Si vous souhaitez intégrer un module de reconnaissance faciale, il va falloir ajouter une webcam (USB).</p>
<p>Pour cela, il faut la démonter, récupérer le circuit et le fixer dans le boîtier.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig07.jpg"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Miroir assemblé sans la webcam" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig07_thumb.jpg" alt="Miroir assemblé sans la webcam" width="304" height="404" border="0" /></a></p>
<h3>Etape 2 : Le développement logiciel</h3>
<h4>Etape 2.1 : L’interface du miroir</h4>
<p>Pour réaliser le miroir, nous avons choisi de concevoir une application web avec AngularJS. En effet, comme le dit le créateur de Constellation, Sébastien Warin, on peut connecter n’importe quoi avec quelques lignes de code qui vont bien.</p>
<p>Tout d’abord, il est important de rappeler que pour continuer ce tutoriel, il est nécessaire d’avoir une Constellation déployée chez soi. Vous trouverez la plateforme ainsi que les tutoriels de prise en main sur le portail <a href="https://developer.myconstellation.io/">https://developer.myconstellation.io/</a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig8.png"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Le rôle de Constellation dans la plateforme S-Fit" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig8_thumb.png" alt="Le rôle de Constellation dans la plateforme S-Fit" width="300" height="300" border="0" /></a></p>
<p>Nous allons donc pouvoir connecter notre application Angular à Constellation :</p>
<p></p><pre class="crayon-plain-tag">var app = angular.module('Mirror', ['ngConstellation']);

app.controller('MyController', ['$scope', 'constellationConsumer', ($scope, constellation) =&gt; {

    constellation.initializeClient("maconstellation.local", "masupercle123", "MyMirror");

    constellation.connect();

}]);</pre><p></p>
<p>Il ne reste plus qu’à s’abonner aux StateObjects de Constellation que l’on veut voir sur le miroir. Par exemple, ici, nous allons récupérer la météo dans la ville de Lille :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerStateObjectLink("*", "ForecastIO", "Lille", "*", (so) =&gt; {
    $scope.$apply(() =&gt; {
        $scope.temperature = so.Value.currently.temperature;
    });
});</pre><p></p>
<p>Pour en savoir plus, vous pouvez vous rendre sur le portail dont le lien se trouve plus haut pour y trouver la documentation complète. Vous trouverez d’ailleurs un tutoriel détaillé sur l’utilisation de Constellation en JavaScript. Mais rassurez vous, ce n’est pas plus compliqué que cela. Il ne manque que quelques lignes d’HTML et de CSS pour donner vie à votre miroir.</p>
<p>Si on continue l’exemple de la météo, le code HTML associé pourrait-être le suivant :</p>
<p></p><pre class="crayon-plain-tag">&lt;p&gt;{{temperature}}&lt;/p&gt;</pre><p></p>
<p>On obtiendrait alors une page sur laquelle la température va s’afficher dynamiquement.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig6.png"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="L’interface finale du miroir: le choix du noir et blanc permet un meilleur rendu sur le miroir" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig6_thumb.png" alt="L’interface finale du miroir: le choix du noir et blanc permet un meilleur rendu sur le miroir" width="450" height="336" border="0" /></a></p>
<h4>Etape 2.2 : La reconnaissance faciale</h4>
<p>Comme nous l’expliquions plus haut, nous avons ajouté un module de reconnaissance faciale pour gérer plusieurs profils. Il s’agit d’une partie facultative et plutôt complexe.</p>
<p>Pour cela, nous avons utilisé une <a href="https://www.codeproject.com/Articles/261550/EMGU-Multiple-Face-Recognition-using-PCA-and-Paral">application open source existante</a> qui s’appuie sur EMGU.CV. C’est un portage en C# d’OpenCV. Malheureusement, cette application était trop ancienne et nous n’avons pas réussi à la connecter directement à Constellation. Pour résoudre ce problème, nous avons conçu un paquet Constellation qui permet de publier et de s’abonner aux StateObjects par l’intermédiaire de sockets TCP.</p>
<p>Lors de l’ajout d’un nouvel utilisateur S-Fit, le paquet lance la séquence d’enregistrement d’un visage automatiquement.</p>
<p>Nous avons effectué plusieurs essais sur la quantité d’images à enregistrer, afin d’obtenir l’équilibre idéal entre une reconnaissance optimale et un minimum d’espace utilisé. Pour vous reconnaître, l’algorithme s’appuie sur plusieurs caractéristiques faciales, comme la forme du nez, de la bouche, des yeux, de vos sourcils…</p>
<p>De par le peu d’espace pris par la reconnaissance, vous pouvez aisément enregistrer toute votre famille, afin que le miroir devienne un élément à part entière de votre lieu de vie, et que tout le monde participe à la compétition !</p>
<p>La reconnaissance faciale se déroule en deux étapes. La première consiste à détecter un visage. Pour cela nous avons utilisé le classificateur Haar car il nous fallait une reconnaissance faciale en temps réel. Le classificateur Haar est, en fait, un fichier xml contenant une quantité énorme de photos dites négatives et positives. Les photos positives contiennent un visage, tandis que les photos négatives n’en contiennent pas. Cela permet donc de savoir si un visage est présent sur une photo ne faisant pas partie du classificateur. À noter qu’il est possible de créer soi-même son propre classificateur ou même d’en améliorer un.</p>
<p>Ici, nous nous servons donc de ce dernier afin de vérifier si, sur la frame actuelle, un visage est présent ou non de la sorte :</p>
<p></p><pre class="crayon-plain-tag">gray_frame = currentFrame.Convert&lt;Gray, Byte&gt;();

MCvAvgComp[][] facesDetected = gray_frame.DetectHaarCascade(Face, 1.2, 10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(50, 50));</pre><p></p>
<p>Ceci va donc insérer dans le tableau facesDetected[0] tous les visages ayant eu un résultat positif après comparaison avec le classificateur Haar.</p>
<p>Dans un second temps, on cherche à reconnaître une personne à l’aide de son visage, l’application dispose donc d’une architecture très simple divisée en trois classes C#. La classe principale va capturer le flux vidéo de la webcam puis par la suite analyser chaque image via la classe de reconnaissance de personne qui, elle, aura au préalable chargé les données des personnes déjà enregistrées. La dernière classe sert, quant à elle, à enregistrer une personne en prenant une centaine de photos du visage de celle-ci.</p>
<p>Pour communiquer avec notre package, nous avons également ajouté une classe TCPClient.cs qui se connecte et échange les StateObjects via le réseau.</p>
<p>C’est d’ailleurs les paquets reçus qui vont démarrer les fonctions d’ajout d’utilisateur.</p>
<p>Pour rendre la gestion des utilisateurs agréable, nous avons intégré cette reconnaissance faciale de manière totalement transparente. Lorsqu’un utilisateur s’enregistre dans l’application il doit être face au miroir. Pour vérifier cela, l’utilisateur sera invité à saisir un code à six chiffres qui s’affichera quelques secondes sur le miroir. Une fois l’ensemble des informations saisies dans l’application, le miroir va automatiquement lancer une séquence de capture de 100 clichés du nouvel utilisateur.</p>
<p>Pour la reconnaissance des utilisateurs enregistrés, le paquet de reconnaissance faciale va capturer une image chaque seconde pour vérifier la présence ou non d’un individu connu.</p>
<p>Lorsque deux utilisateurs enregistrés sont face au miroir, ce dernier va se concentrer sur celui qu’il identifie le mieux.</p>
<h4>Etape 2.3 : L’application mobile</h4>
<p>L’application S-Fit a été conçue avec les frameworks Ionic 3 et Apache Cordova. Ces frameworks permettent d’obtenir une application Web à l&rsquo;intérieur d’une application native Android ou iOS qui embarque un serveur NodeJS sur le mobile. Comme nous l’avons vu plus haut, l’application qu’affiche le miroir est une page web, l’application mobile utilise donc les mêmes technologies.</p>
<p>Ainsi, la connexion s’effectuera tout aussi simplement :</p>
<p></p><pre class="crayon-plain-tag">var constellation = $.signalR.createConstellationConsumer("maconstellation.local", "masupercle123", "MonApp");

constellation.connection.start();</pre><p></p>
<p>Une application comme la nôtre peut alors consommer des StateObjects mais également envoyer des MessageCallbacks. C’est à dire exécuter des fonctions directement sur la Constellation. C’est particulièrement utile pour incrémenter le compteur de pas.</p>
<p>Nous avons découpé notre application en trois grandes parties : la gestion des profils, les activités et les trophées.</p>
<h5>Gestion des profils</h5>
<p>Comme S-Fit est pensé pour plusieurs utilisateurs, nous avons géré les profils dans notre application.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig10-1.png"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Choix d’utilisateur, nouvel utilisateur et informations" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig10_thumb-1.png" alt="Choix d’utilisateur, nouvel utilisateur et informations" width="354" height="202" border="0" /></a></p>
<p>Lorsqu’un utilisateur lance l’application, il peut choisir son profil. Cette action va établir la connexion avec la Constellation pour récupérer les informations personnelles et l’historique d’activités. Toutefois, s’il n’a pas de profil, il peut en ajouter un s’il est en face du miroir, qui lui affichera alors un code de vérification. Lors du lancement de l’application, cette dernière synchronise instantanément les nouvelles données d’activités avec le serveur Constellation.</p>
<p>L’utilisation d’S-Fit est totalement transparente et ne demande pas de manipulation particulière de l’utilisateur. En effet, nous avons cherché à fournir un produit simple, accessible et entièrement automatisé. Cette synchronisation est permise par Constellation.</p>
<h5>Les activités</h5>
<p>Cette partie se compose d’un podomètre, d’un récapitulatif de la journée en cours et d’un historique sous forme de graphiques.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig11-1.png"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Récapitulatif de la journée en temps réel et statistiques" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig11_thumb-1.png" alt="Récapitulatif de la journée en temps réel et statistiques" width="304" height="262" border="0" /></a></p>
<p>Pour le podomètre, nous nous sommes appuyés sur un plugin de Cordova permettant d’accéder aux données de l&rsquo;accéléromètre du mobile. A l’aide des données fournies par ce plugin, nous avons pu étudier les variations sur les axes x, y et z, dans l’optique de compter les pas.</p>
<p>L’application récupère donc les données accélérométriques de votre mobile toutes les 0.120 secondes. C’est une valeur que nous avons retenue après plusieurs jours de tests pour affiner la précision du compteur de pas, puis, en s’appuyant sur les précédentes valeurs, on va déterminer si le mouvement effectué est un pas ou non, et donc informer Constellation si elle doit incrémenter le nombre de pas de l’utilisateur.</p>
<p>Le développement de cette application ne se résume pas qu’à de la programmation informatique. Nous avons également réalisé des mesures sur plusieurs dizaines de personnes afin d’obtenir un lien entre la morphologie et la longueur des pas</p>
<p></p><pre class="crayon-plain-tag">var slope = 0.64878048 ;
var origin = 44.6744 ;

function getDistance(size, stepCounter) {
    return (size * slope - origin) * stepCounter;
}</pre><p></p>
<p>Avec les informations physiologiques et l’activité de l’utilisateur, on peut donc créer un ensemble de fonctions qui permettent d’étudier son état de santé, en calculant par exemple les calories dépensées chaque jour. C’est grâce à ces données qu’il est possible de créer une application fitness entièrement maîtrisée. On est alors libre d’appliquer les algorithmes souhaités sur les données récupérées.</p>
<p>Pour la page des graphiques sur l’application mobile, nous avons utilisé la bibliothèque Chart.js qui permet de tracer des graphiques dynamiques avec un rendu épuré. Son principal avantage est la prise en main rapide de la bibliothèque ainsi que toutes ses options.</p>
<p>Voici un exemple pour tracer un graphique linéaire</p>
<p></p><pre class="crayon-plain-tag">var myLineChart = new Chart(ctx, {
    type: 'line',
    data: data,
    options: options
});</pre><p></p>
<p>Cependant, il faut tout d’abord récupérer les informations présentes dans les StateObjects pour les afficher dans les graphiques. Cela nous permet de faire des graphes qui se mettent à jour en temps réel.</p>
<h5>Les trophées</h5>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig12.png"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="La liste des trophées et détails d’un trophée" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig12_thumb.png" alt="La liste des trophées et détails d’un trophée" width="354" height="303" border="0" /></a></p>
<p>Comme nous l’expliquions plus haut, nous avons intégré un système de trophées et de récompense. Il se présente tout d’abord comme une liste de trophées que l’on débloque en réalisant des succès particuliers (pas, distance).</p>
<p>Les trophées montrent votre expérience sur S-Fit, et représentent donc la récompense pour vos efforts. Lorsque l’on clique sur un trophée débloqué, on affiche son détail et le nombre de points qu’il a rapporté.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig11.png"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Schéma récapitulatif de la synchronisation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig11_thumb.png" alt="Schéma récapitulatif de la synchronisation" width="240" height="240" border="0" /></a></p>
<h2>Conclusion</h2>
<p>Voilà qui conclue les grandes étapes de la réalisation de S-Fit. Comme vous avez pu le voir les possibilités de personnalisation sont très nombreuses. C’est un projet ludique et facile à réaliser. C’est également un bon point de départ pour prendre en main la plateforme Constellation. Nous espérons vraiment qu’il vous a plu et que vous allez réaliser votre propre version.</p>
<p>Nous tenons également à remercier Julie, Adrien et tous ceux qui se sont impliqués de près ou de loin dans la réalisation de ce projet.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig9.jpg"><img class="colorbox-5474"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="L’équipe au complet" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/fig9_thumb.jpg" alt="L’équipe au complet" width="404" height="256" border="0" /></a></p>
<p>Auteurs : Valentin BEQUART, David BRICENO-AGUILERA, Pierre-Alexandre CHOAIN, Milan FERTIN et Hugo MROCZKOWSKI.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/showcases/s-fit-concevez-un-miroir-connecte-oriente-fitness/">S-Fit : Concevez un miroir connecté orienté fitness</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/showcases/s-fit-concevez-un-miroir-connecte-oriente-fitness/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Créer un capteur de température, humidité et luminosité connecté</title>
		<link>https://developer.myconstellation.io/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/</link>
					<comments>https://developer.myconstellation.io/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 10 May 2017 15:55:52 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Capteur]]></category>
		<category><![CDATA[DHT11]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[AngularJS]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=4588</guid>

					<description><![CDATA[<p>Dans ce tutoriel créons un capteur de température, d’humidité et de luminosité connecté avec une page Web de visualisation des données en temps réel. Prérequis Un Arduino connecté ou un ESP8266 Des capteurs (DHT11 pour l’humidité et la température, un TSL2561</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/">Créer un capteur de température, humidité et luminosité connecté</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Dans ce tutoriel créons un capteur de température, d’humidité et de luminosité connecté avec une page Web de visualisation des données en temps réel.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-52.png"><img loading="lazy" class=" colorbox-4588" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Capteur connecté" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-52.png" alt="Capteur connecté" width="399" height="248" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-55.png"><img loading="lazy" class=" colorbox-4588" 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/2017/05/image_thumb-55.png" alt="image" width="271" height="248" border="0" /></a></p>
<h3>Prérequis</h3>
<ul>
<li>Un Arduino connecté ou un ESP8266</li>
<li>Des capteurs (DHT11 pour l’humidité et la température, un TSL2561 pour la luminosité par exemple)</li>
<li>Un serveur Constellation</li>
</ul>
<h3>Etape 1 : le montage</h3>
<p>Ici nous utiliserons un D1 Mini Pro (ESP8266) avec un capteur DHT11 combinant la mesure de la température et de l’humidité ainsi qu&rsquo;un capteur TSL2561 pour la luminosité.</p>
<p>Les deux capteurs seront alimentés en 3,3v par la D1 Mini.</p>
<p>Le TSL2561 dispose d’une interface I²C (SDA et SDL qu’on connectera sur D1 et D2) et le DHT11 n’a besoin que d’une entrée digitale (qu’on connectera sur D3).</p>
<h3>Etape 2 : la programmation</h3>
<p>Pour démarrer vous devez dans Constellation déclarer une sentinelle associée à une clé d’accès et un package virtuel. Ici notre ESP8266 est représenté par la sentinelle nommée “ESP8266” et le package virtuel se nomme “MySensor”.</p>
<p>Dans l’Arduino IDE, nous créons un nouveau projet à partir du Starter Kit Constellation pour ESP8266 dans lequel nous allons définir le nom de notre réseau Wifi (SSID) ainsi que sa clé d’accès  puis nous configurerons le client Constellation en spécifiant l’identité de notre package virtuel, sa clé d’accès et l’adresse/port de notre serveur Constellation :</p>
<p></p><pre class="crayon-plain-tag">// ESP8266 Wifi
#include &lt;ESP8266WiFi.h&gt;
char ssid[] = "MON SSID";
char password[] = "macléWifi!!!!";

// Constellation client
Constellation&lt;WiFiClient&gt; constellation("X.X.X.X", 8088, "ESP8266", "MySensor", "xxxxxxxxxxxxxxxxx")</pre><p></p>
<p>Encore une fois si tout cela est nouveau pour vous, je vous recommande <a href="/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">de suivre ce guide d’introduction à l’API Constellation pour Arduino/ESP8266</a>.</p>
<p>Lancez maintenant le « gestionnaire de bibliothèque » (menu <i>Croquis &gt; Inclure une bibliothèque &gt; Gérer les bibliothèques</i>) et installez les bibliothèques suivantes :</p>
<ul>
<li>Adafruit Unified Sensor (par Adafruit)</li>
<li>DHT Sensor library (par Adafruit)</li>
<li>Adafruit TSL2561 (par Adafruit)</li>
</ul>
<p>Une fois les librairies installées, ajoutez en entête de votre code :</p>
<p></p><pre class="crayon-plain-tag">#include &lt;Adafruit_TSL2561_U.h&gt;
#include &lt;DHT_U.h&gt;
#include &lt;Wire.h&gt;</pre><p></p>
<p>Déclarez ensuite, juste après la déclaration du client Constellation, le capteur TSL2561 et le DHT11 par les lignes :</p>
<p></p><pre class="crayon-plain-tag">DHT_Unified dht(D3, DHT11);
Adafruit_TSL2561_Unified tsl(TSL2561_ADDR_FLOAT);</pre><p></p>
<p>Déclarez également un entier pour définir l’intervalle de temps (en ms) entre deux mesures que nous fixons à 10 secondes par défaut :</p>
<p></p><pre class="crayon-plain-tag">int interval = 10000; //ms</pre><p></p>
<p>Dans la méthode « <em>setup()</em> » configurez les I/O utilisés par l’I²C (D1 et D2 dans notre cas) :</p>
<p></p><pre class="crayon-plain-tag">Wire.begin(D1, D2);</pre><p></p>
<p>Initialisez ensuite le capteur DHT11 par la ligne :</p>
<p></p><pre class="crayon-plain-tag">dht.begin();</pre><p></p>
<p>Puis le capteur TSL2561 :</p>
<p></p><pre class="crayon-plain-tag">if(!tsl.begin())
{
  Serial.print("No TSL2561 detected!");
  while(1);
}
tsl.enableAutoRange(true);
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);</pre><p></p>
<p>Toujours dans la méthode «<em> setup</em> », récupérons les settings de notre package sur Constellation et affectons le setting « Interval » si défini sur Constellation (autrement c’est la valeur de 10 secondes déclarée ci-dessus qui sera utilisée) :</p>
<p></p><pre class="crayon-plain-tag">JsonObject&amp; settings = constellation.getSettings();
if(settings.containsKey("Interval")) {
  interval = settings["Interval"].as&lt;int&gt;();
}</pre><p></p>
<p>Pour finir dans la boucle principale, nous allons prendre les mesures de nos capteurs et publier trois StateObjects avec une durée de vie de deux fois l’intervalle de temps :</p>
<p></p><pre class="crayon-plain-tag">void loop(void) {
  constellation.loop();
  static int lastBeat = 0;
  if(millis() - lastBeat &gt; interval) {
    lastBeat = millis();
    sensors_event_t event;
    // Luminosité
    tsl.getEvent(&amp;event);
    if (event.light) {
      constellation.pushStateObject("Light", event.light, interval * 2);
    }  
    // Temperature
    dht.temperature().getEvent(&amp;event);
    if (!isnan(event.temperature)) {
      constellation.pushStateObject("Temperature", event.temperature, interval * 2);
    }
    // Humidité
    dht.humidity().getEvent(&amp;event);
    if (!isnan(event.relative_humidity)) {
      constellation.pushStateObject("Humidity", event.relative_humidity, interval * 2);
    }
  }
}</pre><p></p>
<p><strong>Et voilà votre capteur connecté est prêt !</strong></p>
<p>Il ne reste plus qu’à téléverser votre programme et ouvrir votre Console Constellation pour constater qu’il est bien opérationnel :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-53.png"><img class="colorbox-4588"  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/2017/05/image_thumb-53.png" alt="image" width="404" height="149" border="0" /></a></p>
<p>Ouvrez maintenant le <a href="/constellation-platform/constellation-console/stateobjects-explorer/">StateObject Explorer</a> et rechercher le terme “MySensor” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-54.png"><img class="colorbox-4588"  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/2017/05/image_thumb-54.png" alt="image" width="404" height="154" border="0" /></a></p>
<p>On retrouve bien, en temps réel, les trois mesures réalisées par notre ESP8266. N’hésitez pas à ouvrir ces StateObjects et cliquez sur « Subscribe » pour voir les mesures en temps réel dans la Console Constellation.</p>
<h3>Etape 3 : Une page Web pour afficher votre capteur en temps réel</h3>
<p>Créons maintenant une page Web pour afficher en temps réel les mesures de notre capteur connecté. Pour cela créez un fichier HTML sur votre poste avec une structure HTML de base.</p>
<p>Dans les entêtes ajoutez les scripts suivants :</p>
<p></p><pre class="crayon-plain-tag">&lt;script type="text/javascript" src="https://code.jquery.com/jquery-2.2.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.1.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https:/cdn.myconstellation.io/js/Constellation-1.8.1.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/ngConstellation-1.8.1.min.js"&gt;&lt;/script&gt;</pre><p></p>
<p>Sur la balise &lt;html&gt; ajoutez l’attribut :</p>
<p></p><pre class="crayon-plain-tag">ng-app="MyDemoApp"</pre><p></p>
<p>Et sur la balise &lt;body&gt; ajoutez l’attribut :</p>
<p></p><pre class="crayon-plain-tag">ng-controller="MyController"</pre><p></p>
<p>Dans le corps de votre page, placez les valeurs vos StateObjects où bon vous semble. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;div&gt;
    Temperature: &lt;p&gt;{{Temperature}}°C&lt;/p&gt;
    Humidity: &lt;p&gt;{{Humidity}}%&lt;/p&gt;
    Light: &lt;p&gt;{{Light}} lux&lt;/p&gt;
&lt;/div&gt;</pre><p></p>
<p>Pour finir ajoutez le script suivant dans votre page (dans une balise &lt;script&gt;):</p>
<p></p><pre class="crayon-plain-tag">var myDemoApp = angular.module('MyDemoApp', ['ngConstellation']);
myDemoApp.controller('MyController', ['$scope', 'constellationConsumer', function ($scope, constellation) {

  constellation.initializeClient("http://localhost:8088", "clé d'accès constellation", "MySensor WebPage");

    constellation.onConnectionStateChanged(function (change) {
      if (change.newState === $.signalR.connectionState.connected) {

        constellation.registerStateObjectLink("*", "MySensor", "*", "*", function (so) {
          $scope.$apply(function () {
           $scope[so.Name] = so.Value;
          });
        });
      }
    });

    constellation.connect();
  }]);</pre><p></p>
<p>N’oubliez pas de définir l’adresse de votre Constellation ainsi que la clé d’accès pour vous connecter à votre Constellation lors de l’appel de la méthode « constellation.initializeClient »</p>
<p><b>Vous obtenez en quelques minutes une page Web permettant d’afficher en temps réel les mesures de température, d’humidité et de luminosité réalisées par votre ESP8266 !</b></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-55.png"><img class="colorbox-4588"  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/2017/05/image_thumb-55.png" alt="image" width="404" height="369" border="0" /></a></p>
<h3>Etape 4 (optionnelle) : créer un package .NET pour exploiter les données du capteur</h3>
<p>La page Web réalisée ci-dessus permet d’afficher en temps réel les valeurs de vos StateObjects.</p>
<p>Si maintenant vous souhaitez récupérer la valeur de ces StateObject dans un programme pour réagir en fonction de certaines valeurs (par exemple alerter si T° trop froide ou allumer des lumières si la luminosité est trop faible) ou bien tout simplement enregistrer ces valeurs dans un fichier, une base de données ou un service de cloud, suivez la suite.</p>
<p>Pour cet exemple, réalisons un programme en C#. On part du principe que vous avez installé Visual Studio et <a href="/getting-started/installer-constellation/">le SDK Constellation depuis le « Web Platform Installer »</a>.</p>
<p>Créez alors un nouveau projet de type « Constellation Package Console » :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-56.png"><img class="colorbox-4588"  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/2017/05/image_thumb-56.png" alt="image" width="404" height="266" border="0" /></a></p>
<p>Dans votre classe, ajoutez simplement des propriétés pour chaque StateObject avec l’attribut « StateObjectLink » pour lier ces propriétés .NET aux StateObjects de votre capteur (servez-vous du snippet « stateobjectlink »).</p>
<p>Par exemple pour inclure le StateObject « Light » dans notre classe C# :</p>
<p></p><pre class="crayon-plain-tag">[StateObjectLink("MySensor", "Light")]
public StateObjectNotifier Light { get; set; }</pre><p></p>
<p>Vous pouvez maintenant afficher sa valeur à tout moment, par exemple :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.WriteInfo($"Luminosité {this.Light.Value.LastUpdate} = {this.Light.DynamicValue} lux");</pre><p></p>
<p>La propriété « Light » de votre classe contiendra toujours la dernière valeur du StateObject connu dans votre Constellation.</p>
<p>Vous pouvez donc manipuler la valeur mesurée par votre ESP8266 dans votre code C# comme une simple propriété .NET de votre code.</p>
<p>Vous pouvez également vous abonner à chaque mise à jour du StateObject pour déclencher une action grâce à l’évènement « ValueChanged » :</p>
<p></p><pre class="crayon-plain-tag">this.Light.ValueChanged += (s, e) =&gt;
{
    PackageHost.WriteInfo($"Nouvelle mesure à {this.Light.Value.LastUpdate} = {this.Light.DynamicValue} lux");
};</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-57.png"><img class="colorbox-4588"  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/2017/05/image_thumb-57.png" alt="image" width="404" height="206" border="0" /></a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/">Créer un capteur de température, humidité et luminosité connecté</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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/#comments</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[ESP8266]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[WriteLog]]></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>
		<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>2</slash:comments>
		
		
			</item>
		<item>
		<title>Le générateur de code C#</title>
		<link>https://developer.myconstellation.io/constellation-platform/constellation-sdk/generateur-de-code/</link>
					<comments>https://developer.myconstellation.io/constellation-platform/constellation-sdk/generateur-de-code/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 12:53:45 +0000</pubDate>
				<category><![CDATA[Constellation SDK]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[SDK]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2153</guid>

					<description><![CDATA[<p>Etant donné que chaque package peut (et devrait) déclarer la liste des MessageCallbacks détaillée (description, liste des paramètres, type de réponse, …) qu’il expose ainsi que la liste des types personnalisées qu’il utilise dans la signature de ses MessageCallbacks ou</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-sdk/generateur-de-code/">Le générateur de code C#</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Etant donné que chaque package peut (et devrait) déclarer la liste des MessageCallbacks détaillée (description, liste des paramètres, type de réponse, …) qu’il expose ainsi que la liste des types personnalisées qu’il utilise dans la signature de ses MessageCallbacks ou des StateObjects qu’il publie, il est donc possible de générer du code de manière automatique.</p>
<p>C’est grâce à cette description, que l’on nomme le “PackageDescriptor” que fonctionne le “<a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallback Explorer</a>” de la Console Constellation par exemple.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-116.png"><img class="colorbox-2153"  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-111.png" alt="image" width="350" height="200" border="0" /></a></p>
<p align="left">L’interface est capable de lister chaque MessageCallbacks  de chaque packages de votre Constellation avec un formulaire pour la saisie des paramètres (simples ou complexes) afin de tester simplement vos MC.</p>
<p align="left">En cliquant sur le bouton <a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-117.png"><img class="colorbox-2153"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-112.png" alt="image" width="25" height="22" border="0" /></a>, le “<a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallback Explorer</a>” de la Console Constellation vous propose des “code snippets” pour différents langages (C#, Python, Arduino, JS, etc.).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-118.png"><img class="colorbox-2153"  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-113.png" alt="image" width="354" height="226" border="0" /></a></p>
<h3 align="left">Pourquoi générer du code ?</h3>
<p align="left">Comme vous le savez, en C# pour envoyer un message et donc invoquer un MC d’un autre package, vous devez créer un scope et invoquer le MC en utilisant un proxy dynamique.</p>
<p align="left">Par exemple pour invoquer le MC “AreaArm” du package Paradox, on pourrait écrire :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.CreateMessageProxy("Paradox").AreaArm(new { Area = Paradox.Core.Area, Mode = Paradox.Core.ArmingMode, PinCode = System.String });</pre><p></p>
<p align="left">Il est important de noter ici que la méthode “<em>CreateMessageProxy</em>” retourne un “proxy dynamique”, c’est à dire que la méthode invoquée, ici “AreaArm” sera la clé du message.</p>
<p align="left">Autrement dit, comme tout est dynamique, il y a aucune aide ou auto-complétion. On pourrait très bien écrire ceci :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.CreateMessageProxy("Paradox").CeciEstUnExemple();</pre><p></p>
<p>Votre package enverra un message “CeciEstUnExemple” au(x) package(s) Paradox de votre Constellation. Vous devez donc être vigilent sur le nom des MC invoqués car une erreur de frappe passera inaperçu !</p>
<p>Pour plus d’information sur l’envoi de messages &amp; invocation de MessageCallbacks en C#, <a href="/client-api/net-package-api/envoyer-des-messages-invoquer-des-messagecallbacks/">veuillez lire ceci</a>.</p>
<p>Le “problème” est le même avec la consommation des StateObjects (<a href="/client-api/net-package-api/consommer-des-stateobjects/">lire ceci</a>). Par exemple pour injecter dans votre code, le StateObject “/intelcpu/0/load/0” produit par le package “HWMonitor” sur la sentinelle “MON-PC”, on peut écrire :</p>
<p></p><pre class="crayon-plain-tag">[StateObjectLink("MON-PC", "HWMonitor", "/intelcpu/0/load/0")]
private StateObjectNotifier CPU { get; set; }</pre><p></p>
<p>Je peux donc ensuite exploiter la valeur de mon StateObject :</p>
<p></p><pre class="crayon-plain-tag">dynamic value = this.CPU.DynamicValue;</pre><p></p>
<p>La propriété “Value” du StateObjectNotifier  me donne la valeur du StateObject et la propriété “Value” de ce StateObject me donne la valeur du StateObject. Vous pouvez utiliser la propriété “DynamicValue” directement sur le StateObjectNotifier  pour récupérer la valeur du SO sous forme d’un ”dynamic”.</p>
<p>Comme chaque StateObject est différent, je ne sais pas ne que je trouverai dedans (une valeur simple, un objet complexe, …). D’où l’intérêt d’utiliser le <a href="/constellation-platform/constellation-console/stateobjects-explorer/">StateObject Explorer</a> de la Console Constellation pour explorer les SO de votre Constellation.</p>
<p>Par exemple, le StateObject “/intelcpu/0/load/0” produit par le package “HWMonitor” est un objet complexe contenant 4 propriétés :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-119.png"><img class="colorbox-2153"  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-114.png" alt="image" width="354" height="252" border="0" /></a></p>
<p align="left">Alors que le StateObject de type “CarbonDioxideMeasurement” produit par le package “NetAtmo” est un entier :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-120.png"><img class="colorbox-2153"  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-115.png" alt="image" width="354" height="280" border="0" /></a></p>
<p>C’est pour cela que dans votre code, la valeur d’un StateObject est “dynamique” : tout dépend du StateObject que vous consommez !</p>
<p>Que ce soit pour l’invocation de MessageCallback ou la consommation de StateObject, la forme “dynamique” permet de s’adapter à toutes les situations. En revanche vous perdez l’auto complétion ce qui peut vous ralentir mais aussi être une source d’erreur. D’où l’intérêt de générer du code dans votre package!</p>
<h3>Générer du code depuis Visual Studio.</h3>
<p>Le générateur de code inclut dans le SDK Constellation pour Visual Studio ne fonctionne que pour un projet C#.</p>
<p>Commencez tout d’abord par cliquer le bouton <a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-110.png"><img class="colorbox-2153"  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-105.png" alt="image" width="30" height="24" border="0" /></a> “Generate Code” dans la barre de menu :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-109.png"><img class="colorbox-2153"  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-104.png" alt="image" width="240" height="92" border="0" /></a></p>
<p>Le code sera généré pour le projet marqué comme projet de démarrage dans le cas où votre solution contient plusieurs projets.</p>
<p>Autrement, en cliquant-droit sur le projet de votre choix, sélectionnez “Generate Code” dans le sous-menu “Constellation” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-111.png"><img class="colorbox-2153"  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-106.png" alt="image" width="350" height="327" border="0" /></a></p>
<p>Vous serez amené à sélectionner dans la liste déroulante la Constellation à cibler. Pour configurer des connexions vers vos Constellations, <a href="/constellation-platform/constellation-sdk/gerer-connexions-constellation/">lisez ceci</a>.</p>
<p>Une fois le serveur Constellation sélectionné, cliquez sur “Connect and Discover”. Vous obtiendrez la liste de toutes vos sentinelles et packages de votre Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-122.png"><img class="colorbox-2153"  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-117.png" alt="image" width="350" height="387" border="0" /></a></p>
<p align="left">Sélectionnez tout simplement la liste des packages que vous souhaitez inclure dans votre code. Par exemple, ici nous allons générer du code pour les packages “DoorBell”, “LightSensor”, “IRRemote”,”Paradox”, “Pionner” et “Vera”.</p>
<p align="left">Après avoir cliqué sur le bouton “Generate”, un message de confirmation vous indiquera le bon déroulé de l’opération :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-113.png"><img class="colorbox-2153"  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-108.png" alt="image" width="168" height="165" border="0" /></a></p>
<p align="left">Le SDK génère le code dans le fichier “<em>MyConstellation.generated.cs</em>” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-114.png"><img class="colorbox-2153"  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-109.png" alt="image" width="291" height="203" border="0" /></a></p>
<p align="left">Attention, vous ne devez pas modifier ce code directement car ce fichier est écrasé à chaque fois que vous relancer une génération.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-115.png"><img class="colorbox-2153"  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-110.png" alt="image" width="350" height="308" border="0" /></a></p>
<h3 align="left">Utiliser le code généré</h3>
<h4 align="left">Organisation du code généré</h4>
<p align="left">Le code généré dans le fichier “<em>MyConstellation.generated.cs</em>” s’organise dans plusieurs espaces de nom (namespaces) :</p>
<ul>
<li>
<div align="left">Dans le namespace de votre assembly vous trouverez :</div>
<ul>
<li>
<div align="left">La classe statique “<em>MyConstellation</em>” représentant votre Constellation</div>
</li>
<li>
<div align="left">Les classes utilitaires <em>RealNameAttribute</em> et <em>RealNameExtension</em> indispensable au fonctionnement du code généré</div>
</li>
</ul>
</li>
<li>
<div align="left">Des namespaces par package</div>
<ul>
<li>
<div align="left"><em>VotreNamespace.NomDuPackage.StateObjects</em> : code généré pour les StateObjects (si des StateObjects sont déclarés pour le package)</div>
</li>
<li>
<div align="left"><em>VotreNamespace.NomDuPackage.MessageCallbacks</em> : code généré pour les MessageCallbacks (si des MessageCallbacks sont déclarés pour le package)</div>
</li>
</ul>
</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-123.png"><img class="colorbox-2153"  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-118.png" alt="image" width="350" height="406" border="0" /></a></p>
<h4 align="left">Des énumérations pour les sentinelles, packages et instances de votre Constellation</h4>
<p align="left">La classe statique “<em>MyConstellation</em>” contient trois énumérations :</p>
<ul>
<li>
<div align="left"><u>Sentinels</u> : contenant la liste des sentinelles de votre Constellation</div>
</li>
<li>
<div align="left"><u>Packages</u> : contenant le liste des packages de votre Constellation</div>
</li>
<li>
<div align="left"><u>PackageInstances</u> : contenant la liste des instances des packages de votre Constellation</div>
</li>
</ul>
<p align="left">Comme les noms de sentinelles ou packages peuvent contenir des caractères interdits en C# (comme par exemple les tirets), les valeurs des énumérations sont “nettoyées” et la valeur réelle se trouve dans l’attribut “RealName” que vous pouvez récupérer avec la méthode d’extension “<em>GetRealName()</em>”.</p>
<p align="left">Dans notre exemple l’énumération “Sentinels” générée est la suivante :</p>
<p></p><pre class="crayon-plain-tag">/// &lt;summary&gt;
/// Specifies the sentinels in your Constellation
/// &lt;/summary&gt;
public enum Sentinels
{
    /// &lt;summary&gt;
    /// Sentinel 'CEREBRUM'
    /// &lt;/summary&gt;
    [RealName("CEREBRUM")]
    CEREBRUM,
    /// &lt;summary&gt;
    /// Sentinel 'ESP8266'
    /// &lt;/summary&gt;
    [RealName("ESP8266")]
    ESP8266,
    /// &lt;summary&gt;
    /// Sentinel 'ESP-DoorBell'
    /// &lt;/summary&gt;
    [RealName("ESP-DoorBell")]
    ESP_DoorBell,
    /// &lt;summary&gt;
    /// Sentinel 'ESP-LightSensorSalon'
    /// &lt;/summary&gt;
    [RealName("ESP-LightSensorSalon")]
    ESP_LightSensorSalon,
    /// &lt;summary&gt;
    /// Sentinel 'esp-senergy'
    /// &lt;/summary&gt;
    [RealName("esp-senergy")]
    esp_senergy,
    /// &lt;summary&gt;
    /// Sentinel 'SKYNET-SERVER'
    /// &lt;/summary&gt;
    [RealName("SKYNET-SERVER")]
    SKYNET_SERVER,
}</pre><p></p>
<p align="left">De ce fait on peut manipuler les sentinelles et récupérer le nom réel avec la méthode “GetRealName()” :</p>
<p></p><pre class="crayon-plain-tag">MyConstellation.Sentinels sentinel = MyConstellation.Sentinels.ESP_DoorBell;
string realName = sentinel.GetRealName();</pre><p></p>
<p align="left">De plus, dans cette classe vous trouverez des méthodes d’extension pour <a href="/client-api/net-package-api/envoyer-des-messages-invoquer-des-messagecallbacks/#Creer_un_scope">créer un “MessageScope”</a> vers une de vos sentinelles, packages ou instances de package.</p>
<p align="left">Par exemple pour créer un scope vers les packages “Hue” :</p>
<p></p><pre class="crayon-plain-tag">MessageScope scope = MyConstellation.Packages.Hue.CreateScope();</pre><p></p>
<p>Ce qui est équivalent à :</p>
<p></p><pre class="crayon-plain-tag">MessageScope scope = MessageScope.Create("Hue");</pre><p></p>
<p>Sauf qu’avec le code généré plus besoin de chercher le nom exact ni même de risquer de faire une erreur de frappe, car tout est énumération !</p>
<p>On peut également cibler une instance d’un package en particulier. Par exemple pour cibler précisément le package “Hue” déployé sur la sentinelle “SKYNET-SERVER” :</p>
<p></p><pre class="crayon-plain-tag">MessageScope scope = MyConstellation.PackageInstances.SKYNET_SERVER_Hue.CreateScope();</pre><p></p>
<h4 align="left">Code généré pour les StateObjects</h4>
<p align="left">Prenons un exemple simple :  dans le code généré ci-dessus j’ai sélectionné le package “Paradox”, un package permettant de connecter les système d’alarme Paradox dans Constellation.</p>
<p align="left">Ce package publie plusieurs StateObjects :</p>
<ul>
<li>
<div align="left">Des StateObjects de type “AreaInfo” par secteur qui représente l’état d’un secteur (système armé ou non par exemple)</div>
</li>
<li>
<div align="left">Des StateObjects de type “ZoneInfo” par zone qui représente l’état d’une zone (zone ouverte ou non par exemple)</div>
</li>
<li>
<div align="left">Des StateObjects de type “UserInfo” par utilisateur qui représente l’état d’un utilisateur (nom de l’utilisateur, dernière activité, etc..)</div>
</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-124.png"><img class="colorbox-2153"  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-119.png" alt="image" width="350" height="206" border="0" /></a></p>
<p align="left">Prenons par exemple le StateObject “ZoneInfo1” de ce package :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-125.png"><img class="colorbox-2153"  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-120.png" alt="image" width="350" height="268" border="0" /></a></p>
<p align="left">On y trouvera plusieurs informations sur l’état de cette zone.</p>
<p align="left">Le code généré pour les StateObjects de ce package sera donc rangé dans le namespace : <em>VotreNamespace.Paradox.StateObjects </em>et contiendra :</p>
<ul>
<li>
<div align="left">Une énumération “<em>ParadoxStateObjectNames</em>” référençant le nom des StateObjects actuellement connus sur le serveur</div>
</li>
<li>
<div align="left">Une classe “<em>ParadoxStateObjectLinkAttribute</em>” (spécialisation de la classe <em>StateObjectLinkAttribute</em>)</div>
</li>
<li>
<div align="left">Des classes pour chaque types personnalisés du package, ici le générateur aura généré les classes “AreaInfo”, “ZoneInfo” et “UserInfo”</div>
</li>
<li>
<div align="left">Une classe “<em>ParadoxExtensions</em>” contenant des méthodes d’extension pour convertir des StateObjects en type personnalisé</div>
</li>
</ul>
<p align="left">Voyons par exemple comment inclure notre StateObject de la zone “1” dans votre code C# avec le code généré.</p>
<p align="left">Tout d’abord, il faut inclure le namespace :</p>
<p></p><pre class="crayon-plain-tag">using Paradox.StateObjects;</pre><p></p>
<p align="left">Ensuite ajoutons un “StateObjectLink” de type “ParadoxStateObjectLink” où nous préciserons le nom du StateObject avec l’énumération :</p>
<p></p><pre class="crayon-plain-tag">[ParadoxStateObjectLink(ParadoxStateObjectNames.ZoneInfo1)]
public StateObjectNotifier Zone1 { get; set; }</pre><p></p>
<p align="left">Sans le code généré nous aurions écrit :</p>
<p></p><pre class="crayon-plain-tag">[StateObjectLink(Package="Paradox", Name="ZoneInfo1")]
public StateObjectNotifier Zone1 { get; set; }</pre><p></p>
<p align="left">Je peux ensuite utiliser la méthode d’extension générée “<em>AsZoneInfo()</em>” pour convertir la valeur du StateObject en “<em>ZoneInfo</em>” (“<em>Zon</em>eInfo” étant un type personnalisé décrit par le package Paradox) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-126.png"><img class="colorbox-2153"  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-121.png" alt="image" width="400" height="125" border="0" /></a></p>
<p align="left">Le générateur a “reproduit” ce type dans votre code généré avec les commentaires tel que spécifiés dans le PackageDescriptor du package Paradox.</p>
<p align="left">Sans le code généré, vous devez travailler avec un objet dynamique, donc sans auto-complétion :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-127.png"><img class="colorbox-2153"  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-122.png" alt="image" width="230" height="32" border="0" /></a></p>
<p align="left">Bien entendu tous les Packages (virtuels ou non) peuvent déclarer des Packages Descriptor.</p>
<p align="left">Prenez l’exemple d’un capteur d’électricité basé sur un ESP8266. En utilisant la <a href="/client-api/arduino-esp-api/">librairie Constellation pour Arduino</a>, le code C++ de ce package virtuel commence par déclarer le type “<em>SEnergy.Electricity</em>” :</p>
<p></p><pre class="crayon-plain-tag">constellation.addStateObjectType("SEnergy.Electricity", TypeDescriptor().setDescription("S-Energy Electricity data").addProperty("Counter", "System.Int64", "Number of revolution").addProperty("Timestamp", "System.Int64", "Internal timestamp of the last revolution").addProperty("RevolutionTime", "System.Double", "The time (in ms) of the last revolution").addProperty("WattPerHour", "System.Int32", "Energy consumed").addProperty("Cumul", "System.Int64", "Total of KWh consumed")); 
constellation.declarePackageDescriptor();</pre><p></p>
<p>Puis à chaque fois que le capteur détecte une consommation électrique il publie un StateObject de la façon suivante :</p>
<p></p><pre class="crayon-plain-tag">StaticJsonBuffer&lt;JSON_OBJECT_SIZE(5)&gt; jsonBuffer;
JsonObject&amp; myStateObject = jsonBuffer.createObject();
myStateObject["Counter"] = counter;
myStateObject["Timestamp"] = ts;
myStateObject["RevolutionTime"] = timePerRevolution;
myStateObject["WattPerHour"] = wattPerHour;
myStateObject["Cumul"] = cumul;
constellation.pushStateObject("Electricity", myStateObject, "SEnergy.Electricity", 600);</pre><p></p>
<p align="left">On retrouve bien ce StateObject sur la Console Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-129.png"><img class="colorbox-2153"  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-124.png" alt="image" width="350" height="249" border="0" /></a></p>
<p align="left">Après avoir sélectionné le package “<em>SElectricity</em>” dans le générateur de code, je peux très facilement exploiter ce StateObject avec auto-complétion, description, etc.. :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-130.png"><img class="colorbox-2153"  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-125.png" alt="image" width="450" height="176" border="0" /></a></p>
<p align="left">Par exemple pour suivre en temps réel la consommation électrique dans mon package C# avec le code généré à partir du capteur ESP8266 écrit en C++/Arduino :</p>
<p></p><pre class="crayon-plain-tag">namespace ConstellationPackageConsole2
{
    using Constellation.Package;
    using ConstellationPackageConsole2.SElectricity.StateObjects;

    public class Program : PackageBase
    {
        [SElectricityStateObjectLink(SElectricityStateObjectNames.Electricity)]
        public StateObjectNotifier Electricity { get; set; }

        static void Main(string[] args)
        {
            PackageHost.Start&lt;Program&gt;(args);
        }

        public override void OnStart()
        {
            this.Electricity.ValueChanged += (s, e) =&gt;
            {
                PackageHost.WriteInfo($"Current Energy Consumption : {e.NewState.AsSElectricitySEnergy_Electricity().WattPerHour}W @ {e.NewState.LastUpdate}");
            };
        }
    }
}</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-131.png"><img class="colorbox-2153"  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-126.png" alt="image" width="350" height="176" border="0" /></a></p>
<h4 align="left">Code généré pour les MessageCallbacks</h4>
<p align="left">Le principe est le même avec les MessagesCallbacks, le générateur de code va créer le code dans le namespace “<em>VotreNamespace.NomDuPackage.MessagesCallbacks</em>” :</p>
<ul>
<li>
<div align="left">Des classes pour chaque types personnalisés utilisés dans les MC du package</div>
</li>
<li>
<div align="left">Une classe “<em>(NomDuPackage)Scope</em>” permettant de référencer les MC sous forme de méthodes .NET</div>
</li>
<li>
<div align="left">Une classe “<em>(NomDuPackage)Extensions</em>” : classe d’extension pour créer un scope du package à partir d’un MessageScope ou des énumérations Sentinels, Packages, PackagesInstances générées par le générateur</div>
</li>
</ul>
<h5 align="left">MessageCallbacks avec ou sans paramètre</h5>
<p align="left">Prenons par exemple le package virtuel “IRremote”, un récepteur/émetteur d’infrarouge développé en Arduino/C++ sur un ESP8266. Ce package virtuel expose deux MessageCallbacks : “Restart” pour rebooter l’ESP et “SendCode” pour envoyer un signal IR.</p>
<p align="left">En utilisant la <a href="/client-api/arduino-esp-api/">librairie Constellation pour Arduino</a> de ces deux MC se résume par ces quelques lignes de C++ :</p>
<p></p><pre class="crayon-plain-tag">// SendCode MessageCallback
constellation.registerMessageCallback("SendCode",
  MessageCallbackDescriptor().setDescription("Send the IR code").addParameter("encoding", "System.String").addParameter("code", "System.Int64"),
  [](JsonObject&amp; json) {
    const char * encoder = json["Data"][0].asString();  
    unsigned long code = strtoul(json["Data"][1].asString(), NULL, 0);
    // send the "code" here !
 });

// Restart MessageCallback
constellation.registerMessageCallback("Restart",
  MessageCallbackDescriptor().setDescription("Restart the ESP"),
  [](JsonObject&amp; json) {
    ESP.restart();
 });</pre><p></p>
<p>Une fois l’ESP démarré, nos deux MessageCallbacks sont correctement référencés sur Console Constellation avec les listes des paramètres, types et description :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-132.png"><img class="colorbox-2153"  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-127.png" alt="image" width="350" height="150" border="0" /></a></p>
<p>Dans Visual Studio, générons maintenant le code pour notre package “IRRemote” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-133.png"><img class="colorbox-2153"  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-128.png" alt="image" width="350" height="195" border="0" /></a></p>
<p>Ajoutons ensuite le namespace correspondant aux MessageCallbacks de notre package, ici “IRRemote” :</p>
<p></p><pre class="crayon-plain-tag">using IRremote.MessageCallbacks;</pre><p></p>
<p>Vous pouvez ensuite utiliser l’énumération “Packages” (ou “PackagesIntances”) et accéder à la méthode d’extension “<em>CreateIRRemoteScope</em>” pour créer un scope spécifiquement pour notre package :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-134.png"><img class="colorbox-2153"  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-129.png" alt="image" width="450" height="109" border="0" /></a></p>
<p>Vous avez également une méthode d’extension nommée “ToXXXXSCope()” sur un MessageScope. En clair vous avez plusieurs moyen de créer un scope spécifiquement pour votre package “IRremote” avec le code généré :</p>
<p></p><pre class="crayon-plain-tag">IRremoteScope scope =  MyConstellation.Packages.IRremote.CreateIRremoteScope();

IRremoteScope scope = new IRremoteScope(MessageScope.Create("IRRemote"));

IRremoteScope scope = MessageScope.Create("IRRemote").ToIRremoteScope();

IRremoteScope scope = MessageScope.Create(MyConstellation.Packages.IRremote.GetRealName()).ToIRremoteScope();</pre><p></p>
<p>Ensuite sur la classe Scope généré pour votre package, ici “<em>IRRemoteScope</em>”, vous <strong>retrouverez vos MessageCallbacks sous forme de méthode .NET avec les paramètres et descriptions</strong> !</p>
<p>De ce fait vous disposez de l’auto complétion sans risque de faire des erreurs de frappe :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-135.png"><img class="colorbox-2153"  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-130.png" alt="image" width="450" height="152" border="0" /></a></p>
<p>Ainsi pour envoyer un code IR sur l’Arduino/ESP depuis mon code C#, on pourrait écrire :</p>
<p></p><pre class="crayon-plain-tag">// Send Power ON/OFF to Samsung TV
MyConstellation.Packages.IRremote.CreateIRremoteScope().SendCode("Samsung", 0xE0E040BF);</pre><p></p>
<h5>MessageCallbacks avec des paramètres complexes</h5>
<p>Ici le package “<em>IRRemote</em>” expose un MC sans paramètre et un autre avec deux paramètres simples (string et long).</p>
<p>Mais le générateur est également capable de gérer les types complexes. Par exemple prenez le package “Xbmc” permettant de piloter des média-centers Xbmc/Kodi.</p>
<p>Le package expose différents MessageCallbacks pour lancer un média, mettre pause, piloter le volume et également pour afficher un message à l’écran via le MessageCallback nommé “ShowNotification”.</p>
<p>Ce MessageCallback prend deux paramètres : le nom de l’hôte Xbmc (un string) et la notification à afficher. Cette notification est un objet de type “<em>Xbmc.NotificationRequest</em>” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-136.png"><img class="colorbox-2153"  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-131.png" alt="image" width="350" height="155" border="0" /></a></p>
<p align="left">Sur la Console Constellation, vous pouvez cliquer sur les types personnalisés pour afficher les détails du type, ici un objet avec quatre propriétés :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-137.png"><img class="colorbox-2153"  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-132.png" alt="image" width="350" height="172" border="0" /></a></p>
<p align="left">Lorsque vous générez le code C# pour ce package vous retrouverez bien le MC “<em>ShowNotification</em>” avec le type personnalisé en paramètre :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-138.png"><img class="colorbox-2153"  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-133.png" alt="image" width="450" height="92" border="0" /></a></p>
<p>Le générateur a en effet reproduit le type personnalisé dans votre code C# :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-139.png"><img class="colorbox-2153"  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-134.png" alt="image" width="450" height="92" border="0" /></a></p>
<p>Ainsi pour afficher une notification sur un hôte Kodi, je pourrais écrire très simplement :</p>
<p></p><pre class="crayon-plain-tag">MyConstellation.Packages.Xbmc.CreateXbmcScope().ShowNotification("Kodi", new NotificationRequest() { Title = "Constellation", Message = "Hello World !" });</pre><p></p>
<h5>MessageCallbacks avec réponse : les sagas</h5>
<p>Une invocation d’un MessageCallback peut donner lieu à une réponse, on appelle cela les “<a href="/concepts/messaging-message-scope-messagecallback-saga/#Les_Sagas">Sagas</a>”. Avec l’API.NET, n’hésitez pas à relire les articles dédiés : <a href="/client-api/net-package-api/envoyer-des-messages-invoquer-des-messagecallbacks/#Invoquer_un_MessageCallback_avec_reponse_Utilisation_des_Sagas">Invoquer un MessageCallback avec réponse</a> et <a href="/client-api/net-package-api/messagecallbacks/#Repondre_a_une_saga">Répondre à une saga</a>.</p>
<p>Prenons un exemple, le package “Vera” (interface pour les box domotique) expose des MC pour envoyer des ordres à des périphériques Z-Wave :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-140.png"><img class="colorbox-2153"  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-135.png" alt="image" width="350" height="213" border="0" /></a></p>
<p align="left">Vous remarquerez d’ailleurs que les MC “<em>SetDimmableLevel</em>” et “<em>SetSwitchState</em>” prennent en argument un type complexe comme expliqué dans le chapitre précédent.</p>
<p align="left">Vous remarquerez également que ces trois MC retournent un message de réponse, ici de type “Boolean”. En effet le résultat de l’exécution de l’ordre Z-Wave par la Vera est retourné à l’appellent si celui-ci à attaché un numéro de Saga.</p>
<p align="left">Ainsi dans le code généré, les méthodes générées pour ces MessageCallbacks retournent une <em>Task&lt;T&gt; </em>où T est le type de retour, ici un booléen :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-141.png"><img class="colorbox-2153"  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-136.png" alt="image" width="350" height="70" border="0" /></a></p>
<p>Ainsi dans le C# on peut très facilement invoquer le MessageCallback et récupérer la réponse :</p>
<p></p><pre class="crayon-plain-tag">bool result = await MyConstellation.Packages.Vera.CreateVeraScope().SetSwitchState(new DeviceRequest() { DeviceID = 42, State = false });
 if (result)
 {
     PackageHost.WriteInfo("Device #42 turn off !");
 }
 else
 {
     PackageHost.WriteWarn("Unable to turn off the device #42 !");
 }</pre><p></p>
<p>Pour plus d’information à ce sujet, je vous recommande la lecture de l’article : <a href="/client-api/net-package-api/envoyer-des-messages-invoquer-des-messagecallbacks/#Invoquer_un_MessageCallback_avec_reponse_Utilisation_des_Sagas">Invoquer un MessageCallback avec réponse</a>.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-sdk/generateur-de-code/">Le générateur de code C#</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/constellation-platform/constellation-sdk/generateur-de-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Le StateObjects Explorer</title>
		<link>https://developer.myconstellation.io/constellation-platform/constellation-console/stateobjects-explorer/</link>
					<comments>https://developer.myconstellation.io/constellation-platform/constellation-console/stateobjects-explorer/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 23 Sep 2016 14:30:34 +0000</pubDate>
				<category><![CDATA[Constellation Console]]></category>
		<category><![CDATA[StateObject]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2817</guid>

					<description><![CDATA[<p>Le StateObjects Explorer permet d’explorer l’ensemble des StateObjects de votre Constellation. Un moteur de recherche vous permet de rechercher très rapidement les StateObjects souhaités : En cliquant sur le bouton “View” vous pouvez visualiser l’ensemble des informations d’un StateObject dont</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-console/stateobjects-explorer/">Le StateObjects Explorer</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le StateObjects Explorer permet d’explorer l’ensemble des StateObjects de votre Constellation.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-58.png"><img class="colorbox-2817"  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-56.png" alt="image" width="350" height="184" border="0" /></a></p>
<p>Un moteur de recherche vous permet de rechercher très rapidement les StateObjects souhaités :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-59.png"><img class="colorbox-2817"  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-57.png" alt="image" width="350" height="99" border="0" /></a></p>
<p align="left">En cliquant sur le bouton “View” vous pouvez visualiser l’ensemble des informations d’un StateObject dont sa valeur :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-60.png"><img class="colorbox-2817"  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-58.png" alt="image" width="350" height="273" border="0" /></a></p>
<p align="left">La valeur du StateObject est automatiquement coloriée et formatée pour faciliter la lecture.</p>
<p align="left">Vous avez la possibilité de supprimer ce StateObject, de copier sa valeur dans votre presse-papier, de rafraîchir le StateObject ou même vous abonner en temps réel à sa mise à jour.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-61.png"><img class="colorbox-2817"  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-59.png" alt="image" width="350" height="52" border="0" /></a></p>
<p align="left">La StateObject Explorer se désabonne automatiquement de vos StateObjects lorsque vous fermez la fenêtre de détail.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/solive.gif"><img class="colorbox-2817"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="solive" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/solive_thumb-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2016/09/solive_thumb.gif" alt="solive" width="350" height="252" border="0" /></a></p>
<p align="left">Vous pouvez également supprimer des StateObjects en cliquant sur le bouton “Purge” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-62.png"><img class="colorbox-2817"  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-60.png" alt="image" width="350" height="198" border="0" /></a></p>
<p align="left">Vous serez alors amené à sélectionner l’instance du package pour laquelle supprimer ses StateObjects ou encore supprimer tous les StateObjects marqués comme “expirés”.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-63.png"><img class="colorbox-2817"  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-61.png" alt="image" width="350" height="206" border="0" /></a></p>
<p align="left">Notez qu’à tout moment vous pouvez cliquer sur le bouton “Refresh” ou Ctrl+R pour rafraîchir la liste des StateObjects.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-console/stateobjects-explorer/">Le StateObjects Explorer</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/constellation-platform/constellation-console/stateobjects-explorer/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Créer, tester et déployer des packages Python en ligne de commande</title>
		<link>https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/</link>
					<comments>https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Thu, 07 Sep 2017 21:50:15 +0000</pubDate>
				<category><![CDATA[Python API]]></category>
		<category><![CDATA[Constellation SDK]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Constellation]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[WriteLog]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5341</guid>

					<description><![CDATA[<p>Vous pouvez créer des packages Constellation Python avec Visual Studio ou alors sans IDE avec l&#8217;outil en ligne de commande nommé « Constellation Package Tools CLI ». Nous allons dans cet article créer, tester et déployer sur votre Constellation un package Python</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/">Créer, tester et déployer des packages Python en ligne de commande</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Vous pouvez <a href="https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-python/">créer des packages Constellation Python avec Visual Studio</a> ou alors sans IDE avec l&rsquo;outil en ligne de commande nommé <em><strong>« Constellation Package Tools CLI ».</strong></em></p>
<p>Nous allons dans cet article créer, tester et déployer sur votre Constellation un package Python avec cet outil.</p>
<h2>Prérequis</h2>
<p>Le « Constellation Package Tools CLI » est un outil en ligne de commande compatible Windows et Linux. Il est écrit en Python et s&rsquo;installe via PIP avec la commande :</p>
<p></p><pre class="crayon-plain-tag">pip install constellation-pkgtools-cli</pre><p></p>
<p>Sur Windows vous devriez au préalable avoir installé Python 2.7 ainsi que l&rsquo;outil « pip » et les libraires « pyzmq » et « enum34 ». La procédure complète d&rsquo;installation est <a href="https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-python/#Installer_Python_sur_Windows">décrite sur cette page</a>.</p>
<p>Via une invite de commande, tapez la commande ci-dessus :</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation sur Windows" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb.png" alt="Installation sur Windows" width="354" height="246" border="0" /></a></p>
<p>Sur Linux, vous devez également avoir installé Python 2.7 (généralement installé par défaut),  l&rsquo;outil « pip » et les libraires « pyzmq » et « enum34 » sans oublier le moteur Mono. Pour cela, utilisez le WPI (<em>Web Platform Installer</em>) pour <a href="/getting-started/ajouter-des-sentinelles/#Installation_dune_sentinelle_sur_un_systeme_Linux">installer une sentinelle Constellation</a>. Celui-ci se chargera de déployer l&rsquo;ensemble des prérequis nécessaire.</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-1.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation sur Linux" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-1.png" alt="Installation sur Linux" width="354" height="226" border="0" /></a></p>
<h2>La commande « ctln »</h2>
<p>Une fois le package Python « <em>constellation-pkgtools-cli</em> » installé via PIP, vous aurez accès à une commande nommée « ctln » (abréviation de <strong>C</strong>ons<strong>t</strong>e<strong>l</strong>latio<strong>n</strong>)</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-3.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Commande &quot;ctln&quot;" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-3.png" alt="Commande &quot;ctln&quot;" width="454" height="229" border="0" /></a></p>
<p>Cette commande vous permettra de créer de nouveau package, les tester et déployer en local ou directement sur un serveur Constellation.</p>
<h2>Créer son premier package Python</h2>
<p>Pour créer un nouveau package utilisez simplement la commande “create” en spécifiant le nom de votre package. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">ctln create &lt;mon projet&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-4.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Création d'un nouveau package" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-4.png" alt="Création d'un nouveau package" width="354" height="234" border="0" /></a></p>
<p align="left">Et voilà, votre package “MyFirstPackage” est créé dans le répertoire du même nom !</p>
<h3 align="left">Template de package</h3>
<p>Chaque package est créé à partir d’un template. Vous pouvez lister les templates avec la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln template list</pre><p></p>
<p>A l’heure où est écrit cet article il y a deux templates de type “projet” :</p>
<ul>
<li>Python Base Template : le template de base (créé par défaut)</li>
<li>Python Demo template : package Python avec du code de “demo”</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-5.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Listing des templates de package" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-5.png" alt="Listing des templates de package" width="354" height="234" border="0" /></a></p>
<p align="left">Lorsque vous créez un package avec la commande “ctln create”, le template “python-base” est sélectionné par défaut.</p>
<p align="left">Vous pouvez cependant préciser l’Id du template à utiliser dans la commande “ctln create”. Par exemple pour créer un package sur base du template de demo :</p>
<p></p><pre class="crayon-plain-tag">ctln create &lt;mon projet&gt; python-demo</pre><p></p>
<p align="left">Il y a aussi des templates de type “item”, c’est à dire des templates pour les scripts que vous allez rajouter par la suite à votre package.</p>
<h3 align="left">Mise à jour du template</h3>
<p align="left">Comme vous le constatez dans le listing des templates ci-dessus, chaque template comporte un numéro de version car ils sont amenés à évoluer notamment en cas de mise à jour des librairies Constellation.</p>
<p align="left">Avec le SDK Constellation Visual Studio, les nouvelles versions des librairies sont diffusées avec NuGet. Ici avec cet outil en ligne de commande, les nouvelles librairies sont embarquées dans des mises à jour des templates.</p>
<p align="left">Ainsi pour mettre à jour vos packages, vous pouvez tout simplement mettre à jour le template de votre package par la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln update</pre><p></p>
<p align="left">Cette commande doit être lancé depuis le répertorie racine de votre package.</p>
<p align="left">Notez également que la mise à jour est “intelligente” dans la mesure où elle n’écrase pas vos fichiers de configuration, le manifeste du package ou encore vos scripts Python.</p>
<h2>Développer son package</h2>
<p>Le développement de package Python est <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Creez_le_package_Python_dans_Visual_Studio">expliqué dans cet article</a>. Bien que l&rsquo;article se base sur Visual Studio, l&rsquo;API Python est strictement identique.</p>
<p>Ainsi, pour rappel, vous avez à la racine de votre projet le fichier « <a href="/concepts/package-manifest/">PackageInfo.xml</a> » qui contient l&rsquo;ensemble des informations de votre package (<a href="/concepts/package-manifest/">plus de détail ici</a>) mais aussi le fichier de configuration nommé « PythonPackageHost.exe.config » qui contient la liste des scripts Python à lancer.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-7.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Structure du package" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-7.png" alt="Structure du package" width="354" height="234" border="0" /></a></p>
<p>Les <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">bases </a>du développement d&rsquo;un script Constellation Python <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">sont expliquées ici</a>.</p>
<p>Pour faciliter le développement, vous n&rsquo;êtes pas obligé de modifier manuellement le fichier de configuration pour gérer les scripts Python. Pour cela vous avez à disposition différentes commandes pour lister, ajouter, renommer ou supprimer des scripts.</p>
<h3>Lister les scripts du package</h3>
<p>Les scripts Constellation Python lancés par votre package peuvent être listés par la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript list</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-6.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Listing des scripts Python du package" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-6.png" alt="Listing des scripts Python du package" width="354" height="234" border="0" /></a></p>
<p style="text-align: left;">Ici votre package « MyFirstPackage » ne contient qu&rsquo;un seul script nommé « Main.py » dans le répertoire Scripts du package.</p>
<h3 style="text-align: left;">Ajouter des scripts Python</h3>
<p style="text-align: left;">Pour ajouter un script Constellation Python, vous pouvez soit ajouter un script existant sur votre système de fichier dans votre package ou soit créer un nouveau script à partir d&rsquo;un modèle (template).</p>
<h4 style="text-align: left;">Ajouter un script existant</h4>
<p style="text-align: left;">Pour un script existant, il suffit d&rsquo;utiliser l&rsquo;option « add » :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript add &lt;filepath&gt; [--filename=&lt;name&gt;]</pre><p></p>
<p>Vous devez spécifier le chemin complet vers votre fichier à ajouter (filepath) et optionnellement le nom du fichier une fois ajouté dans votre package.</p>
<p>Par exemple la commande ci-dessous ajoutera dans votre package le fichier « ~/demo/MyDemo.py » sous le nom « DemoSeb.py »</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript add ~/demo/MyDemo.py --filename=DemoSeb.py</pre><p></p>
<h4 style="text-align: left;">Ajouter de nouveau script</h4>
<p style="text-align: left;">L&rsquo;action la plus courante sera de créer un nouveau script Python dans votre package avec l&rsquo;action « new » via la commande suivante :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript new &lt;filename&gt; [&lt;item_template_name&gt;]</pre><p></p>
<p>Vous devez obligatoirement spécifier le nom du fichier (filename) avec ou sans l’extension .py (rajoutée automatiquement). Le script sera créé dans le répertoire Scripts de votre package et automatiquement déclaré dans la configuration.</p>
<p>Vous pouvez également spécifier l&rsquo;identifiant du template à utiliser. Les templates peuvent être listés avec la commande « <em>ctln template list</em> » comme vu ci-dessus.  A l&rsquo;heure où cet article est écrit il y a trois templates de type « item » :</p>
<ul>
<li>« python-base » : le template de base</li>
<li>« python-demo »  : un template avec du code de demonstration</li>
<li>« python-empty »  : un squelette vide</li>
</ul>
<p>Si vous ne précisez pas l&rsquo;identifiant, c&rsquo;est le template « python-base » qui sera utilisé.</p>
<p>Par exemple ajoutons à notre package un deuxième script (avec le template de base) :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript new Main2</pre><p></p>
<p>Rajoutons également un troisieme scriupt de démonstation en utilisant le template de demo (python-demo) :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript new DemoConstellation python-demo</pre><p></p>
<p>Notre package a maintenant trois scripts : Main.py (créé avec le template du package), Main2.py (créé ci-dessus avec le template de base), DemoConstellation.py (créé avec le template de demo) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-8.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Ajout de scripts Python" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-8.png" alt="Ajout de scripts Python" width="354" height="226" border="0" /></a></p>
<h3 style="text-align: left;">Renommer ou supprimer des scripts</h3>
<p style="text-align: left;">Vous pouvez renommer les scripts du package avec l’option “rename”. Par exemple renommons “DemoConstellation” par “Demo” (les extensions “.py” sont optionnelles) :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript rename DemoConstellation Demo</pre><p></p>
<p><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-9.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; margin-right: auto; border-width: 0px;" title="Renommer des scripts" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-9.png" alt="Renommer des scripts" width="354" height="226" border="0" /></a></p>
<p>Pour supprimer des scripts il suffit d’utiliser l’option “remove” en spécifiant le nom du script (avec ou sans son extension .py).</p>
<p>Par exemple supprimons les deux fichiers “Main2.py” et “Demo.py” que nous avons ajoutés (et renommés) ci-dessus :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript remove Main2
ctln pyscript remove Demo</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-10.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Supprimer des scripts" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-10.png" alt="Supprimer des scripts" width="354" height="226" border="0" /></a></p>
<h3>Editer les scripts Python du package</h3>
<p>Une fois vos scripts ajoutés, renommés ou supprimés avec la commande “ctln”, libre à vous d’utiliser votre éditeur de texte préféré pour éditer votre code !</p>
<p>Par exemple de le cas ici présent d’un accès SSH Linux, je pourrais utiliser “nano” ou “vim” (ou encore Notepad++ sur ma station WIndows via un tranfert SCP avec WInSCP par exemple).</p>
<p></p><pre class="crayon-plain-tag">nano Scripts/Main.py</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-11.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Edition des scripts Python avec Nano" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-11.png" alt="Edition des scripts Python avec Nano" width="354" height="226" border="0" /></a></p>
<p align="left">Ici le script “Main” défini une fonction de démarrage (<em>OnStart</em>) et une fonction de fermeture (<em>OnExit</em>). Pour rappel, les <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">bases </a>de l’API Constellation Python <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">sont expliquées ici</a>.</p>
<p align="left">Notez simplement que dans cet exemple, le WriteInfo déclenché au démarrage (<em>OnStart</em>) écrit un log dasn Constellation de type “Information” en concaténant dans un message textuel les propriétés suivantes :</p>
<ul>
<li>
<div align="left">“<span style="text-decoration: underline;">PackageName</span>” : le nom du package</div>
</li>
<li>
<div align="left">“<span style="text-decoration: underline;">SentinelName</span>” : le nom de la sentinelle sur laquelle est déployée ce package</div>
</li>
<li>
<div align="left">“<span style="text-decoration: underline;">IsStandAlone</span>” : un booléen indiquant si le package tourne de façon indépendante ou hébergée au sein d’une sentinelle</div>
</li>
<li>
<div align="left">“<span style="text-decoration: underline;">IsConnected</span>” : un booléen indiquant si le package est connecté ou non à une Constellation</div>
</li>
</ul>
<h2>Tester son package</h2>
<p>Pour tester notre package en local, il suffit de lancer la commande suivante :</p>
<p></p><pre class="crayon-plain-tag">ctln run</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-12.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Démarrage du package en local" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-12.png" alt="Démarrage du package en local" width="354" height="215" border="0" /></a></p>
<p>Comme vous pouvez le lire sur la console, le nom de la sentinelle affichée est “local sandbox” étant donné que la propriété <em>IsStandalone</em> est <em>true</em> (la propriété <em>SentinelName</em> est None). En effet votre package n’est pas déployé/démarré par Constellation sur une véritable sentinelle. Il est juste démarré en “standalone” par la commande “run”.</p>
<p>De plus la propriété “<em>IsConnected</em>” est <em>false</em> car votre package n’est pas connecté à une Constellation.</p>
<p>Vous pouvez donc tester des éléments de base de votre package mais de façon déconnecté, il manquera donc plusieurs fonctionnalités (les logs produits resterons local dans votre console, pas d&rsquo;accès aux settings hormis ceux déclarés en local, la publication ou consommation de StateObjects sera impossible tout comme l’invocation ou l&rsquo;exposition de MessageCallbacks).</p>
<p>Pour tester votre package complètement, il est possible de le lancer en local tout en le connectant à une Constellation.</p>
<p>Tout d&rsquo;abord, il faudra déclarer des serveurs Constellation dans l&rsquo;outil <em>ctln</em>.</p>
<h3>Ajouter et gérer des serveurs Constellation</h3>
<p>Les commandes sont les suivantes :</p>
<p></p><pre class="crayon-plain-tag">ctln server list
ctln server (add | set) &lt;name&gt; --url=&lt;url&gt; --accesskey=&lt;key&gt;
ctln server (add | set) &lt;name&gt; --url=&lt;url&gt; --username=&lt;user&gt;
ctln server check &lt;name&gt;
ctln server remove &lt;name&gt;</pre><p></p>
<p>Vous pouvez lister les serveurs, ajouter ou mettre à jour des serveurs avec la clé d’accès ou un couple login/password, tester la connectivité ou supprimer des serveurs.</p>
<p>Par exemple je dispose d’une Constellation installée à l’adresse : <a title="http://pc-seb.ajsinfo.loc:8088" href="http://pc-seb.ajsinfo.loc:8088">http://pc-seb.ajsinfo.loc:8088</a>. Un credential basé sur le couple login/password “admin/seb” a été configuré. Je peux donc ajouter ce serveur que je nommerai ici “pc-seb” via la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln server add pc-seb --url=http://pc-seb.ajsinfo.loc:8088 --username=admin</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-13.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Ajout de serveur Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-13.png" alt="Ajout de serveur Constellation" width="354" height="215" border="0" /></a></p>
<p>Le serveur ajouté est testé au moment de l’ajout mais vous pouvez à tout moment tester la connectivité vers cette Constellation avec la commande “<em>ctln server check</em>”. Par exemple pour tester la Constellation nommée “pc-seb” :</p>
<p></p><pre class="crayon-plain-tag">ctln server check pc-seb</pre><p></p>
<h3>Tester son package dans Constellation</h3>
<p>Maintenant que nous avons ajouté un serveur Constellation dans l’outil, nous pouvons relancé notre package en le connectant à notre Constellation nommée “pc-seb” via la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln run --server=pc-seb</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-14.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Démarrage du package en local mais connecté à un serveur Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-14.png" alt="Démarrage du package en local mais connecté à un serveur Constellation" width="354" height="215" border="0" /></a></p>
<p align="left">Le package démarre toujours dans la « sandbox locale » (<em>IsStandalone = true</em>) mais cette fois ci il est connecté à ma Constellation nommée « pc-seb » (<em>IsConnected = true</em>).</p>
<p align="left">D’ailleurs en lançant la Console Constellation je peux maintenant suivre en temps réel les logs de ce package, les StatesObjects qu’il produit ou encore les MessageCallbacks qu’il expose.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-15.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Connexion du package avec sa Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-15.png" alt="Connexion du package avec sa Constellation" width="354" height="208" border="0" /></a></p>
<h2>Publier son package</h2>
<p>Une fois le package développé et testé, il ne reste plus qu’à le packager pour pouvoir le déployer dans Constellation.</p>
<p>Vous pouvez soit le packager dans un fichier en local (que vous pourrez uploader sur une Constellation ou échanger avec d&rsquo;autre) ou soit le déployer directement dans une Constellation référencée dans l&rsquo;outil.</p>
<p>Par exemple pour publier ce package dans un fichier local dans le répertoire “/home/pi” :</p>
<p></p><pre class="crayon-plain-tag">ctln publish --output=/home/pi</pre><p></p>
<p>Maintenant, pour déployer ce même package directement sur une Constellation, il suffit simplement de spécifier le nom du serveur Constellation enregistré sur la commande “publish”.</p>
<p>Par exemple pour publier ce package sur la Constellation nommée ici “pc-seb” :</p>
<p></p><pre class="crayon-plain-tag">ctln publish pc-seb</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-16.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Publication d'un package sur une Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-16.png" alt="Publication d'un package sur une Constellation" width="354" height="215" border="0" /></a></p>
<p align="left">En vous rendant sur le <a href="/constellation-platform/constellation-console/package-repository/">Package Repository</a> de votre Console Constellation, votre package fraîchement publié sera prêt à être <a href="/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/#Deployer_un_package">déployé sur vos sentinelles Windows ou Linux</a> de votre Constellation.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-17.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Package Repository" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-17.png" alt="Package Repository" width="354" height="268" border="0" /></a></p>
<h2>Next steps</h2>
<p>Pour en savoir plus sur le développement de package en Python :</p>
<ul>
<li>Retour sur <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">les bases</a> de l’API Python  (<a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Produire_des_logs">produire des logs</a>, <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Acces_aux_settings">accéder aux settings</a>, <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Publier_des_StateObjects">publier des StateObjects</a>)</li>
<li><a href="/client-api/python-api/messagecallbacks-exposer-des-methodes-python/">Exposer vos fonctions</a> Python dans Constellation (les MessageCallbacks)</li>
<li><a href="/client-api/python-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-en-python/">Invoquer des MessageCallbacks</a> des autres packages de votre Constellation en Python</li>
<li><a href="/client-api/python-api/consommer-des-stateobjects-en-python/">Consommer les StateObjects</a> de votre Constellation</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/">Créer, tester et déployer des packages Python en ligne de commande</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/python-api/developper-avec-le-package-tools-cli/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Consommer des StateObjects depuis l&#8217;API Python</title>
		<link>https://developer.myconstellation.io/client-api/python-api/consommer-des-stateobjects-en-python/</link>
					<comments>https://developer.myconstellation.io/client-api/python-api/consommer-des-stateobjects-en-python/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 24 Aug 2016 09:46:27 +0000</pubDate>
				<category><![CDATA[Python API]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[StateObjectLink]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2507</guid>

					<description><![CDATA[<p>Pour consommer des StateObjects vous pouvez simplement déclarer une méthode acceptant en paramètre un StateObject et rajouter sur cette méthode le décorateur “Constellation.StateObjectLink” en spécifiant le lien vers le ou les StateObjects. Par exemple si vous voulez récupérer en temps</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/python-api/consommer-des-stateobjects-en-python/">Consommer des StateObjects depuis l&rsquo;API Python</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Pour consommer des StateObjects vous pouvez simplement déclarer une méthode acceptant en paramètre un StateObject et rajouter sur cette méthode le décorateur “<em>Constellation.StateObjectLink</em>” en spécifiant le lien vers le ou les StateObjects.</p>
<p>Par exemple si vous voulez récupérer en temps réel le StateObject correspondant à un thermostat Nest (partant de l’hypothèse où le package Nest est déployé dans votre Constellation).</p>
<p>Via le StateObjects Explorer de la Console Constellation, on retrouvera le StateObject ici nommé “Living Room” publié par le package Nest qui représente l’état du thermostat du salon :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-76.png"><img class="colorbox-2507"  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-65.png" alt="image" width="350" height="200" border="0" /></a></p>
<p>On peut donc écrire une méthode qui sera liée à ce StateObject pour afficher un message de log à chaque fois que l’état du thermostat sera mis à jour :</p>
<p></p><pre class="crayon-plain-tag">@Constellation.StateObjectLink(package = "Nest", name = "Living Room")
def OnNestTargetTemperatureChanged(stateObject):
    Constellation.WriteInfo("The Nest target temperature has changed to : %s°C" % stateObject.Value.target_temperature_c)</pre><p></p>
<p>Le décorateur “StateObjectLink” accepte les paramètres suivants : “sentinel”, “package”, “name” et “type”. Tous ces paramètres sont optionnels et par défaut défini à “*”, c’est à dire qu’aucun filtre n’est appliqué !</p>
<p>Une méthode décorée “StateObjectLink” doit accepter qu’un seul argument : le StateObject.</p>
<p>Un StateObject contient les propriétés suivantes :</p>
<ul>
<li><u>SentinelName</u> : nom de la sentinelle qui a produit le StateObject</li>
<li><u>PackageName</u> : nom du package qui a produit le StateObject</li>
<li><u>Name</u> : le nom du StateObject</li>
<li><u>UniqueId</u> : identifiant unique du StateObject dans la Constellation (concaténation des 3 propriétés ci-dessus)</li>
<li><u>Type</u> : type du StateObject</li>
<li><u>Lifetime</u> : durée de vie en seconde du StateObject avant d’être considéré “expiré” (0 si infini)</li>
<li><u>LastUpdate</u> : date de la dernière publication du StateObject</li>
<li><u>IsExpired</u> : indique si le StateObject est expiré (c’est à dire que DateTime.Now &gt;  LastUpdate  + Lifetime si et seulement si Lifetime &gt; 0)</li>
<li><u>Metadatas</u> : dictionnaire de clé / valeur</li>
<li><u>Value</u> : la valeur du StateObject (peut être un type simple ou un objet complexe)</li>
</ul>
<p><span style="text-decoration: underline;">Important</span> : la méthode sur laquelle est appliquée cet attribut sera invoquée au démarrage de votre package avec la valeur actuelle du ou des StateObjects (<em>Request</em>) puis à chaque mise à jour des StateObjects (<em>Subscribe</em>).</p>
<p>Autre exemple, affichons dans les logs de notre package Python la consommation des CPU de l’ensemble des sentinelles Windows connectées dans notre Constellation en utilisant le package HWMonitor :</p>
<p></p><pre class="crayon-plain-tag">@Constellation.StateObjectLink(package = "HWMonitor", name = "/intelcpu/0/load/0")
def CPUUpdated(stateobject):
    Constellation.WriteInfo("CPU on %s is currently %s %" % (stateobject.SentinelName, stateobject.Value.Value))</pre><p></p>
<p>Dans le cas où vous souhaiterez conserver la valeur de votre StateObject dans une variable de votre script Python pour pouvoir vous en servir dans d&rsquo;autre méthode, il suffit tout simplement d&rsquo;affecter le StateObject dans une variable globale depuis un StateObjectLink.</p>
<p>Reprenons l&rsquo;exemple du thermostat Nest ci-dessus. Commençons par déclarer cette variable globale au niveau de notre script :</p>
<p></p><pre class="crayon-plain-tag">global nestThermostat</pre><p></p>
<p>Puis ajoutons un StateObjectLink vers le StateObject du thermostat Nest pour mettre à jour notre variable globale :</p>
<p></p><pre class="crayon-plain-tag">@Constellation.StateObjectLink(package = "Nest", name = "Living Room")
def OnNestThermostatChanged(stateObject):
    global nestThermostat
    nestThermostat = stateObject.Value</pre><p></p>
<p>Ainsi la variable « <em>nestThermostat</em> » contiendra la dernière valeur du StateObject représentant le thermostat Nest. Vous pourrez y accéder depuis n&rsquo;importe quel endroit de votre script.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/python-api/consommer-des-stateobjects-en-python/">Consommer des StateObjects depuis l&rsquo;API Python</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/python-api/consommer-des-stateobjects-en-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Les StateObjects</title>
		<link>https://developer.myconstellation.io/concepts/stateobjects/</link>
					<comments>https://developer.myconstellation.io/concepts/stateobjects/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 12:31:32 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[StateObject]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2145</guid>

					<description><![CDATA[<p>Les StateObjects sont des objets de données produits et publiés par des packages qu’ils soient “réels” ou “virtuels” d&#8217;une Constellation. Ils représentent des variables de type simple (numérique, chaîne de caractère, booléen, etc..) ou de type complexe (objet formaté en</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/stateobjects/">Les StateObjects</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Les StateObjects sont des objets de données produits et publiés par des packages qu’ils soient “réels” ou “virtuels” d&rsquo;une Constellation.</p>
<p>Ils représentent des variables de type simple (numérique, chaîne de caractère, booléen, etc..) ou de type complexe (objet formaté en JSON).</p>
<p>Les StateObjects sont tous stockés sur le serveur Constellation et peuvent être interrogés par n’importe quels packages ou consommateurs de la Constellation (sauf si des autorisations restreignent l’accès).</p>
<h3>Le StateObject</h3>
<p>Chaque StateObject comporte :</p>
<ul>
<li>Le nom de la sentinelle et du package qui a produit le StateObject</li>
<li>Un nom (la clé d&rsquo;un StateObject)</li>
<li>Une valeur</li>
<li>Une date de mise à jour</li>
<li>Une durée de vie en seconde (“0” si infinie)</li>
<li>Un type</li>
<li>Des métadatas (dictionnaire de clé / valeur)</li>
</ul>
<p>Dans la philosophie Constellation, chaque package (<a href="/concepts/sentinels-packages-virtuels/">virtuel ou non</a>) publie des StateObjects représentant des « variables publiques ».</p>
<p>Par exemple un capteur de température Arduino publiera des StateObjects sur la température ou humidité qu’il relève, un package comme le “HWMonitor” publiera des StateObjects sur les compteurs hardware qu’il mesure (consommation CPU, RAM, etc..), ou encore un package comme celui “Paradox” publiera des StateObjects pour chaque zone d’un système d’alarme où chaque StateObject contiendra un objet indiquant l’état de la zone (ouverte/fermée, en alarme ou non, en défaut ou non, etc..).</p>
<p>Le « <a href="/constellation-platform/constellation-console/stateobjects-explorer/">StateObject Explorer</a> » de la Console Constellation permet d’explorer l’ensemble des StateObjects de la Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-27.png"><img loading="lazy" class="alignnone colorbox-2145" title="Le StateObjects Explorer" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-26.png" alt="Le StateObjects Explorer" width="350" height="176" border="0" /></a></p>
<p align="left">Avec la possibilité de visualiser tous les détails et de vous abonner aux mises à jour en temps réel :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-28.png"><img loading="lazy" class="alignnone colorbox-2145" title="Détail d'un StateObject" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-27.png" alt="Détail d'un StateObject" width="350" height="251" border="0" /></a></p>
<p style="text-align: left;" align="center">La capture ci-dessus montre un StateObject produit par le package “NetAtmo” qui représente le détail d’un capteur NetAtmo (Id, version du firmware, nom du capteur, statuts de la communication, niveau de la batterie, etc..).</p>
<p style="text-align: left;" align="center">Comme chaque package peut publier des StateObjects dans Constellation, il est possible en interrogeant les StateObjects de votre Constellation de connaitre en temps réel l’état de tous vos systèmes (ou du moins “le dernier état connu”).</p>
<p style="text-align: left;" align="center">A noter que l’unicité d’un StateObject est obtenu par le triplet : “Sentinel + Package + Nom” car un nom de StateObject est unique pour une <a href="/concepts/instance-package-versioning-et-resolution/#Sentinel_Package_Instance_de_package">instance de package</a> (couple Sentinel / Package), de même qu’un package est un unique pour une sentinelle et qu’une sentinelle est unique dans une Constellation.</p>
<h3>Interrogation, abonnement et filtre</h3>
<p>Dans les librairies Constellation (<a href="/client-api/javascript-api/">JavaScript</a>, <a href="/client-api/net-package-api/">.NET</a>, <a href="/client-api/python-api/">Python</a>, <a href="/client-api/arduino-esp-api/">Arduino</a>, etc..) et d’un point de vue plus générique avec les <a href="/client-api/rest-api/">interfaces REST</a> Constellation vous allez retrouver les mêmes fonctionnalités :</p>
<ul>
<li>Le “Request” de StateObject</li>
<li>Le “Subscribe” de StateObject</li>
</ul>
<p>Le “Request” permet de récupérer la dernière valeur connue d’un ou de plusieurs StateObjects.</p>
<p>Le ”Subscribe” permet de créer un abonnement sur un ou plusieurs StateObjects. Une fois abonné, vous serez notifié en temps réel des qu’un StateObject de votre abonnement est mis à jour.</p>
<p>Dans ces deux méthodes vous serez amené à définir le ou les StateObjects que vous souhaitez récupérer ou suivre. Pour cela vous devez définir un filtre en indiquant :</p>
<ul>
<li>Le nom de la sentinelle du StateObject</li>
<li>Le nom du package du StateObject</li>
<li>Le nom du StateObject</li>
<li>Le type du StateObject</li>
</ul>
<p>Pour chaque filtre vous pourrez appliquer le wildcard “*” pour accepter toutes les valeurs possibles.</p>
<p>Ainsi appliquer le filtre <em>/</em>/<em>/</em> sélectionnera tous les StateObjects de votre Constellation. N’oubliez pas que l’unicité d’un StateObject est obtenue par le triplet : “Sentinel + Package + Nom”.</p>
<p>Quelques exemples :</p>
<ul>
<li>*/Demo/*/* : sélectionne tous les StateObjects du package “Demo” quelque soit la sentinelle</li>
<li>MonPC/Demo/*/* : sélectionne tous les StateObjects du package “Demo” de la sentinelle “MonPC”</li>
<li>MonPC/*/*/* : tous les StateObjects produits sur la sentinelle MonPC</li>
<li>MonPC/*/*/MyData : tous les StateObjects de type “MyData” et produits sur la sentinelle MonPC</li>
<li>MonPC/Demo/ABC/* : le StateObject ABC du package Demo sur la sentinelle MonPC</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/stateobjects/">Les StateObjects</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/stateobjects/feed/</wfw:commentRss>
			<slash:comments>2</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-22 02:24:21 by W3 Total Cache
-->