﻿<?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 Lux - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/tag/lux/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/tag/lux/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Thu, 19 Apr 2018 05:09:28 +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 Lux - Constellation</title>
	<link>https://developer.myconstellation.io/tag/lux/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Synchroniser la lampe du bureau avec sa session Windows</title>
		<link>https://developer.myconstellation.io/tutorials/synchroniser-lampe-bureau-avec-session-windows/</link>
					<comments>https://developer.myconstellation.io/tutorials/synchroniser-lampe-bureau-avec-session-windows/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Sun, 14 May 2017 12:35:00 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Vera]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Z-Wave]]></category>
		<category><![CDATA[WindowsControl]]></category>
		<category><![CDATA[Lux]]></category>
		<category><![CDATA[LightSensor]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[StateObjectLink]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=4829</guid>

					<description><![CDATA[<p>L&#8217;un des avantages de Constellation est qu&#8217;il est très facile de faire « parler » des objets/systèmes entre eux. Dans ce tutoriel, nous allons lier notre lampe du bureau à notre session Windows. L&#8217;idée est très simple : lorsque vous déverrouillez (ou ouvrez) votre</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/synchroniser-lampe-bureau-avec-session-windows/">Synchroniser la lampe du bureau avec sa session Windows</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>L&rsquo;un des avantages de Constellation est qu&rsquo;il est très facile de faire « parler » des objets/systèmes entre eux. Dans ce tutoriel, nous allons lier notre lampe du bureau à notre session Windows.</p>
<p>L&rsquo;idée est très simple : lorsque vous déverrouillez (ou ouvrez) votre session Windows on allumera automatiquement la lampe du bureau et lorsque vous verrouillez (ou fermez) votre session, la lampe s&rsquo;éteindra automatiquement.</p>
<p align="center"><img loading="lazy" class="aligncenter wp-image-4833 size-full colorbox-4829" title="Demo" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/WindowsControl-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/05/WindowsControl.gif" alt="Demo" width="450" height="253" /></p>
<p>On peut même aller plus loin si vous avez un capteur de luminosité connecté pour n&rsquo;allumer la lampe que lorsqu&rsquo;il fait trop sombre.</p>
<h3>Prérequis</h3>
<ul>
<li>Un serveur Constellation</li>
<li>Une lampe pilotable par Constellation</li>
<li>Le package <a href="/package-library/windowscontrol/">WindowsControl</a> déployé sur la sentinelle de l&rsquo;ordinateur Windows à synchroniser avec la lampe</li>
<li>Optionnellement un capteur de luminosité connecté dans Constellation</li>
<li>Le SDK Constellation pour Visual Studio</li>
</ul>
<h3>Etape 1 : piloter une lampe par Constellation</h3>
<p>Bien entendu il faut d&rsquo;abord pouvoir piloter une lampe par Constellation pour réaliser ce tutoriel !</p>
<p>Vous pouvez par exemple piloter un relais depuis un Raspberry en créant un package Python ou bien depuis un Arduino ou un ESP8266 comme vu <a href="/tutorials/creer-un-relais-connecte/">dans ce tutoriel</a>. Il suffit de créer une fonction pilotant un relais (simple manipulation d&rsquo;une sortie digitale) et d&rsquo;exposer cette fonction comme <a href="/concepts/messaging-message-scope-messagecallback-saga/">MessageCallback</a>. On pourra ainsi invoquer votre méthode pour ouvrir et fermer le relais et donc piloter une lampe depuis n&rsquo;importe quel système connecté dans votre Constellation.</p>
<p align="center"><img loading="lazy" class="alignnone size-full wp-image-4599 colorbox-4829" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-58.png" alt="" width="350" height="198" srcset="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-58.png 454w, https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-58-300x170.png 300w" sizes="(max-width: 350px) 100vw, 350px" /></p>
<p>Autre solution utiliser une carte de relais connectée par USB qu&rsquo;on pilotera avec le package <a href="/package-library/relayboard/">RelayBoard</a>. Ce package expose des MC permettant d&rsquo;ouvrir ou fermer les relais et publie l&rsquo;état de chacun d&rsquo;entre eux comme StateObject. Il ne reste plus qu&rsquo;à connecter une lampe sur l&rsquo;un des relais.</p>
<p align="center"><img loading="lazy" class="alignnone size-full wp-image-3530 colorbox-4829" title="RelayBoard" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-143.png" alt="RelayBoard" width="176" height="180" /></p>
<p>On peut aussi utiliser des prises Wifi Belkin Wemo qu&rsquo;on connectera à Constellation avec le package <a href="/package-library/wemo/">Wemo</a>. Encore une fois ce package expose des MC permettant d&rsquo;allumer ou d’éteindre la charge connectée dessus et publie son état en tant que StateObject. Il suffit d&rsquo;y brancher une lampe !</p>
<p align="center"><img class="colorbox-4829"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Prise Wemo Insight" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/wemo.jpg" alt="Prise Wemo Insight" width="200" height="200" border="0" /></p>
<p>Dans la même idée, on peut utiliser des prises Somfy qu&rsquo;on connectera à Constellation avec le package <a href="/package-library/rfxcom/">RFXCOM </a>nécessitant une passerelle RFXcom connectée en USB. Le package expose un MessageCallback permettant d&rsquo;envoyer des ordres par radiofréquences aux équipements RTS (protocole Somfy) pour piloter par exemple des prises. Il n&rsquo;y a pas de retour d&rsquo;état sur ce protocole, donc il ne sera pas possible de récupérer son état mais on pourra allumer ou éteindre la prise et donc une lampe !</p>
<p align="center"><img class="colorbox-4829"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Prise Somfy" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/prise-telecommandee-interieure-variateur-100-w-rts-2401092-somfy.jpg" alt="Prise Somfy" width="200" height="200" border="0" /></p>
<p>Encore une autre possibilité, utiliser des prises ou des modules Z-Wave. Il faut pour cela un contrôleur Z-Wave qu&rsquo;on connectera à Constellation. Vous pouvez soit utiliser le package <a href="/package-library/jeedom/">Jeedom </a>ou soit le package <a href="/package-library/vera/">Vera</a>.</p>
<p align="center"><img class="colorbox-4829"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Prise Z-Wave AN158" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/an158.jpg" alt="Prise Z-Wave AN158" width="200" height="200" border="0" /></p>
<p>On pourrait également utiliser des lampes ou des ampoules connectées de la gamme Phillips Hue qu&rsquo;on connectera à Constellation grâce au package <a href="/package-library/hue/">Hue</a>.</p>
<p style="text-align: center;"><img loading="lazy" class="alignnone size-full wp-image-3598 colorbox-4829" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-166.png" alt="" width="350" height="175" srcset="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-166.png 350w, https://developer.myconstellation.io/wp-content/uploads/2016/10/image-166-300x150.png 300w" sizes="(max-width: 350px) 100vw, 350px" /></p>
<p>Pour ma part la lampe de mon bureau est contrôlée par une prise Z-Wave AN158 appairée sur une Vera Lite. Ce contrôleur Z-Wave est connecté à Constellation grâce au package <a href="/package-library/vera/">Vera</a>.</p>
<p>J&rsquo;ai donc dans ma Constellation des StateObjets pour chaque périphérique Z-Wave et des MessageCallbacks pour envoyer des ordres Z-Wave. Par exemple depuis le <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallbacks Explorer</a>, on retrouve le MC « <em>SetSwitchState</em> » permettant de définir l&rsquo;état d&rsquo;un switch (On/Off) Z-Wave.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-85.png"><img class="colorbox-4829"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="MessageCallbacks Explorer" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-85.png" alt="MessageCallbacks Explorer" width="454" height="169" border="0" /></a></p>
<p style="text-align: left;" align="center">Depuis l&rsquo;API.net il me suffit d&rsquo;invoquer le code suivant pour allumer le device #42 :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = 42, State = true });</pre><p></p>
<p>Vous pouvez appuyer sur le bouton <img loading="lazy" class="alignnone size-full wp-image-2961 colorbox-4829" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-112.png" alt="" width="25" height="22" /> pour obtenir les exemples de code pour chaque MessageCallback. Par exemple toujours pour allumer le device Z-Wave #42 depuis un Arduino :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage(Package, "Vera", "SetSwitchState", "{ 'DeviceID':42, 'State':true }");</pre><p></p>
<p>Bref il existe différente méthode de piloter une lampe (ou n&rsquo;importe quelle charge) depuis Constellation, soit en mode DIY en créant vous-même votre package réel (C#, Python, &#8230;) ou virtuel (Arduino, ESP8266, Gadgeteer, &#8230;) ou bien en utilisant des technologies telles RTS de Somfy, le Z-Wave, les lampes et ampoules Philips, les prises Wifi de Belkin, etc&#8230; avec les packages déjà disponibles dans le <a href="/plateforme/package-repository/">catalogue en ligne</a>.</p>
<p>Et quand bien même il n&rsquo;existe pas de connecteur Constellation pour piloter votre lampe, libre à vous de créer votre propre package créant ainsi la passerelle, le connecteur entre Constellation et votre lampe.</p>
<h3>Etape 2 : connaitre l&rsquo;état de la session avec le package WindowsControl</h3>
<p>Maintenant que nous avons un MessageCallback pour piloter la lampe du bureau, faut-il encore savoir si la session est ouverte ou non.</p>
<p>Pour cela vous avez dans le catalogue en ligne, le package <a href="/package-library/windowscontrol/">WindowsControl</a> qui expose différent MessageCallbacks pour verrouiller ou fermer une session, pour arrêter ou redémarrer l&rsquo;ordinateur, pour contrôler le volume ou la luminosité (comme vu <a href="/tutorials/potentiometre-connecte-pour-controler-le-volume-ou-la-luminosite/">dans ce tutoriel</a>).</p>
<p>Ce package produit également un StateObject nommé « SessionLocked » de type booléen qui indique si la session est verrouillée (ou fermée) ou non.</p>
<p>Il suffit donc de <a href="/getting-started/telecharger-et-deployer-des-packages-sur-vos-sentinelles/">déployer ce package</a> depuis la <a href="/constellation-platform/constellation-console/package-repository/">Console Constellation</a> sur la sentinelle UI du PC à synchroniser avec votre lampe. On suivra ainsi ce StateObject pour savoir quel est l&rsquo;état de votre session et réagir tout changement d&rsquo;état.</p>
<h3>Etape 3 : synchroniser la lampe avec la session en C#</h3>
<p>Passons au chose sérieuse, nous avons d&rsquo;un côté un StateObject nous indiquant si la session est ouverte ou non et un MessageCallback nous permettant d&rsquo;allumer ou d&rsquo;éteindre la lampe du bureau, reste juste à créer le lien.</p>
<p>Pour cela nous allons <a href="/getting-started/creez-votre-premier-package-constellation-en-csharp/">créer un package .NET en C#</a> depuis Visual Studio.</p>
<p>Dans la classe principale (<em>Program</em>), nous allons ajouter un <a href="/client-api/net-package-api/consommer-des-stateobjects/">StateObjectLink</a>, c&rsquo;est à dire une propriété dans notre code liée au StateObject représentant l&rsquo;état de la session en ajoutant les lignes :</p>
<p></p><pre class="crayon-plain-tag">[StateObjectLink("WindowsControl", "SessionLocked")]
public StateObjectNotifier SessionLocked { get; set; }</pre><p></p>
<p>Prenez garde toutefois, si vous avez déployé le package WindowsControl sur plusieurs sentinelles de votre Constellation, le StateObjectLink ci-dessus sera lié à plusieurs StateObjects et non au StateObject de votre ordinateur à scruter. L’unicité d’un StateObject est obtenu par le triplet : “Sentinel + Package + Nom” car un nom de StateObject est unique pour une <a href="https://developer.myconstellation.io/concepts/instance-package-versioning-et-resolution/#Sentinel_Package_Instance_de_package">instance de package</a> (couple Sentinel / Package), de même qu’un package est unique pour une sentinelle et qu’une sentinelle est unique dans une Constellation.</p>
<p>De ce fait pour lier la propriété « <em>SessionLocked</em> » au StateObject « <em>SessionLocked</em> » de votre ordinateur on écrira :</p>
<p></p><pre class="crayon-plain-tag">[StateObjectLink("PC-SEB_UI", "WindowsControl", "SessionLocked")]
public StateObjectNotifier Session { get; set; }</pre><p></p>
<p>Dans l&rsquo;exemple ci-dessus, la machine est nommée « PC-SEB » et donc le nom de sa sentinelle « PC-SEB_UI » étant donné que le package WindowsControl est déployé sur la Sentinelle UI d&rsquo;où le suffixe « _UI » dans le nom de la sentinelle. Vous pouvez bien entendu vérifier le nom exacte de votre sentinelle sur la Console Constellation.</p>
<p>Maintenant que l&rsquo;état de la session de notre PC est synchronisé dans cette propriété .NET de notre code C#, nous allons ajouter un « handler » pour réagir au changement d&rsquo;état :</p>
<p></p><pre class="crayon-plain-tag">this.SessionLocked.ValueChanged += (s, e) =&gt;
{
    if ((bool)this.SessionLocked.DynamicValue)
    {
        PackageHost.WriteInfo("Verrouillage de la session : fermeture de la lampe");
    }
    else
    {
        PackageHost.WriteInfo("Session déverrouillée : allumage de la lampe");
    }
};</pre><p></p>
<p>Maintenant pour allumer la lumière, il suffit d&rsquo;envoyer un message pour déclencher le MessageCallback permettant de contrôler votre lampe. Comme expliqué ci-dessus, dans mon cas, la lampe sur mon bureau est contrôlée par une prise Z-Wave AN158 pilotable par le package Vera via le MessageCallback « <em>SetSwitchState</em>« .</p>
<p>On crée donc <a href="/client-api/net-package-api/envoyer-des-messages-invoquer-des-messagecallbacks/">un proxy dynamique vers le package</a> Vera et on invoque le MC comme on invoquerait une méthode .NET en passant en paramètre un objet contenant l&rsquo;ID du device Z-Wave et l&rsquo;état souhaité :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = 42, State = true });</pre><p></p>
<p>Pour connaitre l&rsquo;ID du device Z-Wave on peut soit le rechercher dans le StateObjects Explorer et l&rsquo;écrire en dur dans notre code C#, ou soit ajouter un autre StateObjectLink afin de récupérer dynamiquement son Id (car contenu dans le StateObject du device).</p>
<p>Le code de notre package sera donc :</p>
<p></p><pre class="crayon-plain-tag">public class Program : PackageBase
{
    [StateObjectLink("Vera", "Lampe Bureau Seb")]
    public StateObjectNotifier LampeBureau { get; set; }

    [StateObjectLink("PC-SEB_UI", "WindowsControl", "SessionLocked")]
    public StateObjectNotifier SessionLocked { get; set; }

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

    public override void OnStart()
    {
        this.SessionLocked.ValueChanged += (s, e) =&gt;
        {
            if ((bool)this.SessionLocked.DynamicValue)
            {
                PackageHost.WriteInfo("Verrouillage de la session : fermeture de la lampe");
                PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = (int)this.LampeBureau.DynamicValue.Id, State = false });
            }
            else
            {
                PackageHost.WriteInfo("Session déverrouillée : allumage de la lampe");
                PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = (int)this.LampeBureau.DynamicValue.Id, State = true });
            }
        };
    }
}</pre><p></p>
<p>On peut maintenant lancer notre package en mode « Debug On Constellation » pour le tester depuis Visual Studio tout en le connectant dans votre Constellation :</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1675 aligncenter colorbox-4829" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-196.png" alt="" width="104" height="34" /></p>
<p>Vous pouvez tester le fonctionnel de votre package : on verrouille la session, la lampe s&rsquo;éteint, on la déverrouille, la lampe s&rsquo;allume !</p>
<p>Une fois votre package testé et validé, vous pouvez <a href="/constellation-platform/constellation-sdk/publier-package-visual-studio/">le publier</a> dans votre Constellation et le déployer sur une de vos sentinelles (<a href="/getting-started/creez-votre-premier-package-constellation-en-csharp/#Publier_son_package_dans_Constellation">voir le guide</a>).</p>
<h3>Etape 4 : ajouter un capteur de luminosité</h3>
<p>Jusqu&rsquo;à présent dès que la session est déverrouillée la lampe du bureau s&rsquo;allume et dès qu&rsquo;on la ferme elle s’éteint. Seulement en pleine journée ce n&rsquo;est peut être pas très judicieux d&rsquo;allumer la lumière !</p>
<p>Pour cela nous pouvons ajouter une condition supplémentaire basée sur la luminosité ambiante.</p>
<p>On pourrait utiliser un capteur sans fil du marché comme le Chacon DIO54783 connecté via le package RFXcom ou bien un capteur Z-Wave via le package Vera ou Jeedom. On peut aussi concevoir son propre capteur avec un Arduino ou un ESP8266 <a href="/tutorials/creer-un-capteur-de-luminosite-dans-une-prise-220v/">comme vu dans ce tutoriel</a> ou avec un Raspberry Pi <a href="/tutorials/un-capteur-de-luminosite-exterieur-pilote-par-raspberry/">comme vu ici</a>.</p>
<p style="text-align: center;"><a href="/tutorials/creer-un-capteur-de-luminosite-dans-une-prise-220v/"><img loading="lazy" class="alignnone wp-image-4818 colorbox-4829" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-84.png" alt="" width="351" height="312" srcset="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-84.png 454w, https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-84-300x266.png 300w" sizes="(max-width: 351px) 100vw, 351px" /></a></p>
<p style="text-align: center;"><a href="/tutorials/un-capteur-de-luminosite-exterieur-pilote-par-raspberry/"><img loading="lazy" class="alignnone wp-image-4749 size-full colorbox-4829" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1170883_thumb-1.jpg" alt="" width="354" height="227" srcset="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1170883_thumb-1.jpg 354w, https://developer.myconstellation.io/wp-content/uploads/2017/05/P1170883_thumb-1-300x192.jpg 300w" sizes="(max-width: 354px) 100vw, 354px" /></a></p>
<p>Dans notre article, prenons par exemple l&rsquo;un des deux capteurs ci-dessus qui publient chacun un StateObject nommé « Lux » composé de 3 propriétés : Broadband, IR et Lux.</p>
<p>Pour intégrer cette « information » dans notre code C#, ajoutons un StateObjectLink vers le StateObject « Lux » :</p>
<p></p><pre class="crayon-plain-tag">[StateObjectLink("LightSensor", "Lux")]
public StateObjectNotifier LuxSensor { get; set; }</pre><p></p>
<p>On peut maintenant modifier la condition d&rsquo;allumage avec un « else if » qui vérifiera que la luminosité est inférieure à un seuil qu&rsquo;on <a href="/client-api/net-package-api/settings/">va déclarer dans les settings</a> Constellation de façon à pouvoir modifier cette valeur à la volée depuis la Console Constellation :</p>
<p></p><pre class="crayon-plain-tag">else if (this.LuxSensor.DynamicValue.Lux &lt; PackageHost.GetSettingValue&lt;int&gt;("DaylightThreshold"))</pre><p></p>
<p>Bien entendu comme tout setting, il est vivement recommandé de le déclarer dans le <a href="/concepts/package-manifest/">manifeste du package</a> (le fichier <em>PackageInfo.xml</em>). De plus on pourra y définir la valeur par défaut ici fixée à 50 (lux) :</p>
<p></p><pre class="crayon-plain-tag">&lt;Settings&gt;
  &lt;Setting name="DaylightThreshold" type="Int32" defaultValue="50" description="Seuil de luminosité minimale pour l'allumage de la lampe du bureau" /&gt;
&lt;/Settings&gt;</pre><p></p>
<p>Pour finir, prenons le cas où la session est déjà déverrouillée et la soirée arrivant, la luminosité passe en dessous du seuil : il faut alors allumer la lumière bien que l&rsquo;état de la session n&rsquo;a pas changé !</p>
<p>Pour cela nous allons ajouter un « handler » pour réagir à chaque mise à jour du StateObject « Lux » du capteur de luminosité. A chaque nouvelle mesure, si la valeur est inférieure au seuil défini dans les settings et que la session est bien déverrouillée, on allumera la lumière :</p>
<p></p><pre class="crayon-plain-tag">this.LuxSensor.ValueChanged += (s, e) =&gt;
{
    if (e.NewState.DynamicValue.Lux &lt; PackageHost.GetSettingValue&lt;int&gt;("DaylightThreshold") &amp;&amp; (bool) this.SessionLocked.DynamicValue == false)
    {
        PackageHost.WriteInfo("Session déverrouillée à la tombée de la nuit : allumage de la lampe");
        PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = (int)this.LampeBureau.DynamicValue.Id, State = true });
    }
};</pre><p></p>
<p>Ainsi notre lumière de bureau est maintenant synchronisée à notre session et ne s&rsquo;allumera que si la luminosité est faible. Elle sera donc éteinte dès qu&rsquo;on ferme ou verrouille la session et s&rsquo;allumera si la luminosité baisse sous le seuil défini dans les settings alors que la session est déjà déverrouillée ou vient d&rsquo;être déverrouillée.</p>
<h3>Etape 5 : fermer la lampe en cas de déconnexion du PC</h3>
<p>Pour vraiment aller au fond des choses il y a encore un cas à gérer : que faire si le PC s’arrête proprement ou brutalement. En somme l&rsquo;idée est de fermer la lampe si le PC est déconnecté de Constellation, que ce soit suite à un arrêt de l&rsquo;ordinateur, un crash, une déconnexion quelconque, etc..</p>
<p>Pour savoir si le PC est bien connecté on va surveiller l&rsquo;état de la sentinelle UI de votre PC. Pour cela il faut se connecter sur le hub de contrôle.</p>
<p>L&rsquo;utilisation du hub de contrôle depuis un package C# est expliqué en détail <a href="/client-api/net-package-api/controlmanager/">dans cet article </a>que je vous recommande de lire.</p>
<p>La première étape consiste donc à déclarer dans le <a href="/concepts/package-manifest/">manifeste du package</a> (le fichier <em>PackageInfo.xml</em>) l&rsquo;utilisation du hub de contrôle par votre package en ajoutant l&rsquo;attribut suivant sur la balise <em>Package</em> :</p>
<p></p><pre class="crayon-plain-tag">EnableControlHub="true"</pre><p></p>
<p>De plus il faut également, sur votre package, définir une <a href="/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">clé d&rsquo;accès ayant les droits d&rsquo;accès au hub de contrôle</a>. Vous pouvez vérifier la bonne connexion au hub de contrôle dans votre code par la propriété : « <em>PackageHost.HasControlManager</em>« .</p>
<p>Une fois connecté au hub de contrôle on va demander à recevoir les mises à jour des statuts des sentinelles de notre Constellation par la ligne :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.ControlManager.RequestSentinelUpdates();</pre><p></p>
<p>Cela nous permet ensuite d&rsquo;attacher un « handler » qu&rsquo;on filtrera sur notre sentinelle (ici nommée « PC-SEB_UI »). On stockera dans la variable « pcConnected » un booléen indiquant si la sentinelle de notre PC est connectée ou non. Si notre sentinelle n&rsquo;est pas/plus connectée, on fermera immédiatement la lampe du bureau.</p>
<p></p><pre class="crayon-plain-tag">PackageHost.ControlManager.SentinelUpdated += (s, e) =&gt;
{
    if (e.Sentinel.Description.SentinelName == "PC-SEB_UI")
    {
        this.pcConnected = e.Sentinel.IsConnected;
        PackageHost.WriteInfo("Le PC de Seb est '{0}'", e.Sentinel.IsConnected ? "connecté" : "déconnecté");
        if (!this.pcConnected)
        {
            // Éteindre la lampe si le PC est déconnecté !
            PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = (int)this.LampeBureau.DynamicValue.Id, State = false });
        }
    }
};</pre><p></p>
<p>De plus, dans la condition d&rsquo;allumage, on rajoutera le fait de vérifier que le PC est bien connecté avant de prendre la décision d&rsquo;allumer la lampe :</p>
<p></p><pre class="crayon-plain-tag">else if (this.pcConnected &amp;&amp; this.LuxSensor.DynamicValue.Lux &lt; PackageHost.GetSettingValue&lt;int&gt;("DaylightThreshold"))</pre><p></p>
<p>Et voilà, notre package est opérationnel ! La lampe est parfaitement synchronisée avec l&rsquo;état de notre session Windows en tenant compte de la luminosité ambiante et des différents cas de figure pouvant apparaître, comme le redémarrage, l’arrêt ou le crash de notre PC !</p>
<p>Le code final est :</p>
<p></p><pre class="crayon-plain-tag">public class Program : PackageBase
{
    // Nom de la sentinelle Windows à syncrhoniser avec la lampe
    private const string SEB_PC_SENTINEL_NAME = "PC-SEB_UI";
    
    // PC Connecté? oui ou non !
    private bool pcConnected = false;

    // Lien vers le SO de la lampe du bureau
    [StateObjectLink("Vera", "Lampe Bureau Seb")]
    public StateObjectNotifier LampeBureau { get; set; }

    // Lien vers l'état de la session Windows
    [StateObjectLink(SEB_PC_SENTINEL_NAME, "WindowsControl", "SessionLocked")]
    public StateObjectNotifier SessionLocked { get; set; }

    // Lien vers le capteur de luminosité
    [StateObjectLink("LightSensor", "Lux")]
    public StateObjectNotifier LuxSensor { get; set; }

    // Démarrage du package
    static void Main(string[] args)
    {
        PackageHost.Start&lt;Program&gt;(args);
    }

    // Méthode de démarrage de notre package
    public override void OnStart()
    {
        // Si accès au ControlHub
        if (PackageHost.HasControlManager)
        {
            // Demande de reception des mise à jour des sentinelles
            PackageHost.ControlManager.RequestSentinelUpdates();
            // En cas de mise à jour de l'état d'une sentinelle
            PackageHost.ControlManager.SentinelUpdated += (s, e) =&gt;
            {
                // Si cela concerne notre sentinelle
                if (e.Sentinel.Description.SentinelName == SEB_PC_SENTINEL_NAME)
                {
                    // On stocke dans la variable "pcConnected" l'état connecté ou déconnecté de notre PC
                    this.pcConnected = e.Sentinel.IsConnected;
                    PackageHost.WriteInfo("Le PC de Seb est '{0}'", e.Sentinel.IsConnected ? "connecté" : "déconnecté");
                    // Si le PC est maintenant déconnecté, on ferme la lampe !
                    if (!this.pcConnected)
                    {
                        SetLight(false);
                    }
                }
            };
        }
        else
        {
            // Pas d'accès au COntrolHub, on log une erreur ! Vérifiez votre clé d'accès !
            PackageHost.WriteError("Accès au ControlHub impossible !");
        }

        // En cas de mise à jour du StateObject "Lux" du package "LightSensor"
        this.LuxSensor.ValueChanged += (s, e) =&gt;
        {
            // Si le PC est connecté, que la luminosité actuelle est inférieure au seuil défini dans les settings et que la session est bien dévérouillée
            if (this.pcConnected &amp;&amp; e.NewState.DynamicValue.Lux &lt; PackageHost.GetSettingValue&lt;int&gt;("DaylightThreshold") &amp;&amp; (bool) this.SessionLocked.DynamicValue == false)
            {
                // On allume la lampe !
                SetLight(true);
                PackageHost.WriteInfo("Session dévérouillée à la tombée de la nuit : allumage de la lampe");
            }
        };

        // En cas de mise à jour du StateObject "SessionLocked" du package "WindowsControl"
        this.SessionLocked.ValueChanged += (s, e) =&gt;
        {
            // Si la session est vérouillée (ou fermée)
            if ((bool)this.SessionLocked.DynamicValue)
            {
                // On eteint la lampe
                SetLight(false);
                PackageHost.WriteInfo("Verrouillage de la session : fermeture de la lampe");
            }
            // Si le PC est connecté, que la luminosité actuelle est inférieure au seuil défini dans les settings et que la session est donc dévérouillée
            else if (this.pcConnected &amp;&amp; this.LuxSensor.DynamicValue.Lux &lt; PackageHost.GetSettingValue&lt;int&gt;("DaylightThreshold"))
            {
                // On allume la lampe !
                SetLight(true);
                PackageHost.WriteInfo("Session déverrouillée avec luminosité faible : allumage de la lampe");
            }
        };
    }

    private void SetLight(bool state)
    {
        // Pour allumer la lumière, on invoque le MC "SetSwitchState" du package "Vera" en passant l'ID de la lampe (récupérée par son StateObjet)
        PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = (int)this.LampeBureau.DynamicValue.Id, State = state });
    }
}</pre><p></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/synchroniser-lampe-bureau-avec-session-windows/">Synchroniser la lampe du bureau avec sa session Windows</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/tutorials/synchroniser-lampe-bureau-avec-session-windows/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[IoT]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Lux]]></category>
		<category><![CDATA[TSL2561]]></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>Un capteur de luminosité extérieur piloté par un Raspberry avec un package Python</title>
		<link>https://developer.myconstellation.io/tutorials/un-capteur-de-luminosite-exterieur-pilote-par-raspberry/</link>
					<comments>https://developer.myconstellation.io/tutorials/un-capteur-de-luminosite-exterieur-pilote-par-raspberry/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Sat, 13 May 2017 12:46:15 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Raspberry]]></category>
		<category><![CDATA[Lux]]></category>
		<category><![CDATA[Luminosité]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=4730</guid>

					<description><![CDATA[<p>Dans un précédent tutoriel, nous avons découvert comment créer un capteur de luminosité avec un ESP8266 connecté par Wifi. Ici je vous propose de créer un capteur extérieur piloté par un Raspberry Pi. Pour être exact, le Raspberry Pi sera</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/un-capteur-de-luminosite-exterieur-pilote-par-raspberry/">Un capteur de luminosité extérieur piloté par un Raspberry avec un package Python</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Dans un précédent tutoriel, nous avons découvert comment créer un <a href="/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/">capteur de luminosité avec un ESP8266</a> connecté par Wifi. Ici je vous propose de créer un capteur extérieur piloté par un Raspberry Pi.</p>
<p>Pour être exact, le Raspberry Pi sera installé en intérieur, connecté au réseau filaire Ethernet et relié par un câble à un boitier étanche installé sur le toit qui contiendra une photorésistance et/ou un capteur TSL2561.</p>
<p>Nous allons utiliser un <a href="/constellation-platform/constellation-sentinel/constellation-raspberry-pi/">Raspberry B+ version 1</a> sur lequel <a href="/getting-started/ajouter-des-sentinelles/">nous installerons une sentinelle</a> pour pouvoir déployer notre package depuis Visual Studio. Le package d’acquisition des données sera <a href="/getting-started/creez-votre-premier-package-constellation-en-python/">écrit en Python</a>.</p>
<h3>Prérequis</h3>
<ul>
<li>Un serveur Constellation</li>
<li>Un <a href="/constellation-platform/constellation-sentinel/constellation-raspberry-pi/">Raspberry Pi </a>sur lequel <a href="/getting-started/ajouter-des-sentinelles/">nous installerons une sentinelle</a></li>
<li>Une photorésistance avec un condensateur 1uF et/ou un capteur TSL2561</li>
<li>Visual Studio avec le SDK Constellation</li>
</ul>
<h3>Mesurer la luminosité ambiante avec une photorésistance</h3>
<h4>Le montage</h4>
<p>Tout d&rsquo;abord, il nous faut un boitier étanche avec un couvercle transparent (pour mesurer la luminosité c&rsquo;est mieux !) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160386-1.jpg"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Boite étanche" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160386_thumb-1.jpg" alt="Boite étanche" width="379" height="243" border="0" /></a></p>
<p>Sur une plaque epoxy, soudons la photorésistance avec un condensateur 1uF.</p>
<p>Une des deux pattes de la photorésistance sera reliée sur la pin « 3v3 » du Raspberry et la deuxième sera reliée à une entrée du Raspberry, disons la pin n°12 (soit la GPIO #18). Toujours sur cette 2ème patte, on soudera le pole « + » du condensateur. L&rsquo;autre pole du condensateur, celle marquée « -« , devra être reliée à la masse, sur l&rsquo;une des pins « GND » du Raspberry.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160398-1.jpg"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Photorésistance" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160398_thumb-1.jpg" alt="Photorésistance" width="310" height="298" border="0" /></a></p>
<p>On a donc trois fils connectés entre le Raspberry et notre capteur : le 3V3 et la masse (Gnd) pour l&rsquo;alimentation et un pour le signal (GPIO #18). L&rsquo;idée est donc de « charger » le condensateur et de chronométrer le temps qu&rsquo;il mets à se décharger.</p>
<p>Plus il y a de lumière et moins la résistance est forte, autrement dit le condensateur se déchargera très rapidement. A l&rsquo;inverse, plus il fait sombre et plus la résistance sera forte. Autrement dit, moins il y a de lumière et moins vite se déchargera le condensateur.</p>
<p>On voit sur les photos ci-dessous, le fil Orange pour le 3V3, le fil Bleu pour la GPIO et le fil Blanc pour la masse (Gnd) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160424-1.jpg"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation dans le boitier" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160424_thumb-1.jpg" alt="Installation dans le boitier" width="347" height="264" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160435-1.jpg"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation dans le boitier" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160435_thumb-1.jpg" alt="Installation dans le boitier" width="351" height="264" border="0" /></a></p>
<p>Il fois les connexions réalisées, on peut refermer proprement notre boitier en vérifiant soigneusement son étanchéité avant de l&rsquo;installer sur le toit.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160450-1.jpg"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation sur le toit" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160450_thumb-1.jpg" alt="Installation sur le toit" width="354" height="300" border="0" /></a></p>
<p>Côté intérieur, on relie les 3 fils de notre boitier au Raspberry (3v3, Gnd et GPIO18), le câble Ethernet et l&rsquo;alimentation MicroUSB.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160442-1.jpg"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Raspberry Pi B" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1160442_thumb-1.jpg" alt="Raspberry Pi B" width="354" height="335" border="0" /></a></p>
<p style="text-align: left;" align="center">Pour l&rsquo;installation du <a href="/constellation-platform/constellation-sentinel/constellation-raspberry-pi/">système sur le Raspberry suivez ce guide</a> puis <a href="/getting-started/ajouter-des-sentinelles/">installez-y une sentinelle</a>. Votre Raspberry est prêt et connecté à Constellation, reste à développer notre package Python.</p>
<h4>Programmation</h4>
<p>Depuis Visual Studio, <a href="/getting-started/creez-votre-premier-package-constellation-en-python/">créons un nouveau projet</a> de type « Constellation Python Package » que nous nommerons “LightSensor”.</p>
<p align="center"><img loading="lazy" class="wp-image-1736 size-medium aligncenter colorbox-4730" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-300x208.png" alt="" width="300" height="208" srcset="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-300x208.png 300w, https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb.png 424w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>Renommez le fichier « Demo.py » en « Light.py » et remplacez l’intégralité du contenu par le code suivant :</p>
<p></p><pre class="crayon-plain-tag">import Constellation
import RPi.GPIO as GPIO, time, os      

MAX_READING = 30000
LIGHT_SENSOR_GPIO = 18
MEASURE_INTERVAL = 10

def OnExit():
    GPIO.cleanup()

def RCtime (RCpin):
    reading = 0
    GPIO.setup(RCpin, GPIO.OUT)
    GPIO.output(RCpin, GPIO.LOW)
    time.sleep(0.1) 
    GPIO.setup(RCpin, GPIO.IN)
    # This takes about 1 millisecond per loop cycle
    while (GPIO.input(RCpin) == GPIO.LOW):
        if (reading &gt; MAX_READING):
            break
        reading += 1
    return reading
 
def Start():
    global INTERVAL
    GPIO.setmode(GPIO.BCM)
    Constellation.OnExitCallback = OnExit
    lastSend = 0
    currentValue = 0
    count = 0
    Constellation.WriteInfo("LightSensor is ready !")
    while Constellation.IsRunning:
        currentValue = currentValue + RCtime(LIGHT_SENSOR_GPIO)
        count = count + 1
        ts = int(round(time.time()))
        if ts - lastSend &gt;= int(Constellation.GetSetting("Interval")):
            avg = int(round(currentValue / count))
            Constellation.PushStateObject("Light", avg, "int")
            currentValue = 0
            count = 0
            lastSend = ts
        time.sleep(MEASURE_INTERVAL)

Constellation.Start(Start)</pre><p></p>
<p>N’hésitez pas à <a href="/getting-started/creez-votre-premier-package-constellation-en-python/">relire le guide</a> sur la création de package Python pour bien comprendre les bases d&rsquo;un package Python.</p>
<p>Ici on démarre notre package par la méthode « Start » qui démarre une boucle pour appeler la méthode <em>RCtime</em> toutes les 10 secondes (variable MEASURE_INTERVAL).</p>
<p>La méthode <em>RCtime</em> charge le condensateur (mode output) puis passe l&rsquo;I/O en « input » et incrémente la variable « reading » en continue tant que le condensateur n&rsquo;est pas déchargé (input == « low »). Plus la valeur « reading » est élevée, plus le condensateur a mis du temps à se décharger et donc moins il y a de lumière. On a un garde-fou à « 30.000 » pour ne pas attendre indéfiniment dans le cas où il fait trop sombre.</p>
<p>Bien entendu on ne mesure pas une unité précise. Si vous déployez votre code sur un RPi V1 et V2 (plus puissant), vous n&rsquo;aurez pas la même valeur pour les mêmes conditions.</p>
<p>Chaque mesure incrémente la variable « currentValue », puis dès qu&rsquo;on atteint l&rsquo;intervalle configuré dans les Settings Constellation, on fait la moyenne des mesures on <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Publier_des_StateObjects">publie un StateObjec</a>t nommé « Light » de type « int ».</p>
<p>Dans le <a href="/concepts/package-manifest/">manifeste du package</a> (<em>PackageInfo.xml</em>), n&rsquo;oubliez pas de déclarer le setting « Interval » en lui spécifiant une valeur par défaut, ici de 10 seconde :</p>
<p></p><pre class="crayon-plain-tag">&lt;Settings&gt;
  &lt;Setting name="Interval" isRequired="false" type="Int32" defaultValue="10" description="Interval to read sensors in second" /&gt;
&lt;/Settings&gt;</pre><p></p>
<p>De même vous pouvez également modifier les informations de compatibilité des plateformes pour exclure la plateforme Windows dans la mesure où le package exploite les GPIO du Raspberry.</p>
<p></p><pre class="crayon-plain-tag">&lt;Platform id="Win32NT" isCompliant="false" /&gt;</pre><p></p>
<p>Et voilà le package est prêt, vous pouvez depuis Visual Studio le <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Publiez_votre_package">publier</a> dans votre Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-72.png"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Publication du projet" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-72.png" alt="Publication du projet" width="454" height="283" border="0" /></a></p>
<p>… puis <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Deployez_votre_package_sur_une_sentinelle">le déployer</a> sur votre sentinelle Raspberry depuis la Console Constellation, en cliquant sur le bouton “Deploy new package” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-73.png"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Deploiement" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-73.png" alt="Deploiement" width="454" height="291" border="0" /></a></p>
<p>Dans l’assistant de déploiement vous pourrez alors personnaliser le setting “Interval” ou bien laisser la valeur par défaut que nous avons fixé à 10 (secondes) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-74.png"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Settings" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-74.png" alt="Settings" width="454" height="248" border="0" /></a></p>
<p align="left">Sur la Console Log, le package va être téléchargé et déployé par votre sentinelle Raspberry avant de démarrer :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-75.png"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Console Log" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-75.png" alt="Console Log" width="454" height="252" border="0" /></a></p>
<p align="left">Et en vous rendant dans le StateObjects Explorer, vous verrez votre package “LightSensor” publier un StateObject “Light” avec un entier comme valeur :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-76.png"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="StateObjects Explorer" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-76.png" alt="StateObjects Explorer" width="454" height="160" border="0" /></a></p>
<p>Votre package Python est opérationnel, on peut dés à présent exploiter cette valeur dans une page Web, un script, un programme .NET ou Python, un Arduino, etc… comme nous le verrons dans la suite de cet article.</p>
<h3>Mesurer des lux avec un capteur TSL2561</h3>
<p>Pour obtenir une mesure plus fiable et surtout exploitant une échelle de mesure universelle, nous allons utiliser un capteur de luminosité TSL2561 capable de mesurer des Lux.</p>
<h4>Le montage</h4>
<p>Dans cette deuxième version, j&rsquo;ai conservé la photorésistance et simplement ajouté le capteur TSL2561. Celui-ci est également alimenté en 3V3, j&rsquo;ai donc réutilisé les deux fils (Orange et Blanc) de la photorésistance pour alimenter le capteur également.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1170883-1.jpg"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Ajout d'un capteur TSL2561" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1170883_thumb-1.jpg" alt="Ajout d'un capteur TSL2561" width="354" height="227" border="0" /></a></p>
<p style="text-align: left;" align="center">Le TSL2561 utilise l&rsquo;I²C, j&rsquo;ai donc ajouté deux fils entre le boitier étanche et le Raspberry pour connecter le capteur en i²C (SDA et SCL).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1170888-1.jpg"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Ajout d'un capteur TSL2561" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/P1170888_thumb-1.jpg" alt="Ajout d'un capteur TSL2561" width="354" height="201" border="0" /></a></p>
<p style="text-align: left;" align="center">Sur le Raspberry, le SDA est la GPIO#2 et le SCL la GPIO #3, c&rsquo;est à dire juste en dessus de la pin 3v3.</p>
<h4>La programmation</h4>
<p>Le plus simple et le plus fiable pour récupérer les données du capteur TSL2561 depuis un Raspberry est d&rsquo;utiliser un programme natif. Pour cela nous allons utiliser le code publié à cette adresse : <a title="http://dino.ciuffetti.info/2014/03/tsl2561-light-sensor-on-raspberry-pi-in-c/" href="http://dino.ciuffetti.info/2014/03/tsl2561-light-sensor-on-raspberry-pi-in-c/">http://dino.ciuffetti.info/2014/03/tsl2561-light-sensor-on-raspberry-pi-in-c/</a>.</p>
<p>Il suffit récupérer les 3 fichiers C et de les compiler avec GCC pour générer le binaire. Pour vous simplifier la tache, vous pouvez directement récupérer le binaire <a href="https://developer.myconstellation.io/download/resources/tutorials/GetTSL2561">GetTSL2561 ici</a>.</p>
<p>Ajoutez ensuite un deuxième script nommé « Lux.py » dans le répertoire « Scripts » de votre projet et <strong>n&rsquo;oubliez pas</strong> d&rsquo;inclure votre script dans le package en définissant la Build Action à « Content » et en activant la copie du fichier dans le répertoire de sortie :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-77.png"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Inclure les scripts Python dans le package" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-77.png" alt="Inclure les scripts Python dans le package" width="254" height="339" border="0" /></a></p>
<p>Copiez également le binaire <a href="https://developer.myconstellation.io/download/resources/tutorials/GetTSL2561">GetTSL2561</a> dans le répertoire « Scripts » de votre package en l&rsquo;incluant également dans le package (Build Action à Content et Copy if newer).</p>
<p>Le contenu du script « Lux.py » sera :</p>
<p></p><pre class="crayon-plain-tag">import Constellation
import os, re, subprocess, time, stat

# Const
EXECUTABLE_FILENAME = "GetTSL2561"

def DoMeasure():
    # Start process
    process = subprocess.Popen("./" + EXECUTABLE_FILENAME, stdout=subprocess.PIPE)
    # Reading  output
    for line in iter(process.stdout.readline, ''):
        # Parse line
        matchObj = re.match('RC: (\d*)\((.*)\), broadband: (\d*), ir: (\d*), lux: (\d*)', line)
        if matchObj:
            # Reading value
            returnCode = int(matchObj.group(1))
            broadband = int(matchObj.group(3))
            ir = int(matchObj.group(4))
            lux = int(matchObj.group(5))
            # Push StateObject
            if returnCode != 0:
                Constellation.WriteWarn("Unknow return code %s : %s" % (returnCode, line))
            else:
                Constellation.PushStateObject("Lux", { "Broadband": broadband, "IR" : ir, "Lux" : lux }, "LightSensor.Lux")
        else:
            Constellation.WriteError("Unable to parse the output: %s" % line)

def Start():    
    # Make the "GetTSL2561" file as executable
    st = os.stat(EXECUTABLE_FILENAME)
    os.chmod(EXECUTABLE_FILENAME, st.st_mode | stat.S_IEXEC)
    Constellation.WriteInfo("LuxSensor is ready !")
    while Constellation.IsRunning:  
        DoMeasure()
        time.sleep(int(Constellation.GetSetting("Interval")))

Constellation.Start(Start)</pre><p></p>
<p>Comme pour le script « Light.py », on déclare la méthode « <em>Start</em> » comme méthode de démarrage. Celle-ci boucle tant que le package est démarré à l&rsquo;intervalle défini par le setting « Interval » qu&rsquo;on a déclaré à 10 secondes par défaut dans le manifeste.</p>
<p>A chaque itération, on invoque la méthode « <em>DoMeasure</em> » qui démarre le programme « <em>GetTSL2561</em> » et on parse avec une regex le résultat de la sortie du programme (<em>process.stdout</em>) pour extraire le code de retour, le broadband (spectre visible), l&rsquo;infrarouge et le nombre de lux courant mesuré par le capteur.</p>
<p>Si le code de retour est égal à 0 c&rsquo;est que la mesure est correcte, on publie alors un StateObject nommé « Lux » contenant les trois propriétés mesurées : Broadband, IR et Lux.</p>
<p></p><pre class="crayon-plain-tag">Constellation.PushStateObject("Lux", { "Broadband": broadband, "IR" : ir, "Lux" : lux }, "LightSensor.Lux")</pre><p></p>
<p>Attention avant de déployer cette nouvelle version<strong> il faut activer l&rsquo;I²C sur le Raspberry</strong>. Pour cela lancer la commande « <em>sudo raspi-config</em> » puis dans le menu « <em>Advanced Options</em> » activez l&rsquo;I²C et chargez le module par défaut au démarrage.</p>
<p>On peut maintenant publier cette nouvelle version depuis Visual Studio et lancer un « Reload » sur notre package pour déployer cette nouvelle version sur notre Rapsberry.</p>
<p>Désormais nous avons deux StateObjects publiés par ce package : « <em>Light</em> » via la photorésistance et « <em>Lux</em> » via le TSL2561 :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-78.png"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="StateObjects Explorer" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-78.png" alt="StateObjects Explorer" width="454" height="133" border="0" /></a></p>
<p>Notre nouveau StateObject « Lux » est un objet complexe contenant trois propriétés :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-79.png"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Detail du StateObject Lux" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-79.png" alt="Detail du StateObject Lux" width="454" height="330" border="0" /></a></p>
<h3>Exploitez les données</h3>
<p>Notre package Python vit sa vie sur notre Raspberry et publie à intervalle régulier deux StateObjects sur base des mesures réalisées par la photorésistance et/ou le capteur de lux TSL2561.</p>
<p>On peut maintenant écrire des pages Web, des scripts, des packages .NET ou Python, Arduino, etc… qui exploiteront ces mesures en temps réel.</p>
<h4>Un dashboard Web</h4>
<p>Depuis <a href="/getting-started/connectez-vos-pages-web-constellation/">une page Web</a>, il suffit d&rsquo;ajouter un <a href="/client-api/javascript-api/consommer-constellation-angular-js/">StateObjectLink</a>. Vous pouvez vous inspirer <a href="/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/#Etape_3_Une_page_Web_pour_afficher_votre_capteur_en_temps_reel">de ce tutoriel</a> par exemple.</p>
<p></p><pre class="crayon-plain-tag">constellation.registerStateObjectLink("*", "LightSensor", "Lux", "*", function (so) {
  $scope.$apply(function () {
    console.log("Lux = ", so.Value.Lux);
  });
});</pre><p></p>
<p>Par exemple sur le <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/" target="_blank" rel="noopener noreferrer">projet S-Panel</a> avec quelques composants Bootstrap :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-80.png"><img class="colorbox-4730"  loading="lazy" title="S-Panel" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-80.png" alt="S-Panel" width="244" height="131" border="0" /></a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-81.png"><img class="colorbox-4730"  loading="lazy" title="S-Panel" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-81.png" alt="S-Panel" width="354" height="210" border="0" /></a></p>
<h4>Un programme .NET</h4>
<p>Vous pouvez là aussi vous inspirer <a href="/tutorials/creer-un-capteur-de-temperature-humidite-et-luminosite-connecte/#Etape_4_optionnelle_creer_un_package_NET_pour_exploiter_les_donnees_du_capteur">de ce tutoriel</a>. En clair, il suffit dans votre code C# d&rsquo;ajouter des <a href="/client-api/net-package-api/consommer-des-stateobjects/">StateObjectLinks </a>avec l&rsquo;API.NET :</p>
<p></p><pre class="crayon-plain-tag">[StateObjectLink("LightSensor", "Lux")]
public StateObjectNotifier Lux { get; set; }</pre><p></p>
<p>Ainsi la propriété .NET nommée « Lux » ci-dessus sera liée en temps réel au StateObject « Lux » du package « LigthSensor ».</p>
<p>Vous pouvez ajouter des événements dès que la valeur change :</p>
<p></p><pre class="crayon-plain-tag">this.Lux.ValueChanged += (s, e) =&gt;
{
    PackageHost.WriteInfo($"Nouvelle mesure à {this.Lux.Value.LastUpdate} = {this.Lux.DynamicValue.Lux} lux");
};</pre><p></p>
<p><img loading="lazy" class="alignnone size-medium wp-image-4596 aligncenter colorbox-4730" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-57-300x153.png" alt="" width="300" height="153" srcset="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-57-300x153.png 300w, https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-57.png 404w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>Vous pouvez ainsi faire ce que bon vous semble avec cette information. Par exemple allumer automatiquement les lumières si la luminosité est trop faible, fermer les volets, enregistrer la valeur des Lux dans un fichier Excel ou une base de données, etc.. etc..</p>
<h4>Historisation avec ElasticSearch / Kibana</h4>
<p>En utilisant le package <a href="/package-library/graylogconnector">Graylog </a>du <a href="/plateforme/package-repository/">catalogue de package</a>, on peut historiser les mesures de notre capteur dans une base ElasticSearch.</p>
<p>Dans la configuration du package Graylog, on aura quelque chose comme :</p>
<p></p><pre class="crayon-plain-tag">&lt;graylogConfiguration xmlns="urn:GraylogConnector" sendPackageLogs="false" sendPackageStates="true" sendSentinelUpdates="true"&gt;
    &lt;subscriptions&gt;
        &lt;subscription package="LightSensor" name="Lux" /&gt;
        &lt;!-- ..... --&gt;
    &lt;/subscriptions&gt;
    &lt;outputs&gt;
        &lt;gelfOutput name="Graylog server UDP" host="graylog.ajsinfo.loc" port="12201" protocol="Udp" /&gt;
    &lt;/outputs&gt;
&lt;/graylogConfiguration&gt;</pre><p></p>
<p>La documentation du package <a href="/package-library/graylogconnector">Graylog</a> est disponible <a href="/package-library/graylogconnector">ici</a>. En résumé on crée ici un abonnement pour la StateObject « Lux » du package « LightSensor » et dans les « outputs » on a déclaré notre serveur Graylog.</p>
<p>De ce fait dès que le StateObject « Lux » est mis à jour par notre package Python, le package Graylog enregistre la nouvelle version du StateObject sur le serveur Graylog qui lui-même utilise ElasticSearch comme base de stockage.</p>
<p>Ainsi on pourra utiliser un outil comme Kibana pour visualiser l&rsquo;évolution de notre StateObject :</p>
<p><img loading="lazy" class="aligncenter colorbox-4730" title="Kibana" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-83.png" alt="Kibana" width="454" height="304" border="0" /></p>
<p>Un article complet sur le sujet <a href="https://sebastien.warin.fr/2015/10/09/3180-creez-votre-home-analytics-analyse-et-reporting-de-votre-domotique-informatique-et-objets-connectes-avec-elasticsearch-graylog-kibana-constellation/" target="_blank" rel="noopener noreferrer">a été publié ici</a>.</p>
<h4>Stats avec Cacti</h4>
<p>On peut également écrire un script pour récupérer notre StateObject « Lux » depuis l&rsquo;<a href="/client-api/rest-api/interface-rest-consumer/">interface REST</a> qu&rsquo;on ajoutera en tant que « <em>Data Input Methods</em> » dans Cacti pour pouvoir créer des graphiques facilement :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-82.png"><img class="colorbox-4730"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Cacti" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-82.png" alt="Cacti" width="454" height="358" border="0" /></a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/un-capteur-de-luminosite-exterieur-pilote-par-raspberry/">Un capteur de luminosité extérieur piloté par un Raspberry avec un package Python</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/tutorials/un-capteur-de-luminosite-exterieur-pilote-par-raspberry/feed/</wfw:commentRss>
			<slash:comments>1</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-24 23:47:52 by W3 Total Cache
-->