﻿<?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 Package - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/tag/package/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/tag/package/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Mon, 24 Feb 2020 08:34:58 +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 Package - Constellation</title>
	<link>https://developer.myconstellation.io/tag/package/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Vorwerk : connectez votre robot aspirateur Kobold ou Neato dans Constellation</title>
		<link>https://developer.myconstellation.io/package-library/vorwerk/</link>
					<comments>https://developer.myconstellation.io/package-library/vorwerk/#respond</comments>
		
		<dc:creator><![CDATA[Constellation Documentation Agent]]></dc:creator>
		<pubDate>Sun, 23 Feb 2020 14:41:07 +0000</pubDate>
				<category><![CDATA[Packages]]></category>
		<category><![CDATA[Robot]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Vorwerk]]></category>
		<category><![CDATA[Neato]]></category>
		<category><![CDATA[Vacuum]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/miscellaneous/vorwerk/</guid>

					<description><![CDATA[<p>Le package Vorwerk vous permet connecter votre robot aspirateur Kobold VR200 ou VR300 dans Constellation.<br />
L'API utilisée par Vorwerk est la même que celle des Neato Botvac, vous pouvez donc également connecter vos robots Botvac.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/vorwerk/">Vorwerk : connectez votre robot aspirateur Kobold ou Neato dans Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le package Vorwerk vous permet connecter votre robot aspirateur Kobold VR200 ou VR300 dans Constellation.</p>
<p>L&rsquo;API utilisée par Vorwerk est la même que celle des Neato Botvac, vous pouvez donc également connecter vos robots Botvac.</p>
<h3 id="installation">Installation</h3>
<p>Depuis le &quot;Online Package Repository&quot; de votre Console Constellation, installez et déployez le package sur la sentinelle de votre choix (compatible Windows et Linux).</p>
<p>Sur la page de Settings, vous devez obligatoirement définir vos identifiants de connexion au Cloud Vorwerk ou Neato.</p>
<p>Vous pouvez également déployer ce package manuellement dans la configuration de votre Constellation :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name=&quot;Vorwerk&quot;&gt;
  &lt;settings&gt;
    &lt;setting key=&quot;Username&quot; value=&quot;xxxx@yyyyy.com&quot; /&gt;
    &lt;setting key=&quot;Password&quot; value=&quot;xxxxxxx&quot; /&gt;
    &lt;setting key=&quot;Vendor&quot; value=&quot;Vorwerk&quot; /&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<h3 id="settings">Settings</h3>
<table>
<thead>
<tr>
<th>Nom</th>
<th>Type</th>
<th>Requis ?</th>
<th>Description du Setting</th>
</tr>
</thead>
<tbody>
<tr>
<td>Username</td>
<td>String</td>
<td>OUI</td>
<td>Nom d&rsquo;utilisateur Vorwerk/Neato</td>
</tr>
<tr>
<td>Password</td>
<td>String</td>
<td>OUI</td>
<td>Mot de passe Vorwerk/Neato</td>
</tr>
<tr>
<td>Vendor</td>
<td>String</td>
<td>NON</td>
<td>Marque du robot : &quot;Vorwerk&quot; ou &quot;Neato&quot; (par défaut Vorwerk)</td>
</tr>
<tr>
<td>RobotPollingInterval</td>
<td>Int</td>
<td>NON</td>
<td>Interval en seconde d&rsquo;interrogation du robot (par défaut 10 sec)</td>
</tr>
<tr>
<td>DashboardPollingInterval</td>
<td>Int</td>
<td>NON</td>
<td>Interval en seconde d&rsquo;interrogation du &quot;dashboard&quot; (par défaut 900 sec soit 15 min)</td>
</tr>
</tbody>
</table>
<h3 id="stateobjects">StateObjects</h3>
<p>Vous retrouverez un StateObject &quot;Dashboard&quot; qui contient les informations sur le compte utilisé ainsi que la liste des robots attachés et un StateObject par robot (le nom du StateObject est le nom du robot) qui contient les informations sur l&rsquo;état du robot.</p>
<table>
<thead>
<tr>
<th>Nom</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dashboard</td>
<td>Vorwerk.Models.Dashboard</td>
<td>Information sur le compte et robots attachés</td>
</tr>
<tr>
<td>&lt;&lt; nom du robot &gt;&gt;</td>
<td>Vorwerk.Models.RobotState</td>
<td>Information sur l&rsquo;état du robot</td>
</tr>
</tbody>
</table>
<h3 id="messagecallbacks">MessageCallbacks</h3>
<p>Le package expose 2 MessageCallbacks :</p>
<table>
<thead>
<tr>
<th>Signature</th>
<th>Réponse (saga)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>StartCleaning(string robotName, bool ecoMode = true)</td>
<td>RobotState</td>
<td>Démarre un néttoyage</td>
</tr>
<tr>
<td>StartSpotCleaning(string robotName, bool ecoMode = true, int height = 200, int width = 200, bool repeat = false)</td>
<td>RobotState</td>
<td>Démarre un néttoyage d&rsquo;une zone</td>
</tr>
<tr>
<td>StopCleaning(string robotName)</td>
<td>RobotState</td>
<td>Arrete le néttoyage</td>
</tr>
<tr>
<td>PauseCleaning(string robotName)</td>
<td>RobotState</td>
<td>Pause le néttoyage</td>
</tr>
<tr>
<td>ResumeCleaning(string robotName)</td>
<td>RobotState</td>
<td>Résume le néttoyage</td>
</tr>
<tr>
<td>SendToBase(string robotName)</td>
<td>RobotState</td>
<td>Démarre un néttoyage</td>
</tr>
</tbody>
</table>
<h3 id="quelques-exemples">Quelques exemples</h3>
<ul>
<li>Lancer le néttoyage en journée lorsque l&rsquo;alarme est armée</li>
<li>Contrôler le robot depuis vos Dashboards HTML ou WPF</li>
</ul>
<h3 id="ressources">Ressources</h3>
<p>Quelques ressources pour le developpement du package :</p>
<ul>
<li>A node module for Vorwerk Kobold VR200 and VR300 : <a href="https://github.com/nicoh88/node-kobold">https://github.com/nicoh88/node-kobold</a></li>
<li>PHP library for Neato Botvac : <a href="https://github.com/tomrosenback/botvac">https://github.com/tomrosenback/botvac</a></li>
<li>Neato Javascript SDK : <a href="https://github.com/NeatoRobotics/neato-sdk-js">https://github.com/NeatoRobotics/neato-sdk-js</a></li>
<li>Python module for interacting with Neato Botvac Connected vacuum robots : <a href="https://github.com/stianaske/pybotvac">https://github.com/stianaske/pybotvac</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/vorwerk/">Vorwerk : connectez votre robot aspirateur Kobold ou Neato dans Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/package-library/vorwerk/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TPLinkSmartHome : Prises et autres périphériques connectés</title>
		<link>https://developer.myconstellation.io/package-library/tplinksmarthome/</link>
					<comments>https://developer.myconstellation.io/package-library/tplinksmarthome/#respond</comments>
		
		<dc:creator><![CDATA[Constellation Documentation Agent]]></dc:creator>
		<pubDate>Wed, 29 May 2019 13:21:06 +0000</pubDate>
				<category><![CDATA[Packages]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[TPLink]]></category>
		<category><![CDATA[Plug]]></category>
		<category><![CDATA[TPLinkSmartHome]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/miscellaneous/tplinksmarthome/</guid>

					<description><![CDATA[<p>Le package TPLinkSmartHome vous permet de contrôler et monitorer les périphériques TPLink Smart Home (kasa smarthome).<br />
ATTENTION, pour le moment seules les prises HS100 et HS110 sont prises en charge par ce package.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/tplinksmarthome/">TPLinkSmartHome : Prises et autres périphériques connectés</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le package TPLinkSmartHome vous permet de contrôler et monitorer les périphériques TPLink Smart Home (kasa smarthome).<br />
<strong>ATTENTION, pour le moment seules les prises HS100 et HS110 sont prises en charge par ce package.</strong></p>
<h3 id="installation">Installation</h3>
<p>Depuis le “Online Package Repository” de votre Console Constellation, installez et déployez le package sur la sentinelle de votre choix (compatible Windows et Linux).</p>
<p>Sur la page de Settings, vous devez obligatoirement définir un ou plusieurs périphériques.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">[{
        &quot;HostName&quot;: &quot;192.168.0.123&quot;,
        &quot;Type&quot;: &quot;PlugWithEnergyMeter&quot;
        }, {
        &quot;HostName&quot;: &quot;192.168.0.234&quot;,
        &quot;Type&quot;: &quot;Plug&quot;
    }]</pre><p></p>
<p>Vous pouvez également déployer ce package manuellement dans la configuration de votre Constellation :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name=&quot;TPLinkSmartHome&quot;&gt;
    &lt;settings&gt;
        &lt;setting key=&quot;poolingInterval&quot; value=&quot;2000&quot; /&gt;
        &lt;setting key=&quot;devices&quot;&gt;
            &lt;content&gt;[{
            &quot;HostName&quot;: &quot;192.168.0.123&quot;,
            &quot;Type&quot;: &quot;PlugWithEnergyMeter&quot;
        }, {
            &quot;HostName&quot;: &quot;192.168.0.234&quot;,
            &quot;Type&quot;: &quot;PlugWithEnergyMeter&quot;
        }]&lt;/content&gt;
        &lt;/setting&gt;
    &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<h3 id="settings">Settings</h3>
<table>
<thead>
<tr>
<th>Nom</th>
<th>Type</th>
<th>Requis ?</th>
<th>Description du Setting</th>
</tr>
</thead>
<tbody>
<tr>
<td>devices</td>
<td>JsonObject</td>
<td>OUI</td>
<td>liste de périphériques</td>
</tr>
<tr>
<td>poolingInterval</td>
<td>int</td>
<td>NON</td>
<td>interval en millisecondes entre deux récupération de l&rsquo;état des périphériques (défaut : 2000ms)</td>
</tr>
</tbody>
</table>
<h3 id="stateobjects">StateObjects</h3>
<p>Vous retrouverez 1 StateObject publié par périphérique par le package :</p>
<table>
<thead>
<tr>
<th>Nom</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>TPLink-##Hostname##</td>
<td>JsonObject</td>
<td>les informations d&rsquo;un périphérique</td>
</tr>
</tbody>
</table>
<h3 id="messagecallbacks">MessageCallbacks</h3>
<p>Le package expose 3 MessageCallbacks :</p>
<table>
<thead>
<tr>
<th>Signature</th>
<th>Réponse (saga)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>GetDailyStat(string hostname, int? year = null, int? month = null)</td>
<td>JsonObject</td>
<td>Les statistiques d&rsquo;utilisation quotidiennes pour une année et un mois donné (Pour les prises HS110 uniquement)</td>
</tr>
<tr>
<td>GetMonthStat(string hostname, int? year = null)</td>
<td>JsonObject</td>
<td>Les statistiques d&rsquo;utilisation mensuelles pour une année donnée (Pour les prises HS110 uniquement)</td>
</tr>
<tr>
<td>SetOutputState(string hostname, bool state)</td>
<td>void</td>
<td>Change l&rsquo;état (ON/OFF) d&rsquo;une prise (Pour les prises HS100 et HS110 uniquement)</td>
</tr>
<tr>
<td>SetLedOff(string hostname, bool isOff)</td>
<td>Object</td>
<td>Change l&rsquo;état (ON/OFF) de la LED d&rsquo;une prise (Pour les prises HS100 et HS110 uniquement)</td>
</tr>
</tbody>
</table>
<h3 id="quelques-exemples">Quelques exemples</h3>
<ul>
<li>Surveiller la consommation d&rsquo;une prise connectée</li>
<li>Contrôler à distance une prise connectée, éteindre la nuit certaines prises etc.</li>
</ul>
<h3 id="license">License</h3>
<p>Apache License</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/tplinksmarthome/">TPLinkSmartHome : Prises et autres périphériques connectés</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/package-library/tplinksmarthome/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OrangeTV : pilotez votre décodeur TV Orange</title>
		<link>https://developer.myconstellation.io/package-library/orangetv/</link>
					<comments>https://developer.myconstellation.io/package-library/orangetv/#respond</comments>
		
		<dc:creator><![CDATA[Constellation Documentation Agent]]></dc:creator>
		<pubDate>Thu, 23 May 2019 13:37:30 +0000</pubDate>
				<category><![CDATA[Packages]]></category>
		<category><![CDATA[Livebox]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[TV]]></category>
		<category><![CDATA[OrangeTV]]></category>
		<category><![CDATA[Orange]]></category>
		<category><![CDATA[décodeur]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/miscellaneous/orangetv/</guid>

					<description><![CDATA[<p>Documentation en cours de rédaction! Connect your Orange Set-top box (Orange LiveBox TV) to Constellation StateObjects State : the current state of the Set-top box (with the current standby state, current context, current played media, etc.) MessageCallbacks SwitchTo(string epgId) :</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/orangetv/">OrangeTV : pilotez votre décodeur TV Orange</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Documentation en cours de rédaction!</p>
<p>Connect your Orange Set-top box (Orange LiveBox TV) to Constellation</p>
<h3 id="stateobjects">StateObjects</h3>
<ul>
<li>State : the current state of the Set-top box (with the current standby state, current context, current played media, etc.)</li>
</ul>
<h3 id="messagecallbacks">MessageCallbacks</h3>
<ul>
<li>SwitchTo(string epgId) : Switches to EPG identifier</li>
<li>SwitchToChannel(Channel channel) : Switches to channel</li>
<li>SendKey(Key key, PressKeyMode mode = PressKeyMode.SinglePress) : Sends the remote controller key</li>
<li>RefreshState() : Refreshes the current state</li>
</ul>
<h3 id="installation">Installation</h3>
<p>Declare the package in a Sentinel with the following configuration :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name=&quot;OrangeTV&quot;&gt;
  &lt;settings&gt;
    &lt;setting key=&quot;Hostname&quot; value=&quot;192.168.x.x&quot; /&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<h3 id="license">License</h3>
<p>Apache License</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/orangetv/">OrangeTV : pilotez votre décodeur TV Orange</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/package-library/orangetv/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Constellation à la DevCon #4 le 26 octobre à l&#8217;école 42</title>
		<link>https://developer.myconstellation.io/blog/devcon-4-le-26-octobre-lecole-42/</link>
					<comments>https://developer.myconstellation.io/blog/devcon-4-le-26-octobre-lecole-42/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 20 Oct 2017 09:02:14 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Web Platform Installer]]></category>
		<category><![CDATA[Raspberry]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Supervision]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Constellation]]></category>
		<category><![CDATA[IoT]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5604</guid>

					<description><![CDATA[<p>Jeudi 26 octobre 2017 se tiendra la 4ème édition de la DevCon, la conférence technique du magazine Programmez! Le thème de cet après-midi sera 100 % Raspberry Pi &#38; Co en production : serveur, IoT, développement, Docker. Et à cette</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/devcon-4-le-26-octobre-lecole-42/">Constellation à la DevCon #4 le 26 octobre à l&rsquo;école 42</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Jeudi 26 octobre 2017 se tiendra la 4ème édition de la <strong>DevCon</strong>, la conférence technique du magazine <a href="https://www.programmez.com/">Programmez!</a></p>
<p align="center"><a href="https://www.programmez.com/content/devcon-4-100-raspberry-pi-co"><img class="colorbox-5604"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="devcon-4" src="https://developer.myconstellation.io/wp-content/uploads/2017/10/devcon-4.jpg" alt="devcon-4" width="400" height="317" border="0" /></a></p>
<p>Le thème de cet après-midi sera <strong>100 % Raspberry Pi &amp; Co en production</strong> : serveur, IoT, développement, Docker.</p>
<p>Et à cette occasion, vous retrouverez une nouvelle fois une session dédiée à <a href="http://www.myconstellation.io/">Constellation</a> spécial Raspberry.</p>
<p>Au menu de cette session :</p>
<ul>
<li>Comment <a href="https://developer.myconstellation.io/constellation-platform/constellation-server/installer-constellation-sur-linux/">déployer une Constellation sur Raspbian</a> en une seule ligne de commande grâce au Web Platform Installer</li>
<li>Comment <a href="https://developer.myconstellation.io/getting-started/ajouter-des-sentinelles/#Installation_dune_sentinelle_sur_un_systeme_Linux">joindre des RPi v1, v2, v3 </a>dans Constellation pour y <a href="https://developer.myconstellation.io/plateforme/fonctionnalites/deploiement-administration/">déployer et superviser des packages</a> (programmes) depuis une interface Web centrale</li>
<li>Comment développer des packages avec <a href="https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-csharp/">Visual Studio</a> ou en ligne de commande avec le « <a href="https://developer.myconstellation.io/blog/developpez-vos-packages-python-ligne-de-commande/">Constellation Package Tools CLI</a> » et les déployer automatiquement sur vos RPi</li>
<li>Comment <a href="https://developer.myconstellation.io/client-api/python-api/">vos packages Python</a> sur RPi peuvent interagir avec vos autres systèmes et autres packages Python, C#, objets Arduino ou des ESP8266, des pages Javascript, ou autre</li>
<li>Comment contrôler un RPi depuis une pages Web ou une application mobile multi-plateforme avec quelques lignes !</li>
</ul>
<p>Nous verrons également plusieurs applications concrètes déployées pour ma « smarthome » comme : <a href="http://sebastien.warin.fr/2015/03/24/2478-senergy-la-solution-de-monitoring-des-ressources-energetiques-de-la-maison-geek-is-in-da-house-2015/">S-Energy</a>, ma solution de supervision des ressources énergique basée sur un Raspberry, <a href="http://sebastien.warin.fr/2015/08/20/2833-s-opener-connectez-et-scurisez-votre-porte-de-garage-avec-constellation-et-un-raspberry-pi-la-porte-de-garage-intelligente/">S-Opener</a> pour piloter la porte de garage depuis un Raspberry, <a href="https://developer.myconstellation.io/tutorials/un-capteur-de-luminosite-exterieur-pilote-par-raspberry/">capteurs luminosité</a>, gestion des volets, etc&#8230;</p>
<p><b>Quand ? </b>26 octobre à partir de 13h30</p>
<p><b>Où :</b> à l’école 42 (Paris)</p>
<p><b>Informations &amp; inscriptions :</b> <a href="https://www.programmez.com/content/devcon-4-100-raspberry-pi-co">https://www.programmez.com/content/devcon-4-100-raspberry-pi-co</a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/devcon-4-le-26-octobre-lecole-42/">Constellation à la DevCon #4 le 26 octobre à l&rsquo;école 42</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/blog/devcon-4-le-26-octobre-lecole-42/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Développez vos packages Python en ligne de commande</title>
		<link>https://developer.myconstellation.io/blog/developpez-vos-packages-python-ligne-de-commande/</link>
					<comments>https://developer.myconstellation.io/blog/developpez-vos-packages-python-ligne-de-commande/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 08 Sep 2017 08:18:28 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Package]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5398</guid>

					<description><![CDATA[<p>Nouvel outil dans l’écosystème Constellation : le Constellation Package Tools CLI. Un outil en ligne de commande pour Windows et Linux vous permettant de créer, développer, tester et publier vos packages Constellation Python depuis un simple shell. Jusqu&#8217;à présent le seul</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/developpez-vos-packages-python-ligne-de-commande/">Développez vos packages Python en ligne de commande</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Nouvel outil dans l’écosystème Constellation : le <em><strong><a href="/client-api/python-api/developper-avec-le-package-tools-cli/">Constellation Package Tools CLI</a></strong></em>. Un outil en ligne de commande pour Windows et Linux vous permettant de créer, développer, tester et publier vos packages Constellation Python depuis un simple shell.</p>
<p><span id="more-5398"></span></p>
<p>Jusqu&rsquo;à présent le seul moyen de développer des packages Constellation impliquait le<strong> SDK Constellation pour Visual Studio</strong>.</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/06/image-1.png"><img class="colorbox-5398"  loading="lazy" title="Création d'un nouveau script Constellation Python" src="https://developer.myconstellation.io/wp-content/uploads/2017/06/image_thumb-1.png" alt="Création d'un nouveau script Constellation Python" width="354" height="246" border="0" /></a></p>
<p>Grace à Visual Studio et le SDK Constellation vous pouvez développer, tester et publier des packages Constellation en <a href="/getting-started/creez-votre-premier-package-constellation-en-csharp/">.NET</a> et <a href="/getting-started/creez-votre-premier-package-constellation-en-python/">Python </a>facilement dans un environnement de développement riche et productif.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-6.png"><img class="colorbox-5398"  loading="lazy" title="IntelliSense VisualStudio" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-6.png" alt="IntelliSense VisualStudio" width="420" height="276" border="0" /></a></p>
<p>Éditeur de code très complet (coloration syntaxique, Intellisense, outil de refactoring), explorateur de solution, générateur de code Constellation, expérience de debug très poussée, publication des package Constellation intégrée à l&rsquo;IDE, etc&#8230;</p>
<p>En contre partie, vous devez nécessairement être sur une station Windows et avoir installé Visual Studio.</p>
<p>Pour offrir une autre solution, il est maintenant possible de développer sans avoir besoin de cet IDE grâce au <em><strong><a href="/client-api/python-api/developper-avec-le-package-tools-cli/">Constellation Package Tools CLI</a></strong></em>.</p>
<p>Il s&rsquo;agit d&rsquo;un outil en ligne de commande compatible <span style="text-decoration: underline;">Windows</span> et <span style="text-decoration: underline;">Linux</span> vous permettant de <span style="text-decoration: underline;">créer, développer, tester et publier des packages Constellation Python avec un simple shell</span> (Windows ou Linux).</p>
<p>Le<em><strong>« Constellation Package Tools CLI »</strong></em> s&rsquo;installe avec PIP grâce à la commande :</p>
<p></p><pre class="crayon-plain-tag">pip install constellation-pkgtools-cli</pre><p></p>
<p>Ensuite il devient très facile de créer un package Python grâce à une seule commande :</p>
<p></p><pre class="crayon-plain-tag">ctln create &lt;mon projet&gt;</pre><p></p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-4.png"><img class="colorbox-5398"  loading="lazy" title="Création d'un nouveau package" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-4.png" alt="Création d'un nouveau package" width="354" height="234" border="0" /></a></p>
<p>Il ne vous reste plus qu&rsquo;à utiliser votre éditeur de code préféré pour développer votre package.</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-11.png"><img class="colorbox-5398"  loading="lazy" title="Edition des scripts Python avec Nano" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-11.png" alt="Edition des scripts Python avec Nano" width="354" height="226" border="0" /></a></p>
<p>Vous pourrez ensuite tester votre package en local et lorsqu&rsquo;il est prêt à être déployé, vous pourrez le publier dans votre Constellation toujours en ligne de commande :</p>
<p></p><pre class="crayon-plain-tag">ctln run
ctln publish myconstellationserver</pre><p></p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-15.png"><img class="colorbox-5398"  loading="lazy" title="Connexion du package avec sa Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-15.png" alt="Connexion du package avec sa Constellation" width="354" height="208" border="0" /></a></p>
<p>Pour découvrir cet outil en détail, rendez-vous dès maintenant sur <a href="/client-api/python-api/developper-avec-le-package-tools-cli/">cette page</a>.</p>
<p>Bon développement à tous,</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/blog/developpez-vos-packages-python-ligne-de-commande/">Développez vos packages Python en ligne de commande</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/blog/developpez-vos-packages-python-ligne-de-commande/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DD-WRT : Connectez votre routeur DD-WRT à Constellation</title>
		<link>https://developer.myconstellation.io/package-library/ddwrt/</link>
					<comments>https://developer.myconstellation.io/package-library/ddwrt/#respond</comments>
		
		<dc:creator><![CDATA[Constellation Documentation Agent]]></dc:creator>
		<pubDate>Sun, 21 May 2017 08:43:33 +0000</pubDate>
				<category><![CDATA[Packages]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[DD-WRT]]></category>
		<category><![CDATA[Routeur]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=4906</guid>

					<description><![CDATA[<p>Documentation en cours de rédaction &#8230;</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/ddwrt/">DD-WRT : Connectez votre routeur DD-WRT à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Documentation en cours de rédaction &#8230;</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/ddwrt/">DD-WRT : Connectez votre routeur DD-WRT à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/package-library/ddwrt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Synchroniser un interrupteur mural avec des ampoules connectées et contrôler l&#8217;ambiance lumineuse de votre pièce</title>
		<link>https://developer.myconstellation.io/tutorials/synchroniser-interrupteur-mural-ampoules-connectee/</link>
					<comments>https://developer.myconstellation.io/tutorials/synchroniser-interrupteur-mural-ampoules-connectee/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Mon, 15 May 2017 23:12:13 +0000</pubDate>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Hue]]></category>
		<category><![CDATA[Lampe]]></category>
		<category><![CDATA[Fibaro]]></category>
		<category><![CDATA[Ampoules]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Vera]]></category>
		<category><![CDATA[Z-Wave]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=4853</guid>

					<description><![CDATA[<p>Dans cet article nous allons découvrir comment contrôler l&#8217;ambiance lumineuse d&#8217;une pièce équipée d&#8217;ampoules connectées avec un simple interrupteur mural. L&#8217;idée est à la fois de pouvoir allumer ou éteindre toutes les ampoules de la pièce à partir de l’interrupteur</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/synchroniser-interrupteur-mural-ampoules-connectee/">Synchroniser un interrupteur mural avec des ampoules connectées et contrôler l&rsquo;ambiance lumineuse de votre pièce</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Dans cet article nous allons découvrir comment contrôler l&rsquo;ambiance lumineuse d&rsquo;une pièce équipée d&rsquo;ampoules connectées avec un simple interrupteur mural.</p>
<p>L&rsquo;idée est à la fois de pouvoir allumer ou éteindre toutes les ampoules de la pièce à partir de l’interrupteur mais également de pouvoir sélectionner une ambiance lumineuse en fonction des circonstances, par exemple pour un salon : ambiance « réception », ambiance « soirée », ambiance « Ciné », ambiance « Feu de cheminée », etc&#8230;</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/Hue1.gif"><img class="colorbox-4853"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Hue1" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/Hue1_thumb-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/05/Hue1_thumb.gif" alt="Hue1" width="150" height="266" border="0" /></a></p>
<h3>Prérequis</h3>
<ul>
<li>Un serveur Constellation</li>
<li>Des lampes ou ampoules connectées, ici des Philips Hue</li>
<li>Un interrupteur mural connecté, ici un interrupteur Legrand relié à un module Z-Wave Fibaro FGS-211</li>
<li>Le SDK Constellation pour Visual Studio</li>
</ul>
<h3>Etape 1 : connecter un interrupteur mural</h3>
<p>La première étape consiste donc à intégrer un interrupteur dans Constellation. Avec la polyvalence de la plateforme Constellation, il y a mille et une manière d&rsquo;y parvenir.</p>
<p>Pour ma part, j&rsquo;ai conservé les interrupteurs existants de la gamme Mosaic Legrand. Il s&rsquo;agit pour être exacte d&rsquo;un double bouton poussoir.</p>
<p>Pour le rendre connecté, j&rsquo;ai ajouté un micro-module de la marque Fibaro spécialement conçu pour être intégré dans la boite d&rsquo;encastrement juste derrière l’interrupteur.</p>
<p>Ce module Fibaro est un FGS-211 connecté en Z-Wave et disposant de deux relais en sortie pilotant des charges jusqu&rsquo;à 1500W et de deux entrées. Dans mon cas, il n&rsquo;y a aucune charge connectée sur ce module, il me sert juste de »capteur ».</p>
<p>Je rappelle aussi que les ampoules Philips Hue doivent être constamment alimentées en 220v de façon à être pilotable même après avoir fermé les lumières !</p>
<p>Le module Fibaro est simplement connecté sur le réseau électrique 220v pour son alimentation et aux deux boutons poussoir Legrand de la façon suivante :</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-87.png"><img loading="lazy" class="alignnone colorbox-4853" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Connexion du FGS-211" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-86.png" alt="Connexion du FGS-211" width="450" height="321" border="0" /></a></p>
<p>Cela permettant d&rsquo;avoir deux boutons connectés sur le même interrupteur : l&rsquo;un servira pour allumer ou éteindre toutes les lumières du salon et l&rsquo;autre permettra de changer la configuration lumineuse de la pièce.</p>
<p style="text-align: center;"><img loading="lazy" class="aligncenter colorbox-4853" 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-86.png" alt="image" width="240" height="232" border="0" /></p>
<p style="text-align: left;">Ce module Fibaro a été appairé sur mon contrôleur Z-Wave qui est une Vera Lite. Après avoir déployé le package <a href="/package-library/vera/">Vera </a>sur une des sentinelles de ma Constellation, on obtient différents StateObjects représentant l&rsquo;état en temps réel de chaque device Z-Wave et des MessageCallbacks permettant de les piloter.</p>
<p style="text-align: left;">Les deux relais du FGS-221 sont considérés comme deux devices distincts de type « Switchs » (On ou Off). On a donc deux StateObjects dans Constellation pour représenter l&rsquo;état de ces deux relais. Chacun de ces StateObjects contient la propriété « Status », un booléen indiquant si le relais est ouvert ou fermé.</p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-89.png"><img loading="lazy" class="aligncenter colorbox-4853" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="StateObject du FGS-211" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-88.png" alt="StateObject du FGS-211" width="354" height="293" border="0" /></a></p>
<p style="text-align: left;">On peut permuter l&rsquo;état du relais informatiquement parlant par la Vera (ou par Constellation via le MessageCallback « <em>SetSwitchState</em> » du package Vera) ou directement en appuyant sur les boutons poussoirs.</p>
<p>Ainsi dès lors que l&rsquo;utilisateur va appuyer sur l&rsquo;un des boutons poussoirs, l&rsquo;état du relais changera et donc le StateObject le représentant sera également mis à jour dans votre Constellation. On pourra donc s&rsquo;abonner à ces deux StateObjects via l&rsquo;API.NET, Python, Arduino ou autre pour réagir à ces changements d&rsquo;état, par exemple pour allumer ou éteindre les ampoules Hue.</p>
<h3>Etape 2 : connecter des lampes</h3>
<p>Deuxième étape pour mener à bien notre projet : connecter des lampes dans Constellation. Il y a différentes solutions comme nous avons pu le découvrir dans <a href="/tutorials/synchroniser-lampe-bureau-avec-session-windows/#Etape_1_piloter_une_lampe_par_Constellation">cet autre tutoriel</a> : solutions DIY, prises connectées en Wifi, RF, en Z-Wave, lampes ou ampoules connectées en Wifi, en ZeeBee, etc.. etc..</p>
<p>Dans mon cas, j&rsquo;ai équipé les huit appliques de mon salon avec des ampoules Philips Hue.</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/hue.jpg"><img loading="lazy" class="aligncenter colorbox-4853" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="hue" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/hue_thumb.jpg" alt="hue" width="400" height="210" border="0" /></a></p>
<p style="text-align: left;">Toutes les ampoules communiquent en ZeeBee à un pont Ethernet, nommé le bridge (à gauche de la photo ci-dessus). Grace au package <a href="/package-library/hue/">Hue</a>, vous disposez de différents MessageCallbacks pour contrôler chaque lampes Hue (état, intensité lumineuse, couleur, effet, etc..) et d&rsquo;un StateObject par luminaire représentant son état en temps réel.</p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-90.png"><img class="colorbox-4853"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="StateObject d'une ampoule Hue" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-89.png" alt="StateObject d'une ampoule Hue" width="354" height="258" border="0" /></a></p>
<p style="text-align: center;" align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-91.png"><img class="colorbox-4853"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="MessageCallbacks du package Hue" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-90.png" alt="MessageCallbacks du package Hue" width="354" height="358" border="0" /></a></p>
<h3>Etape 3 : synchroniser l’interrupteur avec les lampes</h3>
<p>Passons au chose sérieuse, nous avons d’un côté deux StateObjects nous indiquant l&rsquo;état des deux relais qu&rsquo;on contrôle par les boutons poussoirs et de l&rsquo;autre des MessageCallbacks nous permettant de contrôler les ampoules Hue du salon, reste juste à faire le lien !</p>
<p>Pour cela nous allons <a href="https://developer.myconstellation.io/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 deux <a href="https://developer.myconstellation.io/client-api/net-package-api/consommer-des-stateobjects/">StateObjectLinks</a>, c’est à dire des propriétés dans notre code liées aux StateObjects représentant les états des interrupteurs :</p>
<p></p><pre class="crayon-plain-tag">[StateObjectLink("Vera", "Interrupteur Hue 1")]
public StateObjectNotifier InterrupteurHue1 { get; set; }

[StateObjectLink("Vera", "Interrupteur Hue 2")]
public StateObjectNotifier InterrupteurHue2 { get; set; }</pre><p></p>
<p>Nous allons commencer par le bouton de gauche, c&rsquo;est à dire l&rsquo;interrupteur n°1 qui se chargera d&rsquo;allumer ou d’éteindre toutes les ampoules du salon.</p>
<p>Pour cela nous allons attacher un « handler » qui réagira à la mise à jour du StateObject « Interrupteur Hue 1 ». Le handler commencera par vérifier que l&rsquo;état à bien changé, c&rsquo;est à dire que la propriété « Status » du « OldState » versus le « NewState » est bien différente (le StateObject peut être mis à jour par exemple dans le cas d&rsquo;un « poll » Z-Wave à intervalle régulier sans pour autant que son Status ait changé !).</p>
<p>Ensuite on invoque simplement le MessageCallback « <em>SetState</em> » du package Hue. Le 1er argument est le n° de la lampe, 0 indiquant « toutes les lampes » et le 2ème argument est l&rsquo;état (On ou Off) de la lampe. Ici on passera l&rsquo;état du relais (propriété du Status).</p>
<p></p><pre class="crayon-plain-tag">this.InterrupteurHue1.ValueChanged += (s, e) =&gt;
{
    if ((bool)e.OldState.DynamicValue.Status != (bool)e.NewState.DynamicValue.Status)
    {
        PackageHost.CreateMessageProxy("Hue").SetState(0, (bool)e.NewState.DynamicValue.Status);
    }
};</pre><p></p>
<p>Ainsi dès que vous appuyez sur le bouton poussoir de gauche, le relais change d&rsquo;état donc le code ci-dessus est invoqué ce qui allumera ou éteindra toutes vos lampes Hue !</p>
<p>Et voilà comment en quelques lignes on peut synchroniser des choses ensembles ! Au final, on obtient un interrupteur connecté pilotant plusieurs ampoules connectées.</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>). Simple et efficace !</p>
<h3>Etape 4 : contrôler les ambiances lumineuses</h3>
<p>Ce que nous avons fait jusqu&rsquo;à présent est relativement simple : on synchronise simplement l&rsquo;état du relais Fibaro (piloté par l’interrupteur) à l&rsquo;état (state On/Off) des lampes Hue.</p>
<p>Le MessageCallback « <em>SetState</em> » allume ou éteint des lampes Hue. Dans le cas d&rsquo;un allumage, les lampes reprendront leurs dernières configurations en terme de couleur et d&rsquo;intensité.</p>
<p style="text-align: left;">Il existe d&rsquo;autre MC sur ce package comme le <em>SetColor</em>, <em>SetBrightness</em>, ou le <em>Set</em> qui combine les 3 en un en prenant en paramètre à la fois l&rsquo;état, la couleur et l&rsquo;intensité.</p>
<p style="text-align: left;">Nous allons donc perfectionner notre package en utilisant <a href="/client-api/net-package-api/settings/">un setting au format JSON</a> pour décrire nos différentes ambiances lumineuses. L’interrupteur de gauche ne se contentera plus de faire un simple <em>SetState</em> sur chaque lampe mais appliquera la configuration dite par défaut que nous pourrons à tout moment mettre à jour dans les settings depuis la Console.</p>
<p style="text-align: left;">L&rsquo;interrupteur n°2 quant à lui, celui de droite, servira pour appliquer la configuration suivante de façon cyclique (arrivé à la dernière, on revient au début).</p>
<p align="center"><img class="colorbox-4853"  loading="lazy" title="Hue2" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/Hue2_thumb-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2017/05/Hue2_thumb.gif" alt="Hue2" width="150" height="266" border="0" /></p>
<p style="text-align: left;" align="center">Commençons d&rsquo;abord par définir nos configurations lumineuses dans un setting JSON.</p>
<h4>Créer des « configurations lumineuses »</h4>
<p>Pour cela je vous propose de créer une page Web pour générer le setting de configuration sur base de l&rsquo;état actuelle de vos lampes.</p>
<p>En clair, avec l&rsquo;application officielle Hue, réglez vos lampes pour créer l&rsquo;ambiance lumineuse souhaitée et en temps réel notre page Web générera l&rsquo;objet JSON représentant votre configuration.</p>
<p>Nous allons simplement créer un simple page HTML en y ajoutant le module Constellation / AngularJS <a href="/client-api/javascript-api/consommer-constellation-angular-js/">comme vu ici</a>.</p>
<p>Lorsque nous sommes connecté, on enregistre un StateObjectLink sur tous les StateObjects du type « <em>Q42.HueApi.Light</em> » du package Hue. Pour chaque lampe Hue, on stocke la valeur du StateObject dans une variable de scope nommée « lights » :</p>
<p></p><pre class="crayon-plain-tag">constellation.registerStateObjectLink("*", "Hue", "*", "Q42.HueApi.Light", function (stateObject) { 
    $scope.$apply(function () {
        $scope.lights[stateObject.Name] = stateObject.Value;
    });
});</pre><p></p>
<p>Ainsi l&rsquo;état de chacune de nos lampes sera synchronisée en temps réel dans cette variable Javascript.</p>
<p>Maintenant dans le code HTML, générons une liste pour afficher le nom de chaque lampe, son ID, son état (on/off), sa couleur (Hue et Saturation) et son intensité (bri) avec un « ng-repeat » Angular :</p>
<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
    &lt;li ng-repeat="(name, value) in lights" title="{{value}}"&gt;{{name}} = #{{value.id}} On:{{value.state.on}} Hue:{{value.state.hue}} Sat:{{value.state.sat}} Bri:{{value.state.bri}}&lt;/li&gt;
&lt;/ul&gt;</pre><p></p>
<p>C&rsquo;est aussi simple que cela !</p>
<p>Maintenant ajoutons une méthode « <em>ExportCurrentConfig</em> » qu&rsquo;on appellera dans notre StateObjectLink dès qu&rsquo;un StateObject est mis à jour :</p>
<p></p><pre class="crayon-plain-tag">$scope.ExportCurrentConfig = function() {
    var config = { ConfigName: "MyConfig", Lights: []};
    for(var name in $scope.lights) {
        var value = $scope.lights[name];
        config.Lights.push({ id: value.id, state: value.state.on, hue: value.state.hue, sat:value.state.sat, bri:value.state.bri });
    }
    $scope.strConfigs = JSON.stringify([ config ]).replace(/"/g, "'");
};</pre><p></p>
<p>On crée un objet avec une propriété « <em>ConfigName</em> » pour nommer notre configuration et un tableau « <em>Lights</em> » qu&rsquo;on remplit avec l&rsquo;état connu de chaque lampe. Pour finir on « <em>stringify</em> » notre objet en JSON qu&rsquo;on affichera ensuite dans un « <em>textarea</em> » sur la page :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-88.png"><img class="colorbox-4853"  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-87.png" alt="image" width="454" height="274" border="0" /></a></p>
<p style="text-align: left;" align="center">Il ne reste plus qu&rsquo;à générer différentes configurations notre « extracteur » pour la suite de notre tutoriel.</p>
<p style="text-align: left;" align="center">Le code complet de la page :</p>
<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" ng-app="hue"&gt;
&lt;head&gt;
    &lt;title&gt;Hue Configuration&lt;/title&gt;
        
    &lt;script type="text/javascript" src="/Scripts/jquery-2.1.3.min.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="/Scripts/angular.min.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="/Scripts/jquery.signalR-2.2.0.min.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="/Scripts/Constellation-1.8.1.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="/Scripts/ngConstellation-1.8.1.js"&gt;&lt;/script&gt; 
    
    &lt;script&gt;
        var hue = angular.module('hue',  ['ngConstellation'])
            .controller('HueController', ['$scope', 'constellationConsumer', function ($scope, constellation) {
                $scope.lights = {};
                $scope.strConfigs = "";
            
                constellation.initializeClient("http://xxxxxxx:8088/", "demo123", "Hue Configurator");
                
                $scope.ExportCurrentConfig = function() {
                    var config = { ConfigName: "MyConfig", Lights: []};
                    for(var name in $scope.lights) {
                        var value = $scope.lights[name];
                        config.Lights.push({ id: value.id, state: value.state.on, hue: value.state.hue, sat:value.state.sat, bri:value.state.bri });
                    }
                    $scope.strConfigs = JSON.stringify([ config ]).replace(/"/g, "'");
                };

                constellation.onConnectionStateChanged(function (change) {
                    if (change.newState === $.signalR.connectionState.connected) {
                        console.log("Connected");
                        constellation.registerStateObjectLink("*", "Hue", "*", "Q42.HueApi.Light", function (stateObject) {  
                            $scope.$apply(function () {
                                $scope.lights[stateObject.Name] = stateObject.Value;    
                                $scope.ExportCurrentConfig();
                            });
                        });                        
                    }
                    else if (change.newState === $.signalR.connectionState.disconnected) {    
                        constellation.connect();
                    }
                });
                
                constellation.connect();
            }]);
    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;ul&gt;
        &lt;li ng-repeat="(name, value) in lights" title="{{value}}"&gt;{{name}} = #{{value.id}} On:{{value.state.on}} Hue:{{value.state.hue}} Sat:{{value.state.sat}} Bri:{{value.state.bri}}&lt;/li&gt;
    &lt;/ul&gt;
    &lt;hr/&gt;
    &lt;p&gt;Current configuration :&lt;/p&gt;
    &lt;textarea rows="40" cols="50"&gt;{{strConfigs}}&lt;/textarea&gt;
    
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>
<h4>Activer les configurations depuis interrupteur</h4>
<p>Premièrement nous allons déclarer dans le <a href="/concepts/package-manifest/">manifeste de notre package</a> (<em>PackageInfo.xml</em>) le setting « <em>Hue.Configuration</em> » par la ligne :</p>
<p></p><pre class="crayon-plain-tag">&lt;Setting name="Hue.Configurations" type="JsonObject" isRequired="true" description="Configurations lumineuses" /&gt;</pre><p></p>
<p>Le contenu de ce setting sera un tableau des différentes configurations générées par notre extracteur ci-dessus.</p>
<p>Pour ma part voici mes configurations à titre d&rsquo;exemple :</p>
<p></p><pre class="crayon-plain-tag">[
   {
      'ConfigName':'Blanc chaud',
      'DefaultConfig':true,
      'Lights':[
         {
            'id':'1',
            'state':true,
            'hue':6479,
            'sat':252,
            'bri':254
         },
         {
            'id':'2',
            'state':true,
            'hue':13907,
            'sat':187,
            'bri':179
         },
         {
            'id':'3',
            'state':true,
            'hue':13907,
            'sat':187,
            'bri':254
         },
         {
            'id':'4',
            'state':true,
            'hue':14101,
            'sat':180,
            'bri':141
         },
         {
            'id':'5',
            'state':true,
            'hue':14101,
            'sat':180,
            'bri':254
         },
         {
            'id':'6',
            'state':true,
            'hue':14101,
            'sat':180,
            'bri':161
         },
         {
            'id':'7',
            'state':true,
            'hue':12778,
            'sat':219,
            'bri':120
         },
         {
            'id':'8',
            'state':true,
            'hue':12778,
            'sat':219,
            'bri':254
         }
      ]
   },
   {
      'ConfigName':'Film du soir',
      'Lights':[
         {
            'id':'1',
            'state':true,
            'hue':7157,
            'sat':243,
            'bri':104
         },
         {
            'id':'2',
            'state':false,
            'hue':13907,
            'sat':187,
            'bri':179
         },
         {
            'id':'3',
            'state':true,
            'hue':13122,
            'sat':211,
            'bri':80
         },
         {
            'id':'4',
            'state':true,
            'hue':12778,
            'sat':219,
            'bri':142
         },
         {
            'id':'5',
            'state':true,
            'hue':13122,
            'sat':211,
            'bri':80
         },
         {
            'id':'6',
            'state':false,
            'hue':14101,
            'sat':180,
            'bri':161
         },
         {
            'id':'7',
            'state':false,
            'hue':13122,
            'sat':211,
            'bri':120
         },
         {
            'id':'8',
            'state':false,
            'hue':4712,
            'sat':241,
            'bri':254
         }
      ]
   },
   {
      'ConfigName':'Cheminée',
      'Lights':[
         {
            'id':'2',
            'state':false,
            'hue':7980,
            'sat':252,
            'bri':79
         },
         {
            'id':'8',
            'state':true,
            'hue':4712,
            'sat':241,
            'bri':254
         },
         {
            'id':'5',
            'state':true,
            'hue':13122,
            'sat':211,
            'bri':91
         },
         {
            'id':'4',
            'state':false,
            'hue':7862,
            'sat':252,
            'bri':53
         },
         {
            'id':'3',
            'state':true,
            'hue':13122,
            'sat':211,
            'bri':91
         },
         {
            'id':'6',
            'state':true,
            'hue':8774,
            'sat':252,
            'bri':56
         },
         {
            'id':'7',
            'state':true,
            'hue':13122,
            'sat':211,
            'bri':120
         },
         {
            'id':'1',
            'state':true,
            'hue':6196,
            'sat':247,
            'bri':104
         }
      ]
   },
   {
      'ConfigName':'Tout éteind',
      'OffConfig':true,
      'Lights':[
         {
            'id':'1',
            'state':false,
            'hue':7157,
            'sat':243,
            'bri':104
         },
         {
            'id':'2',
            'state':false,
            'hue':13907,
            'sat':187,
            'bri':179
         },
         {
            'id':'3',
            'state':false,
            'hue':3584,
            'sat':252,
            'bri':254
         },
         {
            'id':'4',
            'state':false,
            'hue':12778,
            'sat':219,
            'bri':142
         },
         {
            'id':'5',
            'state':false,
            'hue':13122,
            'sat':211,
            'bri':80
         },
         {
            'id':'6',
            'state':false,
            'hue':14101,
            'sat':180,
            'bri':161
         },
         {
            'id':'7',
            'state':false,
            'hue':12778,
            'sat':219,
            'bri':120
         },
         {
            'id':'8',
            'state':false,
            'hue':12778,
            'sat':219,
            'bri':254
         }
      ]
   }
]</pre><p></p>
<p>Vous remarquerez que j&rsquo;ai ajouté sur la première configuration la propriété « <em>DefaultConfig = true</em> » et « <em>OffConfig =true</em> » sur la dernière.  On se servira de ces deux propriétés pour savoir quelles sont les configurations à appliquer en cas de « On » et de « Off » sur notre interrupteur n°1.</p>
<p>Le setting est de type « JsonObject », on aura donc un bel éditeur dans la Console Constellation pour le déclarer ou le modifier. Pour vos développements vous pouvez aussi utiliser le <a href="/client-api/net-package-api/settings/">fichier App.config</a>.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-92.png"><img class="colorbox-4853"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Configuration du setting" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-91.png" alt="Configuration du setting" width="454" height="278" border="0" /></a></p>
<p>Pour revenir à notre code C#, nous allons tout d&rsquo;abord déclarer les variables privées suivantes :</p>
<p></p><pre class="crayon-plain-tag">private int currentConfigurationId = 0, defaultConfigurationId = 0, offConfigurationId = 0;
private List&lt;dynamic&gt; hueConfiguration = new List&lt;dynamic&gt;();</pre><p></p>
<p>Dans la méthode démarrage (<em>OnStart</em>) on charge notre setting JSON dans la variable « <em>hueConfiguration</em> » avec la méthode « <em>GetSettingAsJson</em> » puis on récupère dans ce tableau l&rsquo;index de la configuration « Default » et « Off » par la méthode .NET « <em>FindIndex</em> » :</p>
<p></p><pre class="crayon-plain-tag">hueConfiguration = new List&lt;dynamic&gt;(PackageHost.GetSettingAsJsonObject("Hue.Configurations"));
defaultConfigurationId = this.hueConfiguration.FindIndex(c =&gt; c.DefaultConfig == true);
offConfigurationId = this.hueConfiguration.FindIndex(c =&gt; c.OffConfig == true);</pre><p></p>
<p>Créons maintenant la méthode « <em>ApplyHueConfiguration</em> » qui se chargera d&rsquo;appliquer la configuration sur nos lampes Hue.</p>
<p>En quelques mots elle itère sur chaque « <em>Light</em> » de la configuration spécifiée par son index puis invoque le MessageCallback « <em>Set</em> » du package Hue en passant l&rsquo;ID de la lampe avec son état (state, hue/sat et brightness). La configuration courante est sauvegardée dans la variable « <em>currentConfigurationId</em>« .</p>
<p>Il est aussi possible de spécifier optionnellement l&rsquo;index de la configuration à exclure ce qui aura pour action d&rsquo;appliquer automatique la configuration suivante.</p>
<p></p><pre class="crayon-plain-tag">private int ApplyHueConfigration(List&lt;dynamic&gt; configurationList, int configIdx, int configToExclude = -1)
{
    // Si la config selectionnée est à exclure ...
    if (configToExclude &gt;= 0 &amp;&amp; configIdx == configToExclude)
    {
        // On passe à la configuration suivante :
        return this.ApplyHueConfigration(configurationList, (configIdx + 1) % configurationList.Count, configToExclude);
    }
    else
    {
        // On récupere la configuration à partir de son Index
        var config = configurationList[configIdx];
        PackageHost.WriteInfo("Applying Hue configuration '{0}'", config.ConfigName);
        // On applique la configuration en invoquant le MC "Set" à chaque lampe
        this.currentConfigurationId = configIdx;
        foreach (dynamic hue in config.Lights)
        {
            PackageHost.CreateMessageProxy("Hue").Set(hue.id, hue.state, hue.hue, hue.sat, hue.bri);
            Thread.Sleep(100);
        }
        // On retourne l'Index de la configuration appliquée
        return configIdx;
    }
}</pre><p></p>
<p>Maintenant modifions notre handler sur le StateObjectLink « InterrupteurHue1 » que nous avons créé précédemment.</p>
<p>Dès que cet interrupteur change d&rsquo;état on applique la configuration « Default » ou « Off » en fonction de l&rsquo;état du relais FGS-211 correspondant. On prendra garde de ne rien faire si l&rsquo;interrupteur change à « On » alors que l&rsquo;état des lampes n&rsquo;est pas éteint et inversement, on ne fera rien si l&rsquo;interrupteur change à « Off » alors que les lampes sont déjà éteintes.</p>
<p></p><pre class="crayon-plain-tag">this.InterrupteurHue1.ValueChanged += (s, e) =&gt;
{
    // Si InterrupteurHue1 change d'état
    if ((bool)e.OldState.DynamicValue.Status != (bool)e.NewState.DynamicValue.Status)
    {
        if ((bool)e.NewState.DynamicValue.Status &amp;&amp; this.currentConfigurationId != offConfigurationId)
        {
            // Ne rien faire si InterrupteurHue1 = ON et que la configuration actuelle n'est pas "tout eteint" !
            return;
        }
        else if ((bool)e.NewState.DynamicValue.Status == false &amp;&amp; this.currentConfigurationId == offConfigurationId)
        {
            // Ne rien faire si InterrupteurHue1 = OFF et que la configuration actuelle est déjà "tout eteint" !
            return;
        }
        else
        {
            // Autrement on applique la configuration "default" si InterrupteurHue1 = ON ou "off" si InterrupteurHue1 = Off
            this.ApplyHueConfigration(hueConfiguration, (bool)e.NewState.DynamicValue.Status ? defaultConfigurationId : offConfigurationId);
        }
    }
};</pre><p></p>
<p>Maintenant pour le deuxième interrupteur, dès qu&rsquo;il changera d&rsquo;état, deux cas :</p>
<ul>
<li>Si l&rsquo;interrupteur n°1 n&rsquo;est pas allumé, on invoque le MC « <em>SetSwitchState</em> » du package Vera pour l&rsquo;allumer. Ainsi son SO sera mis à jour et donc le code ci-dessus sera invoqué pour appliquer la configuration « Default » (synchronisation parfaite entre l&rsquo;état du relais Fibaro et nos lampes)</li>
<li>Si l&rsquo;interrupteur n°1 est déjà allumé, on appelle notre méthode « <em>ApplyHueConfiguration</em> » en spécifiant l&rsquo;index de la prochaine configuration et en excluant la configuration « tout éteint » (Off)</li>
</ul>
<p></p><pre class="crayon-plain-tag">// On permute les configurations avec InterrupteurHue2
this.InterrupteurHue2.ValueChanged += (s, e) =&gt;
{
    // Si InterrupteurHue2 change d'état
    if ((bool)e.OldState.DynamicValue.Status != (bool)e.NewState.DynamicValue.Status)
    {
        // Si InterrupteurHue1 = OFF, on l'allume pour garder InterrupteurHue1 syncrhonisé !
        if ((bool)this.InterrupteurHue1.DynamicValue.Status == false)
        {
            // Cela déclenchera le handler ci-dessus ce qui appliquera la configuration "default".
            PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = (int)this.InterrupteurHue1.DynamicValue.Id, State = true });
        }
        else // Si InterrupteurHue1 est déjà ON
        {
            // ON applique la configuration suivante de facon cyclique en excluant la configuration " tout éteint"
            this.ApplyHueConfigration(hueConfiguration, (this.currentConfigurationId + 1) % hueConfiguration.Count, configToExclude: offConfigurationId);
        }
    }
};</pre><p></p>
<p>Ainsi on a bien l&rsquo;interrupteur n°1 qui contrôle le relais n° 1 du Fibaro, lui même parfaitement synchronisé avec nos lampes. Si le relais est éteint, on applique la configuration « OffConfig » de notre setting et si le relais est allumé, on applique la configuration « DefaultConfig ».</p>
<p>Quand on appuie sur l&rsquo;interrupteur n°2, on permute l&rsquo;état du relais n° 2 du Fibaro ce qui applique donc, de manière cyclique, les différentes configurations de notre setting sur nos lampes Hue.</p>
<p>On peut modifier comme bon nous semble le setting depuis la Console Constellation pour changer la configuration par défaut, ajouter ou supprimer de nouvelles ambiances ou modifier celles existantes ! De même, si ajoutez des lampes dans votre pièce vous n&rsquo;aurez qu&rsquo;à les déclarer dans votre JSON;</p>
<p>De plus, avec n&rsquo;importe quelle application ou contrôleur Z-Wave comme un Minimote par exemple, vous pouvez contrôler l&rsquo;interrupteur n°1 qui se synchronisera parfaitement avec vos lampes Hue !</p>
<h4>Pour aller plus loin</h4>
<p>Ajoutons une dernière méthode nommée « <em>ApplyHueConfiguration</em> » qui accepte en paramètre le nom de la configuration à appliquer. On l&rsquo;invoque avec le nom de la configuration (et non l&rsquo;index) et elle se chargera d&rsquo;appliquer cette configuration si elle existe bien dans votre setting.</p>
<p>Une fois n&rsquo;est pas coutume, on enverra des messages au package Vera pour synchroniser l&rsquo;état du relais n°1 si nécessaire.</p>
<p></p><pre class="crayon-plain-tag">[MessageCallback]
public int ApplyHueConfigration(string configName)
{
    // On récupere l'ID de la configuration à partir de son nom
    int configId = this.hueConfiguration.FindIndex(c =&gt; c.ConfigName == configName);
    if (configId &gt;= 0)
    {
        // On synchronise l'interrupteur Fibaro avec les lampes (sens Hue -&gt; Fibaro)
        if (configId != offConfigurationId &amp;&amp; (bool)this.InterrupteurHue1.DynamicValue.State == false)
        {
            PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = (int)this.InterrupteurHue1.DynamicValue.Id, State = true });
        }
        else if (configId == offConfigurationId &amp;&amp; (bool)this.InterrupteurHue1.DynamicValue.State == true)
        {
            PackageHost.CreateMessageProxy("Vera").SetSwitchState(new { DeviceID = (int)this.InterrupteurHue1.DynamicValue.Id, State = false });
        }

        // On applique la configuration
        return this.ApplyHueConfigration(hueConfiguration, configId);
    }
    else
    {
        return configId;
    }
}</pre><p></p>
<p>Vous remarquerez que nous avons ajouté l&rsquo;attribut <em>[MessageCallback]</em> sur cette méthode ce qui veut dire que votre package exposera cette méthode, que l&rsquo;on nomme <em>MessageCallback</em>, pour toute votre Constellation.</p>
<p>C&rsquo;est à dire que n&rsquo;importe quel autre package C#, Python, un script Powershell ou Bash, un Arduino ou ESP8266, une page Web, etc&#8230; Tous pourront envoyer un message à votre package pour appliquer des configurations lumineuses sur vos lampes Hue en fonction des configurations que nous avez configuré dans votre setting !</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/tutorials/synchroniser-interrupteur-mural-ampoules-connectee/">Synchroniser un interrupteur mural avec des ampoules connectées et contrôler l&rsquo;ambiance lumineuse de votre pièce</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-interrupteur-mural-ampoules-connectee/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<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[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>
		<category><![CDATA[Vera]]></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>GoogleTraffic : l&#8217;état du trafic routier dans Constellation</title>
		<link>https://developer.myconstellation.io/package-library/googletraffic/</link>
					<comments>https://developer.myconstellation.io/package-library/googletraffic/#respond</comments>
		
		<dc:creator><![CDATA[Constellation Documentation Agent]]></dc:creator>
		<pubDate>Fri, 28 Oct 2016 12:46:58 +0000</pubDate>
				<category><![CDATA[Packages]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Traffic]]></category>
		<category><![CDATA[Route]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=3627</guid>

					<description><![CDATA[<p>Le  package GoogleTraffic permet de calculer le temps de route entre deux adresses en tenant compte de l’état du trafic. Installation Depuis le “Online Package Repository” de votre Console Constellation, déployez le package GoogleTraffic : Une fois le package télécharger</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/googletraffic/">GoogleTraffic : l&rsquo;état du trafic routier dans Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le  package GoogleTraffic permet de calculer le temps de route entre deux adresses en tenant compte de l’état du trafic.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-175.png"><img class="colorbox-3627"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-157.png" alt="image" width="350" height="213" border="0" /></a></p>
<h3>Installation</h3>
<p>Depuis le “Online Package Repository” de votre Console Constellation, déployez le package GoogleTraffic :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-176.png"><img class="colorbox-3627"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-158.png" alt="image" width="350" height="211" border="0" /></a></p>
<p>Une fois le package télécharger votre repository local, sélectionnez la sentinelle sur laquelle déployer le package.</p>
<p>Pour finir, sur la page de Settings vous pouvez optionnellement remplir votre adresse de domicile et une ou plusieurs adresse de destination avec une plage horaire :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-177.png"><img class="colorbox-3627"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-159.png" alt="image" width="350" height="284" border="0" /></a></p>
<p align="left">Lorsque le package est dans une plage d’horaire spécifiée, il réalisera les itinéraires “de” et “vers” les destinations à l’intervalle spécifié dans l’attribut “refreshInterval” (ici 15 min). Les résultats sont publiés dans des StateObjects.</p>
<p align="left">Vous pouvez également déployer ce package manuellement dans la configuration de votre Constellation :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="GoogleTraffic" /&gt;</pre><p></p>
<p align="left">Ou avec des deux itinéraire à suivre de 7h à 10h, de 11h45 à 14h30 et de 16h à 19h30 :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="GoogleTraffic"&gt;
  &lt;settings&gt;
    &lt;setting key="googleTrafficConfigurationSection"&gt;
        &lt;content&gt;
            &lt;googleTrafficConfigurationSection xmlns="urn:GoogleTraffic" refreshInterval="00:15:00"&gt;
                &lt;home name="Maison" address="108 rue Sebastopol" postalCode="59000" city="Lille" /&gt;
                &lt;destinations&gt;
                    &lt;address name="Adresse 1" address="48 rue de Douai" postalCode="59000" city="Lille" /&gt;
                    &lt;address name="Adresse 2" address="1 avenue victor huge" postalCode="92190 " city="Meudon" /&gt;
                &lt;/destinations&gt;
                &lt;timeRanges&gt;
                    &lt;timeRange from="07:00:00" to="10:00:00" /&gt;
                    &lt;timeRange from="11:45:00" to="14:30:00" /&gt;
                    &lt;timeRange from="16:00:00" to="19:30:00" /&gt;
                &lt;/timeRanges&gt;
            &lt;/googleTrafficConfigurationSection&gt;
       &lt;/content&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<h3>Détails du package</h3>
<h4>Les Settings</h4>
<table border="0" width="100%" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="10"><u>Nom</u></td>
<td valign="top" width="10"><u>Type</u></td>
<td valign="top" width="10"><u>Détail</u></td>
<td valign="top" width="478"><u>Description</u></td>
</tr>
<tr>
<td valign="top" width="10"><strong>googleTrafficConfigurationSection</strong></td>
<td valign="top" width="10">ConfigurationSection</td>
<td valign="top" width="10">Optionnel</td>
<td valign="top" width="478">Adresse IP ou DNS du pont Hue.</td>
</tr>
</tbody>
</table>
<h4>Les StateObjects</h4>
<p>Vous retrouverez autant de StateObjects que de lampes Hue appariées sur le pont ainsi qu’un StateObject pour la configuration du pont :</p>
<table border="0" width="100%" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="10"><u>Nom</u></td>
<td valign="top" width="10"><u>Type</u></td>
<td valign="top" width="446"><u>Description</u></td>
</tr>
<tr>
<td valign="top" width="10"><strong>RouteHomeTo&lt;&lt;  Destination &gt;&gt;</strong></td>
<td valign="top" width="10">List&lt;TrafficData&gt;</td>
<td valign="top" width="446">La liste des itinéraires possibles de l’adresse “home” à la “destination” avec le temps de route avec et sans trafic et la distance.</td>
</tr>
<tr>
<td valign="top" width="10"><strong>Route&lt;&lt;  Destination &gt;&gt;ToHome</strong></td>
<td valign="top" width="10">List&lt;TrafficData&gt;</td>
<td valign="top" width="446">La liste des itinéraires possibles de l’adresse “destination” à “home” avec le temps de route avec et sans trafic et la distance.</td>
</tr>
</tbody>
</table>
<h4 align="left">Les MessageCallbacks</h4>
<p>Le package expose 3 MessageCallbacks :</p>
<table border="0" width="100%" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="10"><u>Nom</u></td>
<td valign="top" width="141"><u>Réponse (saga)</u></td>
<td valign="top" width="407"><u>Description</u></td>
</tr>
<tr>
<td valign="top" width="10"><strong>GetRoute</strong></td>
<td valign="top" width="141">List&lt;TrafficData&gt;</td>
<td valign="top" width="407">Calcule et retourne la liste des itinéraires possibles entre deux adresses avec le temps de route avec et sans trafic et la distance.</td>
</tr>
</tbody>
</table>
<p><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-178.png"><img class="colorbox-3627"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-160.png" alt="image" width="350" height="109" border="0" /></a></p>
<h3 align="left">Quelques exemples</h3>
<ul>
<li>Afficher le temps de route et le nom de la meilleur route sur une application Windows WPF</li>
<li>Créer un programme pour enregistrer le temps de route aux horaires de travail et exploiter les statistiques dans Excel.</li>
<li>Afficher l’état du trafic sur la route vers votre travail sur un anneau de LED RBG avec un Arduino/ESP</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/googletraffic/">GoogleTraffic : l&rsquo;état du trafic routier dans Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/package-library/googletraffic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hue : connectez vos lampes Hue dans Constellation</title>
		<link>https://developer.myconstellation.io/package-library/hue/</link>
					<comments>https://developer.myconstellation.io/package-library/hue/#comments</comments>
		
		<dc:creator><![CDATA[Constellation Documentation Agent]]></dc:creator>
		<pubDate>Fri, 28 Oct 2016 12:27:35 +0000</pubDate>
				<category><![CDATA[Packages]]></category>
		<category><![CDATA[Lampe]]></category>
		<category><![CDATA[Lumières]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Hue]]></category>
		<category><![CDATA[Philips]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=3614</guid>

					<description><![CDATA[<p>Le  package Hue permet de connecter et contrôler vos différentes lampes connectées Philips Hue dans Constellation. Vous devez disposer d’un pont Philips Hue (Hue Bridge) pour pouvoir utiliser ce package. Le code source de ce package est disponible sur : https://github.com/myconstellation/constellation-packages/tree/master/Hue</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/hue/">Hue : connectez vos lampes Hue dans Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le  package Hue permet de connecter et contrôler vos différentes lampes connectées <a href="http://www2.meethue.com/fr-fr/">Philips Hue</a> dans Constellation.</p>
<p align="center"><a href="http://www2.meethue.com/fr-fr/"><img class="colorbox-3614"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-166.png" alt="image" width="350" height="175" border="0" /></a></p>
<p align="left">Vous devez disposer d’un <a href="http://www2.meethue.com/fr-fr/productdetail/philips-hue-bridge">pont Philips Hue</a> (Hue Bridge) pour pouvoir utiliser ce package.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-167.png"><img class="colorbox-3614"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-150.png" alt="image" width="350" height="171" border="0" /></a></p>
<p style="text-align: left;" align="center">Le code source de ce package est disponible sur : <a href="https://github.com/myconstellation/constellation-packages/tree/master/Hue">https://github.com/myconstellation/constellation-packages/tree/master/Hue</a></p>
<h3>Installation</h3>
<h4>Prérequis : créer un utilisateur sur le pont Philips Hue</h4>
<p>Identifiez tout d’abord l’adresse IP (ou DNS) de votre pont Philips (avec un scan UPnP, en consultant les baux de votre serveur DHCP ou avec le client mobile officiel de Hue).</p>
<p>En entrant l’adresse de votre navigateur, vous devrez tomber sur la home page du bridge :</p>
<p><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-168.png"><img class="colorbox-3614"  loading="lazy" style="background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; padding-right: 0px; margin-right: auto; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-151.png" alt="image" width="350" height="308" border="0" /></a></p>
<p>Rendez-vous maintenant sur l’outil intégré de l’exécution de requête HTTP à l’adresse : http://&lt;bridge ip address&gt;/debug/clip.html</p>
<p align="center"> <a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-169.png"><img class="colorbox-3614"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-152.png" alt="image" width="350" height="308" border="0" /></a></p>
<p align="left">Dans le corps de la requête (Request Body) entrez le JSON suivant :</p>
<p></p><pre class="crayon-plain-tag">{"devicetype": "constellation#connector"}</pre><p></p>
<p>Avant d’exécuter la requête, appuyez sur le bouton “Link” sur le Bridge :</p>
<p align="center"><img class="colorbox-3614"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-170.png" alt="image" width="240" height="176" border="0" /></p>
<p align="left">Vous disposez maintenant de 30 secondes pour enregistrer votre utilisateur. Exécutez donc la requête sans tarder en cliquant sur le bouton “POST”.</p>
<p align="left">En retour (Commande Response) vous obtiendrez l’identifiant de votre utilisateur, ici nommé “83b7780291a6ceffbe0bd049104df” :</p>
<p></p><pre class="crayon-plain-tag">[{"success":{"username": "83b7780291a6ceffbe0bd049104df"}}]</pre><p></p>
<p align="left">Retenez cet identifiant, c’est cela qu’utilisera le package Constellation pour se connecter à vos Hue.</p>
<p>Pour plus d’informations : <a title="http://www.developers.meethue.com/documentation/configuration-api#71_create_user" href="http://www.developers.meethue.com/documentation/configuration-api#71_create_user">http://www.developers.meethue.com/documentation/configuration-api#71_create_user</a></p>
<h4>Installation du package Constellation</h4>
<p>Depuis le “Online Package Repository” de votre Console Constellation, déployez le package Hue :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-171.png"><img class="colorbox-3614"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-153.png" alt="image" width="350" height="211" border="0" /></a></p>
<p>Une fois le package télécharger votre repository local, sélectionnez la sentinelle sur laquelle déployer le package.</p>
<p>Pour finir, sur la page de Settings vous devez obligatoirement spécifier l’adresse de votre Bridge Hue (IP ou DNS) ainsi que votre utilisateur créé ci-dessus.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-172.png"><img class="colorbox-3614"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-154.png" alt="image" width="350" height="214" border="0" /></a></p>
<p align="left">Vous pouvez également déployer ce package manuellement dans la configuration de votre Constellation :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="Hue"&gt;
  &lt;settings&gt;
    &lt;setting key="BridgeAddress" value="192.168.x.x" /&gt;
    &lt;setting key="BridgeUsername" value="83b7780291a6ceffbe0bd049104df" /&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<h3>Détails du package</h3>
<h4>Les Settings</h4>
<table border="0" width="100%" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="10"><u>Nom</u></td>
<td valign="top" width="10"><u>Type</u></td>
<td valign="top" width="10"><u>Détail</u></td>
<td valign="top" width="478"><u>Description</u></td>
</tr>
<tr>
<td valign="top" width="10"><strong>BridgeAddress</strong></td>
<td valign="top" width="10">String</td>
<td valign="top" width="10">Obligatoire</td>
<td valign="top" width="478">Adresse IP ou DNS du pont Hue.</td>
</tr>
<tr>
<td valign="top" width="10"><strong>BridgeUsername</strong></td>
<td valign="top" width="10">String</td>
<td valign="top" width="10">Obligatoire</td>
<td valign="top" width="478">Identifiant de l’utilisateur utilisé pour se connecter sur le pont Hue.</td>
</tr>
</tbody>
</table>
<h4>Les StateObjects</h4>
<p>Vous retrouverez autant de StateObjects que de lampes Hue appariées sur le pont ainsi qu’un StateObject pour la configuration du pont :</p>
<table border="0" width="100%" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="10"><u>Nom</u></td>
<td valign="top" width="10"><u>Type</u></td>
<td valign="top" width="446"><u>Description</u></td>
</tr>
<tr>
<td valign="top" width="10"><strong>BridgeCondig</strong></td>
<td valign="top" width="10">Q42.HueApi.BridgeConfig</td>
<td valign="top" width="446">Représente la configuration du pont Hue (nom, adresse MAC et IP, config réseau, versions, liste des utilisateurs, etc..)</td>
</tr>
<tr>
<td valign="top" width="10"><strong>&lt;&lt; Nom de la lampe &gt;&gt;</strong></td>
<td valign="top" width="10">Q42.HueApi.Light</td>
<td valign="top" width="446">Représente l’état d’une lampe Hue (ID, état On/Off, luminosité, couleur Hue, effet, alerte, modèle, version logicielle, etc…)</td>
</tr>
</tbody>
</table>
<p><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-173.png"><img class="colorbox-3614"  loading="lazy" style="background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; padding-right: 0px; margin-right: auto; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-155.png" alt="image" width="350" height="160" border="0" /></a></p>
<h4 align="left">Les MessageCallbacks</h4>
<p>Le package expose 3 MessageCallbacks :</p>
<table border="0" width="100%" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="10"><u>Nom</u></td>
<td valign="top" width="141"><u>Réponse (saga)</u></td>
<td valign="top" width="407"><u>Description</u></td>
</tr>
<tr>
<td valign="top" width="10"><strong>SendCommandTo</strong></td>
<td valign="top" width="141"><em>Aucune</em></td>
<td valign="top" width="407">Envoi une commande à une ou plusieurs lampes</td>
</tr>
<tr>
<td valign="top" width="10"><strong>Set</strong></td>
<td valign="top" width="141"><em>Aucune</em></td>
<td valign="top" width="407">Envoi une commande à une lampe (état, couleur, intensité)</td>
</tr>
<tr>
<td valign="top" width="10"><strong>SetBrightness</strong></td>
<td valign="top" width="141"><em>Aucune</em></td>
<td valign="top" width="407">Défini l’intensité d’une lampe</td>
</tr>
<tr>
<td valign="top" width="10"><strong>SetColor</strong></td>
<td valign="top" width="141"><em>Aucune</em></td>
<td valign="top" width="407">Défini la couleur d’une lampe</td>
</tr>
<tr>
<td valign="top" width="10"><strong>SetCommandToAll</strong></td>
<td valign="top" width="141"><em>Aucune</em></td>
<td valign="top" width="407">Envoi une commande à toutes les lampes</td>
</tr>
<tr>
<td valign="top" width="10"><strong>SetState</strong></td>
<td valign="top" width="141"><em>Aucune</em></td>
<td valign="top" width="407">Défini l’état (On/Off) d’une lampe</td>
</tr>
<tr>
<td valign="top" width="10"><strong>ShowAlert</strong></td>
<td valign="top" width="141"><em>Aucune</em></td>
<td valign="top" width="407">Affiche une alerte sur une lampe</td>
</tr>
</tbody>
</table>
<h3 align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-174.png"><img class="colorbox-3614"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-156.png" alt="image" width="350" height="277" border="0" /></a></h3>
<h3 align="left">Quelques exemples</h3>
<ul>
<li>Tamiser les lumières lors du démarrage d’un film</li>
<li>Piloter les lumières en fonction de la luminosité ambiante</li>
<li>Piloter des configurations de lumières avec un interrupteur Legrand connecté à un module Fibaro</li>
<li>Afficher une alerte sur une lampe lorsqu’il pleut ou que quelqu’un sonne à la porte</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/package-library/hue/">Hue : connectez vos lampes Hue dans Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/package-library/hue/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-22 03:09:28 by W3 Total Cache
-->