﻿<?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 AngularJS - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/tag/angularjs/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/tag/angularjs/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Sun, 29 Jul 2018 05:49:22 +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 AngularJS - Constellation</title>
	<link>https://developer.myconstellation.io/tag/angularjs/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>FriendLeaf : la serre connectée grâce à Constellation</title>
		<link>https://developer.myconstellation.io/tutorials/friendleaf-la-serre-connectee-grace-a-constellation/</link>
					<comments>https://developer.myconstellation.io/tutorials/friendleaf-la-serre-connectee-grace-a-constellation/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 17 Jul 2018 09:40:50 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Saga]]></category>
		<category><![CDATA[Relais]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[smartphone]]></category>
		<category><![CDATA[PushBullet]]></category>
		<category><![CDATA[Notification]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=6084</guid>

					<description><![CDATA[<p>Plus besoin de disposer d&#8217;un espace extérieur pour faire pousser vos propres herbes aromatiques, salades et fleurs. Grâce à la serre connectée FriendLeaf, vous pouvez faire pousser plusieurs plantes et vous en occuper facilement. Projet réalisé par Théo DELOOSE, Clara</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/friendleaf-la-serre-connectee-grace-a-constellation/">FriendLeaf : la serre connectée grâce à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><i>Plus besoin de disposer d&rsquo;un espace extérieur pour faire pousser vos propres herbes aromatiques, salades et fleurs. Grâce à la serre connectée FriendLeaf, vous pouvez faire pousser plusieurs plantes et vous en occuper facilement.</i></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure1.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title=" FriendLeaf : la serre connectée grâce à Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure1_thumb.png" alt="FriendLeaf : la serre connectée grâce à Constellation" width="354" height="266" border="0" /></a></p>
<p>Projet réalisé par Théo DELOOSE, Clara BOMY, Clément NOUGÉ, Mathieu GABRIEL, Marine DAEL et Thaï-Son DANG.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure2.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="L'équipe FriendLeaf" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure2_thumb.png" alt="L'équipe FriendLeaf" width="254" height="208" border="0" /></a></p>
<p><span id="more-6084"></span></p>

<h3>Introduction</h3>
<p>Nous sommes six étudiants en troisième année à l’ISEN Lille. Dans le cadre de notre projet de fin d’année, nous avons conçu une serre connectée dédiée à un usage en intérieur. Celle-ci est équipée d’un système d’éclairage intelligent, d’une pompe d’arrosage automatique et d’un brumisateur intégré afin de garantir la bonne croissance des plantes, rassemblant les conditions nécessaires à leur développement. Pour une plus grande facilité d&rsquo;utilisation, notre serre est associée à une application mobile simple et ludique permettant de suivre en temps réel les données de l’environnement de la serre et de contrôler celle-ci à distance.</p>
<p>En réalisant ce projet, notre but était de proposer une solution de serre connectée à un prix raisonnable et possédant une interface attrayante pour améliorer l’expérience de l’utilisateur.</p>
<p>De plus nous voulions que la serre puisse être intégrée dans différents systèmes facilement pour que l’utilisateur puisse utiliser les données à sa guise.</p>
<h3>Fonctionnement général</h3>
<p>Nous avons pensé<i> FriendLeaf </i>comme un système de monitoring et de pilotage. Il propose en effet de gérer automatiquement l’arrosage, l’humidité et la luminosité de la serre, ou bien de les activer manuellement à notre guise. Il synchronise les données récupérées par les différents capteurs grâce à la plateforme Constellation et active, par le biais d’un relais, les actionneurs. Enfin, <i>FriendLeaf </i>alerte l’utilisateur lorsque le réservoir d’eau est vide. Tout est synchronisé en temps réel comme par magie grâce à Constellation.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure3.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Communication" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure3_thumb.png" alt="Communication" width="400" height="150" border="0" /></a></p>
<p>Nous avons donc ajouté dans la serre les capteurs permettant de relever les informations sur l’humidité de l’air et du sol, sur la température et sur la luminosité.  L’équipement installé comporte aussi une guirlande lumineuse ayant pour but d’éclairer et d’afficher les alertes, une pompe pour le système d’arrosage et un brumisateur permettant d’humidifier l’air.</p>
<p align="center"> <a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure4.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Schéma général de la serre " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure4_thumb.png" alt="Schéma général de la serre " width="450" height="244" border="0" /></a></p>
<h3>Matériel utilisé</h3>
<p>Pour réaliser notre projet, nous nous sommes servis des composants suivants :</p>
<p>Pour la Serre :</p>
<ul>
<li><u><a href="https://www.ikea.com/fr/fr/catalog/products/70186603/">Serre SOCKER Ikea</a></u> (12,99€), Ikea</li>
<li>Bac pour le terreau (1,50€), Jardinerie</li>
<li><u><a href="https://www.amazon.fr/Raspberry-Pi-3-Mod%C3%A8le-B-Carte-m%C3%A8re/dp/B07BDR5PDW/ref=sr_1_cc_3?s=aps&amp;ie=UTF8&amp;qid=1528895423&amp;sr=1-3-catcorr&amp;keywords=raspberry+pi+3B">Carte Raspberry Pi 3B </a></u>(40,80€), Amazon</li>
<li><u><a href="https://www.amazon.fr/Elegoo-Optocoupleur-Continu-Arduino-Raspberry/dp/B06XKST8XC/ref=sr_1_1?s=computers&amp;ie=UTF8&amp;qid=1528792288&amp;sr=1-1&amp;keywords=4%2Bcanaux%2B250V&amp;th=1">Relais 4 canaux</a></u> supportant jusqu’à 5A et 250V (AC) et 30V (DC) (9,99€), Amazon</li>
<li>Câbles de connexion</li>
<li>Boîte de dérivation</li>
</ul>
<p>Pour les capteurs :</p>
<ul>
<li>Humidité et température air : <u><a href="https://www.amazon.fr/SODIAL-Humidite-Numerique-Temperature-Arduino/dp/B00K67XRFC/ref=sr_1_1?ie=UTF8&amp;qid=1529502640&amp;sr=8-1&amp;keywords=dht+11">DHT11</a></u> (1,31€), Amazon</li>
<li>Luminosité : <u><a href="https://www.gotronic.fr/art-capteur-de-luminosite-tsl2561-19569.htm">TSL2561</a></u> (6,95€), Gotronic</li>
<li>Humidité sol : <u><a href="https://www.gotronic.fr/art-capteur-d-humidite-gt110-26091.htm#complte_desc">GT110</a></u> (2,40€), Gotronic</li>
<li>Niveau d’eau : <u><a href="https://www.gotronic.fr/art-detecteur-de-niveau-gravity-sen0205-25296.htm">Gravity SEN0205</a></u> (10,50€), Gotronic</li>
</ul>
<p>Pour le brumisateur :</p>
<ul>
<li>Un <u><a href="https://www.amazon.fr/Ultrasons-Shineus-Humidificateur-Fontaine-Atomisation/dp/B077HSKYN8/ref=sr_1_4?ie=UTF8&amp;qid=1528895226&amp;sr=8-4&amp;keywords=mist+maker">émetteur à ultrasons</a></u> (9,89€), Amazon</li>
<li>Une alimentation pour le brumisateur (24V DC, 1A) (25€), Derotronic, Lille</li>
<li>Un bol</li>
</ul>
<p>Pour le système d’arrosage :</p>
<ul>
<li>Une <u><a href="https://www.amazon.fr/Gugutogo-submersible-%C3%A9lectrique-silencieux-m%C3%A9canique/dp/B07BXJTND4/ref=sr_1_3?s=electronics&amp;ie=UTF8&amp;qid=1529927406&amp;sr=1-3&amp;keywords=pompe+%C3%A0+eau+12v">pompe à eau</a></u> (5,48€), Amazon</li>
<li>Une alimentation 12V 600mA (12€), Derotronic, Lille</li>
<li>Un jerrican (environ 10€)</li>
<li>Un tuyau (ø7mm -ø10mm), Diall</li>
</ul>
<p>Pour l’éclairage :</p>
<ul>
<li>2m de <u><a href="http://www.blachere-illumination-store.com/fr/nos-creations/326-fil-lumiere-blanc-8m-3587880017658.html">guirlandes lumineuses</a></u> (1m LED et 1m incandescent), Blachère</li>
<li>Une alimentation pour fil lumière, Blachère</li>
<li>Colliers de serrage</li>
</ul>
<h3>Conception de la serre</h3>
<h4>Étape 1 : Préparation de la serre</h4>
<p>Dans la serre, nous avons disposé les capteurs, le pot et un bol pour le brumisateur. Nous avons également percé des trous pour pouvoir faire passer tous les capteurs et le tuyau d’arrosage.</p>
<p>Pour ce qui est de la guirlande lumineuse, il nous a fallu percer quelques trous supplémentaires dans les montants de la serre pour y glisser les colliers de serrage.</p>
<p align="center"> <a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure5.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="La serre &quot;nue&quot; " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure5_thumb.png" alt="La serre &quot;nue&quot; " width="354" height="266" border="0" /></a></p>
<h4>Étape 2 : Branchement du relais</h4>
<p align="center"> <a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure6.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Les relais" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure6_thumb.png" alt="Les relais" width="240" height="240" border="0" /></a></p>
<p>Afin de pouvoir contrôler les actionneurs, nous avons branché le relais quatre canaux à une carte Raspberry Pi.</p>
<p>Celui-ci est analogue à un interrupteur. Pour chaque canal, une alimentation est nécessaire et chacun d’entre eux peut être piloté individuellement grâces aux différents pins dont dispose le relais. Il faut également prévoir une masse que l’on branche sur le pin “Gnd” du relais.</p>
<p>Par défaut, lorsque les pins d’entrée ne sont pas alimentés, les canaux du relais délivrent la tension d’alimentation correspondante sur la sortie NC (“Normally Closed”) ou sur la sortie NO (“Normally Open”) dans le cas contraire.</p>
<h4>Etape 3 : Éclairage de la serre</h4>
<p>Pour l’éclairage de notre serre, nous avons percé des trous dans la structure et fixé la guirlande avec des colliers de serrage. Celle-ci doit être alimentée par une tension de 230V (<i>tension secteur</i>) et est composée d’un mètre de LEDs rouge et d’un mètre incandescent jaune.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure7.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Les LEDs" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure7_thumb.png" alt="Les LEDs" width="244" height="160" border="0" /></a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure7bis.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Les LEDs" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure7bis_thumb.png" alt="Les LEDs" width="244" height="184" border="0" /></a></p>
<p>Elle est connectée au relais par la phase et le neutre, chacun branchés sur un canal différent, afin d’isoler totalement la guirlande du secteur et ainsi éviter tout problème avec le reste des composants.</p>
<h4>Etape 4 : Installation du brumisateur</h4>
<p align="center"> <a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure8.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Le relais avec les LEDs et le brumisateur " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure8_thumb.png" alt="Le relais avec les LEDs et le brumisateur " width="244" height="324" border="0" /></a></p>
<p>Pour augmenter l’humidité de l’air dans la serre, nous avons installé un brumisateur fonctionnant par émissions d’ultrasons. Il nécessite une alimentation de 24V/1A maximum. On le relie ensuite au relais. La masse est directement connectée à l’adaptateur secteur par le biais d’un domino.</p>
<h4>Etape 5 : Installation du système d’arrosage</h4>
<h4 align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure9.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation du système d’arrosage" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure9_thumb.png" alt="Installation du système d’arrosage" width="184" height="244" border="0" /></a></h4>
<p>En ce qui concerne l’arrosage, nous disposons d’une pompe submersible qui nécessite une alimentation de 12V et 400mA. Elle est branchée en sortie à un tuyau percé pour un arrosage homogène. Nous la connectons ensuite à un des canaux du relais.</p>
<p align="center"> <a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure10.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Le reservoir" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure10_thumb.png" alt="Le reservoir" width="184" height="244" border="0" /></a></p>
<p>Pour le réservoir, nous avons récupéré un bidon de vinaigre de 5L sur lequel nous avons fait un trou pour le capteur de niveau d’eau et une ouverture pour le remplir et y faire passer la pompe.</p>
<h4>Pour résumer&#8230;</h4>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure11.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Schéma du relais et de la Raspberry" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure11_thumb.png" alt="Schéma du relais et de la Raspberry" width="404" height="301" border="0" /></a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure12.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Rendu dans la boite " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure12_thumb.png" alt="Rendu dans la boite " width="185" height="244" border="0" /></a></p>
<h4>Étape 6 : Mise en place des capteurs et paramétrage de la carte Arduino</h4>
<p>Nous installons à présent les capteurs d’humidité/température de l’air, d’humidité du sol, de de luminosité et de niveau d’eau. Nous branchons tous ces capteurs aux pins de la Raspberry ou de l’Arduino en faisant attention au fait que :</p>
<ul>
<li>Les capteurs d’humidité du sol et de niveau d’eau se branchent sur du 5V.</li>
<li>Les capteurs d’humidité/température de l’air et de luminosité sont alimentés en 3,3V.</li>
</ul>
<h5>Étape 6.1 : Capteur d’humidité et de température de l’air</h5>
<p>Le capteur d’humidité et de température de l’air fournissant des données numériques, nous le relions directement à notre Raspberry Pi comme montré sur le schéma ci-dessous :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure13.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Capteur d'humidité/température " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure13_thumb.png" alt="Capteur d'humidité/température " width="350" height="134" border="0" /></a></p>
<h5>Étape 6.2 : Capteurs de luminosité, d’humidité du sol et de niveau d’eau</h5>
<p><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure14.png"><img class="colorbox-6084"  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=" Capteurs et Arduino sur la Raspberry " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure14_thumb.png" alt=" Capteurs et Arduino sur la Raspberry " width="350" height="274" border="0" /></a></p>
<p>Ces capteurs fournissant des données analogiques, nous les avons branchés à une carte Arduino nano qui permet de lire ces données, contrairement à la Raspberry. Elle est reliée directement par USB à la Raspberry Pi comme montré ci-après :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure15.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Arduino et ses capteurs" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure15_thumb.png" alt="Arduino et ses capteurs" width="244" height="184" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure16.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Arduino et ses capteurs" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure16_thumb.png" alt="Arduino et ses capteurs" width="244" height="185" border="0" /></a></p>
<h5>Étape 6.3 : Programmation de la carte Arduino</h5>
<p>Dans l’IDE Arduino, nous avons donc commencé par programmer la carte.</p>
<p>Nous ajoutons tout d’abord les librairies d’Adafruit pour pouvoir initialiser le capteur de luminosité et régler le temps d’intégration des données. Dans le gestionnaire de bibliothèque (menu<i> Croquis &gt; Inclure une bibliothèque</i>), nous avons installé les librairies suivantes :</p>
<ul>
<li>Adafruit Unified Sensor</li>
<li>Adafruit TSL2561</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure17.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Les librairies Arduino " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure17_thumb.png" alt="Les librairies Arduino " width="350" height="76" border="0" /></a></p>
<p>Au démarrage, dans la méthode “setup()”, nous configurons les pins utilisés. Nous décidons d’utiliser les pins analogiques A0 et A1, respectivement pour le capteur d’humidité du sol et du niveau d’eau et les pins A4 et A5 pour le capteur de luminosité :</p>
<p></p><pre class="crayon-plain-tag">void setup(void) 
{
  Serial.begin(9600);
 
  /*Réglage du capteur de luminosité*/
  if(!tsl.begin()) //Initialisation du capteur
  {
    //S'il y a un problème pour détecter le capteur, vérifier votre connexion
    Serial.print("Ooops, pas de capteur détecté... Vérifier votre connexion!");
    while(1);
  }
  
    //Configuration du gain du capteur et du temps d'intégration
    tsl.enableAutoRange(true);          
    tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);    
 
}</pre><p></p>
<p>Dans la méthode “loop()”, nous recueillons ensuite les valeurs des capteurs et les faisons afficher sur le Monitor Série en utilisant les commandes analogRead() et Serial.print()  :</p>
<p></p><pre class="crayon-plain-tag">void loop(void) 
{  
  /*Pour recevoir une nouvelle donnée par le capteur de luminosité*/ 
  sensors_event_t event;
  tsl.getEvent(&amp;event);
 
  //Lecture des pins analogiques pour les données des capteurs d'humidité du sol et de niveau d'eau
  Hum_value = analogRead(A0);
  Liquid_value=analogRead(A1);
 
  //Affichage des valeurs sur le Moniteur série
  Serial.print(event.light,0);
  Serial.print(',');
  Serial.print(map(Hum_value,0,1024,0,100)); //Le capteur d'humidité renvoie une valeur en pourcentage 
  Serial.print(',');
  Serial.println(map(Liquid_value,0,512,0,1)); //Le capteur de niveau d'eau retourne la valeur 1 quand il est en contact avec l'eau, 0 sinon
  delay(5000); //Retard de 5s pour éviter de surcharger le buffer de la Raspberry 
}</pre><p></p>
<p>Nous récupèrerons ensuite les données des différents capteurs à l’aide de la carte Raspberry Pi.</p>
<h3>La programmation vers Constellation</h3>
<p>La programmation vers Constellation est divisée en deux packages : le premier correspond à la récupération des données des capteurs et à l’activation des actionneurs, le second a été créé pour gérer le stockage des données en vue de créer des graphiques sur notre application.</p>
<h4>Etape 1 : Package relatif aux capteurs et actionneurs</h4>
<h5>Etape 1.1 : Acquisition des données des capteurs</h5>
<p>Pour récupérer les données des différents capteurs cités précédemment, nous avons utilisé la librairie “Adafruit_DHT” pour Raspberry Pi et la librairie “serial” qui permet de faire le lien entre l’Arduino-Nano et la Raspberry Pi. Ces valeurs vont nous permettre de décider s’il faut activer ou non les actionneurs tels que la pompe, le brumisateur ou les LED.</p>
<p>La fonction ci-après permet de récupérer les valeurs des différents capteurs.</p>
<p></p><pre class="crayon-plain-tag">def getCapteur():
    humiditeAir, temperature = Adafruit_DHT.read_retry(11,4)
    lux, humiditeSol, eau = ser.readline()[:-2].split(",")</pre><p></p>
<p>Nous avons ensuite créé un State Object rassemblant les valeurs d’humidité du sol, d’humidité de l’air, de température et de luminosité ambiante pour pouvoir les publier sur notre Constellation.</p>
<p></p><pre class="crayon-plain-tag">Constellation.PushStateObject("Capteurs", {"HumiditeSol": int(self.humiditeSol), "HumiditeAir": int(self.humiditeAir), "Temperature": int(self.temperature), "Luminosite": int(self.lux)}, "CapteursInfos")</pre><p></p>
<p align="center"> <a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure18.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title=" Le State Object des capteurs " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure18_thumb.png" alt=" Le State Object des capteurs " width="350" height="169" border="0" /></a></p>
<h5>Etape 1.2 : Activation et désactivation des différents actionneurs (brumisateur, guirlande lumineuse et pompe à eau)</h5>
<p>Comme mentionné précédemment, les actionneurs sont reliés à la Raspberry Pi via un relais quatre canaux. Cela simplifie grandement la programmation : il nous suffit simplement de gérer l’ouverture et la fermeture des relais.</p>
<p>Nous avons donc fait en sorte que chaque actionneur soit associé à son relais grâce à la librairie GPIO de la Raspberry Pi. Ainsi, le code diffère seulement au niveau des numéros des pins utilisés par les actionneurs.</p>
<p>Voici un exemple du code de l’activation et de la désactivation de notre pompe :</p>
<p></p><pre class="crayon-plain-tag">GPIO.setmode(GPIO.BOARD)
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,0)</pre><p></p>
<p>Le pin 12 de la Raspberry est celui relié au relais contrôlant la pompe.</p>
<h5>Etape 1.3 : Automatisation des actionneurs</h5>
<p>Pour réaliser la fonction d’automatisation, nous nous sommes tout d’abord renseignés sur les conditions propices à la bonne croissance des plantes au niveau de l’humidité du sol et de l’air, de la luminosité et de la température de l’air.</p>
<p>Pour le brumisateur, nous avons choisi de l’activer si l’humidité est inférieure à 35% et de le désactiver si l’humidité remonte au dessus de 37%.</p>
<p></p><pre class="crayon-plain-tag">if humiditeAir &gt; 37 and brumisateur:
    DesactiverBrumisateur()
elif humiditeAir &lt; 35 and not brumisateur:
    ActiverBrumisateur()
    time.sleep(1)</pre><p></p>
<p>Pour la pompe, le fonctionnement est différent. Puisque la diffusion de l’eau dans la terre est plus lente, nous activons la pompe pendant 5s avant de la désactiver pendant 30s pour laisser le temps au capteur de ressentir les changements.</p>
<p></p><pre class="crayon-plain-tag">if humiditeSol &lt; 30 and not pompe:
    if self.ticks == 0:
            if self.next_water == 0:
                    ActiverPompe()
            self.next_water = 15
        else:
                    self.next_water -= 1
        elif humiditeSol &gt; 30:
                    self.next_water = 0
    elif pompe:
            self.ticks += 1
               if self.ticks &gt;= 3:
                    DesactiverPompe()
                       self.ticks = 0
time.sleep(1)</pre><p></p>
<p>Ces différentes fonctions sont exécutées dans des threads séparés pour ne pas que le code soit bloquant.</p>
<p>Maintenant, il ne reste plus qu&rsquo;à sécuriser notre système d’arrosage via le capteur de niveau d’eau. Connecté à la carte Arduino nano, ce capteur va nous renvoyer 1 s’il y a de l’eau dans le réservoir, 0 sinon.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure19.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Package PushBullet" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure19_thumb.png" alt="Package PushBullet" width="354" height="163" border="0" /></a></p>
<p>Les données du capteur de niveau d’eau nous permettent d’arrêter le système d’arrosage lorsque le réservoir est presque vide et d’informer l’utilisateur via un PushBullet et l’allumage des LEDs qu’il faut remplir le réservoir.</p>
<p></p><pre class="crayon-plain-tag">Constellation.SendMessage("PushBullet", "PushNote", [ "FriendLead", "Le reservoir d'eau est vide"], Constellation.MessageScope.package)</pre><p></p>
<div align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure20.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Notification sur smartphone" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure20_thumb.png" alt="Notification sur smartphone" width="184" height="364" border="0" /></a></div>
<h4>Étape 2 : Package relatif au stockage des données</h4>
<p>Afin d’historiser les valeurs des capteurs stockées dans un des State Objects du premier package, nous en avons créé un autre que l’on a déployé sur le même serveur que Constellation.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure21.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Enregistrement CSV" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure21_thumb.png" alt="Enregistrement CSV" width="177" height="244" border="0" /></a></p>
<p>Ce package génère une base de données dans un fichier .csv qui est mis à jour toutes les minutes avec les nouvelles données.</p>
<p>Chaque ligne contient la date, l’heure, l’humidité du sol, l’humidité de l’air, la température et la luminosité.</p>
<p></p><pre class="crayon-plain-tag">@Constellation.StateObjectLink(package = "FriendLeafCapteurs", name = "Capteurs")
def RecupValue(stateObject):
    humiditeSol = stateObject.Value.HumiditeSol
    humiditeAir = stateObject.Value.HumiditeAir
    temperature = stateObject.Value.Temperature</pre><p></p>
<p>Nous avons ensuite créé un message callback qui permet de visualiser le fichier CSV dans notre Constellation.</p>
<p></p><pre class="crayon-plain-tag">@Constellation.MessageCallback()
def LireBDD():
'''
: return string : La base de données 
'''
    file = open('BDD.csv','r')
    lines = file.readlines()
    return lines</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure22.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="La saga du Message Callback " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure22_thumb.png" alt="La saga du Message Callback " width="350" height="203" border="0" /></a></p>
<h3>L’interface utilisateur : l’application mobile de monitoring et de pilotage de la serre</h3>
<h4>Étape 1 : Le noyau de l’application</h4>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure23.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="L'application Cordova" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure23_thumb.png" alt="L'application Cordova" width="184" height="364" border="0" /></a></p>
<p>Pour développer l’application mobile nous nous sommes aidés de Cordova, un Framework permettant de créer des application Android et iOS avec des technologies web.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure24.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Cordova" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure24_thumb.png" alt="Cordova" width="240" height="98" border="0" /></a></p>
<p>Nous avons également utilisé jQuery et AngularJS pour faciliter l’interaction entre Javascript et HTML.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure27.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="AngularJS" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure27_thumb.png" alt="AngularJS" width="240" height="143" border="0" /></a></p>
<p>De plus, pour gérer certaines fonctionnalités comme le traitement du CSV ou l’affichage des graphiques, nous avons utilisé des librairies externes comme PapaParser et Chartist. Finalement, pour embellir le CSS, nous avons utilisé le Framework SemanticUI qui ressemble en certain points à Bootstrap.</p>
<h4>Étape 2 : Connexion à Constellation, State Object et Messages Callback</h4>
<p>Pour nous connecter à Constellation avec AngularJS, nous avons utilisé ces lignes de codes :</p>
<p></p><pre class="crayon-plain-tag">Constellation.initializeClient(url_port, sha, "FriendLeaf");

Constellation.onConnectionStateChanged(function (change) {
   //suite
});</pre><p></p>
<p>et une ligne de ce type pour chaque State Object :</p>
<p></p><pre class="crayon-plain-tag">Constellation.registerStateObjectLink("*", "FriendLeafCapteurs", "Actionneurs", "*", function (so) {
    //suite
});</pre><p></p>
<p>Quant aux messages Callback, ils sont envoyés comme suit :</p>
<p></p><pre class="crayon-plain-tag">Constellation.sendMessage({ Scope: 'Package', Args: ['FriendLeafCapteurs'] }, 'DesactiverBrumisateur');</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure28.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Page de configuration" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure28_thumb.png" alt="Page de configuration" width="184" height="364" border="0" /></a></p>
<p>Pour que l’application soit utilisable sur n’importe quelle Constellation, nous avons créé un page de configuration où l’utilisateur rentre l’adresse de sa constellation, le port, et des identifiants.</p>
<p>Une fois tout cela rempli, le nom d’utilisateur et le mot de passe sont hachés en SHA1 grâce à une librairie externe et la connexion à Constellation commence.</p>
<p>Lorsque l’application se lance pour la première fois, l&rsquo;utilisateur est directement redirigé vers cette page pour entrer les informations nécessaires.</p>
<h4>Étape 3 : Affichage des données en temps réel</h4>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure29.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Le tableau de bord " src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure29_thumb.png" alt="Le tableau de bord" width="184" height="364" border="0" /></a></p>
<p>Pour l’affichage des données en temps réel nous avons utilisé des images SVG car elles sont très flexibles et nous voulions réaliser des barres de progression en arc de cercle. Pour les valeurs numériques on affiche un scope AngularJS dans lequel sont stockés les valeurs des capteurs.</p>
<p>Le code JS :</p>
<p></p><pre class="crayon-plain-tag">//Stockage des valeurs des capteurs dans la variable capteur
scope.capteurs["humiditeAir"] = so.Value.HumiditeAir;
scope.$apply(); //Applications des modifications du scope

//Pour changer le remplissage de la jauge 
$("#h_air_gauge").css("stroke-dasharray",(so.Value.HumiditeAir*18)/100 + " 18 0");</pre><p></p>
<p>SVG en HTML :</p>
<p></p><pre class="crayon-plain-tag">&lt;svg viewbox="0 0.5 10 8"&gt;
    &lt;defs&gt;
    &lt;linearGradient id="linear" x1="0%" y1="0%" x2="100%" y2="0%"&gt;
        &lt;stop offset="0%" stop-color="#00ee4f"/&gt;
        &lt;stop offset="66%" stop-color="#eeae00"/&gt;
        &lt;stop offset="100%" stop-color="#ee0000"/&gt;
    &lt;/linearGradient&gt;
    &lt;/defs&gt;
    &lt;text x="50%" y="50%" id="h_air_value" text-anchor="middle"  alignment-baseline="middle" fill="#00ee4f"&gt;
        {{Math.round(capteurs["humiditeAir"])}}%
    &lt;/text&gt;
    &lt;path d="M2 8 A 4 4 0 1 1 8 8" fill="none" stroke-width="0.78" stroke="#E8F6FD" /&gt;
    &lt;path class="loader" id="h_air_gauge" d="M2 8 A 4 4 0 1 1 8 8" fill="none" stroke-width="0.8" 
stroke="url(#linear)" /&gt;
&lt;/svg&gt;</pre><p></p>
<h4>Étape 4 : Contrôler sa serre</h4>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure32.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Page de contrôle" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure32_thumb.png" alt="Page de contrôle" width="124" height="244" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure30.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Page de contrôle" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure30_thumb.png" alt="Page de contrôle" width="124" height="244" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure31.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Page de contrôle" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure31_thumb.png" alt="Page de contrôle" width="124" height="244" border="0" /></a></p>
<p>Nous avons également prévu dans l’application de pouvoir gérer les différents actionneurs de la serre.</p>
<p>Pour gérer le côté automatique du package responsable des capteurs nous avons utilisés des sliders qui lorsqu’activés, vont envoyer un Message Callback comme décrit ci-dessus. On va également suivre l’évolution du State Object indiquant si l’automatisation est activée pour tel ou tel actionneur et ainsi bloqué ou non le bouton d’activation manuel. Car oui, il est également possible d’activer manuellement chaque actionneur grâce à un bouton.</p>
<h4>Étape 5 : Les graphiques</h4>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure33.png"><img class="colorbox-6084"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Graphiques" src="https://developer.myconstellation.io/wp-content/uploads/2018/07/figure33_thumb.png" alt="Graphiques" width="184" height="361" border="0" /></a></p>
<p>Pour ce qui est des graphiques nous avons utilisé une librairie externe que nous avons modifié pour la rendre compatible sur mobile. Cette librairie s’appelle Chartist. Grâce à elle nous avons pu faire de superbes graphiques.</p>
<h3>Conclusion</h3>
<p>Voilà qui conclut les grandes étapes de la réalisation de FriendLeaf. Comme vous avez pu le voir, la serre remplit complètement son rôle. C’est un projet ludique, simple à réaliser et facilement transposable sur d’autres installations grâce aux State Objects et aux messages Callback. 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 serre.</p>
<p>Nous tenons également à remercier Léa, le jardin de Théo et les parents de Marine qui nous ont fourni quelques accessoires nécessaires à la serre.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/friendleaf-la-serre-connectee-grace-a-constellation/">FriendLeaf : la serre connectée grâce à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/tutorials/friendleaf-la-serre-connectee-grace-a-constellation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Créer une serrure connectée à Constellation</title>
		<link>https://developer.myconstellation.io/tutorials/creer-une-serrure-connectee-constellation/</link>
					<comments>https://developer.myconstellation.io/tutorials/creer-une-serrure-connectee-constellation/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 16 May 2018 14:05:31 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Serrure]]></category>
		<category><![CDATA[tutoriel]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Constellation]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5979</guid>

					<description><![CDATA[<p>Article proposé par Olivier MOUILLOT, Mohammed TAHRI JOUTEI HASSANI et Gaëtan DELABY Vous attendez quelqu’un chez vous mais vous êtes occupé à faire autre chose. Cette serrure connectée vous permettra de contrôler l’ouverture de la porte d’entrée depuis n’importe quelle</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-une-serrure-connectee-constellation/">Créer une serrure connectée à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>Article proposé par Olivier MOUILLOT, Mohammed TAHRI JOUTEI HASSANI et Gaëtan DELABY</em></p>
<p>Vous attendez quelqu’un chez vous mais vous êtes occupé à faire autre chose. Cette serrure connectée vous permettra de contrôler l’ouverture de la porte d’entrée depuis n’importe quelle pièce de votre domicile, et cela en un clic grâce à votre smartphone. Nous allons voir pas à pas comment la mettre en place simplement.</p>

<h2>Prérequis</h2>
<p>Pour réaliser ce projet, il vous faut :</p>
<ul>
<li>Une gâche électrique 12V / 500 A</li>
<li>Un ESP8266</li>
<li>Un régulateur de tension LM1117</li>
<li>Un transistor NPN TIP 110</li>
<li>Une résistance 5,6 KΩ</li>
<li>Deux condensateurs 0,1 µF et 0,33 µF</li>
<li>Du fil électrique</li>
<li>Une batterie 12V</li>
<li>Un serveur Constellation (Un ordinateur pourra faire l’affaire)</li>
</ul>
<h2>Etape 1 : réaliser une serrure connectée</h2>
<p>Dans un premier temps, il nous a fallu trouver une serrure adaptée au développement du projet sur laquelle nous pouvions brancher nos fils électriques. Nous avons donc opté pour la serrure suivante que vous pourrez vous procurer via <a href="https://www.amazon.fr/Extel-90301-3-%C3%A9lectrique-passage-serrure/dp/B002LS6OTA/ref=sr_1_2?ie=UTF8&amp;qid=1511196788&amp;sr=8-2&amp;keywords=g%C3%A2che+%C3%A9lectrique&amp;dpID=31-7q-yaD0L&amp;preST=_SX300_QL70_&amp;dpSrc=srch">ce lien </a>.</p>
<p align="center"><a href="https://www.amazon.fr/Extel-90301-3-%C3%A9lectrique-passage-serrure/dp/B002LS6OTA/ref=sr_1_2?ie=UTF8&amp;qid=1511196788&amp;sr=8-2&amp;keywords=g%C3%A2che+%C3%A9lectrique&amp;dpID=31-7q-yaD0L&amp;preST=_SX300_QL70_&amp;dpSrc=srch"><img class="colorbox-5979"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Extel Weca 90301.3 Gâche électrique sans passage de serrure" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/image.png" alt="Extel Weca 90301.3 Gâche électrique sans passage de serrure" width="146" height="331" border="0" /></a></p>
<p>Pour de plus amples informations techniques sur la gâchette, vous pouvez également regarder <a href="http://www.produktinfo.conrad.com/datenblaetter/75000-99999/094195-an-01-ml-gache_elec_de_en_fr_nl.pdf">ici</a>.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/image-1.png"><img class="colorbox-5979"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="serrure de dessus" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/image_thumb.png" alt="serrure de dessus " width="354" height="266" border="0" /></a></p>
<p>Il faut ensuite créer le câblage nécessaire au fonctionnement de la serrure. Notre principal problème a été de convertir l’alimentation indispensable de 12V pour la serrure en une alimentation de 3,3V nécessaire à l’utilisation de notre ESP. A l’aide du régulateur de tension, nous avons réalisé le montage suivant en entrée de l’ESP.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/image-2.png"><img class="colorbox-5979"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title=" régulateur de tension" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/image_thumb-1.png" alt=" régulateur de tension" width="400" height="138" border="0" /></a></p>
<p>Afin de laisser passer le courant et de faire fonctionner la gâchette, le transistor TIP110 en série avec une résistance 5,6kΩ se placent en sortie GPIO de l’ESP. Une LED peut être également placée à cette même sortie afin de visualiser l’état de la serrure.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/image-3.png"><img class="colorbox-5979"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="sortie ESP" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/image_thumb-2.png" alt="sortie ESP" width="350" height="232" border="0" /></a></p>
<p>Enfin, voici le montage final reprenant tous les composants :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/image-4.png"><img class="colorbox-5979"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Schéma global du circuit" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/image_thumb-3.png" alt="Schéma global du circuit" width="350" height="184" border="0" /></a></p>
<h2>Etape 2 : Programmation</h2>
<p>Vous avez fait la moitié du travail, voyons ensemble comment coder notre ESP8266.</p>
<p>La fonction de base de la gâche électrique est assez simple : couper le courant à travers la serrure pour la fermer ou le laisser passer le courant afin d’ouvrir la serrure. En premier lieu, nous avons développé le code Arduino servant à faire faire passer du courant ou non dans la gâche. Pour cela nous devons dans un premier temps connecter notre ESP8266 à Constellation. Pour découvrir comment connecter votre ESP à Constellation, <a href="https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">suivez ce guide</a>.</p>
<p>En ce qui concerne le code Arduino permettant de contrôler la serrure, vous en trouverez ci-dessous l’intégralité.</p>
<p></p><pre class="crayon-plain-tag">#include &lt;Constellation.h&gt;

// ESP8266 Wifi
#include &lt;ESP8266WiFi.h&gt;
char ssid[] = "MY-WIFI";
char password[] = "xxxxxxxx";

define LOCK_PIN D3

// Constellation client
Constellation&lt;WiFiClient&gt; constellation("172.20.10.2", 8088, "d1mini", "demoisen", "xxxxxxxx");

void setup(void) {
  Serial.begin(115200);  delay(10);

  //SET I/O 
  pinMode(LOCK_PIN, OUTPUT);
  // INITIAL mode
  digitalWrite(LOCK_PIN , LOW);

  // Set Wifi mode
  if (WiFi.getMode() != WIFI_STA) {
    WiFi.mode(WIFI_STA);
    delay(10);
  }
  
  // Connecting to Wifi  
  Serial.print("Connecting to ");
  Serial.println(ssid);  
  WiFi.begin(ssid, password);  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected. IP: ");
  Serial.println(WiFi.localIP());

  constellation.pushStateObject("State", false);
  
  constellation.registerMessageCallback("OpenDoor", MessageCallbackDescriptor().setDescription("Ouvres la porte"),
      [](JsonObject&amp; message) {
            digitalWrite(LOCK_PIN, HIGH);
            constellation.pushStateObject("State", true);
            delay(4000);
            digitalWrite(LOCK_PIN, LOW);   
            constellation.pushStateObject("State", false);    
      });
  
  // Declare the package descriptor
  constellation.declarePackageDescriptor();

  // WriteLog info
  constellation.writeInfo("Virtual Package on '%s' is started !", constellation.getSentinelName());  
}

void loop(void) {
  constellation.loop();
}</pre><p></p>
<p>L’étape suivante a été d’utiliser la librairie Constellation <a href="https://developer.myconstellation.io/client-api/arduino-esp-api/recevoir-des-messages-et-exposer-des-methodes-messagecallback-sur-arduino-esp/">pour ajouter un « MessageCallback</a> » afin de contrôler le GPIO de la gâchette, <a href="https://developer.myconstellation.io/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/">couplé à un « StateObject</a> » permettant de maintenir l’état de la serrure dans Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/image-5.png"><img class="colorbox-5979"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="StateObject" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/image_thumb-4.png" alt="StateObject" width="354" height="258" border="0" /></a></p>
<p>Constellation va aller garder en permanence l’état de la serrure grâce au StateObject « State ».</p>
<p>Dorénavant, n’importe qui connecté au serveur peut se servir du MessageCallback « OpenDoor» exposé par l’ESP que nous avons utilisé pour faire permuter l’ouverture et la fermeture automatique de la serrure. Un délai de 4 secondes est programmé avant que la serrure ne se referme après ouverture de la gâche. Nous avons ajouté cette fonctionnalité afin d’ajouter une partie sécurité à notre dispositif.</p>
<p align="center"><img class="colorbox-5979"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="MessageCallback" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/image-6.png" alt="MessageCallback" width="350" height="73" border="0" /></p>
<p>&nbsp;</p>
<p>On obtient alors simplement le pilotage de notre gâchette avec Constellation, dont l’état pourra être contrôlé grâce à une page Web qu’on vous présente dans la partie suivante.</p>
<h2>Etape 3 : Piloter sa serrure à l’aide d’une page web</h2>
<p>Pour cette dernière étape qui consiste à piloter notre serrure connectée grâce à une page Web. Il s’agit principalement de l’interface via laquelle vous pourrez facilement décider de l’ouverture ou la fermeture de la serrure.</p>
<p>Voici le code HTML que nous avons mis en place :</p>
<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" ng-app="MyDemoApp"&gt;
&lt;head&gt;
    &lt;link rel="stylesheet" href="bruh.css" /&gt;
    &lt;title&gt;Serrure connectée&lt;/title&gt;
    &lt;link rel="stylesheet" href="style.css" /&gt;
    &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.2.min.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.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.2.min.js"&gt;&lt;/script&gt;
    
    &lt;script&gt;
        var myDemoApp = angular.module('MyDemoApp', ['ngConstellation']);
        myDemoApp.controller('MyController', ['$scope',  'constellationConsumer', function ($scope, constellation) {
  
          constellation.initializeClient("http://172.20.10.2:8088", "xxxxxxxxxx", "WebPage");
          constellation.onConnectionStateChanged(function (change) {
            if (change.newState === $.signalR.connectionState.connected) {
                console.log("Je suis connecté !");
                constellation.requestSubscribeStateObjects("*", "DoorLock", "*", "*");
                }
            });

          constellation.onUpdateStateObject(function (stateObject) {
              console.log(stateObject);
              $scope[stateObject.Name] = stateObject.Value;
              $scope.$apply();
          });
          
          $scope.openDoor = function(){
                constellation.sendMessage({Scope: 'Package', Args: ['DoorLock']}, 'OpenDoor');
            };

            
          constellation.connect();

                }]);
    &lt;/script&gt;
 
&lt;/head&gt;

&lt;body ng-controller="MyController"&gt;
        
    &lt;button ng-click="openDoor()"&gt; OPEN &lt;/button&gt;

&lt;/body&gt;
&lt;/html&gt;</pre><p></p>
<p>Avec quelques lignes de CSS, le rendu final de notre page est le suivant et on ne peut plus simple d’utilisation pour le pilotage :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/image-7.png"><img class="colorbox-5979"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Page Web" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/image_thumb-5.png" alt="Page web" width="354" height="169" border="0" /></a></p>
<p>Pour la suite il suffit d’héberger cette page HTML sur un serveur Web quelconque et vous pourrez ouvrir votre porte depuis un PC, un smartphone, une table ou autre.</p>
<p>Et comme l’ouverture de la porte est exposer comme un <a href="https://developer.myconstellation.io/concepts/messaging-message-scope-messagecallback-saga/">MessageCallback</a>, vous pourrez l’ouvrir depusi un code <a href="https://developer.myconstellation.io/client-api/net-package-api/envoyer-des-messages-invoquer-des-messagecallbacks/">C#,</a> <a href="https://developer.myconstellation.io/client-api/python-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-en-python/">Python</a>, <a href="https://developer.myconstellation.io/client-api/arduino-esp-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-depuis-arduino-esp/">Arduino</a> ou même un simple <a href="https://developer.myconstellation.io/client-api/rest-api/interface-rest-consumer/#Envoyer_des_messages">appel HTTP</a> à l’API Constellation. N’hésitez pas à utiliser le “<a href="https://developer.myconstellation.io/constellation-platform/constellation-console/messagecallbacks-explorer/">Code Generator</a>” de la console Constellation.</p>
<p>Au final avec une gâche électrique, un ESP8266, une Constellation et quelques lignes d’Arduino, on est capable d’ouvrir une porte depuis tous type d’application.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-une-serrure-connectee-constellation/">Créer une serrure connectée à Constellation</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-une-serrure-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[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>
		<category><![CDATA[ForecastIO]]></category>
		<category><![CDATA[Domotique]]></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>Nouvelles API Javascript et AngularJS 1.8.2</title>
		<link>https://developer.myconstellation.io/blog/nouvelles-api-javascript-angularjs-1-8-2/</link>
					<comments>https://developer.myconstellation.io/blog/nouvelles-api-javascript-angularjs-1-8-2/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Thu, 06 Jul 2017 08:02:30 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Javascript]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5217</guid>

					<description><![CDATA[<p>Après la mise à jour du SDK et Python Proxy la semaine dernière, c&#8217;est au tour des API Javascript et AngularJS de passer en 1.8.2. Ces deux nouvelles versions sont disponibles sur le repository Nuget depuis votre Visual Studio et</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/nouvelles-api-javascript-angularjs-1-8-2/">Nouvelles API Javascript et AngularJS 1.8.2</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><br />
Après la <a href="/blog/api-python-et-sdk-version-1-8-2/">mise à jour du SDK et Python Proxy</a> la semaine dernière, c&rsquo;est au tour des <a href="/client-api/javascript-api/">API Javascript et AngularJS</a> de passer en 1.8.2.</p>
<p>Ces deux nouvelles versions sont disponibles sur le repository Nuget depuis votre Visual Studio et sur le <a href="https://cdn.myconstellation.io">CDN Constellation</a>.</p>
<h3>Amélioration des méthodes sendMessage et sendMessageWithSaga</h3>
<p>La version 1.8.2 de l&rsquo;API Javascript et AngularJS améliore l&rsquo;usage de ces deux méthodes.</p>
<h4>Invoquer un MessageCallback sans paramètre</h4>
<p>Lorsque vous invoquez un MessageCallback qui ne prend pas de paramètre d&rsquo;entrée, <strong>il n&rsquo;y a plus besoin de passer un objet vide « {} »</strong> dans les méthodes <em>sendMessage</em> et <em>sendMessageWithSaga</em>.</p>
<p>Un exemple pour bien comprendre :</p>
<p></p><pre class="crayon-plain-tag">// Mode Legacy
constellation.server.sendMessage({ Scope: 'Package', Args: ['DemoPackage'] }, "UneMethodeSansParam", "{}");

// Avec la lib 1.8.2
constellation.server.sendMessage({ Scope: 'Package', Args: ['DemoPackage'] }, "UneMethodeSansParam");</pre><p></p>
<p>Notez que vous pouvez toujours utiliser la forme « legacy », il n&rsquo;y a pas de « breaking change » lorsque vous allez mettre à jour la libraire Javascript.</p>
<p>Cette nouveauté est également portée sur la libraire AngularJS :</p>
<p></p><pre class="crayon-plain-tag">// Legacy :
constellation.sendMessage({ Scope: 'Package', Args: ['DemoPackage'] }, "UneMethodeSansParam", "{}");

// Avec la lib 1.8.2
constellation.sendMessage({ Scope: 'Package', Args: ['DemoPackage'] }, "UneMethodeSansParam");</pre><p></p>
<p>De plus, cet ajout est également disponible sur la méthode <em>sendMessageWithSaga</em>.</p>
<h4>Invoquer un MessageCallback avec plusieurs paramètres</h4>
<p>Lorsque vous invoquez un MessageCallback qui prend plusieurs paramètres, <strong>il n&rsquo;y a plus besoin de les encapsuler dans un tableau</strong> que ce soit dans la méthode <em>sendMessage</em> ou <em>sendMessageWithSaga</em>.</p>
<p>Un exemple pour bien comprendre :</p>
<p></p><pre class="crayon-plain-tag">// Mode legacy
constellation.server.sendMessage({ Scope: 'Package', Args: ['DemoPackage'] }, 'UneMethodeAvecPlusieurParams', [ 'input', 2, 4, false ]);

// Avec la lib 1.8.2
constellation.server.sendMessage({ Scope: 'Package', Args: ['DemoPackage'] }, 'UneMethodeAvecPlusieurParams', 'input', 2, 4, false);</pre><p></p>
<p>Dans la forme legacy les 4 paramètres à passer pour invoquer le MessageCallback « <em>UneMethodeAvecPlusieurParams</em> » sur le package <em>DemoPackage</em> étaient encapsulés dans un tableau. Désormais depuis la version 1.8.2, vous pouvez passer vos paramètres les uns dernière les autres dans les méthodes <em>sendMessage</em> ou <em>sendMessageWithSaga</em>.</p>
<p>Bien évidement vous pouvez toujours utiliser la forme « legacy », il n&rsquo;y a pas de « breaking change » lorsque vous allez mettre à jour la libraire Javascript. Cette nouveauté est également portée sur la libraire AngularJS et aussi disponible sur la méthode <em>sendMessageWithSaga</em>.</p>
<h4>Invoquer un MessageCallback avec message de retour (saga)</h4>
<p>Pour uniformiser la signature de la méthode sendMessageWithSaga avec les API Python, .NET ou Arduino, le callback de retour est désormais le 1er argument de la méthode <em>sendMessageWithSaga</em> et non le dernier. De plus cela facilite le traitement par rapport au point cité ci-dessus.</p>
<p></p><pre class="crayon-plain-tag">// Legacy
constellation.server.sendMessageWithSaga({ Scope: 'Package', Args: ['DemoPackage'] }, 'MethodeAvecReponse', ['input', 2, 4, false],
    function (response) { console.log("Message de reponse = ", response); });

// Avec la lib 1.8.2
constellation.server.sendMessageWithSaga(function (response) {
    console.log("Message de reponse = ", response);
}, { Scope: 'Package', Args: ['DemoPackage'] }, 'MethodeAvecReponse', 'input', 2, 4, false);</pre><p></p>
<p>Dans le mode « legacy » le callback de retour était le dernier argument de la méthode <em>sendMessageWithSaga.</em> De plus comme expliqué ci-dessous tous les arguments à passer au MessageCallback devaient être encapsulés dans un tableau (3ème argument de la méthode <em>sendMessageWithSaga).</em></p>
<p>Désormais depuis la version 1.8.2, le callback de retour est passé en première et vous pouvez passer vos paramètres les uns dernière les autres comme vu précédemment.</p>
<p>Une nouvelles fois, vous pouvez toujours utiliser la forme « legacy », il n&rsquo;y a pas de « breaking change » lorsque vous allez mettre à jour la libraire Javascript et cette nouveauté est également portée sur la libraire AngularJS.</p>
<h3>Support du hub « Package »</h3>
<p>Désormais la libraire Javascript 1.8.2 intègre le proxy permettant de communiquer avec le hub « Package » car jusqu&rsquo;à présent elle ne permettait qu&rsquo;une communication avec le hub « Consumer » et « Controller » (relire <a href="/getting-started/connectez-vos-pages-web-constellation/">cette introduction</a> pour plus d&rsquo;explications sur la lib JS).</p>
<p>Autrement dit il est désormais possible d&rsquo;écrire des packages (virtuel) en Javascript en profitant de toutes les fonctionnalités propres aux packages (possibilité d&rsquo;écrire des logs, de définir et récupérer des settings déclarés sur le serveur, de publier des StateObject, etc&#8230;).</p>
<p>Bien entendu cela n&rsquo;a pas grand intérêt dans une page Web qu&rsquo;on considère plutôt comme un Consommateur car elle a un cycle de vie éphémère (relire les <a href="/concepts/architecture-constellation-et-les-differents-acteurs/">concepts ici</a>). Mais par contre cette libraire ouvre la voie pour pouvoir écrire des packages Javascript basés sur un technologie comme NodeJS qui permet de réaliser de « véritable application » en Javascript.</p>
<p>Le <a href="/constellation-platform/changelog/#05072017_Update_API_Javascript_AngularJS_182">changelog complet est disponible ici</a>.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/nouvelles-api-javascript-angularjs-1-8-2/">Nouvelles API Javascript et AngularJS 1.8.2</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/blog/nouvelles-api-javascript-angularjs-1-8-2/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[StateObject]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Capteur]]></category>
		<category><![CDATA[DHT11]]></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>Créer un relais connecté</title>
		<link>https://developer.myconstellation.io/tutorials/creer-un-relais-connecte/</link>
					<comments>https://developer.myconstellation.io/tutorials/creer-un-relais-connecte/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 10 May 2017 15:46:17 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Relais]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=4604</guid>

					<description><![CDATA[<p>Dans ce tutoriel nous allons créer un relais connecté qu’on pourra contrôler depuis une page Web, une montre ou même un script Powershell pour piloter une lumière, une porte de garage, une chaudière ou n’importe quelle charge électrique (10 ampères</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-un-relais-connecte/">Créer un relais connecté</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Dans ce tutoriel nous allons créer un relais connecté qu’on pourra contrôler depuis une page Web, une montre ou même un script Powershell pour piloter une lumière, une porte de garage, une chaudière ou n’importe quelle charge électrique (10 ampères max) ou contact sec.</p>
<h3>Prérequis</h3>
<ul>
<li>Un Arduino connecté ou un ESP8266</li>
<li>Un shield relais (ou un relais seul avec une diode, une résistance et un transistor NPN)</li>
<li>Un serveur Constellation</li>
</ul>
<h3>Etape 1 : le montage</h3>
<p>Ici on utilisera un D1 Mini Pro (ESP8266) avec un « Shield » relais tout fait qu&rsquo;il n&rsquo;y a plus qu&rsquo;à déposer sur le « D1 Mini ». Si vous n&rsquo;avez de shield, vous pouvez utiliser un relais seul que vous piloterez avec un transistor NPN via une sortie de l&rsquo;ESP8266.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-58.png"><img class="colorbox-4604"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Relais connecté" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-58.png" alt="Relais connecté" width="454" height="257" border="0" /></a></p>
<p>Vous retrouverez sur ce shield un bornier à 3 pôles :</p>
<ul>
<li>Le pôle de gauche est « NO » (normalement ouvert)</li>
<li>Le pole du milieu est le commun</li>
<li>Le pôle de droite est « NC » (normalement fermé)</li>
</ul>
<p>Autrement dit, au repos il y a contact entre le 2<sup>ème</sup> et 3<sup>ème</sup> pole (normalement fermé). Lorsque que vous activez le relais, vous permutez le contact entre la 1<sup>ère</sup> et le 2<sup>ème</sup> pole.</p>
<p>Si vous voulez piloter une lampe, connectez un des fils entre la source d’énergie et votre lampe sur le pole « commun » et le pole « NO ». Ainsi au repos, votre lampe ne sera pas allumée mais si vous activez votre relais elle le sera.</p>
<p>Attention tout de même si vous manipulez des sources AC 220V et n’oubliez pas que votre relais ne supporte que des charges inférieures à 10A (soit environ 2200W).</p>
<h3>Etape 3 : 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 “MyRelay”.</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", "MyRelay", "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>Notre relais se pilote par la sortie D1. Commencez donc par configurer cette sortie en ajoutant la ligne suivante dans la méthode «<em> setup()</em> » :</p>
<p></p><pre class="crayon-plain-tag">pinMode(D1, OUTPUT);</pre><p></p>
<p>Ensuite, toujours dans la méthode de démarrage « <em>setup()</em> » et une fois connecté au Wifi, déclarez le MessageCallback suivant :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("SwitchState",
  MessageCallbackDescriptor().setDescription("Set the state of the relay").addParameter&lt;bool&gt;("state", "The state of the relay"),
  [](JsonObject&amp; json) {
      bool state = json["Data"].as&lt;bool&gt;();
      // Changer l'état du relais
      digitalWrite(D1, state ? HIGH : LOW);
      // Mise à jour du StateObject de l'état du relais
      constellation.pushStateObject("State", state);
 });</pre><p></p>
<p>Nous exposons ici un MessageCallback nommé « <em>SwitchState</em> »  qui prend en paramètre un booléen pour définir l’état du relais (ON ou OFF).</p>
<p>Le code du MC pilotera alors la sortie D1 sur lequel est connecté notre relais et publiera un StateObject « <em>State</em> » avec l’état actuel du relais.</p>
<p>Pour finir, toujours au démarrage, ajoutez cette ligne après la déclaration de votre MC :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("State", false);</pre><p></p>
<p>Ainsi au démarrage de l’ESP8266, le relais est forcément sur Off, donc nous actualisation le StateObject « State » sur Constellation avec la valeur « false ».</p>
<p><b>Et voilà, votre relais connecté est opérationnel !</b></p>
<p>Vous pouvez connecter sur les pôles NO et commun une charge électrique comme une lampe ou une simple LED, en courant continue ou alternatif (220V par exemple) sans dépasser 10 ampères.</p>
<p>Si vous ne connectez rien sur votre relais, vous pouvez tout de même tester son bon fonctionnement :</p>
<ul>
<li>Le relais « claque » lorsqu’il change d’état</li>
<li>Une petite LED rouge à côté de l’inscription « NC » s’allumera quand le relais est sur « ON »</li>
</ul>
<p>Lancez le <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallback Explorer</a> de la Console Constellation pour tester votre MessageCallback :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-59.png"><img class="colorbox-4604"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="MessageCallbacks Explorer" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-59.png" alt="MessageCallbacks Explorer" width="454" height="141" border="0" /></a></p>
<h3>Etape 3 : créer une page Web de pilotage du relais</h3>
<p>Créons maintenant une page Web pour piloter notre relais. 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>Ajoutez ensuite 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 ici", "MyRelay Controller");
      constellation.onConnectionStateChanged(function (change) {
          if (change.newState === $.signalR.connectionState.connected) {
              console.log("Je suis connecté !");

              constellation.registerStateObjectLink("*", "MyRelay", "*", "*", function (so) {
                  $scope.$apply(function () {
                      $scope.RelayState = so.Value;
                  });
              });

          }
      });
      constellation.connect();
      $scope.constellation = constellation;
  }]);</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 « <em>constellation.initializeClient</em> ».</p>
<p>Enfin, ajoutez sur votre page la valeur du StateObject « State » et un bouton pour envoyer un message au package « MyRelay » afin d’invoquer le MC « SwitchState ».</p>
<p>Par exemple avec quelques classes CSS issues de Bootstrap :</p>
<p></p><pre class="crayon-plain-tag">&lt;div class="panel" ng-class="RelayState ? 'panel-danger' : 'panel-default'"&gt;
    &lt;div class="panel-heading"&gt;
        &lt;h3 class="panel-title"&gt;My Relay&lt;/h3&gt;
    &lt;/div&gt;
    &lt;div class="panel-body"&gt;
        &lt;p&gt;Current state : {{ RelayState ? "ON" : "OFF" }}&lt;/p&gt;
        &lt;a href="#" class="btn btn-primary" ng-click="constellation.sendMessage({ Scope: 'Package', Args: ['MyRelay'] }, 'SwitchState', !RelayState)"&gt;Switch {{ RelayState ? "OFF" : "ON" }}&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre><p></p>
<p><b>Vous obtenez en quelques minutes une page Web permettant de piloter en temps réel votre relais avec un retour sur son état courant.</b></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-66.png"><img class="colorbox-4604"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Page Web de contrôle" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-66.png" alt="Page Web de contrôle" width="382" height="246" border="0" /></a></p>
<p>Vous pouvez d’ailleurs ouvrir la page sur plusieurs navigateurs ou sur plusieurs machines et constater que toutes les pages se mettent à jour en temps réel dès que l’état du relais change.</p>
<h3>Etape 4 (optionnelle) : Piloter le relais avec un script Powershell</h3>
<p>Pour invoquer votre MessageCallback depuis un script Powershell nous allons utilisez l’interface http.</p>
<p>Vous pouvez d’ailleurs afficher le code snippet pour obtenir l’URL depuis le <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallback Explorer</a>.</p>
<p>Dans notre cas l’URL sera : <a href="http://localhost:8088/rest/consumer/SendMessage?SentinelName=Consumer&amp;PackageName=DemoPowershel&amp;AccessKey=xxxx&amp;scope=Package&amp;args=MyRelay&amp;key=SwitchState&amp;data=true">http://localhost:8088/rest/consumer/SendMessage?SentinelName=Consumer&amp;PackageName=DemoPowershel&amp;AccessKey=xxxx&amp;scope=Package&amp;args=MyRelay&amp;key=SwitchState&amp;data=true</a></p>
<p>Comme vous le constatez nous utilisons l’interface « /consumer ». L&rsquo;argument « sentinelName » doit donc être « Consumer » et le nom du package est en fait un « friendly name » que nous appellerons ici « DemoPowershell ». Vous devez remplacer le « xxxx » par une clé d’accès valide, par exemple la même que celle utilisée par les ESP.</p>
<p>Notre Powershell est donc un « consommateur » et non un « package virtuel ». Il n’y a donc pas besoin de le déclarer dans la configuration de notre Constellation. Un consommateur peut envoyer ou recevoir des messages et consommer des StateObjects mais il ne peut pas écrire de log ni même publier des StateObjects.</p>
<p>Si vous souhaitez utiliser ce script sur une autre machine sur le serveur Constellation, remplacez dans l’URL « localhost » par l’adresse IP ou DNS de votre serveur Constellation.</p>
<p>Pour invoquer une URL en Powershell vous pouvez utiliser la command-let « Invoke-WebRequest ».</p>
<p>Créons alors un script Powershell que nous nommerons « SwitchRelay.ps1 » avec le code suivant :</p>
<p></p><pre class="crayon-plain-tag">param (
    [Parameter(Mandatory=$true)][bool]$state
 )
$res = Invoke-WebRequest ("http://localhost:8088//rest/consumer/SendMessage?SentinelName=Consumer&amp;PackageName=DemoPowershell&amp;AccessKey=5863d9e4cbdf522eaa62e0747fceb1c5b249ba13&amp;scope=Package&amp;args=MyRelay&amp;key=SwitchState&amp;data=" + $state.ToString().ToLower())
Write-Host "SwitchState to" $state</pre><p></p>
<p><b>Et voilà votre commande Powershell est capable d’invoquer un MessageCallback dans votre Constellation et donc de piloter le relais de votre ESP8266 !</b></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-60.png"><img class="colorbox-4604"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Script Powershell" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-60.png" alt="Script Powershell" width="454" height="92" border="0" /></a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-un-relais-connecte/">Créer un relais 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-relais-connecte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nouvelles versions des librairies JavaScript et mise en place d&#8217;un CDN</title>
		<link>https://developer.myconstellation.io/blog/nouvelles-versions-des-librairies-javascript-et-mise-en-place-dun-cdn/</link>
					<comments>https://developer.myconstellation.io/blog/nouvelles-versions-des-librairies-javascript-et-mise-en-place-dun-cdn/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 20 Sep 2016 13:33:42 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[CDN]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[API]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2654</guid>

					<description><![CDATA[<p>Afin de faciliter l’utilisation des libraires JS pour Constellation nous avons mis en place un CDN avec les différentes versions depuis la version 1.8.x. https://cdn.myconstellation.io/js/ Veuillez noter que le CDN est accessible en HTTP ou HTTPS et expose toutes les</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/nouvelles-versions-des-librairies-javascript-et-mise-en-place-dun-cdn/">Nouvelles versions des librairies JavaScript et mise en place d&rsquo;un CDN</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Afin de faciliter l’utilisation des libraires JS pour Constellation nous avons mis en place un CDN avec les différentes versions depuis la version 1.8.x.</p>
<p align="center"><a title="https://cdn.myconstellation.io/js/" href="https://cdn.myconstellation.io/js/"><strong>https://cdn.myconstellation.io/js/</strong></a></p>
<p>Veuillez noter que le CDN est accessible en HTTP ou HTTPS et expose toutes les versions des librairies JavaScript et AngularJS pour Constellation au format classique ou minifié.</p>
<p align="center"><a href="https://cdn.myconstellation.io/js/"><img class="colorbox-2654"  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-20.png" alt="image" width="350" height="228" border="0" /></a></p>
<p>Ainsi dans vos pages HTML, vous pouvez facilement, sans aucun autre prérequis qu’une connectivité internet, ajouter les librairies Constellation et leurs dépendances :</p>
<p></p><pre class="crayon-plain-tag">&lt;script type="text/javascript" src="//code.jquery.com/jquery-2.2.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.1.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="//cdn.myconstellation.io/js/Constellation-1.8.1.min.js"&gt;&lt;/script&gt;</pre><p></p>
<p>Pour AngularJS :</p>
<p></p><pre class="crayon-plain-tag">&lt;script type="text/javascript" src="//code.jquery.com/jquery-2.2.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.1.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="//cdn.myconstellation.io/js/Constellation-1.8.1.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="//cdn.myconstellation.io/js/ngConstellation-1.8.1.min.js"&gt;&lt;/script&gt;</pre><p></p>
<p>Au passage vous remarquerez la mise à jour des libraires JS en version 1.8.1.</p>
<p>Changelog :</p>
<ul>
<li>Revu de la gestion des sagas (sendMessageWithSaga)</li>
<li>Ajout de la méthode registerMessageCallback</li>
<li>Ajout de la méthode registerStateObjectLink</li>
</ul>
<p>Les packages NuGet correspondants ont également été mis à jour sur le repository Constellation accessible depuis votre Visual Studio.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/nouvelles-versions-des-librairies-javascript-et-mise-en-place-dun-cdn/">Nouvelles versions des librairies JavaScript et mise en place d&rsquo;un CDN</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/blog/nouvelles-versions-des-librairies-javascript-et-mise-en-place-dun-cdn/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Connectez vos pages Web à Constellation</title>
		<link>https://developer.myconstellation.io/getting-started/connectez-vos-pages-web-constellation/</link>
					<comments>https://developer.myconstellation.io/getting-started/connectez-vos-pages-web-constellation/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 14:22:29 +0000</pubDate>
				<category><![CDATA[Guide de démarrage]]></category>
		<category><![CDATA[Javascript API]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[Controller]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2114</guid>

					<description><![CDATA[<p>Introduction Il existe actuellement deux librairies Constellation JavaScript : Constellation for Javascript Constellation for AngularJS La première est basée sur jQuery, la deuxième est une surcouche de la 1ère encapsulée dans un module AngularJS. Vous retrouverez ces deux librairies depuis</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/connectez-vos-pages-web-constellation/">Connectez vos pages Web à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Introduction</h3>
<p>Il existe actuellement deux librairies Constellation JavaScript :</p>
<ol>
<li>Constellation for Javascript</li>
<li>Constellation for AngularJS</li>
</ol>
<p>La première est basée sur jQuery, la deuxième est une surcouche de la 1ère encapsulée dans un module AngularJS.</p>
<p>Vous retrouverez ces deux librairies depuis le gestionnaire de package Nuget intégré à Visual Studio :</p>
<p align="center"><img class="colorbox-2114"  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/07/image.png" alt="image" width="300" height="118" border="0" /></p>
<p>Chacune de ces deux librairies propose deux types de client :</p>
<ol>
<li>Consumer</li>
<li>Controller</li>
</ol>
<p>Le client “Consumer” permet de se connecter à Constellation en tant que “consommateur” pour pouvoir interroger des StateObjects et envoyer/recevoir des messages.</p>
<p>Le client “Controller” permet lui de se connecter à Constellation en tant que « contrôleur » pour récupérer par exemple en temps réel les logs produits par vos packages, arrêter/démarrer les packages, surveiller la consommation de ressources de chacun d&rsquo;entre eux, etc.</p>
<p>Dans ce guide nous allons utiliser le client « Consumer » afficher en temps réel le StateObject produit par le package <a href="/package-library/hwmonitor/">HWMonitor </a>représentant la consommation de votre CPU dans une page Web.</p>
<p>Pour cela vous devez avoir déployé le package “HWMonitor” sur au moins une de vos sentinelles (Windows).</p>
<h3>Etape 1 : ajouter la librairie Constellation</h3>
<h4>En utilisant le CDN</h4>
<p>Les librairies JavaScripts sont accessibles sur : <a href="http://cdn.myconstellation.io/js/">http://cdn.myconstellation.io/js/</a> (en HTTP ou HTTPS).</p>
<p>De ce fait, vous pouvez créer une simple pages HTML et ajoutez dans l’entête les balises suivantes :</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.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.min.js"&gt;&lt;/script&gt;</pre><p></p>
<p>Si vous souhaitez connecter votre page à Constellation en utilisant le framework AngularJS :</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.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.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.2.min.js"&gt;&lt;/script&gt;</pre><p></p>
<h4>Par Nuget en utilisant Visual Studio</h4>
<p>Créez une application Web vide dans Visual Studio et ouvrez le gestionnaire de package NuGet.</p>
<p>En sélectionnant la source “Constellation”, installez le package Nuget “Constellation.Javascript” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-12.png"><img class="colorbox-2114"  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-12.png" alt="image" width="354" height="122" border="0" /></a></p>
<p align="left">Une fois installée vous obtiendrez dans le dossier “Scripts” de votre projet Web les librairies jQuery, SignalR et Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-13.png"><img class="colorbox-2114"  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/08/image_thumb-13.png" alt="image" width="244" height="224" border="0" /></a></p>
<p align="left">Créez ensuite une page Web (HTML ou ASPX) et dans l’entête de votre code HTML référencez les scripts (à adapter en fonction des n° de version des librairies contenues dans les packages Nuget) :</p>
<p></p><pre class="crayon-plain-tag">&lt;script type="text/javascript" src="Scripts/jquery-2.2.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="Scripts/jquery.signalR-2.2.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="Scripts/Constellation-1.8.2.js"&gt;&lt;/script&gt;</pre><p></p>
<h3>Etape 2 : Initialiser le client</h3>
<p>Tout d’abord il faut déterminer la clé d’accès qui sera utilisée par votre page. Ici, depuis la Console Constellation, nous créons un credential “DemoWeb” avec la clé d&rsquo;accès “123456789” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-14.png"><img class="colorbox-2114"  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-14.png" alt="image" width="354" height="141" border="0" /></a></p>
<p align="left">Dans notre page HTML, créons un client “Consumer” en spécifiant l’URI de notre Constellation, la clé d’accès utilisée pour se connecter et le “friendly name” de votre client :</p>
<p></p><pre class="crayon-plain-tag">var constellation = $.signalR.createConstellationConsumer("http://localhost:8088", "123456789", "Test API JS");</pre><p></p>
<h3>Etape 3 : Etablir la connexion à Constellation</h3>
<p>Ajoutons un handler sur le changement d’état de la connection pour afficher le message “Je suis connecté” dans la console de votre navigateur :</p>
<p></p><pre class="crayon-plain-tag">constellation.connection.stateChanged(function (change) {
    if (change.newState === $.signalR.connectionState.connected) {
        console.log("Je suis connecté");
    }
});</pre><p></p>
<p>Pour finir lançons la connexion en invoquant la méthode Start :</p>
<p></p><pre class="crayon-plain-tag">constellation.connection.start();</pre><p></p>
<p>Testons la page dans Chrome par exemple :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-15.png"><img class="colorbox-2114"  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-15.png" alt="image" width="354" height="77" border="0" /></a></p>
<h3>Etape 4 : Afficher le contenu d’un StateObject en temps réel</h3>
<p>Dans notre cas nous voulons afficher en temps réel la consommation CPU de notre sentinelle.</p>
<p>Ce StateObject se nomme “/intelcpu/0/load/0” et est produit par le package “HWMonitor” que vous aurez pris le soin de déployer sur une de vos sentinelles (ici ma sentinelle se nomme “PO-SWARIN”) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-16.png"><img class="colorbox-2114"  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/08/image_thumb-16.png" alt="image" width="244" height="176" border="0" /></a></p>
<p align="left">On peut donc enregistrer un “StateObjectLink” avec la méthode “registerStateObjectLink” en demandant un filtre sur la sentinelle nommée “MON-PC”, le package “HWMonitor” et le nom “/intelcpu/load/0” (le dernier argument de cette méthode correspond au type du StateObject, ici ”*” indique qu’il n’y a pas de filtre sur le type) et en indiquant la fonction à invoquer à chaque mise à jour du et des StateObjects liés, ici mettre à jour un &lt;span&gt; de la page.</p>
<p>Vous devez impérativement faire cet enregistrement lorsque vous êtes connecté, c’est à dire lorsque le handler “stateChanged” est invoqué avec l’état “Connected”.</p>
<p>Le code final sera donc :</p>
<p></p><pre class="crayon-plain-tag">constellation.connection.stateChanged(function (change) {
    if (change.newState === $.signalR.connectionState.connected) {
        console.log("Je suis connecté");
        constellation.client.registerStateObjectLink("MON-PC", "HWMonitor", "/intelcpu/0/load/0", "*", function (so) {
            console.log(so);
            $("#cpu").text(so.Value.Value);
        });
    }
});</pre><p></p>
<p>Dès que le StateObject est réceptionné par notre page nous affectons la propriété “Value” de la valeur du StateObject comme contenu du span “cpu” de la page. De ce fait, ajoutons un “span” nommé “cpu” dans le corps de notre page :</p>
<p></p><pre class="crayon-plain-tag">&lt;body&gt;
    &lt;span id="cpu"&gt;&lt;/span&gt; %
&lt;/body&gt;</pre><p></p>
<p>Ainsi vous aurez en temps réel votre CPU dans une page HTML grâce à l’exploitation du StateObject ici produit par le package HWMonitor :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-17.png"><img class="colorbox-2114"  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-17.png" alt="image" width="354" height="71" border="0" /></a></p>
<p align="left">Vous remarquerez que dans le handler ci-dessus nous loguons également l’objet “stateobject” réceptionné par notre page.</p>
<p align="left">Cet objet contient les différentes propriétés du StateObject : la sentinelle et le package qui ont produit ce StateObject, le nom du StateObject, son type, sa durée de vue (ici “lifetime=0” donc n’expire jamais), la date de mise à jour du StateObject, ses métadonnées et surtout sa valeur (propriété “Value”).</p>
<p align="left">Ici la valeur de ce StateObject produit par le package “HWMonitor” est un objet complexe (entouré en vert) qui contient différentes propriétés :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-18.png"><img class="colorbox-2114"  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-18.png" alt="image" width="354" height="248" border="0" /></a></p>
<p align="left">Pour la suite je vous recommande vivement l’utilisation du framework AngularJS permettant de développer des pages plus facilement.</p>
<h3>Next step</h3>
<ul>
<li><a href="/client-api/javascript-api/consommer-constellation-api-javascript/">Consommer Constellation avec l’API Javascript</a></li>
<li><a href="/client-api/javascript-api/consommer-constellation-angular-js/">Consommer Constellation avec Angular JS</a></li>
<li><a href="/client-api/javascript-api/controler-constellation-api-javascript/">Contrôler votre Constellation en Javascript</a></li>
<li><a href="/client-api/javascript-api/application-mobile-multi-plateforme-avec-cordova-et-javascript/">Créer une application mobile multi-plateforme avec Cordova et l’API Javascript</a></li>
<li><a href="/client-api/javascript-api/application-mobile-multi-plateforme-avec-ionic-et-angular-js/">Créer une application mobile multi-plateforme avec Ionic et Angular JS</a></li>
<li><a href="/client-api/javascript-api/creer-application-montre-samsung-gear-tizen-angularjs/">Créer une application pour une montre Samsung Gear avec Tizen et AngularJS</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/connectez-vos-pages-web-constellation/">Connectez vos pages Web à 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/connectez-vos-pages-web-constellation/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Consommer Constellation avec Angular JS</title>
		<link>https://developer.myconstellation.io/client-api/javascript-api/consommer-constellation-angular-js/</link>
					<comments>https://developer.myconstellation.io/client-api/javascript-api/consommer-constellation-angular-js/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 19 Aug 2016 08:27:12 +0000</pubDate>
				<category><![CDATA[Javascript API]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[Saga]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[SendMessage]]></category>
		<category><![CDATA[ReceiveMessage]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[Subscribe]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2331</guid>

					<description><![CDATA[<p>Préparer la page AngularJS Vous pouvez soit utiliser le gestionnaire de package Nuget depuis Visual Studio pour installer la dernière version du package “Constellation.Angular” et ses dépendances : Ou bien utiliser (ou copier en local) les scripts des CDN en</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/javascript-api/consommer-constellation-angular-js/">Consommer Constellation avec Angular JS</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Préparer la page AngularJS</h3>
<p>Vous pouvez soit utiliser le gestionnaire de package Nuget depuis Visual Studio pour installer la dernière version du package “Constellation.Angular” et ses dépendances :</p>
<p align="center"><img class="colorbox-2331"  src="https://developer.myconstellation.io/wp-content/uploads/2016/07/image.png" alt="image" /></p>
<p>Ou bien utiliser (ou copier en local) les scripts des CDN en ajoutant dans votre code HTML les balises suivantes :</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.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.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.2.min.js"&gt;&lt;/script&gt;</pre><p></p>
<p>Dans votre code Javascript, vous devez créer un module Angular pour votre page que nous appelleront “MyDemoApp” et dans lequel nous injecterons le module “ngConstellation” :</p>
<p></p><pre class="crayon-plain-tag">var myDemoApp = angular.module('MyDemoApp', ['ngConstellation']);</pre><p></p>
<p>Vous devez également ajouter l’attribut “ng-app” sur la balise &lt;html&gt; de votre page pour lier votre page HTML à votre module Angular :</p>
<p></p><pre class="crayon-plain-tag">&lt;html xmlns="http://www.w3.org/1999/xhtml" ng-app="MyDemoApp"&gt;</pre><p></p>
<p>Enfin vous devez créer un contrôleur AngularJS dans lequel nous injecterons la factory “constellationConsumer” que nous appellerons dans notre code “constellation” :</p>
<p></p><pre class="crayon-plain-tag">myDemoApp.controller('MyController', ['$scope',  'constellationConsumer', function ($scope, constellation) {

}]);</pre><p></p>
<p>Sans oublier de lier votre corps de page (&lt;body&gt;) à ce contrôleur :</p>
<p></p><pre class="crayon-plain-tag">&lt;body ng-controller="MyController"&gt;</pre><p></p>
<p>Et voilà votre squelette est prêt !</p>
<p>Pour plus d’information sur AngularJS, je vous recommande la lecture de ce guide : <a title="https://docs.angularjs.org/misc/started" href="https://docs.angularjs.org/misc/started">https://docs.angularjs.org/misc/started</a></p>
<p>Pour résumer notre squelette page est donc :</p>
<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" ng-app="MyDemoApp"&gt;
&lt;head&gt;
    &lt;title&gt;Test API AngularJS&lt;/title&gt;
    &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.2.min.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.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.2.min.js"&gt;&lt;/script&gt;
    
    &lt;script&gt;
        var myDemoApp = angular.module('MyDemoApp', ['ngConstellation']);
        myDemoApp.controller('MyController', ['$scope',  'constellationConsumer', function ($scope, constellation) {

        }]);
    &lt;/script&gt;

&lt;/head&gt;
&lt;body ng-controller="MyController"&gt;

&lt;/body&gt;
&lt;/html&gt;</pre><p></p>
<h3>Connecter une page HTML à Constellation avec AngularJS</h3>
<p>Dans notre contrôleur AngularJS, nous allons initialiser le client Consumer en spécifiant l’URL de votre serveur Constellation, la clé d’accès et le “Friendly name” de votre page :</p>
<p></p><pre class="crayon-plain-tag">constellation.initializeClient("http://localhost:8088", "123456789", "TestAPI");</pre><p></p>
<p>Vous pouvez <a href="/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">créer une clé d’accès depuis la Console Constellation</a> ou en <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">éditant le fichier de configuration du serveur</a>.</p>
<p>Enfin ajoutons un handler sur le changement d’état de la connexion pour afficher le message “Je suis connecté” dans la console de votre navigateur par exemple lorsque la connexion à Constellation est établie :</p>
<p></p><pre class="crayon-plain-tag">constellation.onConnectionStateChanged(function (change) {
    if (change.newState === $.signalR.connectionState.connected) {
        console.log("Je suis connecté !");
    }
});</pre><p></p>
<p>Il ne reste plus qu’à lancer la connexion en invoquant la méthode “connect” :</p>
<p></p><pre class="crayon-plain-tag">constellation.connect();</pre><p></p>
<p>Et voilà, votre page AngularJS est connectée à votre Constellation.</p>
<h3>Envoyer des messages et invoquer des MessageCallbacks</h3>
<h4>Envoyer des messages</h4>
<p>Pour envoyer des messages et donc invoquer des MessageCallbacks vous devez utiliser la méthode “<em>constellation.sendMessage</em>” en spécifiant :</p>
<ul>
<li>Le scope</li>
<li>La clé du message</li>
<li>Le contenu du message (= les paramètres du MessageCallback)</li>
</ul>
<p>Par exemple, avec le package Nest déployé dans votre Constellation, on retrouvera un MessageCallback  “SetTargetTemperature” pour piloter la température de consigne d’un thermostat Nest.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-21.png"><img class="colorbox-2331"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-20.png" alt="image" width="350" height="99" border="0" /></a></p>
<p align="left">N’hésitez pas à utiliser le <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallback Explorer</a> pour découvrir l’ensemble des MessageCallbacks exposés par les packages de votre Constellation.</p>
<p>Pour invoquer le MessageCallback  “SetTargetTemperature” depuis votre page Web en passant en paramètre l’ID du thermostat et la température de consigne :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage({ Scope: 'Package', Args: ['Nest'] }, 'SetTargetTemperature', 'my_thermostat_id', 19);</pre><p></p>
<p>En AngularJS, pour lier l’invocation de ce code à un bouton, vous devez simplement ajouter l’attribut “ng-click” sur votre bouton.</p>
<p>Par exemple, dans votre code HTML :</p>
<p></p><pre class="crayon-plain-tag">&lt;body ng-controller="MyController"&gt;
    &lt;button ng-click="SetNestTemperature()"&gt;Set Nest to 19°C&lt;/button&gt;
&lt;/body&gt;</pre><p></p>
<p>Et dans votre contrôleur :</p>
<p></p><pre class="crayon-plain-tag">$scope.SetNestTemperature = function () {
   constellation.sendMessage({ Scope: 'Package', Args: ['Nest'] }, 'SetTargetTemperature', 'my_thermostat_id', 19);
};</pre><p></p>
<p>Autre solution, exposer le client Consumer dans le scope AngularJS :</p>
<p></p><pre class="crayon-plain-tag">$scope.constellation = constellation;</pre><p></p>
<p>Et donc s&rsquo;en servir directement dans le template HTML :</p>
<p></p><pre class="crayon-plain-tag">&lt;body ng-controller="MyController"&gt;
    &lt;button ng-click="constellation.sendMessage({ Scope: 'Package', Args: ['Nest'] }, 'SetTargetTemperature', 'my_thermostat_id', 19)"&gt;Set Nest to 19°C&lt;/button&gt;
&lt;/body&gt;</pre><p></p>
<p>Allons un peu plus loin en ajoutant un champ permettant à l’utilisateur de définir la température de consigne.</p>
<p>Dans le template HTML :</p>
<p></p><pre class="crayon-plain-tag">Temperature : &lt;input type="number" ng-model="targetTemperature" /&gt;
&lt;button ng-click="SetNestTemperature()"&gt;Set target temperature&lt;/button&gt;</pre><p></p>
<p>Le champ “input” est de type “number” et est lié à la variable de scope (le modèle) que nous appellerons “targetTemperature”.</p>
<p>De ce  fait dans notre fonction “SetNestTemperature” nous pouvons récupérer la valeur définie par l’utilisateur :</p>
<p></p><pre class="crayon-plain-tag">$scope.SetNestTemperature = function () {
   constellation.sendMessage({ Scope: 'Package', Args: ['Nest'] }, 'SetTargetTemperature', 'my_thermostat_id', $scope.targetTemperature);
};</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-29.png"><img class="colorbox-2331"  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-28.png" alt="image" width="350" height="60" border="0" /></a></p>
<p>Comme pour l’<a href="/client-api/javascript-api/consommer-constellation-api-javascript/">API Javascript</a>, vous pouvez également passer plusieurs arguments à votre MC combinant type simple et type complexe. Si il y a plusieurs paramètres vous devez les stocker dans un tableau.</p>
<p>Par exemple le MC “ShowNotification” du package <a href="/package-library/xbmc/">Xbmc</a> permettant d’afficher une notification sur une interface Kodi/XBMC prend deux paramètres : le nom d l’hôte XBMC (un type string) et le détail de la notification à afficher (un type complexe) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-23.png"><img class="colorbox-2331"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-22.png" alt="image" width="350" height="143" border="0" /></a></p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage({ Scope: 'Package', Args: ['Xbmc'] }, 'ShowNotification', xbmcName, { "Title":"Hello", "Message":"Hello from JS" });</pre><p></p>
<p>Bien entendu vous pouvez invoquer des MessageCallbacks de n’importe quel package, réel (programme Linux/Windows) ou virtuel (Arduino/ESP, scripts, etc..) ou même sur d’autres consommateurs (pages Web par exemple).</p>
<p>Ainsi vos pages Web peuvent, en envoyant des messages, invoquer des méthodes sur n&rsquo;importe quel système connecté dans votre Constellation.</p>
<p>Par exemple dans l’article sur les ESP/Arduinos, notre ESP8266 exposait un MC “Reboot” pour redémarrer la puce. Si l’on souhaite redémarrer notre Arduino/ESP depuis une page Web, il suffirai d’envoyer un message sans paramètre au bon scope. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage({ Scope: 'Sentinel', Args: ['MyArduino'] }, 'Reboot');</pre><p></p>
<p>Ici le scope est “Sentinel” avec l’argument “MyArduino”, c’est à dire que le message “Reboot” sera envoyé à tous les packages de la sentinelle “MyArduino”.</p>
<p>Les <a href="/concepts/messaging-message-scope-messagecallback-saga/">scopes</a> peuvent être :</p>
<ul>
<li>Sentinel</li>
<li>Package</li>
<li>Group</li>
<li>Others</li>
<li>All</li>
</ul>
<p>La propriété “Args” de l’objet scope est un tableau contenant le nom des groupes, des sentinelles ou packages en fonction du type de scope sélectionné. Seuls les scopes “All” et “Others” n’ont pas besoin d’argument.</p>
<h4>Envoyer des messages avec réponse : les sagas</h4>
<p>Les <a href="https://developer.myconstellation.io/concepts/messaging-message-scope-messagecallback-saga/">Sagas</a> permettent de lier des messages et donc de créer des couples de “requêtes / réponses”.</p>
<p>Avec la libraire JavaScript, il est possible d’envoyer des messages dans une saga et d’enregistrer un callback pour traiter la réponse de ce message.</p>
<p>Par exemple, le package “NetworkTools” expose un MC “Ping” permettant de réaliser un ping réseau. Le résultat du ping est retourné dans un message de réponse (un Int64 représentant le temps du réponse du ping) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb2.png"><img class="colorbox-2331"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image_thumb2" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb2_thumb.png" alt="image_thumb2" width="244" height="110" border="0" /></a></p>
<p align="left">De ce fait pour réaliser un ping depuis une page Web, on pourrait proposer à l’utilisateur un champ pour saisir l’adresse à pinger et afficher le résultat dans un paragraphe.</p>
<p></p><pre class="crayon-plain-tag">&lt;body ng-controller="MyController"&gt;
   Host/IP : &lt;input ng-model="host" /&gt;
   &lt;button ng-click="Ping()"&gt;Ping&lt;/button&gt;
   &lt;p ng-show="pingResult"&gt;Result : {{pingResult}}ms&lt;/p&gt;
&lt;/body&gt;</pre><p></p>
<p>Vous remarquez que le paragraphe du n’est affiché (ng-show) que si la valeur de scope “pingResult” est définie, ce qui n’est pas le cas à l’ouverture de la page.</p>
<p>Déclarons enfin la méthode de scope “Ping” pour envoyer un message au package “NetworkTools” afin d’invoquer dans une saga sur le MC “Ping” avec en paramètre du message variable « $scope.host » qui est liée à la zone de texte (input) de votre vue HTML.</p>
<p>Comme il s’agit d’une saga, nous utilisons la méthode “sendMessageWithSaga” dans laquelle nous passons la fonction callback qui sera invoquée lors de la réponse. A la réception cette réponse, nous allons tous simplement stocker le résultat de la réponse (propriété Data) dans la variable de scope “pingResult”.</p>
<p>L’affectation de la réponse dans la variable de scope “pingResult” est réalisée dans un “$scope.$apply”, une fonction AngularJS qui permet d’indiquer au contrôleur AngularJS que des variables de scope ont été modifiées et donc qu’il faut rafraîchir la vue.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-30.png"><img class="colorbox-2331"  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-29.png" alt="image" width="350" height="88" border="0" /></a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-31.png"><img class="colorbox-2331"  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-30.png" alt="image" width="350" height="90" border="0" /></a></p>
<p></p><pre class="crayon-plain-tag">scope.Ping = function () {
  constellation.sendMessageWithSaga(function(response) {
      $scope.$apply(function() {
        $scope.pingResult = response.Data;
      });
    }, { Scope: 'Package', Args: ['NetworkTools'] }, 'Ping', $scope.host);
};</pre><p></p>
<p>Ainsi vos pages Web peuvent invoquer des méthodes et exploiter la réponse de tous les systèmes connectés sur Constellation exposant des MessageCallbacks.</p>
<h3>Recevoir des messages</h3>
<p>Une page Web connectée sur Constellation peut elle même recevoir des messages et donc exposer des MessageCallbacks que d’autres consommateurs (autres pages Web) ou packages (réels et virtuels) pourront invoquer.</p>
<p>Ceci dit un consommateur tel qu’une page Web n’a pas réellement d’existence. Autrement dit elle n’a pas d’identité et donc ne peut recevoir que des messages adressés à un groupe qu’elle devra joindre.</p>
<p>Pour joindre un groupe vous devez utiliser la méthode “subscribeMessages“ (et “unSubscribeMessages” pour en sortir). Vous pouvez joindre autant de groupe que vous souhaitez.</p>
<p>Par exemple, pour ajouter votre page au groupe “Demo” :</p>
<p></p><pre class="crayon-plain-tag">constellation.subscribeMessages("Demo");</pre><p></p>
<p>Vous pourrez ensuite recevoir les messages envoyés dans ce groupe en ajoutant un handler sur le “onReceiveMessage” :</p>
<p></p><pre class="crayon-plain-tag">constellation.onReceiveMessage(function (message) {
    console.log("Message recu !", message);
});</pre><p></p>
<p>Dans ce handler vous recevrez TOUS les messages (quelque soit la clé du message).</p>
<p>Vous avez aussi un moyen plus simple consistant à définir un handler pour une clé de message spécifiquement via la méthode “registerMessageCallback”.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("ChangeTitle", function (msg) {
    document.title = msg.Data;
});
constellation.registerMessageCallback("HelloWorld", function (msg) {
    alert("Hello World");
});</pre><p></p>
<p>Ici on enregistre deux MessageCallbacks.</p>
<p>Si votre page reçoit un MessageCallback “HelloWorld”, une alerte sera ouverte, si elle reçoit un MessageCallback “ChangeTitle”, le titre de votre page sera modifié avec l’argument passé dans le MC.</p>
<p>Bien entendu, comme vos pages HTML peuvent enregistrer autant de MessageCallbacks qu’elles souhaitent et que ces MessageCallbacks sont invocables depuis n’importe quel système connecté à Constellation, d’autres pages Web, des objets à base d’Arduino, ESP ou autre, des programmes Python, .NET, etc… vous pouvez imaginer tout type d’usage.</p>
<h3>Consommer des StateObjects</h3>
<p>Pour consommer des StateObjects produits par des packages (virtuels ou réels) de votre Constellation, vous avez deux méthodes : l’évènement “onUpdateStateObject” ou les StateObjectLinks.</p>
<p>La première méthode consiste à enregistre un ou plusieurs handlers sur l’évènement “onUpdateStateObject” :</p>
<p></p><pre class="crayon-plain-tag">constellation.onUpdateStateObject(function (stateobject) {
    console.log(stateobject);
});</pre><p></p>
<p>Les handlers seront déclenchés à chaque mise à jour ou interrogation des StateObjects de votre page quelque soit le StateObject.</p>
<p>Pour interroger un ou plusieurs StateObjects à un instant T vous disposez de la méthode “requestStateObjects”.</p>
<p>Pour vous abonner aux mises à jour d’un ou plusieurs StateObjects, vous disposez de la méthode “subscribeStateObjects” (et “unSubscribeStateObjects” pour vous désabonner).</p>
<p>Enfin la méthode “requestSubscribeStateObjects” réalise un “requestStateObjects” et un “subscribeStateObjects” c’est à dire que la méthode demande la valeur actuelle du ou des StateObjects et s’abonne auprès du serveur Constellation pour être notifiée des mises à jour.</p>
<p>Toutes ces méthodes prennent en paramètre : le nom de la sentinelle, le nom du package, le nom du StateObject et le type du StateObject. Vous pouvez utiliser le wildcard “*” pour ne pas appliquer de filtre (<a href="/concepts/stateobjects/">plus d’information ici</a>).</p>
<p>Par exemple, pour récupérer tous les StateObjects du package “Demo” quelque soit la sentinelle et pour s’abonner aux mises à jour de ces StateObjects :</p>
<p></p><pre class="crayon-plain-tag">constellation.requestSubscribeStateObjects("*", "Demo", "*", "*");</pre><p></p>
<p>L’autre méthode consiste à enregistrer un (ou plusieurs) StateObjectLink. Cela permet de lier une fonction à un abonnement.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerStateObjectLink("*", "HWMonitor", "/intelcpu/0/load/0", "*", function (so) {
    // Code A
});

constellation.registerStateObjectLink("*", "Demo", "*", "*", function (so) {
    // Code B
});</pre><p></p>
<p>Ci-dessus le code A sera invoqué dès qu’un SO nommé « /intelcpu/0/load/0” et produit par le package “HWMonitor” est modifié alors que le code B sera déclenché dès qu’un StateObject du package “Demo” est modifié.</p>
<p>Prenons un cas pratique, nous voulons afficher en temps réel la consommation de notre CPU. Comme expliqué ci-dessus, la consommation peut être connue avec le StateObject nommé « /intelcpu/0/load/0” et produit par le package “HWMonitor”.</p>
<p>Nous allons donc ajouter un StateObjectLink et affecter la variable de scope “cpu” à chaque mise à jour de ce SO. Comme pour la réception de message, nous devons utiliser la fonction Angular “$scope.$apply” pour informer le contrôleur Angular que nous avons changé une variable de scope :</p>
<p>Aussi vous devez enregistrer vos SOLink une fois connecté :</p>
<p></p><pre class="crayon-plain-tag">constellation.onConnectionStateChanged(function (change) {
  if (change.newState === $.signalR.connectionState.connected) {
    constellation.registerStateObjectLink("*", "HWMonitor", "/intelcpu/0/load/0", "*", function (so) {
      $scope.$apply(function() {
        $scope.cpu = so.Value.Value;
      });
    });
  }
});</pre><p></p>
<p>Et dans notre template :</p>
<p></p><pre class="crayon-plain-tag">&lt;body ng-controller="MyController"&gt;
    &lt;p&gt;CPU : {{cpu}}&lt;/p&gt;
&lt;/body&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-33.png"><img class="colorbox-2331"  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-32.png" alt="image" width="350" height="64" border="0" /></a></p>
<p>Plutôt que stocker dans notre variable de scope la propriété “Value” de la valeur de notre StateObject, nous pouvons aussi stocker le StateObject lui même :</p>
<p></p><pre class="crayon-plain-tag">$scope.cpu = so;</pre><p></p>
<p>De ce fait dans le template nous pouvons afficher différentes informations contenu dans notre StateObject  :</p>
<p></p><pre class="crayon-plain-tag">&lt;body ng-controller="MyController"&gt;
    &lt;p&gt;CPU on {{cpu.SentinelName }} at {{cpu.LastUpdate}} is &lt;strong&gt;{{cpu.Value.Value}} {{cpu.Value.Unit}}&lt;/strong&gt;&lt;/p&gt;
&lt;/body&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-32.png"><img class="colorbox-2331"  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-31.png" alt="image" width="350" height="50" border="0" /></a></p>
<p>Alors bien sûr le format de la date ou encore la précision de la valeur mesurée par le package HWMonitor ne sont très lisibles. Nous pouvons ajouter des <a href="https://docs.angularjs.org/api/ng/filter/filter">filtres AngularJS</a> directement dans notre template pour rendre notre page plus “user-friendly”.</p>
<p>Utilisons le filtre “date” pour formater la date et “number” pour limiter le nombre de chiffre après la virgule :</p>
<p></p><pre class="crayon-plain-tag">&lt;p&gt;CPU on {{cpu.SentinelName }} at {{cpu.LastUpdate | date : 'dd//MM/yyyy @ hh:mm:ss' }} is &lt;strong&gt;{{cpu.Value.Value | number:2}} {{cpu.Value.Unit}}&lt;/strong&gt;&lt;/p&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-34.png"><img class="colorbox-2331"  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-33.png" alt="image" width="350" height="69" border="0" /></a></p>
<p>C’est toute la magie d’AngularJS <img class="wlEmoticon wlEmoticon-winkingsmile colorbox-2331" style="border-style: none;" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/wlEmoticon-winkingsmile-1.png" alt="Clignement d'œil" /></p>
<p>Allons encore un peu plus loin !</p>
<p>Ici nous avons lié notre variable de scope “cpu” au StateObject nommé « /intelcpu/0/load/0” et produit par le package “HWMonitor”. Mais n’oubliez pas que <a href="/concepts/stateobjects/">l’unicité d’un StateObject</a> est obtenu avec le triplet : Sentinelle + Package + Nom.</p>
<p>Autrement dit il peut y avoir plusieurs SO qui correspondent à ce filtre dans le cas où vous avez déployé le package HWMonitor sur plusieurs sentinelles.</p>
<p>Dans ce cas, la valeur du SO est sans cesse écrasée et notre page devient illisible :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/cpus.gif"><img class="colorbox-2331"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="cpus" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/cpus_thumb-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2016/09/cpus_thumb.gif" alt="cpus" width="350" height="58" border="0" /></a></p>
<p>Nous allons gérer ce cas en créant une variable de scope qui contiendra les différents StateObjects de nos CPUs.</p>
<p>Dans votre scope, commençons par déclarer une variable de scope nommée “cpus” en l’initialisant avec un objet vide :</p>
<p></p><pre class="crayon-plain-tag">$scope.cpus = {}</pre><p></p>
<p>Modifions notre StateObjectLink pour stocker le StateObject dans notre objet “cpus” sous la propriété du nom de la sentinelle de notre StateObject.</p>
<p></p><pre class="crayon-plain-tag">constellation.registerStateObjectLink("*", "HWMonitor", "/intelcpu/0/load/0", "*", function (so) {
  $scope.$apply(function() {
    $scope.cpus[so.SentinelName.replace("-", "")] = so;
  });
});</pre><p></p>
<p>C’est à dire que notre variable de scope “cpus” est un objet avec des propriétés du nom de la sentinelle et qui contient le StateObject de son CPU associé.</p>
<p>Attention le nom de la sentinelle est utilisée comme nom de propriété de notre objet JavaScript et vous n’êtes pas sans savoir que les “-“ (entre autre) ne sont pas autorisés en JS ce qui explique que nous les effaçons avec le “replace”.</p>
<p>Ainsi si je veux afficher dans mon template le CPU de ma machine nommée ”PC-SEB_UI” (= propriété “PCSEB_UI”), je devrais écrire :</p>
<p></p><pre class="crayon-plain-tag">&lt;p&gt;CPU on {{cpus.PCSEB_UI.SentinelName }} at {{cpus.PCSEB_UI.LastUpdate | date : 'dd//MM/yyyy @ hh:mm:ss' }} is &lt;strong&gt;{{cpus.PCSEB_UI.Value.Value | number:2}} {{cpus.PCSEB_UI.Value.Unit}}&lt;/strong&gt;&lt;/p&gt;</pre><p></p>
<p>Il ni a plus d’effet indésirable de voir les StateObjects chevaucher constamment.</p>
<p>Mais on peut aller encore plus loin car notre variable “cpus” contient tous les SO de la consommation de CPU produits par l’ensemble des packages HWMonitor de notre Constellation.</p>
<p>Il suffit d’itérer sur cette variable pour afficher le SO de chaque propriété de notre objet. Avec AngularJS vous pouvez utiliser la directive “<a href="https://docs.angularjs.org/api/ng/directive/ngRepeat">ng-repeat</a>” :</p>
<p></p><pre class="crayon-plain-tag">&lt;p ng-repeat="cpu in cpus"&gt;CPU on {{cpu.SentinelName }} at {{cpu.LastUpdate | date : 'dd//MM/yyyy @ hh:mm:ss' }} is &lt;strong&gt;{{cpu.Value.Value | number:2}} {{cpu.Value.Unit}}&lt;/strong&gt;&lt;/p&gt;</pre><p></p>
<p style="text-align: left;" align="center">Nous obtenons une page capable d&rsquo;afficher en temps réel la consommation de toutes nos machines Windows dans une simple page HTML :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/cpus2.gif"><img class="colorbox-2331"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="cpus2" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/cpus2_thumb-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2016/09/cpus2_thumb.gif" alt="cpus2" width="350" height="256" border="0" /></a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/javascript-api/consommer-constellation-angular-js/">Consommer Constellation avec Angular JS</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/javascript-api/consommer-constellation-angular-js/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Contrôler votre Constellation en Javascript</title>
		<link>https://developer.myconstellation.io/client-api/javascript-api/controler-constellation-api-javascript/</link>
					<comments>https://developer.myconstellation.io/client-api/javascript-api/controler-constellation-api-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Thu, 18 Aug 2016 14:48:37 +0000</pubDate>
				<category><![CDATA[Javascript API]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[ControlHub]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PurgeStateObject]]></category>
		<category><![CDATA[PackageDescriptor]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Hub]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2329</guid>

					<description><![CDATA[<p>Le hub de contrôle expose des méthodes pour contrôler la Constellation comme arrêter/démarrer des packages, s’abonner et récupérer en temps réel les logs des packages de la Constellation, propager les changements de configuration dans la Constellation, suivre les états et</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/javascript-api/controler-constellation-api-javascript/">Contrôler votre Constellation en Javascript</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le <a href="/concepts/les-diffrents-types-de-hub-et-interfaces-rest-du-serveur-constellation/">hub de contrôle</a> expose des méthodes pour contrôler la Constellation comme arrêter/démarrer des packages, s’abonner et récupérer en temps réel les logs des packages de la Constellation, propager les changements de configuration dans la Constellation, suivre les états et la consommation de ressource des packages, etc…</p>
<p>Les deux librairies JavaScript Constellation intègrent un client permettant de se connecter sur ce hub afin de pouvoir piloter votre Constellation. La Console Constellation est d’ailleurs basée sur ce client.</p>
<p>Dans cet article découvrons les fonctionnalités de ce client avec l’API JavaScript et l’API AngularJS.</p>
<h3>Connecter une page HTML au hub de contrôle</h3>
<h4>Etape 1 : Ajouter les librairies</h4>
<h5>En utilisant le CDN</h5>
<p>Les librairies JavaScripts sont accessibles sur : <a href="http://cdn.myconstellation.io/js/">http://cdn.myconstellation.io/js/</a> (en HTTP ou HTTPS).</p>
<p>Pour utiliser la librairie JavaScript :</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.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.min.js"&gt;&lt;/script&gt;</pre><p></p>
<p>Ou si vous souhaitez l&rsquo;utiliser avec le framework AngularJS :</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.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.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.2.min.js"&gt;&lt;/script&gt;</pre><p></p>
<h5>Par Nuget en utilisant Visual Studio</h5>
<p>Dans Visual Studio et ouvrez le gestionnaire de package NuGet.</p>
<p>En sélectionnant la source “Constellation”, installez le package Nuget “Constellation.Javascript” pour l’API JavaScript ou “Constellation.AngularJS” pour l’API AngularJS :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-12.png"><img class="colorbox-2329"  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-12.png" alt="image" width="354" height="122" border="0" /></a></p>
<h4>Etape 2 : Connexion au hub de contrôle</h4>
<p>Avec l’API JavaScript (JS) vous devez créer le client avec la méthode “createConstellationController” en spécifiant l’URL de votre Constellation, une clé d’accès et un friendly name :</p>
<p></p><pre class="crayon-plain-tag">var controller = $.signalR.createConstellationController("http://localhost:8088", "123456789", "TestAPI");
controller.connection.stateChanged(function (change) {
  if (change.newState === $.signalR.connectionState.connected) {
    console.log("Connected to the ControlHub");
  }
});
controller.connection.start();</pre><p></p>
<p>Avec l’API AngularJS (NG), vous devez injecter le client “constellationController” dans votre contrôleur puis l’initialiser avec la méthode “initializeClient” en spécifiant l’URL de votre Constellation, une clé d’accès et un friendly name :</p>
<p></p><pre class="crayon-plain-tag">var demo = angular.module('demoApp', ['ngConstellation']);
demo.controller('MyController', ['$scope',  'constellationController', function ($scope, controller) {

  controller.initializeClient("http://localhost:8088", "123456789", "TestAPI");
    
  controller.onConnectionStateChanged(function (change) {
    if (change.newState === $.signalR.connectionState.connected) {
      console.log("Connected to the ControlHub");
    }
  });
    
  controller.connect();
}]);</pre><p></p>
<p>La clé d’accès (<a href="/concepts/securite-accesskey-credential-authorization/">AccessKey</a>) utilisée pour se connecter au hub de contrôle doit avoir l’attribut “enableControlHub” à “true”. Vous pouvez <a href="/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">gérer les credentials dans la Console Constellation</a> ou dans <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">le fichier de configuration</a>.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-35.png"><img class="colorbox-2329"  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-34.png" alt="image" width="350" height="287" border="0" /></a></p>
<h3>Superviser les sentinelles</h3>
<p>Vous disposez de deux méthodes :</p>
<ul>
<li>requestSentinelsList() : pour recevoir la liste des sentinelles de votre Constellation</li>
<li>requestSentinelUpdates() : pour recevoir toutes les mises à jour des sentinelles de votre Constellation (ajout ou suppression de sentinelles, connexion ou déconnexion des sentinelles, mise à jour des informations, etc…).</li>
</ul>
<p>Ces deux méthodes sont de type “void”. Les réponses sont réceptionnées par les handlers respectivement nommés ”onUpdateSentinelsList” et “onUpdateSentinel”.</p>
<ul>
<li>Avec l’API JS :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.client.onUpdateSentinelsList(function (list) {
  console.log(list);
});

controller.client.onUpdateSentinel(function (sentinel) {
  console.log(sentinel);
});

controller.connection.onConnectionStateChanged(function (change) {
  if (change.newState === $.signalR.connectionState.connected) {
    controller.server.requestSentinelsList();
    controller.server.requestSentinelUpdates();
  }
}</pre><p></p>
<ul>
<li>Avec l’API NG :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.onUpdateSentinelsList (function (list) {
  console.log(list);
});

controller.onUpdateSentinel  (function (se) {
  console.log(se);
});

controller.onConnectionStateChanged(function (change) {
  if (change.newState === $.signalR.connectionState.connected) {
    controller.requestSentinelsList();
    controller.requestSentinelUpdates ();
  }
});</pre><p></p>
<p>Par exemple utilisons l’API NG pour créer une page affichant l’ensemble des sentinelles avec leur statuts en temps dans une page :</p>
<p>Dans le code du contrôleur, ajoutons un handler sur la mise à jour sentinelle afin de stocker les objets “sentinelle” dans une variable  de scope :</p>
<p></p><pre class="crayon-plain-tag">$scope.sentinels = {};
controller.onUpdateSentinel  (function (sentinel) {
  $scope.$apply(function() {
    $scope.sentinels[sentinel.Description.SentinelName.replace("-", "")] = sentinel;
  });
});</pre><p></p>
<p>Nous sommes obligé de faire un “<em>replace(« -« , «  »)</em>” car nous utilisons le nom de la sentinelle comme nom pour la propriété de notre variable de scope, or en JavaScript une propriété ou variable ne peut pas comporter de “-“.</p>
<p>Lors de la connexion, abonnons-nous aux mises à jour des sentinelles afin de maintenir notre page à jour :</p>
<p></p><pre class="crayon-plain-tag">controller.onConnectionStateChanged(function (change) {
  if (change.newState === $.signalR.connectionState.connected) {
    console.log("Connected to the ControlHub");
    controller.requestSentinelUpdates ();
  }
});</pre><p></p>
<p>Enfin dans le template HTML affichons nos différentes sentinelles dans une simple liste à puce :</p>
<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
  &lt;li ng-repeat="s in sentinels"&gt;{{s.Description.SentinelName}} [{{s.IsConnected ? "CONNECTED" : "DISCONNECTED"}}] ({{s.Description.OSVersion}})&lt;/li&gt;
&lt;/ul&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-36.png"><img class="colorbox-2329"  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-35.png" alt="image" width="350" height="160" border="0" /></a></p>
<p>Veuillez noter que seule les sentinelles “<a href="/concepts/sentinels-packages-virtuels/">réelles</a>” qui se sont connectées au moins une fois peuvent être récupérer car cette technique. Pour les sentinelles qui ne se sont jamais connectées comme pour les <a href="/concepts/sentinels-packages-virtuels/">sentinelles virtuelles</a>, vous devez lire le fichier de configuration en utilisant l’API REST de Management (Management API).</p>
<p>Voici la structure de l’objet ”sentinelle” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-37.png"><img class="colorbox-2329"  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-36.png" alt="image" width="350" height="128" border="0" /></a></p>
<h3>Superviser les packages</h3>
<p>Une fois la liste de vos sentinelles connue, vous pouvez récupérer la liste des packages pour chaque sentinelle en invoquant la méthode “requestPackagesList “ et en ajoutant un handler sur le “onUpdatePackageList”.</p>
<ul>
<li>Avec l’API JS :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.client.onUpdatePackageList (function (list) {
  console.log(list);
});
controller.server.requestPackagesList("MySentinel");</pre><p></p>
<ul>
<li>Avec l’API NG :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.onUpdatePackageList (function (list) {
  console.log(list);
});
controller.requestPackagesList("MySentinel");</pre><p></p>
<p>Reprenons notre page ci-dessus et ajoutons la liste des packages pour chaque sentinelle de notre Constellation.</p>
<p>Dans le handler “onUpdateSentinel” défini dans la section précédente, demandons au hub de contrôle la liste des packages pour chaque sentinelle :</p>
<p></p><pre class="crayon-plain-tag">controller.onUpdateSentinel  (function (sentinel) {
  $scope.$apply(function() {
    $scope.sentinels[sentinel.Description.SentinelName.replace("-", "")] = sentinel;
  });
  controller.requestPackagesList(sentinel.Description.SentinelName);
});</pre><p></p>
<p>Et ajoutons dans notre scope le handler “onUpdatePackageList” de manière à ajouter la liste des packages dans une propriété “Packages” que nous ajouterons dans nos objets “sentinelles” :</p>
<p></p><pre class="crayon-plain-tag">controller.onUpdatePackageList (function (p) {
  $scope.$apply(function() {
    $scope.sentinels[p.SentinelName.replace("-", "")]["Packages"] = p.List;
  });
});</pre><p></p>
<p>Nous pouvons maintenant enrichir notre template pour afficher les packages de chacune de nos sentinelles :</p>
<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
  &lt;li ng-repeat="s in sentinels"&gt;{{s.Description.SentinelName}} [{{s.IsConnected ? "CONNECTED" : "DISCONNECTED"}}] ({{s.Description.OSVersion}})
    &lt;ul&gt;
      &lt;li ng-repeat="p in s.Packages"&gt;{{p.Package.Name}} version {{p.PackageVersion}} [{{p.State}}]&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-38.png"><img class="colorbox-2329"  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-37.png" alt="image" width="350" height="433" border="0" /></a></p>
<h3>Surveiller l’état et la consommation des packages</h3>
<p>La liste de package récupérée ci-dessus n’est pas maintenue à jour. Pour recevoir les mises à jour de vos packages afin d’être notifié de chaque changement d’état vous pouvez ajouter le handler “onReportPackageState”.</p>
<p>De plus vous pouvez aussi vous abonner aux informations de consommation des ressources de vos packages avec le handler “onReportPackageUsage”.</p>
<ul>
<li>Avec l’API JS :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.client.onReportPackageUsage  (function (usage) {
  console.log(usage);
});

controller.client.onReportPackageState  (function (usage) {
  console.log(usage);
});</pre><p></p>
<ul>
<li>Avec l’API NG :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.onReportPackageUsage  (function (usage) {
  console.log(usage);
});

controller.onReportPackageState  (function (usage) {
  console.log(usage);
});</pre><p></p>
<p>Par exemple ajoutons dans notre page la consommation de CPU et de RAM pour chaque package de notre Constellation :</p>
<p></p><pre class="crayon-plain-tag">controller.onReportPackageUsage(function (usage) {
  $scope.$apply(function() {
    var sentinelName = usage.SentinelName.replace("-", "");
    for(var idx in $scope.sentinels[sentinelName].Packages) {
      var p = $scope.sentinels[sentinelName].Packages[idx];
      if(p.Package.Name == usage.PackageName) {
        p["CPU"] = usage.CPU;
        p["RAM"] = usage.RAM;
      }
    }
  });
});</pre><p></p>
<p>Dans le code ci-dessus, on ajoute dans chaque objet “Package” la valeur de la consommation du CPU et de RAM.</p>
<p>Ainsi on peut enrichir le template HTML avec le code :</p>
<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
  &lt;li ng-repeat="s in sentinels"&gt;{{s.Description.SentinelName}} [{{s.IsConnected ? "CONNECTED" : "DISCONNECTED"}}] ({{s.Description.OSVersion}})
    &lt;ul&gt;
      &lt;li ng-repeat="p in s.Packages"&gt;{{p.Package.Name}} version {{p.PackageVersion}} [{{p.State}}]
        &lt;ul&gt;
          &lt;li&gt;CPU: {{p.CPU | number : 0 }}% - RAM: {{p.RAM / 1024 / 1024 | number: 0}}Mo&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-39.png"><img class="colorbox-2329"  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-38.png" alt="image" width="350" height="452" border="0" /></a></p>
<h3>Contrôler les packages</h3>
<p>Pour contrôler les instances de package vous disposez des méthodes suivantes :</p>
<ul>
<li><em>start(sentinelName, packageName)</em> : démarre un package</li>
<li><em>stop(sentinelName, packageName)</em> : arrête un package</li>
<li><em>restart(sentinelName, packageName)</em> : redémarre un package</li>
<li><em>reload(sentinelName, packageName)</em> : arrête un package, force la sentinelle à télécharger la dernière version du package sur le serveur et redémarre le package</li>
<li><em>updatePackageSettings(sentinelName, packageName)</em> : pousse les settings d’un package au package en cours de fonctionnement (à charge au package à prendre en compte ses nouveaux paramètres).</li>
</ul>
<p>Avec l’API JS :</p>
<p></p><pre class="crayon-plain-tag">controller.server.start(sentinelName, packageName);
controller.server.stop(sentinelName, packageName);
controller.server.restart(sentinelName, packageName);
controller.server.reload(sentinelName, packageName);
controller.server.updatePackageSettings(sentinelName, packageName);</pre><p></p>
<p>Avec l’API NG :</p>
<p></p><pre class="crayon-plain-tag">controller.start(sentinelName, packageName);
controller.stop(sentinelName, packageName);
controller.restart(sentinelName, packageName);
controller.reload(sentinelName, packageName);
controller.updatePackageSettings(sentinelName, packageName);</pre><p></p>
<p>Par exemple ajoutons dans notre page la possibilité de piloter les packages.</p>
<p>Pour ce faire exposons notre client “controller” dans le scope Angular de façon à pouvoir l’utiliser dans le template HTML :</p>
<p></p><pre class="crayon-plain-tag">$scope.controller = controller;</pre><p></p>
<p>Dans notre template ajoutons ensuite des boutons en spécifiant l&rsquo;action du clic grâce à l&rsquo;attribut “ng-click” :</p>
<p></p><pre class="crayon-plain-tag">&lt;button ng-click="controller.start(s.Description.SentinelName, p.Package.Name)"&gt;Start&lt;/button&gt;
&lt;button ng-click="controller.stop(s.Description.SentinelName, p.Package.Name)"&gt;Stop&lt;/button&gt;
&lt;button ng-click="controller.reload(s.Description.SentinelName, p.Package.Name)"&gt;Reload&lt;/button&gt;
&lt;button ng-click="controller.restart(s.Description.SentinelName, p.Package.Name)"&gt;Restart&lt;/button&gt;</pre><p></p>
<p>Pour aller plus loin on peut également afficher/cacher les boutons en fonction de l’état du package, par exemple ne pas afficher le bouton “Start” si le package est déjà démarré :</p>
<p></p><pre class="crayon-plain-tag">&lt;button ng-hide="p.State == 'Started'" ng-click="controller.start(s.Description.SentinelName, p.Package.Name)"&gt;Start&lt;/button&gt;
&lt;button ng-show="p.State == 'Started'" ng-click="controller.stop(s.Description.SentinelName, p.Package.Name)"&gt;Stop&lt;/button&gt;
&lt;button ng-click="controller.reload(s.Description.SentinelName, p.Package.Name)"&gt;Reload&lt;/button&gt;
&lt;button ng-show="p.State == 'Started'" ng-click="controller.restart(s.Description.SentinelName, p.Package.Name)"&gt;Restart&lt;/button&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-40.png"><img class="colorbox-2329"  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-39.png" alt="image" width="350" height="261" border="0" /></a></p>
<h3>S’abonner aux logs de Constellation</h3>
<p>Pour récupérer les logs produits par les packages (virtuels ou non) en temps réel dans votre page Web, vous devez ajouter un handler sur “onReceiveLogMessage”.</p>
<ul>
<li>Avec l’API JS :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.client.onReceiveLogMessage(function (log) {
  console.log(log);
});</pre><p></p>
<ul>
<li>Avec l’API NG :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.onReceiveLogMessage(function (log) {
  console.log(log);
});</pre><p></p>
<p>Par exemple ajoutons à notre page la capacité d’afficher les logs des packages de notre Constellation en temps réel.</p>
<p>Pour cela nous allons nous abonner aux logs et les stocker dans un tableau de notre scope Angular :</p>
<p></p><pre class="crayon-plain-tag">$scope.logs = [];
controller.onReceiveLogMessage(function (log) {
  $scope.$apply(function() {
    $scope.logs.push(log);
  });
});</pre><p></p>
<p>Nous pouvons donc maintenant afficher proprement nos logs dans notre template HTML :</p>
<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
  &lt;li ng-repeat="log in logs"&gt;{{log.Date | date: 'dd/MM/yyyy HH:mm:ss' }} on {{log.SentinelName}}/{{log.PackageName}} : [{{ log.Level.toUpperCase() }}] {{log.Message}}&lt;/li&gt;
&lt;/ul&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-41.png"><img class="colorbox-2329"  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-40.png" alt="image" width="350" height="194" border="0" /></a></p>
<h3>Récupérer les PackageDescriptors</h3>
<p>Le <a href="/concepts/messaging-message-scope-messagecallback-saga/#Auto-description_des_MessageCallbacks">PackageDescriptor</a> est un objet publié par les packages qui permet de décrire les MessagesCallbacks que les packages exposent ainsi que les types utilisés dans leurs MC et StateObjects.</p>
<p>Pour récupérer un PackageDescriptor vous devez invoquer la méthode ”requestPackageDescriptor” en spécifiant le nom du package et attacher un handler “onUpdatePackageDescriptor” pour récupérer le résultat.</p>
<ul>
<li>Avec l’API JS :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.client.onUpdatePackageDescriptor(function (descriptor) {
  console.log(descriptor);
});

controller.server.requestPackageDescriptor(packageName);</pre><p></p>
<ul>
<li>Avec l’API NG :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.onUpdatePackageDescriptor(function (descriptor) {
  console.log(descriptor);
});

controller.requestPackageDescriptor(packageName);</pre><p></p>
<p>Par exemple sur notre page ci-dessus, ajoutons un bouton permettant d’afficher dans une simple boite de dialogue la liste des MessageCallbacks d’un package :</p>
<p>Dans le template HTML :</p>
<p></p><pre class="crayon-plain-tag">&lt;button ng-click="controller.requestPackageDescriptor(p.Package.Name)"&gt;Show MessageCallbacks&lt;/button&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-42.png"><img class="colorbox-2329"  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-41.png" alt="image" width="350" height="144" border="0" /></a></p>
<p align="left">Et dans le code de notre contrôleur, de manière grossière :</p>
<p></p><pre class="crayon-plain-tag">controller.onUpdatePackageDescriptor(function (descriptor) {
  var result = "Package "+ descriptor.PackageName + " :";
  for(var idx in descriptor.Descriptor.MessageCallbacks) {
    result += "\n - " + descriptor.Descriptor.MessageCallbacks[idx].MessageKey;
  }
  alert(result);          
});</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-43.png"><img class="colorbox-2329"  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-42.png" alt="image" width="350" height="195" border="0" /></a></p>
<p align="left">Une <a href="/client-api/rest-api/interface-rest-constellation/#Declarer_le_Package_Descriptor">description plus détaillée des PackageDesciptors</a> se trouve <a href="/client-api/rest-api/interface-rest-constellation/#Declarer_le_Package_Descriptor">ici</a>.</p>
<h3>Effacer des StateObjects</h3>
<p>Vous pouvez effacer des StateObjects en invoquant la méthode “purgeStateObjects” :</p>
<ul>
<li>Avec l’API JS :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.server.purgeStateObjects(sentinelName, packageName, name, type);</pre><p></p>
<ul>
<li>Avec l’API NG :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.purgeStateObjects(sentinelName, packageName, name, type);</pre><p></p>
<p>Vous devez indiquer les filtres de sélection des StateObjects à supprimer avec la possibilité d’utiliser le wildcard ”*” seulement pour les paramètres “name” et “type”. Autrement dit vous êtes obliger de spécifier le “sentinelName” et “packageName”.</p>
<h3>Rafraichir et déployer la configuration</h3>
<p>Vous pouvez recharger la configuration Constellation avec la méthode “reloadServerConfiguration” :</p>
<ul>
<li>Avec l’API JS :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.server.reloadServerConfiguration(deployConfiguration);</pre><p></p>
<ul>
<li>Avec l’API NG :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.reloadServerConfiguration(deployConfiguration);</pre><p></p>
<p>Cette méthode attend un booléen (deployConfiguration) pour indiquer si oui ou non la configuration doit être déployée après son rechargement. Dans le cas d’un déploiement, la nouvelle configuration est envoyée à toutes les sentinelles et packages de votre Constellation.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/javascript-api/controler-constellation-api-javascript/">Contrôler votre Constellation en Javascript</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/javascript-api/controler-constellation-api-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 

Served from: developer.myconstellation.io @ 2026-01-23 02:02:07 by W3 Total Cache
-->