﻿<?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 ESP8266 - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/tag/esp8266/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/tag/esp8266/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Wed, 16 May 2018 14:25:36 +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 ESP8266 - Constellation</title>
	<link>https://developer.myconstellation.io/tag/esp8266/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Créer un boitier connecté « Mix box » permettant de contrôler votre ordinateur</title>
		<link>https://developer.myconstellation.io/tutorials/creer-un-boitier-connecte-mix-box-permettant-de-controler-votre-ordinateur/</link>
					<comments>https://developer.myconstellation.io/tutorials/creer-un-boitier-connecte-mix-box-permettant-de-controler-votre-ordinateur/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 16 May 2018 14:24:43 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Pression]]></category>
		<category><![CDATA[WindowsControl]]></category>
		<category><![CDATA[tutoriel]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5991</guid>

					<description><![CDATA[<p>Tutoriel proposé par Marc-Antoine DUVAL, Joël GUILLEM et Quentin LEVERT. Dans ce tutoriel, nous allons créer un boitier qui est relié à un ou plusieurs ordinateurs de la maison grâce à un ESP8266 connecté à constellation. Des LEDs permettent à</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-un-boitier-connecte-mix-box-permettant-de-controler-votre-ordinateur/">Créer un boitier connecté « Mix box » permettant de contrôler votre ordinateur</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>Tutoriel proposé par Marc-Antoine DUVAL, Joël GUILLEM et Quentin LEVERT.</em></p>

<p>Dans ce tutoriel, nous allons créer un boitier qui est relié à un ou plusieurs ordinateurs de la maison grâce à un ESP8266 connecté à constellation. Des LEDs permettent à l’utilisateur de suivre le résultat des commandes en temps réel. Le boitier permet de commander à distance le lecteur de vidéo VLC media player à travers différentes fonctionnalités. Il gère :</p>
<ul>
<li>Le volume</li>
<li>La marche avant / marche arrière au cours d’un visionnage</li>
<li>La mise en lecture / pause d’une vidéo</li>
<li>La fermeture de VLC</li>
</ul>
<h2>Prérequis</h2>
<ul>
<li>Un ESP8266, nous utilisons un D1-mini</li>
<li>6 boutons poussoirs tactiles blancs</li>
<li>2 LEDs RGB</li>
<li>Une plaque de plexiglas noire</li>
<li>Une imprimante laser</li>
<li>Un serveur constellation</li>
<li>Le package « Windows Control » déployé sur une ou plusieurs sentinelles</li>
</ul>
<h2>Etape 1 : Réaliser le montage des boutons et LEDs</h2>
<p>Dans un premier temps, nous allons réaliser le montage électronique des composants. Tout d’abord il est nécessaire de brancher l’ESP8266 à la breadboard et de l’alimenter en le connectant en mini-USB à une source d&rsquo;alimentation. Il faut ensuite brancher la masse de l’ESP à la colonne de masse de la breadboard.</p>
<p>Pour les besoins de l’explication du montage, tous les autres composants seront connectés à la breadboard, cependant il est tout à fait possible de les connecter une fois insérés dans le boitier (voir Etape 2). Le schéma global est présenté ci-après.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/Cablage.png"><img class="colorbox-5991"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Cablage" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/Cablage_thumb.png" alt="Cablage" width="354" height="357" border="0" /></a></p>
<p>&nbsp;</p>
<p>Ici nous avons choisi 2 LEDs RGB afin d’améliorer l’effet visuel pour obtenir une LED de couleur jaune. La première LED verte pourra être connectée directement au pin D8 de l’ESP. Quant à la seconde LED RGB, il suffit de connecter les pattes correspondant aux LEDs rouge et verte à la même ligne, puis de lier cette ligne au pin D7 de l’ESP.</p>
<p>Les boutons poussoirs sont à connecter avec les broches 1 et 3 d’un côté et les broches 2 et 4 de l’autre. Le branchement est classique, à savoir les pin D1 à D6 connectés directement sur la patte 1 de chaque bouton, puis retour à la masse sur la patte 3 des boutons. Lorsque l’on appuie sur le bouton, le pin correspondant passera donc en état bas (LOW) et est en état haut (HIGH) tant que l’on n’appuie pas.</p>
<p>Une fois le câblage terminé, nous allons passer à la réalisation du boitier qui contiendra à l’intérieur l’ESP et la breadboard.</p>
<h2>Etape 2 : Réaliser le boitier</h2>
<p>Dans un second temps, il nous faut un boitier que nous pourrons ouvrir pour mettre notre ESP. Le design de la face de devant doit aussi correspondre au nombre de boutons et LED que l’on souhaite mettre en place.</p>
<p>Afin de résoudre cette problématique, nous avons décidé d’imprimer le boitier grâce à une imprimante laser. Nous avons utilisé une plaque de plexiglas noir d’une épaisseur de 3mm.</p>
<p>Tout d’abord, nous avons créé le fond de la boite sans le couvercle. Nous avons utilisé le site : <a href="http://carrefour-numerique.cite-sciences.fr/fablab/wiki/doku.php?id=projets:generateur_de_boites">http://carrefour-numerique.cite-sciences.fr/fablab/wiki/doku.php?id=projets:generateur_de_boites</a> qui permet de générer automatique le fichier .svg qui sera reconnu et utilisé pour l’impression laser. Il suffit d’entrer les dimensions voulues.</p>
<p>Ensuite nous avons utilisé SolidWorks afin de créer notre face avant personnalisée. Nous avons choisi percer 2 trous pour les LEDs et 6 pour les boutons carrés. Après la réalisation de la pièce, plusieurs étapes sont alors nécessaires pour exporter le fichier SolidWorks en fichier .svg.</p>
<ul>
<li>Sélectionner la vue correspondant à la pièce à réaliser</li>
<li>Enregistrer le fichier SolidWorks au format .DXF.</li>
<li>Sélectionner la vue à exporter. Ici, on sélectionne la vue en cours.</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/face_avant.png"><img class="colorbox-5991"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Choix de la face à sauvegarder" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/face_avant_thumb.png" alt="Choix de la face à sauvegarder" width="354" height="194" border="0" /></a></p>
<ul>
<li>Installer Inkscape, ce logiciel permettra de créer le fichier pour l’imprimante laser.</li>
<li>Importer le fichier dans Inkscape. Il faut désactiver mise à l’échelle automatique.</li>
<li>Sauvegarder le fichier qui sera utilisé pour l’impression laser.</li>
</ul>
<p>Enfin, nous avons assemblé toutes les pièces du boitier :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/Boitier.jpg"><img class="colorbox-5991"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Boitier" src="https://developer.myconstellation.io/wp-content/uploads/2018/05/Boitier_thumb.jpg" alt="Boitier" width="254" height="316" border="0" /></a></p>
<h2>Etape 3 : Programmation</h2>
<p>Dans un premier temps, il faut vous assurer que votre ESP8266 soit connecté à votre constellation, si vous ne savez pas comment vous y prendre, je vous invite donc à suivre le tutoriel réalisé par Sébastien Warin : <a href="https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/</a> .</p>
<p>Pour commencer, il faut déclarer le matériel dans la méthode setup de notre ESP8266, conformément à <b>l&rsquo;étape 1, </b>nous avons choisi les pin 1 à 6 en mode PULLUP pour les boutons et les pins 7 &amp; 8 pour les LEDs :</p>
<p></p><pre class="crayon-plain-tag">pinMode(D1,INPUT_PULLUP);
  pinMode(D2,INPUT_PULLUP);
  pinMode(D3,INPUT_PULLUP);
  pinMode(D4,INPUT_PULLUP);
  pinMode(D5,INPUT_PULLUP);
  pinMode(D6,INPUT_PULLUP);
  pinMode(D7,OUTPUT);
  pinMode(D8,OUTPUT);
  digitalWrite(D7,LOW);
  digitalWrite(D8,LOW);</pre><p></p>
<p>Nous avons associé à chaque bouton un messageCallback avec les paramètres permettant d&rsquo;effectuer l&rsquo;action voulu. Pour faire cela, nous avons réalisé une fonction « checkButtonState » qui permet de gérer les évènements d&rsquo;appuie sur les boutons et d&rsquo;appeler le messageCallback correspondant au bouton. Juste avant l&rsquo;appel du messageCallback, la led cablée au pin D7 est allumée pour une période de 2 secondes afin de montrer à l&rsquo;utilisateur que l&rsquo;ESP8266 a bien réalisé l&rsquo;action. Cela permettra en cas de disfonctionnement, que l&rsquo;utilisateur puisse savoir si c&rsquo;est le hardware ou la transmission Wifi/Constellation qui est défectueux.</p>
<p>Le tableau ci-dessous récapitule les actions, messageCallback et pins qui sont associés ensemble :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2018/05/image-8.png"><img class="colorbox-5991"  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/2018/05/image_thumb-6.png" alt="image" width="450" height="109" border="0" /></a></p>
<p>Ci-dessous le code de la fonction checkButtonState :</p>
<p></p><pre class="crayon-plain-tag">void checkButtonState(){
  
  static int lastButtonStateD1 = HIGH;
  static int lastButtonStateD2 = HIGH;
  static int lastButtonStateD3 = HIGH;
  static int lastButtonStateD4 = HIGH;
  static int lastButtonStateD5 = HIGH;
  static int lastButtonStateD6 = HIGH;
  static long led1TimeLitUP = 0;
  // If the led is lit up for 2 secondes, we shut off the led
  if(millis() - led1TimeLitUP &gt;2000){
      digitalWrite(D7, LOW);
    }
  // We retrieve the pin value
  int reading = digitalRead(D1);
// If pin value has changed
  if (reading != lastButtonStateD1){
   // And if pin value is high which mean button is pushed, then we make the associated action
    if (reading == HIGH){
      // We lit up the led in order to show to the user that the messageCallback is sending
       digitalWrite(D7,HIGH);
       // "led1TimeLitUp" take the value of the moment when it has been litted up
       led1TimeLitUP = millis();
       // we use the messageCallback to do the wanted action
       constellation.sendMessage(Package, "WindowsControl", "VolumeUp","{}");
     
      }
      lastButtonStateD1 = reading ;
     
      return;
  }
  reading = digitalRead(D2);
  if (reading != lastButtonStateD2){
     if (reading == HIGH){
        digitalWrite(D7,HIGH); 
        led1TimeLitUP = millis();
        constellation.sendMessage(Package, "WindowsControl", "VolumeDown", "{}"); 
        
      }
      lastButtonStateD2 = reading;
      return;
    }
  reading = digitalRead(D3);
  if (reading != lastButtonStateD3){
     if (reading == HIGH){
        digitalWrite(D7,HIGH); 
        led1TimeLitUP = millis();
        constellation.sendMessage(Package, "WindowsControl", "SendKey", "SpaceBar");
       
      }
      lastButtonStateD3 = reading;
      return;
    }
    
  reading = digitalRead(D4);
  if (reading != lastButtonStateD4){
     if (reading == HIGH){
        digitalWrite(D7,HIGH); 
        led1TimeLitUP = millis();
        constellation.sendMessage(Package, "WindowsControl", "SendCombinationOfKey", "['ALT', 'Left']");
        
      }
      lastButtonStateD4 = reading;
      return;
    }
   reading = digitalRead(D5);
    if (reading != lastButtonStateD5){
     if (reading == HIGH){
        digitalWrite(D7,HIGH); 
        led1TimeLitUP = millis();
        constellation.sendMessage(Package, "WindowsControl", "SendCombinationOfKey", "['ALT', 'Right']");
      
      }
      lastButtonStateD5 = reading;
      return;
    }
    reading = digitalRead(D6);
    if (reading != lastButtonStateD6){
     if (reading == HIGH){
        digitalWrite(D7,HIGH); 
        led1TimeLitUP = millis();
        constellation.sendMessage(Package, "WindowsControl", "SendCombinationOfKey", "['CTRL', 'Q']");
        
      }
      lastButtonStateD6 = reading;
      return;
    }  
  }</pre><p></p>
<p>Et voilà notre boitier de contrôle est opérationnel. Il ne reste plus qu’à l’alimenter et vous avons à notre disposition des boutons physiques pour piloter notre Windows facilement.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-un-boitier-connecte-mix-box-permettant-de-controler-votre-ordinateur/">Créer un boitier connecté « Mix box » permettant de contrôler votre ordinateur</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-boitier-connecte-mix-box-permettant-de-controler-votre-ordinateur/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[AngularJS]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Serrure]]></category>
		<category><![CDATA[tutoriel]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Constellation]]></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>Créer une prise connectée avec un ESP8266</title>
		<link>https://developer.myconstellation.io/tutorials/creer-une-prise-connectee-avec-un-esp8266/</link>
					<comments>https://developer.myconstellation.io/tutorials/creer-une-prise-connectee-avec-un-esp8266/#respond</comments>
		
		<dc:creator><![CDATA[Lucas]]></dc:creator>
		<pubDate>Tue, 31 Oct 2017 11:29:46 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[Domotique]]></category>
		<category><![CDATA[Relais]]></category>
		<category><![CDATA[XBMC]]></category>
		<category><![CDATA[Kodi]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Switch]]></category>
		<category><![CDATA[StateObjectLink]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5668</guid>

					<description><![CDATA[<p>Par Lucas Dupuis La prise connectée est un élément phare de la domotique de la maison. Il permet d&#8217;allumer ou d&#8217;éteindre un équipement branché dessus ou encore de connaitre sa consommation en énergie. Dans mon cas, j&#8217;avais besoin d&#8217;allumer ou</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-une-prise-connectee-avec-un-esp8266/">Créer une prise connectée avec un ESP8266</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>Par Lucas Dupuis</em></p>
<p>La prise connectée est un élément phare de la domotique de la maison. Il permet d&rsquo;allumer ou d&rsquo;éteindre un équipement branché dessus ou encore de connaitre sa consommation en énergie. Dans mon cas, j&rsquo;avais besoin d&rsquo;allumer ou d&rsquo;éteindre les enceintes de mon média center automatiquement lorsque ce dernier était démarré.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-08-08-16.32.30.jpg"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Prise connectée" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-08-08-16.32.30_thumb.jpg" alt="Prise connectée" width="404" height="304" border="0" /></a></p>
<p align="left">Découvrons ensemble comment créer sa prise connectée avec un ESP8266.</p>
<p><span id="more-5668"></span></p>
<h2>Prérequis</h2>
<p>Pour ce tutoriel, il vous faut :</p>
<ul>
<li>Un bloc prise avec un interrupteur</li>
<li>Un transformateur AC/DC 5v</li>
<li>Un ESP-01 (ESP8266)</li>
<li>Un régulateur de tension 3.3v</li>
<li>Un relais 220V pilotable en 5v</li>
<li>Un transistor, des résistances, des leds, une diode, des condensateurs</li>
<li>Du fil électrique</li>
<li>Un pistolet à colle et une drémel</li>
<li>Un serveur Constellation</li>
</ul>
<h2>Etape 1 : Construire la prise</h2>
<p>Dans un premier temps, il nous faut un boitier abordable que nous pourrons ouvrir pour insérer notre ESP à l&rsquo;intérieur. Après quelques recherches, j&rsquo;ai opté pour le <a href="http://www.conrad.fr/ce/fr/product/778994/Prise-intermdiaire-commutable-Renkforce-778994-1-ple-argent">boitier Renkforce disponible chez Conrad</a> pour 3€ environ.</p>
<p>On commence donc par l’ouvrir pour la vider littéralement :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-11-10-22.38.32.jpg"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Prise Renkforce" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-11-10-22.38.20_thumb.jpg" alt="Prise Renkforce" width="204" height="271" border="0" /><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Prise Renkforce" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-11-10-22.38.32_thumb.jpg" alt="Prise Renkforce" width="204" height="271" border="0" /></a></p>
<p align="center"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Démontage" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-11-10-22.41.28_thumb.jpg" alt="Démontage" width="244" height="184" border="0" /><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-11-10-22.41.28.jpg"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Prise démontée" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-11-10-22.44.15_thumb.jpg" alt="Prise démontée" width="244" height="184" border="0" /></a></p>
<p>Puis tous les supports plastique à l&rsquo;intérieur doivent être cassés pour libérer un maximum de place. Je les ai cassés avec une pince coupante et j&rsquo;ai fini de retirer le maximum de plastique avec un dremel. Sur cette photo j&rsquo;avais retiré une partie du fond de la prise pour un autre projet.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-12-18-11.25.15.jpg"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Usinage" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-12-18-11.25.15_thumb.jpg" alt="Usinage" width="354" height="266" border="0" /></a></p>
<p>Il faut ensuite préparer un câblage avec le relais pour qu&rsquo;il s&rsquo;intercale entre l&rsquo;arrivée de la phase (mur) et la phase distribuée à l&rsquo;élément branché sur la prise. Mais il faut également garder en tête que l&rsquo;alimentation de l&rsquo;ESP doit être permanente :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-08-10-22.52.19.jpg"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Schéma" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-08-10-22.52.19_thumb.jpg" alt="Schéma" width="354" height="266" border="0" /></a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/Schma-relais.png"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Schéma" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/Schma-relais_thumb.png" alt="Schéma" width="350" height="321" border="0" /></a></p>
<p>Mon principal problème dans ce tutoriel a été de tout faire rentrer dans la prise. En effet, l&rsquo;alimentation + le relais prennent beaucoup de place et tout est rentré au chausse-pied, avec le câblage noyé dans la colle chaude afin d&rsquo;assurer l&rsquo;isolation.</p>
<p>Le transformateur alimente donc en 5v un régulateur de tension LM1117 3.3V avec deux condensateurs pour lisser du 3.3v pour l&rsquo;ESP01.</p>
<p>Il alimente également directement la bobine du relais dont le circuit est interrompu par un transistor NPN BC547 dont la base sera pilotée en saturation par un GPIO de l&rsquo;ESP.</p>
<p>L&rsquo;ESP pilote deux leds de statut : une rouge et une verte et possède également son dernier GPIO en input pour un bouton physique placé sur le dessus du boitier. Si vous avez suivi jusque-là et que vous connaissez l&rsquo;ESP01, vous aurez compris qu&rsquo;il est impossible de le programmer directement dans la prise, deux des 4 GPIO devant normalement être utilisés pour la communication série.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-08-07-16.00.46.jpg"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="2016-08-07 16.00.46" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-08-07-16.00.46_thumb.jpg" alt="2016-08-07 16.00.46" width="454" height="342" border="0" /></a></p>
<p>Pour combler le « trou » du bouton physique original, j&rsquo;ai choisi de coller par l&rsquo;intérieur du boitier un petit bout de plexiglas translucide. Je l&rsquo;ai ensuite percé pour faire passer les deux leds rouge et verte.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-12-18-18.27.32.jpg"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="2016-12-18 18.27.32" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-12-18-18.27.32_thumb.jpg" alt="2016-12-18 18.27.32" width="244" height="184" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-08-22-23.08.43.jpg"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="2016-08-22 23.08.43" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/2016-08-22-23.08.43_thumb.jpg" alt="2016-08-22 23.08.43" width="244" height="184" border="0" /></a></p>
<p align="left">Et voilà, on obtient une prise connectée par Wifi avec un ESP8266 avec un bouton poussoir et deux LEDs, reste plus qu’à le programmer !</p>
<h2>Etape 2 : la programmation</h2>
<p>La fonction de base de la prise est assez simple : couper le courant ou le laisser passer. Dans un premier temps, j&rsquo;ai uploadé un sketch de base Constellation avec Arduino sur l&rsquo;ESP01 à l&rsquo;extérieur de la prise. Je l&rsquo;ai ensuite branché dans la prise que j&rsquo;ai enfiché dans le mur. Bazinga, le régulateur 3.3v fait son job, l&rsquo;ESP boote, se connecte à mon réseau wifi et envoie un « hello world » dans la console Constellation. Pour découvrir comment connecter un ESP8266 à Constellation, <a href="https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">suivez ce guide</a>.</p>
<p>Ensuite, j&rsquo;ai utilisé 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> pour activer ou désactiver le GPIO de la prise, <a href="https://developer.myconstellation.io/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/">couplé à un StateObject</a> pour maintenir l’état de la prise dans Constellation :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerMessageCallback("Switch", MessageCallbackDescriptor().setDescription("Switch le statut du relais."),
  [](JsonObject &amp; json) {
    statutRelais = !statutRelais;
    digitalWrite(gpioRelais, statutRelais);
    constellation.pushStateObject("Status", stringFormat("{ 'IsActivated':%s }", statutRelais ? "true" : "false" ));
  });</pre><p></p>
<p align="left">Ainsi Constellation a toujours connaissance de l’état de la prise via le StateObject nommé “Status” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/StateObject.png"><img class="colorbox-5668"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="StateObject de l'état de la prise" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/StateObject_thumb.png" alt="StateObject de l'état de la prise" width="354" height="259" border="0" /></a></p>
<p align="left">Et tout le monde peut maintenant découvrir et utiliser le MessageCallback “Switch” exposé par notre ESP pour permuter l’état de notre prise :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/10/MessageCallback2-002.png"><img class="colorbox-5668"  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/2017/10/MessageCallback2-002_thumb.png" alt="MessageCallback" width="354" height="115" border="0" /></a></p>
<p align="left">Bingo, on a donc une prise 220V connectée à Constellation qu’on pourra piloter depuis une page Web, un programme Python ou autre.</p>
<p align="left">Pour vous donnez quelques idées, n’hésitez pas à relire ce tutoriel : <a href="https://developer.myconstellation.io/tutorials/creer-un-relais-connecte/">Créer un relais connecté</a>.</p>
<h2 align="left">Etape 3 : Lier sa prise connectée à l’état de son média-center</h2>
<p align="left">Dans ma Constellation, je dispose d&rsquo;un package « brain » développé en C# avec Visual Studio qui contient l’ensemble des règles de la maison (gestion du chauffages, lumières, volets, etc..).</p>
<p align="left">Je l’ai enrichi pour faire en sorte que si Kodi est en train de lire un média (audio ou vidéo) et que la prise n’est pas allumée, alors il invoque le MessageCallback pour allumer la prise. Et inversement pour l&rsquo;éteindre !</p>
<p align="left">J’ai donc dans une classe C#, ajouté <a href="https://developer.myconstellation.io/client-api/net-package-api/consommer-des-stateobjects/#Les_StateObjectLink">deux StateObjectLinks</a>, c’est à dire que j’ai deux propriétés de mon code C# qui sont liées à mes StateObjets représentant l’état de mon media-center de l’état de ma prise !</p>
<p align="left">Il me reste plus qu’à ajouter un handler sur le changement d’état du State Object de Kodi, afin d’ajouter deux conditions “if” :</p>
<ul>
<li>
<div align="left">Si la prise est éteinte alors que Kodi joue quelque chose (PlayerState différent de null) alors on allume la prise</div>
</li>
<li>
<div align="left">Si la prise est allumée alors que Kodi joue rien (PlayerState null) alors on éteint la prise</div>
</li>
</ul>
<p align="left">Pour allumer ou éteindre la prise, il suffit d’invoquer le MessageCallback “Switch” exposé par notre code Arduino <a href="https://developer.myconstellation.io/client-api/net-package-api/envoyer-des-messages-invoquer-des-messagecallbacks/">en créant un proxy vers notre package.</a></p>
<p></p><pre class="crayon-plain-tag">public class KodiDemo
{
    /// &lt;summary&gt;
    /// StateObject XBMC. Permet de connaitre les infos de lecture.
    /// &lt;/summary&gt;
    [StateObjectLink(Package = "Xbmc", Name = "Kodi Salon NUC")]
    public StateObjectNotifier KodiNotifier { get; set; }

    /// &lt;summary&gt;
    /// StateObject de l'ESP controlant le relais d'activation. Permet de synchroniser les infos de lecture avec la valeur du relais.
    /// &lt;/summary&gt;
    [StateObjectLink(Sentinel = "ESP8266-01-001", Package = "ESP_Relay_Button", Name = "Status")]
    public StateObjectNotifier PriseKodi { get; set; }

    public void Start()
    {
        this.KodiNotifier.ValueChanged += (s, e) =&gt;
        {
            if (this.PriseKodi.DynamicValue.Status == false
                &amp;&amp; e.IsNew == false
                &amp;&amp; e.OldState.DynamicValue.PlayerState == null
                &amp;&amp; e.NewState.DynamicValue.PlayerState != null)
            {
                // démarrage.
                PackageHost.WriteInfo("Activation de la prise.");
                PackageHost.CreateMessageProxy("ESP8266_01_002/ESP_Relay_Button").Switch();
            }

            if (this.PriseKodi.DynamicValue.Status == true
                &amp;&amp; e.IsNew == false
                &amp;&amp; e.OldState.DynamicValue.PlayerState != null
                &amp;&amp; e.NewState.DynamicValue.PlayerState == null)
            {
                PackageHost.WriteInfo($"Arret de la prise.");
                PackageHost.CreateMessageProxy("ESP8266_01_002/ESP_Relay_Button").Switch();
            }
        };
    }
}</pre><p></p>
<p>Et voilà comment en quelques lignes de C# et grâce à Constellation, mes enceintes seront automatiquement allumées ou éteintes selon que mon media-center diffuse ou non un média vidéo ou audio !</p>
<h2>Pour aller plus loin</h2>
<p>Pour aller plus loin, j&rsquo;ai ajouté quelques fonctionnalités intéressantes :</p>
<ul>
<li>J&rsquo;ai pluggé le bouton poussoir ajouté sur le dessus de la prise pour qu&rsquo;il change l&rsquo;état du relais et mette à jour le state objet en conséquence.</li>
<li>J&rsquo;ai ajouté la possibilité d&rsquo;associer les leds de façade au fonctionnement de la prise en m&rsquo;inspirant de ce qui existe sur les prises connectées du marché. La led rouge indique le statut de fonctionnement (power on / connexion au wifi en clignotant), la led verte indique l&rsquo;état du relais.</li>
<li>J&rsquo;ai ajouté également un mode « blind », je trouve que c&rsquo;est une fonctionnalité intéressante mais qui est absente des prises sur le marché : Quand il fait noir dans une pièce et que la prise se reconnecte au wifi, cela peut être gênant de la voir clignoter. Un package de « brain » peut alors gérer les leds directement en <a href="https://developer.myconstellation.io/showcases/connecter-volets-constellation-arduino-raspberry/">fonction de mes volets</a> <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
<li>Ensuite, en cas de déconnection du wifi ou de coupure de courant, j&rsquo;ai prévu un bout de code permettant, au démarrage de l&rsquo;ESP, de requêter son propre StateObject. Cela permet à la prise de revenir à l&rsquo;état dans lequel elle était avant la coupure.</li>
<li>J&rsquo;ai également fait intervenir <a href="https://developer.myconstellation.io/tutorials/connecter-un-video-projecteur-dans-constellation/">l&rsquo;activation de mon projecteur</a>. Ce dernier push un StateObject. Si le média center est éteint, il envoie un paquet WOL via <a href="https://developer.myconstellation.io/package-library/networktools/">le package networktools</a> pour l&rsquo;allumer et envoie une notification de fermeture des volets du salon. Le démarrage de la lecture du média sur kodi pilote la prise d&rsquo;allumage des enceintes sans action manuelle. Ainsi, le démarrage du projecteur et la lecture sur kodi lancent l&rsquo;ambiance parfaite pour profiter de mes séries en un seul geste.</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-une-prise-connectee-avec-un-esp8266/">Créer une prise connectée avec un ESP8266</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-prise-connectee-avec-un-esp8266/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Créer une boite aux lettres connectée avec Constellation</title>
		<link>https://developer.myconstellation.io/showcases/creer-une-boite-aux-lettres-connectee-constellation/</link>
					<comments>https://developer.myconstellation.io/showcases/creer-une-boite-aux-lettres-connectee-constellation/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 27 Sep 2017 10:29:50 +0000</pubDate>
				<category><![CDATA[Showcases]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Capteur]]></category>
		<category><![CDATA[PushBullet]]></category>
		<category><![CDATA[Constellation]]></category>
		<category><![CDATA[smartphone]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[Cordova]]></category>
		<category><![CDATA[Ionic]]></category>
		<category><![CDATA[IoT]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5519</guid>

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

					<description><![CDATA[<p>Par Lucas Dupuis Ayant fait récemment l&#8217;acquisition d&#8217;un vidéo-projecteur pour mes soirées films, je me suis vite rendu compte qu&#8217;avec les jours qui rallongent, j&#8217;ai besoin de fermer les volets de mon salon afin de rester dans une certaine pénombre.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/connecter-un-video-projecteur-dans-constellation/">Connecter un vidéo projecteur standard à Constellation et synchroniser les volets</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><em>Par Lucas Dupuis</em></p>
<p>Ayant fait récemment l&rsquo;acquisition d&rsquo;un vidéo-projecteur pour mes soirées films, je me suis vite rendu compte qu&rsquo;avec les jours qui rallongent, j&rsquo;ai besoin de fermer les volets de mon salon afin de rester dans une certaine pénombre.</p>
<p>La présentation de mon système de pilotage de volets n&rsquo;est plus à faire, <a href="/showcases/connecter-volets-constellation-arduino-raspberry/">vous la retrouverez ici</a>. Vous pouvez aussi utiliser des modules Z-Wave comme le FGR-211 qu&rsquo;on connectera à Constellation via le package <a href="/package-library/vera/">Vera</a> ou <a href="/package-library/jeedom/">Jeedom</a>. Dans tous les cas, nous disposons un <a href="/concepts/messaging-message-scope-messagecallback-saga/">MessageCallback </a>pour ouvrir ou fermer nos volets !</p>
<p>La problématique qui se pose est la suivante : comment savoir que le projecteur est allumé et que je m&rsquo;apprête à regarder un film ?</p>
<p>J&rsquo;ai réfléchi à plusieurs solutions :</p>
<ul>
<li>Monitorer la consommation de la prise électrique afin de déduire que le projecteur est allumé
<ul>
<li>Avantages :
<ul>
<li>Permet d&rsquo;exposer un booléen indiquant que le projecteur est allumé et d&rsquo;ouvrir/fermer les volets en conséquence</li>
<li>Permet de monitorer la consommation en temps réel</li>
<li>Permet de monitorer la durée d&rsquo;utilisation de la lampe du vidéo-projecteur</li>
</ul>
</li>
<li>Inconvénients :
<ul>
<li>Nécessite une prise connectée avec conso-mètre (à fabriquer ou à acheter)</li>
<li>C&rsquo;est potentiellement complexe et coûteux</li>
</ul>
</li>
</ul>
</li>
<li>Surveiller le StateObject de mon médiacenter Kodi (exposé par le package <a href="/package-library/xbmc/">xbmc</a>)
<ul>
<li>Avantages :
<ul>
<li>J&rsquo;ai déjà une routine surveillant le stateobject pour allumer et éteindre le système de son lorsqu&rsquo;un média est joué</li>
<li>Il n&rsquo;y a que du code à mettre en place dans le package « cerveau » de la maison</li>
</ul>
</li>
<li>Inconvénients :
<ul>
<li>Il n&rsquo;y a pas de lien direct entre l&rsquo;allumage du projecteur et une action sur les volets</li>
<li>La sélection du film ou du média sur l&rsquo;écran se fait volets ouverts, et donc c&rsquo;est potentiellement gênant en cas de luminosité importante</li>
<li>Cela ne tient pas compte des autres sources branchées sur le projecteur (TV, console, &#8230;)</li>
</ul>
</li>
</ul>
</li>
<li>Utiliser un déclencheur sur le projecteur
<ul>
<li>Avantages :
<ul>
<li>Montage simple</li>
<li>Peu d&rsquo;investissement</li>
<li>Système embarqué trivial</li>
</ul>
</li>
<li>Inconvénients :
<ul>
<li>Pas de monitoring de consommation</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>J&rsquo;ai retenu la seconde et la troisième option : la seconde option, consistant à surveiller le stateobject de <a href="/package-library/xbmc/">kodi</a> permet l&rsquo;allumage du système de son lorsqu&rsquo;un média est lu, que ce soit un film ou un morceau de musique et la troisième option pour déclencher la fermeture des volets à l&rsquo;allumage du vidéo projecteur.</p>
<h3>Prerequis</h3>
<ul>
<li>Un serveur Constellation</li>
<li>Un vidéo-projecteur avec une sortie 12V</li>
<li>Un ESP8266 (ou Arduino connecté) avec un régulateur de tension</li>
<li>Le SDK Visual Studio</li>
</ul>
<h3>Etape 1 : connecter le vidéo projecteur dans Constellation</h3>
<p>En regardant les caractéristiques de mon projecteur, je me suis rendu compte qu&rsquo;il existait une sortie 12V permettant de déclencher un moteur pour une toile de projection.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/2017-05-03-21.19.35.jpg"><img class="colorbox-4888"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Le projecteur vidéo" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/2017-05-03-21.19.35_thumb.jpg" alt="Le projecteur vidéo" width="454" height="342" border="0" /></a></p>
<p>À la maison je projette sur un mur blanc, je n&rsquo;ai donc pas besoin de cette sortie. Il s&rsquo;agit d&rsquo;un connecteur jack mono que vous trouverez rapidement chez vous dans votre boite de récup&rsquo; ou bien directement sur le net pour quelques centimes.</p>
<p>Il suffit donc d&rsquo;un ESP8266 (par exemple un ESP-01, très petit et peu cher) et d&rsquo;un régulateur de tension 3.3v (ex. LD1117v33) acceptant en entrée une tension entre 5 et 15V et le tour est joué !</p>
<p>En effet, le projecteur envoie du 12v sur la sortie dès qu&rsquo;il est sous tension et du 0v lorsqu&rsquo;il est éteint. Ainsi notre ESP-01 sera alimenté par cette sortie. Lorsqu&rsquo;on allume le vidéo-projecteur, l&rsquo;ESP-01 sera démarré et lorsqu&rsquo;on éteint le vidéo projecteur, il sera éteint car plus d&rsquo;alimentation !</p>
<p>Aussi simple que cela !</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/2017-05-16-10.27.17.jpg"><img class="colorbox-4888"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Schéma du montage avec l'ESP8266" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/2017-05-16-10.27.17_thumb.jpg" alt="Schéma du montage avec l'ESP8266" width="454" height="193" border="0" /></a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/2017-05-06-15.37.28.jpg"><img class="colorbox-4888"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Le vidéo projecteur avec l'ESP8266" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/2017-05-06-15.37.28_thumb.jpg" alt="Le vidéo projecteur avec l'ESP8266" width="454" height="342" border="0" /></a></p>
<p>L&rsquo;ESP, de son côté, publie simplement toutes les secondes un StateObject ayant une durée de vie de 5 secondes pour indiquer que le projecteur est allumé.</p>
<p>Pour connecter un ESP8266 (ou un Arduino) <a href="/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">suivez ce guide</a> ! Une fois connecté dans ma Constellation, je <a href="/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/">publie le StateObject</a> dans la boucle principale <em>loop()</em></p>
<p></p><pre class="crayon-plain-tag">void loop() {
  constellation.loop();
 
  if(((millis() - lastTime) &gt; 1000) 
    || (millis() &lt; lastTime))
  {
    constellation.pushStateObject("Uptime",  millis(), 5);
    lastTime = millis();
  } 
}</pre><p></p>
<p>On a donc dans les StateObjects de notre Constellation, un StateObject « Uptime » publié dans mon cas par le package (virtuel)  « ESP01_Projector » qui contient l&rsquo;uptime de mon projecteur :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/Screenshot-SO.png"><img class="colorbox-4888"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Le StateObject de l'uptime du projecteur" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/Screenshot-SO_thumb.png" alt="Le StateObject de l'uptime du projecteur" width="457" height="332" border="0" /></a></p>
<p style="text-align: left;" align="center">Ce StateObject est mis à jour par l&rsquo;ESP toutes les secondes avec une durée de vie de 5 secondes ! Ainsi je n&rsquo;ai pas besoin de connaitre la valeur du StateObject, il me suffit juste de vérifier que le StateObject est « Valide » et non « Expiré » !</p>
<p style="text-align: left;" align="center">Si il est valide c&rsquo;est que dans les 5 dernières secondes il y a bien publié son Uptime, donc l&rsquo; ESP est démarré ce qui implique que mon vidéo projecteur est bien démarré (pour alimenter l&rsquo;ESP) !</p>
<p style="text-align: left;" align="center">En revanche si ce StateObject est expiré, c&rsquo;est à dire que le StateObject n&rsquo;a pas été mis à jour durant les 5 dernières secondes or l&rsquo;ESP est censé le faire à chaque seconde ! L&rsquo;ESP-01 est donc déconnecté ce qui impliquerai que le vidéo projecteur est arrêté !</p>
<h3 style="text-align: left;" align="center">Etape 2 : synchroniser le vidéo projecteur avec mes volets</h3>
<p style="text-align: left;" align="center">Maintenant, dans mon package « cerveau » de Constellation, il suffit de surveiller ce StateObject et son état expiré ou non pour savoir quelle commande envoyer aux volets.</p>
<p style="text-align: left;" align="center">J&rsquo;ai donc créé un package « cerveau » en C#.</p>
<p style="text-align: left;" align="center">Dans ma classe, je crée un <a href="/client-api/net-package-api/consommer-des-stateobjects/">StateObjectLink </a>pour lier le StateObject de l&rsquo;ESP dans une propriété .NET de mon code :</p>
<p></p><pre class="crayon-plain-tag">/// &lt;summary&gt;
/// StateObject du projecteur. Permet de connaitre l'uptime du projecteur.
/// &lt;/summary&gt;
[StateObjectLink("ESP01_Projector", "Uptime")]
public StateObjectNotifier ProjectorUptime { get; set; }</pre><p></p>
<p>Maintenant au démarrage de mon package, j&rsquo;attache un « handler » sur l&rsquo;événement « <em>ValueChanged</em> » permettant d&rsquo;ajouter du code en cas de mise à jour du StateObject.</p>
<p>Ici je vérifie que mon StateObjectLink est bien lié au StateObject (<em>HasValue</em>) et que ce StateObject n&rsquo;est pas expiré (<em>IsExpired</em>).</p>
<p>Si la condition est vrai, c&rsquo;est que mon projecteur est allumé, alors je peux fermer mes volets autrement je restaure les volets dans leurs positions précédentes.</p>
<p></p><pre class="crayon-plain-tag">this.ProjectorUptime.ValueChanged += (s, e) =&gt;
{
    // Projecteur allumé ?
    if (this.ProjectorUptime.HasValue == true &amp;&amp; this.ProjectorUptime.Value.IsExpired == false)
    {
        // Si projecteur est allumé, on ferme les volets.
        foreach (var volet in this.voletConfig)
        {
            if (this.ShowDebug)
            {
                PackageHost.WriteWarn($"Fermeture du volet {volet.Name} à 100%.");
            }
            
            // On enregistre au passage la position de départ pour la restaurer à la fin.
            volet.PreviousPosition = volet.CurrentPosition; 
            
            // Ordre de fermeture (100%).
            PackageHost.CreateMessageScope("ESP_Shutters").ChangePercent(volet.Name, 100);
        }
    }
    else
    {
        // Si projecteur est éteint, on rouvre les volets.
        foreach (var volet in this.voletConfig)
        {
            if (this.ShowDebug)
            {
                PackageHost.WriteWarn($"Ouverture du volet {volet.Name} à l'ancienne position, {Convert.ToInt32(volet.Percent * 100.0)}-&gt;{volet.PreviousPosition}% après {this.tempoReouvertureVolets} secs d'inactivité.");
            }

            // Pour chaque volet, on revient à la position initiale
            PackageHost.CreateMessageScope("ESP_Shutters").ChangePercent(volet.Name, volet.PreviousPosition);
        }
    }
};</pre><p></p>
<h3>Conclusion</h3>
<p>Une demi-heure de prototypage et de soudure, un petit quart d&rsquo;heure de développement, et le challenge est relevé !</p>
<p>L&rsquo;allumage du projecteur ferme les volets de mon salon selon une consigne, il déclenche également un scénario prédéfini pour les lampes Hue et active la prise du système de son. Le clic sur le bouton de la télécommande rend l&rsquo;expérience du film beaucoup plus profitable avec Constellation !</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/connecter-un-video-projecteur-dans-constellation/">Connecter un vidéo projecteur standard à Constellation et synchroniser les volets</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/tutorials/connecter-un-video-projecteur-dans-constellation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Créer un capteur de luminosité dans une prise 220v avec un ESP8266</title>
		<link>https://developer.myconstellation.io/tutorials/creer-un-capteur-de-luminosite-dans-une-prise-220v/</link>
					<comments>https://developer.myconstellation.io/tutorials/creer-un-capteur-de-luminosite-dans-une-prise-220v/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Sat, 13 May 2017 13:35:14 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Lux]]></category>
		<category><![CDATA[TSL2561]]></category>
		<category><![CDATA[IoT]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=4819</guid>

					<description><![CDATA[<p>Ce tutoriel est sur le principe identique à celui-ci : Créer un capteur de température, humidité et luminosité connecté sauf que nous allons utiliser un ESP-01 beaucoup plus petit et moins cher qu&#8217;un D1 Mini Pro. Nous assemblerons l&#8217;ESP8266 et le capteur de</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-un-capteur-de-luminosite-dans-une-prise-220v/">Créer un capteur de luminosité dans une prise 220v avec un ESP8266</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ce tutoriel est sur le principe identique à celui-ci : <a href="/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/">Créer un capteur de température, humidité et luminosité connecté</a> sauf que nous allons utiliser un ESP-01 beaucoup plus petit et moins cher qu&rsquo;un D1 Mini Pro.</p>
<p>Nous assemblerons l&rsquo;ESP8266 et le capteur de luminosité TSL2561 dans une prise 220v avec un convertisseur 220v -&gt; 3v3.</p>
<h3>Prérequis</h3>
<ul>
<li>Un serveur Constellation</li>
<li>Un ESP8266 comme l&rsquo;ESP-01 (entre 1,5€ et 2€)</li>
<li>Un capteur de luminosité TSL2561 (environ 2€)</li>
<li>Un convertisseur 220v -&gt; 3v3 (environ 2€)</li>
<li>Un boitier/prise 220v (entre 5 et 15 €)</li>
</ul>
<h3>Le montage</h3>
<p>Le capteur TSL2561 se connecte en I²C, il suffit donc de l&rsquo;alimenter en 3v3 et de connecter les deux GPIO de l&rsquo;ESP-01 (GPIO-0 et GPIO-2) aux pins SCL et SDA du capteur.</p>
<p>Le schéma de connexion est donc le suivant :</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/Fig-1.png"><img class="colorbox-4819"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Lux Sensor" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/Fig-1_thumb.png" alt="Lux Sensor" width="450" height="285" border="0" /></a></p>
<p>Sur le bornier 220v de notre prise nous allons souder deux fils (la phase et le neutre) vers l&rsquo;entrée convertisseur 220v AC. En sortie du convertisseur, on a une tension de 3v3 DC que nous connecterons à l&rsquo;ESP-01 ainsi qu&rsquo;au TSL2561.</p>
<p>N&rsquo;oubliez pas également de relier le port « CH_PD » de l&rsquo;ESP-01 au 3v3 pour activer le Wifi.</p>
<p>Pour plus d’information, je vous invite <a href="https://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/" target="_blank" rel="noopener noreferrer">à lire cet article</a>.</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-84.png"><img class="colorbox-4819"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Lux Sensor" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-84.png" alt="Lux Sensor" width="454" height="403" border="0" /></a></p>
<p>Disposez les différents composants dans le boitier en prenant soin d&rsquo;isoler les parties 220v (avec de la colle thermofusibles ou du ruban isolant).</p>
<h3>Le code</h3>
<p>L&rsquo;ESP-01 ne dispose pas comme le D1 Mini Pro vu dans<a href="/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/"> ce tutoriel</a> d&rsquo;une interface USB intégrée. Il vous faudra donc une interface USB/FTDI pour le programmer. Pour plus d’information, je vous invite <a href="https://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/" target="_blank" rel="noopener noreferrer">à lire cet article</a>.</p>
<p>A l&rsquo;inverse du <a href="/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/">tutoriel précédent</a>, ce code utilise la libraire <a href="https://github.com/adafruit/TSL2561-Arduino-Library" data-pjax="#js-repo-pjax-container">TSL2561-Arduino-Library</a> et non la « Unifed Sensor Library » afin de nous permettre de récupérer le Broadband et l&rsquo;IR en plus des Lux.</p>
<p>Il faudra donc installer la libraire « <em>TSL2561-Arduino-Library</em> » depuis le Gestionnaire de bibliothèque. De plus on utilise ici « ArduinoThread » pour ordonner les mesures à intervalle régulier. Vous devrez également installer cette librairie.</p>
<p><strong>Attention</strong> : si tout cela est nouveau pour vous, je vous recommande <a href="https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">de suivre ce guide d’introduction à l’API Constellation pour Arduino/ESP8266</a>.</p>
<p>Le code complet est :</p>
<p></p><pre class="crayon-plain-tag">#include &lt;ESP8266WiFi.h&gt;
const char* ssid     = "MON SSID";
const char* password = "lacléeWifi!!!!";

#include &lt;Constellation.h&gt;
Constellation&lt;WiFiClient&gt; constellation("IP ou DNS du serveur Constellation", 8088, "ESP-LightSensorSalon", "LightSensor", "123456789");

#include &lt;Wire.h&gt;
#include &lt;TSL2561.h&gt;
TSL2561 tsl(TSL2561_ADDR_FLOAT); 

#include &lt;Thread.h&gt;
Thread thrPushLux = Thread();

void pushLuxOnConstellation() {  
  uint32_t lum = tsl.getFullLuminosity();
  uint16_t ir, full;
  ir = lum &gt;&gt; 16;
  full = lum &amp; 0xFFFF;
  uint32_t lux = tsl.calculateLux(full, ir);
  
  constellation.pushStateObject("Lux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir), "LightSensor.Lux", 300);
}

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

  if (tsl.begin()) {
    Serial.println("Found sensor");
  } else {
    Serial.println("No sensor?");
    while (1);
  }
  
  // You can change the gain on the fly, to adapt to brighter/dimmer light situations
  //tsl.setGain(TSL2561_GAIN_0X);         // set no gain (for bright situtations)
  tsl.setGain(TSL2561_GAIN_16X);      // set 16x gain (for dim situations)  
  // Changing the integration time gives you a longer time over which to sense light
  // longer timelines are slower, but are good in very low light situtations!
  //tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS);  // shortest integration time (bright light)
  //tsl.setTiming(TSL2561_INTEGRATIONTIME_101MS);  // medium integration time (medium light)
  tsl.setTiming(TSL2561_INTEGRATIONTIME_402MS);  // longest integration time (dim light)

  // Set Wifi mode
  if (WiFi.getMode() != WIFI_STA) {
    WiFi.mode(WIFI_STA);
    delay(10);
  }
  
  // Connect 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());
  Serial.println(constellation.getSentinelName());
  
  JsonObject&amp; settings = constellation.getSettings();
  int interval = 10000; //ms
  if(settings.containsKey("Interval")) {
    interval = settings["Interval"].as&lt;int&gt;();
  }

  thrPushLux.onRun(pushLuxOnConstellation);
  thrPushLux.setInterval(interval);

  constellation.addStateObjectType("LightSensor.Lux", TypeDescriptor().setDescription("Lux data informations").addProperty("Broadband", "System.Int32").addProperty("IR", "System.Int32").addProperty("Lux", "System.Int32"));
  constellation.declarePackageDescriptor();
  
  constellation.writeInfo("ESP LightSensor '%s' is started (Push interval: %d sec)", constellation.getSentinelName(), interval);  
}

void loop(void) {
  if(thrPushLux.shouldRun()){
    thrPushLux.run();
  }
}</pre><p></p>
<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 “ESP-LightSensorSalon” et le package virtuel se nomme “LightSensor”.</p>
<p>Ensuite il faut 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>Dans la méthode « <em>setup()</em>« , on initialise le capteur TSL puis on se connecte au Wifi et enfin on déclare l&rsquo;intervalle de temps entre chaque mesure, par défaut de 10 secondes qu&rsquo;on peut modifier en ajoutant un setting « Interval » sur notre package virtuel.</p>
<p>On configure ensuite un « thread » qui exécutera à l&rsquo;intervalle de temps spécifié la méthode « <em>pushLuxOnConstellation</em>« . Pour finir on déclare la description du StateObject par la méthode « <em>constellation.addStateObjectType</em> » et on affiche un log. Dans la <em>loop()</em>, on déclenche le thread.</p>
<p>La méthode « <em>pushLuxOnConstellation</em> » récupère les données du capteur et publie le StateObject « Lux » avec les trois propriétés :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("Lux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir), "LightSensor.Lux", 300);</pre><p></p>
<p>Une fois le programme téléversé, votre prise publiera le StateObject à l&rsquo;intervalle régulier la luminosité ambiante.</p>
<h3>Exploiter le capteur</h3>
<p>Comme vous le savez, une fois les données mesurées publiées dans un StateObject n&rsquo;importe quel système connecté dans Constellation peut récupérer ou s&rsquo;abonner en temps réel au StateObject.</p>
<p>On peut donc écrire des pages Web, des scripts, des packages .NET ou Python, Arduino, etc… qui exploiteront ces mesures en temps réel.</p>
<p>Je vous renvoie sur <a href="/tutorials/un-capteur-de-luminosite-exterieur-pilote-par-raspberry/#Exploitez_les_donnees">cette page</a> ou<a href="/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/#Etape_3_Une_page_Web_pour_afficher_votre_capteur_en_temps_reel"> cette autre page</a> pour avoir quelques idées.</p>
<p>Pour ma part ce capteur installé dans le salon est affiché en temps réel sur <a href="https://sebastien.warin.fr/2015/07/15/3033-s-panel-une-interface-domotique-et-iot-multi-plateforme-avec-cordova-angularjs-et-constellation-ou-comment-crer-son-dashboard-domotique-mural/">un dashboard Web</a>,  stocké dans ElasticSearch et Cacti et exploité dans un package .NET nommé « MyBrain » car cette information sur la luminosité ambiante sert dans beaucoup de scénario : gestion des éclairages ou des volets.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/creer-un-capteur-de-luminosite-dans-une-prise-220v/">Créer un capteur de luminosité dans une prise 220v avec un ESP8266</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-luminosite-dans-une-prise-220v/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pilotez une matrice de LED avec une page Web en temps réel</title>
		<link>https://developer.myconstellation.io/tutorials/pilotez-une-matrice-de-led-avec-une-page-web/</link>
					<comments>https://developer.myconstellation.io/tutorials/pilotez-une-matrice-de-led-avec-une-page-web/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 May 2017 12:48:57 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[LED]]></category>
		<category><![CDATA[Matrix]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Canvas]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=4532</guid>

					<description><![CDATA[<p>Découvrons dans ce tutoriel comment piloter en temps réel une matrice de LED bicolore depuis une page Web en quelque ligne. Pour cela nous allons utiliser une matrice de 8&#215;8 LEDs pilotable en I²C que vous pouvez trouver chez Adafruit</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/pilotez-une-matrice-de-led-avec-une-page-web/">Pilotez une matrice de LED avec une page Web en temps réel</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Découvrons dans ce tutoriel comment piloter en temps réel une matrice de LED bicolore depuis une page Web en quelque ligne.</p>
<p align="center"><img class="colorbox-4532"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="ESP Matrix Controller" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/ESPMatrix2-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/05/ESPMatrix2.gif" alt="ESP Matrix Controller" width="400" height="225" border="0" /></p>
<p>Pour cela nous allons utiliser une matrice de 8&#215;8 LEDs pilotable en I²C que vous pouvez trouver <a href="https://www.adafruit.com/product/902">chez Adafruit</a> pour environ 15€. Pour piloter cette matrice nous allons utiliser un ESP8266, ici un <a href="https://www.wemos.cc/product/d1-mini-pro.html">D1 Mini Pro</a> (environ 6€).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1040128.jpg"><img class="colorbox-4532"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="ESP Matrix Controller" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1040128_thumb.jpg" alt="ESP Matrix Controller" width="404" height="304" border="0" /></a></p>
<h3 align="left">Prérequis</h3>
<p align="left">Pour réaliser ce tutoriel, vous aurez besoin :</p>
<ul>
<li>
<div align="left">Un serveur Constellation</div>
</li>
<li>
<div align="left">Un ESP8266</div>
</li>
<li>
<div align="left">Une matrice de LED I²C</div>
</li>
</ul>
<p align="left">Si c’est la première fois que vous utilisez un ESP8266 connecté à Constellation, je vous recommande <a href="/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">de suivre ce guide d’introduction</a> avant de commencer !</p>
<h3 align="left">Etape 1 : connecter la matrice de LED</h3>
<p align="left">Nous avons ici utilisé un D1 Mini Pro, un ESP8266 intégrant nativement une interface de programmation USB, très pratique pour créer des prototypes rapides.</p>
<p align="left">La matrice de LED se connecte à l’ESP8266 en I²C. Nous avons utilisé les fils Noir et Blanc pour alimenter la matrice depuis les pins “5V” et “GND” du D1 Mini ainsi que les fils Bleu et Vert pour connecter les ports D1 et D2 du D1 Mini aux ports SCL et SDA de la matrice de LED :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1040132.jpg"><img class="colorbox-4532"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="D1 Mini avec un 8x8 LED Matrix" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1040132_thumb.jpg" alt="D1 Mini avec un 8x8 LED Matrix" width="354" height="266" border="0" /></a></p>
<p align="left">Et voilà le montage est déjà fini ! Vous pouvez maintenant connecter votre D1 Mini en USB à votre PC pour le programmer.</p>
<h3 align="left">Etape 2 : programmer l’ESP8266</h3>
<p align="left">Pour démarrer vous devez dans Constellation déclarer une sentinelle associée à une clé d&rsquo;accès et un package virtuel. Ici notre ESP8266 est représenté par la sentinelle nommée « ESP8266 » et le package virtuel se nomme « MatrixController ».</p>
<p align="left">Dans l&rsquo;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&rsquo;accès  puis nous configurerons le client Constellation en spécifiant l&rsquo;identité de notre package virtuel, sa clé d&rsquo;accès et l&rsquo;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", "MatrixController", "xxxxxxxxxxxxxxxxx");</pre><p></p>
<p align="left">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&rsquo;API Constellation pour Arduino/ESP8266</a>.</p>
<p align="left">Maintenant que la coquille de notre package virtuel sur ESP8266 est prête, ajoutons les librairies d&rsquo;Adafruit pour piloter la matrice de LED bicolore.</p>
<p align="left">Dans le gestionnaire de bibliothèque (menu<em> Croquis &gt; Inclure une bibliothèque</em>), installez les librairies suivantes :</p>
<ul>
<li>Adafruit GFX</li>
<li>Adafruit LED Backpack</li>
</ul>
<p>Puis dans votre code, ajoutez ces librairies et déclarez une variable de type « Adafruit_BicolorMatrix » que nous nommerons « matrix » :</p>
<p></p><pre class="crayon-plain-tag">#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include &lt;Wire.h&gt;
Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix();</pre><p></p>
<p align="left">Au démarrage, dans la méthode « setup() », initialisez la matrice de LED. Pour rappel nous avons branché la matrice I²C sur les ports D1 et D2 :</p>
<p></p><pre class="crayon-plain-tag">// Init matrix led
Wire.begin(D1, D2);
matrix.begin(0x70);</pre><p></p>
<p align="left">Toujours dans la méthode d&rsquo;initialisation, enregistrons un premier MessageCallback que nous allons nommer « SetPixel ». Ce MessageCallback permettra d&rsquo;allumer ou éteindre un pixel de la matrice.</p>
<p align="left">Nous le déclarons avec 4 paramètres d&rsquo;entrée :</p>
<ul>
<li>x et y pour définir la position du pixel à piloter</li>
<li>state : un boolean indiquant si le pixel doit être allumé ou éteint</li>
<li>clear: un paramètre optionnel de type boolean pour indiquer si il faut effacer la matrice avant (par défaut « true »)</li>
</ul>
<p>Comme vous le constatez ci-dessous, le code de ce MessageCallback commence par effacer la matrice si le dernière paramètre (<em>clear</em>) n&rsquo;est pas défini (car optionnel) ou si il est à « <em>true</em> » en invoquant la méthode « <em>matrix.clear()</em>« .</p>
<p>Ensuite on appelle la méthode « <em>drawPixel</em> » en passant les arguments de notre MC, à savoir le « x », le « y » et le « state ».</p>
<p>Si le paramètre « <em>state</em> » est vrai, on allume le pixel en vert (LED_GREEN) sinon on l&rsquo;éteint (LED_OFF).</p>
<p>Le code est donc :</p>
<p></p><pre class="crayon-plain-tag">// Register SetPixel
constellation.registerMessageCallback("SetPixel",
  MessageCallbackDescriptor().setDescription("Set Pixel On or Off").addParameter&lt;int&gt;("x").addParameter&lt;int&gt;("y").addParameter&lt;bool&gt;("state", "ON or OFF").addOptionalParameter&lt;bool&gt;("clear", true, "Clear matrix before drawn"),
  [](JsonObject&amp; json) {
    if(json["Data"].size() &lt; 4 || json["Data"][3].as&lt;bool&gt;()) {
      matrix.clear();
    }
    matrix.drawPixel(json["Data"][0].as&lt;int&gt;(), json["Data"][1].as&lt;int&gt;(), json["Data"][2].as&lt;bool&gt;() ? LED_GREEN : LED_OFF);  
    matrix.writeDisplay();
 });</pre><p></p>
<p align="left">Comme il s&rsquo;agit d&rsquo;une matrice bicolore, on peut allumer chaque pixel en vert ou en rouge, ou bien en vert ET en rouge ce qui donne du orange.</p>
<p align="left">Nous allons donc ajouter un deuxième MessageCallback que nous nommerons « SetPixelColor » sensiblement identique au premier, sauf que le paramètre « state » est maintenant de type  « int » et se nomme « color ».</p>
<p align="left">D&rsquo;après les constantes de la librairie d&rsquo;Adafruit, LED_GREEN = 2, LED_OFF = 0, le rouge (LED_RED) = 1 et le Orange/Jaune = 2. Le code est donc :</p>
<p></p><pre class="crayon-plain-tag">// Register SetPixelColor
constellation.registerMessageCallback("SetPixelColor",
  MessageCallbackDescriptor().setDescription("Set Pixel On or Off").addParameter&lt;int&gt;("x").addParameter&lt;int&gt;("y").addParameter&lt;int&gt;("color", "0 = Off, 1 = red, 2 = orange, 3 = green").addOptionalParameter&lt;bool&gt;("clear", true, "Clear matrix before drawn"),
  [](JsonObject&amp; json) {
    if(json["Data"].size() &lt; 4 || json["Data"][3].as&lt;bool&gt;()) {
      matrix.clear();
    }
    matrix.drawPixel(json["Data"][0].as&lt;int&gt;(), json["Data"][1].as&lt;int&gt;(), json["Data"][2].as&lt;int&gt;());  
    matrix.writeDisplay();
 });</pre><p></p>
<p align="left">Pour finir, ajoutons un troisième et dernier MessageCallback pour effacer l&rsquo;écran :</p>
<p></p><pre class="crayon-plain-tag">// Register Clear
constellation.registerMessageCallback("Clear",
  MessageCallbackDescriptor().setDescription("Clear matrix"),
  [](JsonObject&amp; json) {
    matrix.clear();
    matrix.writeDisplay();
 });</pre><p></p>
<p align="left">Vous pouvez téléverser le programme puis en vous connectant sur le <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallbacks Explorer</a> de la Console Constellation vous constaterez que les trois MessageCallbacks sont bien référencés dans votre Constellation.</p>
<p align="left">Votre ESP8266 est prêt ! Vous pouvez tester les MC directement depuis la Console pour vous assurer que tout fonctionne correctement :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-48.png"><img class="colorbox-4532"  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-48.png" alt="MessageCallbacks Explorer" width="404" height="284" border="0" /></a></p>
<p style="text-align: left;" align="center">Par exemple en invoquant le MessageCallback « SetPixel » avec<em> x=1</em>,<em> y=2</em> et <em>state=true</em>, le résultat est instantanément visible sur la matrice :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1040131-1.jpg"><img class="colorbox-4532"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Test du package virtuel" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1040131_thumb-1.jpg" alt="Test du package virtuel" width="404" height="304" border="0" /></a></p>
<h3 align="left">Etape 3 : créer une page Web</h3>
<p align="left">Maintenant que notre matrice connectée est prête, créons une page Web pour pouvoir la piloter.</p>
<p align="left">Pour cela nous allons créer une grille de 8&#215;8 représentant la matrice sur laquelle nous pourrions dessiner à la sourie ou au droit (touch) avec la possibilité de choisir la couleur entre le verte, le roue et le orange. Nous allons utiliser le Canvas HTML5 pour cela.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-49.png"><img class="colorbox-4532"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Page de contrôle en HTML5/JS" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-49.png" alt="Page de contrôle en HTML5/JS" width="204" height="278" border="0" /></a></p>
<p align="left">Inutile d&rsquo;utiliser le framework AngularJS pour cela, nous utiliserons la librairie Constellation pour Javascript.</p>
<p align="left">Commençons donc par créer une page HTML classique dans laquelle ajoutons dans l’entête <em>&lt;head&gt;</em> les scripts nécessaires pour <a href="/getting-started/connectez-vos-pages-web-constellation/">connecter la page à Constellation</a> :</p>
<p></p><pre class="crayon-plain-tag">&lt;meta name="viewport" content="width=device-width" /&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.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;</pre><p></p>
<p>Nous avons également ajouté la meta « viewport » pour adapter proprement notre page sur un mobile.</p>
<p>Dans le corps <em>&lt;body&gt;</em> de notre page ajoutons un canvas pour la grille, la liste des couleurs possibles et un bouton pour effacer l&rsquo;écran :</p>
<p></p><pre class="crayon-plain-tag">&lt;canvas id="canvas" width="400" height="400"&gt;&lt;/canvas&gt;

&lt;ul id="colors"&gt;
    &lt;li&gt;&lt;a href="#" data-colorId="0" data-color="white"&gt;Eraser&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="#" data-colorId="1" data-color="red" class="selected"&gt;Rouge&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="#" data-colorId="2" data-color="orange"&gt;Orange&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="#" data-colorId="3" data-color="green"&gt;Vert&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;button id="clear"&gt;Clear&lt;/button&gt;</pre><p></p>
<p>Vous remarquerez que nous stockons dans des attributs « data- » l&rsquo;ID de la couleur de la matrice de LED (0 à 3) et le nom de la couleur HTML équivalente (ex. red = 1). La couleur sélectionnée est repérée par la classe CSS « selected ».</p>
<p>Pour la mise en page justement, ajoutez le code CSS dans une balise <em>&lt;style&gt;</em> dans la page :</p>
<p></p><pre class="crayon-plain-tag">body {
    text-align:center; 
    background:#e9e9e9
}        
#canvas {
    margin:0 auto 20px auto; 
    display:block; 
    background:#fff; 
    cursor:crosshair
}
#colors {
    list-style:none; 
    margin:0 0 20px 0;
    padding:0
}
#colors li {
    display:inline-block
}
#colors a {
    display:inline-block; 
    width:50px; 
    height:50px; 
    margin-right:10px; 
    text-indent:-4000px; 
    overflow:hidden; 
    border-radius:50%
}
#colors a.selected {
    border:2px solid #000; 
    width:45px; 
    height:45px
}
button {
  border-radius: 8px;
  padding: 10px 20px 10px 20px;
  color: #ffffff;
  font-size: 20px;
  background: #808080;
}</pre><p></p>
<p>Enfin, passons au code Javascript de notre page. Ouvrez une balise &lt;script&gt; pour ajouter le code ci-dessous.</p>
<p>On commence tout d&rsquo;abord par déclarer la taille de notre matrice (8&#215;8) ainsi que le client « consumer » de Constellation en spécifiant l&rsquo;adresse/port de votre serveur Constellation ainsi qu&rsquo;une clé d&rsquo;accès pour pouvoir s&rsquo;y connecter.</p>
<p>Ensuite on déclare les variables globales de notre script.</p>
<p></p><pre class="crayon-plain-tag">// Config
var matrixWidth = 8, matrixHeight = 8;
var constellation = $.signalR.createConstellationConsumer("http://x.x.x.x:8088/", "xxxxxxxxxxxxxx", "WebMatrixController"); 

// Global variables
var pixels = [];
var selectedColor = {};
var mouseDown = false;
var canvas, context;
var boxWidth, boxHeight;</pre><p></p>
<p>On ajoute une fonction « initBoard » pour dessiner notre grille dans le canvas HTML et initialiser le tableau « pixels » qui contiendra l&rsquo;état de la matrice :</p>
<p></p><pre class="crayon-plain-tag">function initBoard() {
    // Init the pixels array
    pixels = [];
    for (var x = 0; x &lt;= matrixWidth; x++) {
        pixels[x] = [];
        for (var y = 0; y &lt;= matrixHeight; y++) {
            pixels[x][y] = 0;
        }
    }
    // Create the vertical lines
    for (var x = 0; x &lt;= matrixWidth; x++) {
        context.moveTo(1 + x * boxWidth, 0);
        context.lineTo(1 + x * boxWidth, canvas.height());
    }
    // Create the horizontal lines
    for (var x = 0; x &lt;= matrixHeight; x++) {
        context.moveTo(0, 1 + x * boxHeight);
        context.lineTo(canvas.width(), 1 + x * boxHeight);
    }
    // Draw lines
    context.lineWidth=1;
    context.strokeStyle = "black";
    context.stroke();
}</pre><p></p>
<p>On déclare ensuite une fonction « setPixel » qui se chargera à la fois de dessiner dans le canvas la couleur sélectionnée du pixel mais également d&rsquo;envoyer un message à notre ESP8266 pour invoquer le MessageCallback « SetPixelColor » en spécifiant la position du pixel et la couleur sélectionnée. Le tableau « pixel » permet de n&rsquo;envoyer le message que si la couleur a changé pour éviter d’envoyer plusieurs fois le même ordre.</p>
<p></p><pre class="crayon-plain-tag">function setPixel(x, y) {
    if(pixels[x][y] != selectedColor.color) {
        // Save pixel
        pixels[x][y] = selectedColor.color;
        // Draw on canvas
        context.fillStyle=selectedColor.color;
        context.fillRect(2 + boxWidth * x, 2 +  boxHeight * y, boxWidth - 2, boxHeight - 2);
        // SetPixelColor on ESP8266
        constellation.server.sendMessage({ Scope: 'Package', Args: ['MatrixDesign'] }, 'SetPixelColor', [ x, y, selectedColor.id ]);  
    }
}</pre><p></p>
<p>Pour l’interaction nous ajoutons trois méthodes :</p>
<ul>
<li>moveStart : lorsque la sourie/le doigt (si touch) est posé sur la grille</li>
<li>move : lorsque la sourie/le doigt (si touch) se déplace sur la grille</li>
<li>moveEnd : lorsque la sourie/le doigt (si touch) « quitte » la grille</li>
</ul>
<p>Dans les deux premières méthodes l&rsquo;idée est de déduire la position du pixel en fonction des arguments de l&rsquo;événement levé afin d&rsquo;invoquer la méthode « setPixel » que nous avons déclarée ci-dessus qui se chargera à son tour de dessiner la bonne couleur dans le canvas tout envoyant le message à notre ESP8266.</p>
<p></p><pre class="crayon-plain-tag">function moveStart(e, mobile, obj) {
    mouseDown = true;
    // Determine the pixel coordinates
    var event = mobile ? e.originalEvent : e;
    var x = Math.trunc((event.pageX - obj.offsetLeft) / boxWidth);
    var y = Math.trunc((event.pageY - obj.offsetTop) / boxHeight);
    // Block mobile event
    if (mobile) {
        e.preventDefault();
    }        
    // Set pixel
    setPixel(x, y);
}

function move(e, mobile, obj) {
    if (mouseDown) {
        // Determine the pixel coordinates
        var pageX = mobile ? e.originalEvent.targetTouches[0].pageX : e.pageX;
        var pageY = mobile ? e.originalEvent.targetTouches[0].pageY : e.pageY;
        var x = Math.trunc((pageX - obj.offsetLeft) / boxWidth);
        var y = Math.trunc((pageY - obj.offsetTop) / boxHeight);
        // Block mobile event                
        if (mobile) {
            e.preventDefault();
        }     
        // Set pixel
        setPixel(x, y);
    }
}

function moveEnd() {
    mouseDown = false;
}</pre><p></p>
<p>Il ne reste plus qu&rsquo;à écrire le code de démarrage de notre page.</p>
<p>On commence par initialiser nos variables globales (instance et taille du canvas, contexte de rendu 2D du canvas). On initialise ensuite la grille par notre méthode « <em>iniBoard</em> » et on se connecte à notre Constellation (<em>constellation.connection.start()</em>).</p>
<p>Pour chaque couleur de notre liste, on affecte la couleur du background définie par son attribut <em>data-color</em> et on ajoute un handler au click de façon à récupéré dans l&rsquo;objet « selectedColor » la couleur sélectionnée par l&rsquo;utilisateur.</p>
<p>On affecte également un handler au click du bouton « Clear » pour effacer le Canvas et invoquer le MessageCallback « <em>clear</em> » sur notre ESP8266 afin de vider la matrice.</p>
<p>Et pour finir on attache des handlers aux événements de la souris (<em>mouseDown</em>, <em>mouseMove</em> et <em>mouseUp</em>) et du tactile (<em>touchStart</em>, <em>touchMove</em> et <em>touchEnd</em>) sur nos tris méthodes ci-dessus pour gérer les interactions avec notre grille.</p>
<p></p><pre class="crayon-plain-tag">// On page load
$(document).ready(function() {
    // Variables
    canvas = $("#canvas");
    context = canvas[0].getContext('2d');
    boxWidth = (canvas.width() - 2) / matrixWidth;
    boxHeight = (canvas.height() - 2) / matrixHeight;
    // Init board
    initBoard();            
    // Constellation connection
    constellation.connection.stateChanged(function (change) {
        if (change.newState === $.signalR.connectionState.connected) {
            console.log("Je suis connecté !");
        }
    });                
    constellation.connection.start();            
    // For each color buttons
    $("#colors a").each(function() {
        // Set background color
        $(this).css("background", $(this).attr("data-color"));
        // Attach handler on click
        $(this).click(function() {
            // Load the selected color
            selectedColor.id = $(this).attr("data-colorId");
            selectedColor.color = $(this).attr("data-color");
            // Set the selected class
            $("#colors a").removeAttr("class", "");
            $(this).attr("class", "selected");
            return false;                    
        });
        // Load the selected color
        if( $(this).attr("class") == "selected") {
            selectedColor.id = $(this).attr("data-colorId");
            selectedColor.color = $(this).attr("data-color");
        }
    });            
    // Clear button
     $("#clear").click(function() {
        // Clear the matrix
        constellation.server.sendMessage({ Scope: 'Package', Args: ['MatrixDesign'] }, 'Clear', {});
        // Clear the canvas
        var s = document.getElementById ("canvas");
        var w = s.width;    
        s.width = 10;
        s.width = w;
        // Redraw the board
        initBoard();                
     });             
     // Attach Touch events
    canvas.bind('touchstart', function(e) { moveStart(e, true, this); });
    canvas.bind('touchmove', function(e) { move(e, true, this); });
    $(this).bind('touchend', function() { moveEnd(); });
    // Attach Mouse events
    canvas.mousedown(function(e) {  moveStart(e, false, this); });
    canvas.mousemove(function(e) { move(e, false, this); });
    $(this).mouseup(function() { moveEnd(); });
});</pre><p></p>
<p>Et voilà notre page HTML est prête ! Lancez-la dans notre navigateur et profitez du résultat.</p>
<h3 align="left">Demos</h3>
<p>Quelques démonstrations animées &#8230;.</p>
<p align="center"><img class="colorbox-4532"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="ESP Matrix Controller" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/ESPMatrix1-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/05/ESPMatrix1.gif" alt="ESP Matrix Controller" width="400" height="225" border="0" /></p>
<p align="center"><img class="colorbox-4532"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="ESPMatrix3" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/ESPMatrix3-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/05/ESPMatrix3.gif" alt="ESPMatrix3" width="400" height="225" border="0" /></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/pilotez-une-matrice-de-led-avec-une-page-web/">Pilotez une matrice de LED avec une page Web en temps réel</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/tutorials/pilotez-une-matrice-de-led-avec-une-page-web/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Un potentiomètre connecté pour contrôler le volume de votre PC, la luminosité de l&#8217;écran et bien plus encore</title>
		<link>https://developer.myconstellation.io/tutorials/potentiometre-connecte-pour-controler-le-volume-ou-la-luminosite/</link>
					<comments>https://developer.myconstellation.io/tutorials/potentiometre-connecte-pour-controler-le-volume-ou-la-luminosite/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 10 May 2017 09:15:44 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[WindowsControl]]></category>
		<category><![CDATA[Rotary Encoder]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=4549</guid>

					<description><![CDATA[<p>Dans ce tutoriel nous allons créer un encodeur rotatif connecté pour piloter tout type de chose comme le volume ou la luminosité de vos ordinateurs Windows par exemple grâce au package WindowsControl. Pour cela nous allons utiliser un encodeur rotatif</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/potentiometre-connecte-pour-controler-le-volume-ou-la-luminosite/">Un potentiomètre connecté pour contrôler le volume de votre PC, la luminosité de l&rsquo;écran et bien plus encore</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 encodeur rotatif connecté pour piloter tout type de chose comme le volume ou la luminosité de vos ordinateurs Windows par exemple grâce au package <a href="/package-library/windowscontrol/">WindowsControl</a>.</p>
<p align="center"><img class="colorbox-4549"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Volume2" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/Volume2-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/05/Volume2.gif" alt="Volume2" width="400" height="225" border="0" /></p>
<p>Pour cela nous allons utiliser un encodeur rotatif aussi nommé potentiomètre angulaire comme le KY-040 (comptez entre 50 cts et 2 euros pièce) avec un ESP8266 connecté en Wifi à votre Constellation.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/ky040.jpg"><img class="colorbox-4549"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="KY-040" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/ky040_thumb.jpg" alt="KY-040" width="240" height="184" border="0" /></a></p>
<h3>Prérequis</h3>
<p>Pour réaliser ce tutoriel, il nous faut :</p>
<ul>
<li>Un ESP8266, ici nous utilisons un D1 Mini Pro</li>
<li>Un encodeur rotatif KY-040</li>
<li>Un <a href="/getting-started/installer-constellation/">serveur Constellation</a></li>
<li>Le package <a href="/package-library/windowscontrol/">WindowsControl </a>déployé sur au moins une <a href="/getting-started/ajouter-des-sentinelles/">sentinelle Windows</a></li>
</ul>
<h3>Etape 1 : créer un encodeur rotatif connecté</h3>
<p>Le KY-040 a 5 pins : deux pour l&rsquo;alimentation (5V et Gnd), deux pour l&rsquo;encodeur rotatif (CLK et DT) et un dernier pour le bouton (lorsque l&rsquo;on pousse sur le potentiomètre).</p>
<p>Nous allons donc tout simplement connecter les pin 5V et Gnd sur le port 5V et Gnd de notre D1 Mini Pro. Les pins CLK et DT respectivement sur les ports D1 et D2 et le switch (pin SW) sur le port D3.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/DSC_0019.jpg"><img class="colorbox-4549"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="ESP RotaryController" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/DSC_0019_thumb.jpg" alt="ESP RotaryController" width="304" height="173" border="0" /></a></p>
<p>Vous pouvez optionnellement habiller le potentiomètre avec un bouchon, ci-dessous récupéré sur une veille chaine Hifi :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/DSC_0014.jpg"><img class="colorbox-4549"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="ESP RotaryController avec un bouchon" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/DSC_0014_thumb.jpg" alt="ESP RotaryController avec un bouchon" width="304" height="173" border="0" /></a></p>
<p style="text-align: left;" align="center">Votre encodeur est prêt, il ne reste plus qu&rsquo;à le programmer.</p>
<h3>Etape 2 : programmer l’ESP8266</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 “RotaryController”.</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", "RotaryController", "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>Maintenant que la coquille de notre package virtuel sur ESP8266 est prête, ajoutons une librairie pour interpréter les signaux du KY-040 (inputs CLK et DT) pour connaitre et mesurer le mouvement du potentiomètre.</p>
<p>Dans le gestionnaire de bibliothèque (menu<em> Croquis &gt; Inclure une bibliothèque</em>), installez la librairie “<a href="https://www.pjrc.com/teensy/td_libs_Encoder.html">Encoder</a>” de Paul Stoffregen et ajoutez-la dans votre code avant de déclarer une variable de type “Encoder” que nous nommerons “encoder”.</p>
<p>Pour rappel nous avons connecté le KY-040 sur les ports D1 (CLK) et D2 (DT) et le bouton sur D3 (SW) :</p>
<p></p><pre class="crayon-plain-tag">#include &lt;Encoder.h&gt;

Encoder encoder(D1, D2);
int pinSW = D3;</pre><p></p>
<p>Le bouton poussoir du potentiomètre est un simple bouton poussoir connecté en « pull-up » (à la masse). Il n&rsquo;est donc pas traité par la librairie « Encoder » et sera interprété avec un simple « <em>digitalRead</em>« .</p>
<p>Toujours dans l’entête de votre code, configurons les valeurs par défaut suivantes :</p>
<p></p><pre class="crayon-plain-tag">// Default values
static String target = "WindowsControl";
static String mcbUp = "VolumeUp";
static String mcbDown = "VolumeDown";
static String mcbPush = "Mute";</pre><p></p>
<p>Ici on configure où on va envoyer le message, par défaut au scope du package « WindowsControl ».</p>
<p>A ce package « WindowsControl » on enverra :</p>
<ul>
<li>Un message « VolumeUp » si le potentiomètre « monte »</li>
<li>Un message « VolumeDown » si le potentiomètre « descend »</li>
<li>Un message « Mute » si on pousse le potentiomètre « monte »</li>
</ul>
<p>C’est à dire que par défaut, notre potentiomètre connecté contrôlera le volume des PC Windows où le package WindowsControl est déployé. On pourra par la suite personnaliser ces actions dans les settings comme nous le verrons ci-dessous.</p>
<p>Entrons maintenant dans le code de la méthode « <em>setup()</em>« . Ajoutons la ligne suivante pour initialiser l&rsquo;entrée D3 où est connecté le bouton poussoir :</p>
<p></p><pre class="crayon-plain-tag">// Init I/O
pinMode(pinSW, INPUT_PULLUP);</pre><p></p>
<p>Enregistrons ensuite un MessageCallback « ReloadSettings » pour permettre de recharger la configuration « à la volée » sans devoir redémarrer notre EPS. Ce MessageCallback se charge d&rsquo;invoquer la fonction « <em>loadSettings()</em>« .</p>
<p>De plus, à la fin de notre méthode « setup() » invoquons cette méthode « <em>loadSettings()</em> » pour charger la configuration au démarrage.</p>
<p></p><pre class="crayon-plain-tag">// ReloadSettings MessageCallback
constellation.registerMessageCallback("ReloadSettings", MessageCallbackDescriptor().setDescription("Reload the settings"),
  [](JsonObject&amp; json) {
    loadSettings();
    constellation.writeInfo("Settings reloaded");
 });
constellation.declarePackageDescriptor();

// Load settings on start
loadSettings();</pre><p></p>
<p>Cette méthode « <em>loadSettings()</em> » récupère les settings sur le serveur Constellation et écrase la valeur par défaut si le setting est défini sur le serveur.</p>
<p></p><pre class="crayon-plain-tag">void loadSettings() {
  JsonObject&amp; settings = constellation.getSettings();
  if(settings.containsKey("Target")) {
    target = String(settings["Target"].asString());
  }
  if(settings.containsKey("OnUp")) {
    mcbUp = String(settings["OnUp"].asString());
  }
  if(settings.containsKey("OnDown")) {
    mcbDown = String(settings["OnDown"].asString());
  }
  if(settings.containsKey("OnPush")) {
    mcbPush = String(settings["OnPush"].asString());
  }
}</pre><p></p>
<p>De ce fait par défaut, notre potentiomètre connecté invoque le MessageCallback « VolumeUp » sur le package « WindowsControl » lorsque l&rsquo;on tourne à droite, « VolumeDown » à gauche ou « Mute » lorsqu&rsquo;on appuie dessus. Il suffira d&rsquo;ajouter/modifier les settings de notre package virtuel depuis la Console Constellation pour modifier ces actions.</p>
<p>Il ne reste plus qu&rsquo;à définir le code de la boucle principale, la fonction « <em>loop()</em>« .</p>
<p>Celle-ci lit la valeur de l&rsquo;encodeur rotatif et envoi les messages dans Constellation en cas de montée ou de descente. La boucle lit également la valeur de l&rsquo;entrée D3 pour envoyer le message en cas d&rsquo;appui sur le potentiomètre.</p>
<p></p><pre class="crayon-plain-tag">void loop(void) {
  constellation.loop();

  static long lastValue = -1;
  long value = encoder.read();
  if (value != lastValue &amp;&amp; abs(value - lastValue) &gt;= 4) {
    if(lastValue &gt; value) {
      Serial.println("Up");
      constellation.sendMessage(Package, target.c_str(), mcbUp.c_str(), "{}");
    }
    else {
      Serial.println("Down");
      constellation.sendMessage(Package, target.c_str(), mcbDown.c_str(), "{}");
    }    
    lastValue = value;
  }
  
  static int lastButtonState = LOW; 
  int buttonState = digitalRead(pinSW);
  if (buttonState != lastButtonState &amp;&amp; buttonState == LOW) {
     Serial.println("Push");
     constellation.sendMessage(Package, target.c_str(), mcbPush.c_str(), "{}");
  }
  lastButtonState = buttonState;  
}</pre><p></p>
<p>Et voilà votre potentiomètre connecté est opérationnel !</p>
<h3>Démos</h3>
<h4>Piloter le volume de vos PC</h4>
<p>Une fois le programme téléversé sur votre ESP8266, vous pouvez tourner le potentiomètre à gauche ou à droite pour diminuer ou augmenter le volume. Si vous appuyez sur le bouton, vous alternez entre les modes « mute/un-mute ».</p>
<p align="center"><img class="colorbox-4549"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="MultiSentinels" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/MultiSentinels-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/05/MultiSentinels.gif" alt="MultiSentinels" width="400" height="225" border="0" /></p>
<p style="text-align: left;" align="center">Par contre si vous avez déployé le package <a href="/package-library/windowscontrol/">WindowsControl </a>sur plusieurs de vos sentinelles, vous <strong>contrôlerez simultanément le volume sur TOUTES vos sentinelles</strong> comme le montre l&rsquo;animation ci-dessus.</p>
<p style="text-align: left;" align="center">Souvenez-vous du <a href="/concepts/instance-package-versioning-et-resolution/">concept d&rsquo;instance</a>, ici notre ESP8266 envoie un message au scope « WindowsControl », c&rsquo;est donc TOUTES les instances du package « WindowsControl » qui recevrons le message.</p>
<h4>Piloter le volume d’un PC en particulier</h4>
<p>Pour contrôler le volume d&rsquo;un PC en particulier, il faut envoyer les messages au scope d&rsquo;une instance du « WindowsControl » en particulier.</p>
<p>Pour cela nous devez spécifier l&rsquo;instance selon la nomenclature suivante : « SENTINEL/Package ».</p>
<p>Par exemple, le nom de la sentinelle sur laquelle est déployée le package WindowsControl est « PC-SEB_UI ». Il faudra donc que j&rsquo;envoie les messages au package « PC-SEB_UI/WindowsControl » pour contrôler le volume de mon ordinateur « PC-SEB » et non de tous.</p>
<p>Comme nous avons créé un système personnalisable en se servant des settings Constellation, il me suffit, depuis la Console Constellation, d&rsquo;ajouter le setting que nous avons nommé « Target » pour définir le nom du scope où envoyer les messages :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-50.png"><img class="colorbox-4549"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Personnaliser les settings" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-50.png" alt="Personnaliser les settings" width="404" height="194" border="0" /></a></p>
<p style="text-align: left;" align="center">Et voilà, désormais je ne pilote que le volume de cette machine en particulier et non de toutes mes machines.</p>
<h4>Piloter la luminosité d’un PC</h4>
<p>Si on observe les MessageCallbacks du package <a href="/package-library/windowscontrol/">WindowsControl</a>, on constate qu&rsquo;il expose d&rsquo;autre MCs dont « BrightnessUp » et « BrightnessDown » pour augmenter ou diminuer la luminosité.</p>
<p>Avec notre code se base sur les settings, nous pouvons modifier le nom des MC à invoquer en ajoutant/modifiant les settings du package.</p>
<p>Ajoutons donc deux settings nommés « OnUp » et « OnDown » respectivement définis avec les valeurs « BrightnessUp » et « BrightnessDown ». Invoquons ensuite le MC « ReloadSettings » sur notre package virtuel ou bien appuyez sur le bouton « Reset » de votre ESP8266 pour le redémarrer et donc recharger les settings :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-51.png"><img class="colorbox-4549"  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-51.png" alt="image" width="404" height="214" border="0" /></a></p>
<p style="text-align: left;" align="center">Désormais notre potentiomètre connecté pilotera la luminosité :</p>
<p align="center"><img class="colorbox-4549"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Brightness" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/Brightness-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/05/Brightness.gif" alt="Brightness" width="400" height="225" border="0" /></p>
<h4>Pour aller plus loin …</h4>
<p>Comme vous l&rsquo;avez vu, notre potentiomètre est entièrement personnalisable car le nom des MC à invoquer en cas de montée, descente ou d&rsquo;appui sur le potentiomètre est personnalisable dans les settings.</p>
<p>Ici on pilote le volume ou la luminosité d&rsquo;un Windows grâce au package WindowsControl, mais on pourrait également piloter tout type de chose : l&rsquo;intensité d&rsquo;une lampe, le thermostat, le toit ouvrant d&rsquo;une voiture ou bien des valeurs de vos programmes ou pages Web, par exemple le slider d&rsquo;une page HTML !</p>
<p>Libre à votre imagination <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/potentiometre-connecte-pour-controler-le-volume-ou-la-luminosite/">Un potentiomètre connecté pour contrôler le volume de votre PC, la luminosité de l&rsquo;écran et bien plus encore</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/tutorials/potentiometre-connecte-pour-controler-le-volume-ou-la-luminosite/feed/</wfw:commentRss>
			<slash:comments>0</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[DHT11]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Capteur]]></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>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 

Served from: developer.myconstellation.io @ 2026-01-22 02:01:36 by W3 Total Cache
-->