﻿<?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>Catégorie Javascript API - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/client-api/javascript-api/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/client-api/javascript-api/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Thu, 19 Apr 2018 07:41:36 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.11</generator>

<image>
	<url>https://developer.myconstellation.io/wp-content/uploads/2016/02/256x256-e1457476015859.png</url>
	<title>Catégorie Javascript API - Constellation</title>
	<link>https://developer.myconstellation.io/client-api/javascript-api/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Connectez vos pages Web à Constellation</title>
		<link>https://developer.myconstellation.io/getting-started/connectez-vos-pages-web-constellation/</link>
					<comments>https://developer.myconstellation.io/getting-started/connectez-vos-pages-web-constellation/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 14:22:29 +0000</pubDate>
				<category><![CDATA[Guide de démarrage]]></category>
		<category><![CDATA[Javascript API]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[Controller]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2114</guid>

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

					<description><![CDATA[<p>Connecter une page HTML avec l’API Javascript Vous pouvez soit utiliser le gestionnaire de package Nuget depuis Visual Studio pour installer la dernière version du package “Constellation.Javascript” et ses dépendances : Ou bien utiliser (ou copier en local) les scripts</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/javascript-api/consommer-constellation-api-javascript/">Consommer Constellation avec l&rsquo;API Javascript</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Connecter une page HTML avec l’API Javascript</h3>
<p>Vous pouvez soit utiliser le gestionnaire de package Nuget depuis Visual Studio pour installer la dernière version du package “Constellation.Javascript” et ses dépendances :</p>
<p align="center"><img class="colorbox-2327"  src="https://developer.myconstellation.io/wp-content/uploads/2016/07/image.png" alt="image" /></p>
<p>Ou bien utiliser (ou copier en local) les scripts des CDN en ajoutant dans votre code HTML les balises suivantes :</p>
<p></p><pre class="crayon-plain-tag">&lt;script type="text/javascript" src="https://code.jquery.com/jquery-2.2.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.2.min.js"&gt;&lt;/script&gt;</pre><p></p>
<p>Une fois les scripts ajoutés dans votre page vous devez initialiser le client Constellation en spécifiant l’URL de votre serveur Constellation, la clé d’accès et le “Friendly name” de votre page :</p>
<p></p><pre class="crayon-plain-tag">var constellation = $.signalR.createConstellationConsumer("http://localhost:8088", "123456789", "Test API JS");</pre><p></p>
<p>Vous pouvez <a href="/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">créer une clé d’accès depuis la Console Constellation</a> ou en <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">éditant le fichier de configuration du serveur</a>.</p>
<p>Enfin ajoutons un handler sur le changement d’état de la connexion pour afficher le message “Je suis connecté” dans la console de votre navigateur par exemple lorsque la connexion à Constellation est établie :</p>
<p></p><pre class="crayon-plain-tag">constellation.connection.stateChanged(function (change) {
    if (change.newState === $.signalR.connectionState.connected) {
        console.log("Je suis connecté");
    }
});</pre><p></p>
<p>Il ne reste plus qu’à lancer la connexion en invoquant la méthode Start :</p>
<p></p><pre class="crayon-plain-tag">constellation.connection.start();</pre><p></p>
<p>Et voilà, votre page est connectée à votre Constellation.</p>
<h3>Envoyer des messages et invoquer des MessageCallbacks</h3>
<h4>Envoyer des messages</h4>
<p>Pour envoyer des messages et donc invoquer des MessageCallbacks vous devez utiliser la méthode “<em>constellation.server.sendMessage</em>” en spécifiant :</p>
<ul>
<li>Le scope</li>
<li>La clé du message</li>
<li>Le contenu du message (= les paramètres du MessageCallback)</li>
</ul>
<p>Par exemple, avec le package <a href="/package-library/nest/">Nest </a>déployé dans votre Constellation, on retrouvera un MessageCallback  “SetTargetTemperature” pour piloter la température de consigne d’un thermostat Nest.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-21.png"><img class="colorbox-2327"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-20.png" alt="image" width="350" height="99" border="0" /></a></p>
<p align="left">N’hésitez pas à utiliser le <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallback Explorer</a> pour découvrir l’ensemble des MessageCallbacks exposés par les packages de votre Constellation.</p>
<p>Pour invoquer le MessageCallback  “SetTargetTemperature” depuis votre page Web en passant en paramètre l&rsquo;ID du thermostat et la température de consigne :</p>
<p></p><pre class="crayon-plain-tag">constellation.server.sendMessage({ Scope: 'Package', Args: ['Nest'] }, 'SetTargetTemperature', 'thermostatId', 19);</pre><p></p>
<p>Vous pouvez également passer plusieurs arguments à votre MC combinant type simple et type complexe.</p>
<p>Par exemple le MC “ShowNotification” du package <a href="/package-library/xbmc/">Xbmc </a>permettant d’afficher une notification sur une interface Kodi/XBMC prend deux paramètres : le nom d l’hôte XBMC (un type string) et le détail de la notification à afficher (un type complexe) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-23.png"><img class="colorbox-2327"  loading="lazy" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-22.png" alt="image" width="350" height="143" border="0" /></a></p>
<p></p><pre class="crayon-plain-tag">constellation.server.sendMessage({ Scope: 'Package', Args: ['Xbmc'] }, 'ShowNotification', xbmcName, { "Title":"Hello", "Message":"Hello from JS" });</pre><p></p>
<p>Bien entendu vous pouvez invoquer des MessageCallbacks de n’importe quel package, réel (programme Linux/Windows) ou virtuel (Arduino/ESP) ou même sur d’autres consommateurs (pages Web par exemple).</p>
<p>Ainsi vos pages Web peuvent, en envoyant des messages, invoquer des méthodes sur n&rsquo;importe quel système connecté dans votre Constellation.</p>
<p>Par exemple dans l’article sur les ESP/Arduinos, notre ESP8266 exposait un MC “Reboot” pour redémarrer la puce. Si l’on souhaite redémarrer notre Arduino/ESP depuis une page Web, il suffit d’envoyer un message sans paramètre au bon scope. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.server.sendMessage({ Scope: 'Sentinel', Args: ['MyArduino'] }, 'Reboot');</pre><p></p>
<p>Ici le scope est “Sentinel” avec l’argument “MyArduino”, c’est à dire que le message “Reboot” sera envoyé à tous les packages de la sentinelle “MyArduino”.</p>
<p>Les <a href="/concepts/messaging-message-scope-messagecallback-saga/">scopes</a> peuvent être :</p>
<ul>
<li>Sentinel</li>
<li>Package</li>
<li>Group</li>
<li>Others</li>
<li>All</li>
</ul>
<p>La propriété “Args” de l’objet scope est un tableau contenant le nom des groupes, des sentinelles ou packages en fonction du type de scope sélectionné. Seuls les scopes “All” et “Others” n’ont pas besoin d’argument.</p>
<h4>Envoyer des messages avec réponse : les sagas</h4>
<p>Les <a href="https://developer.myconstellation.io/concepts/messaging-message-scope-messagecallback-saga/">Sagas</a> permettent de lier des messages et donc de créer des couples de “requêtes / réponses”.</p>
<p>Avec la libraire JavaScript, il est possible d’envoyer des messages dans une saga et d’enregistrer un callback pour traiter la réponse.</p>
<p>Par exemple, le package “<a href="/package-library/networktools/">NetworkTools</a>” expose un MC “Ping” permettant de réaliser un ping réseau. Le résultat du ping est retourné dans un message de réponse (un Int64 représentant le temps du réponse du ping) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-25.png"><img class="colorbox-2327"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-24.png" alt="image" width="350" height="155" border="0" /></a></p>
<p align="left">De ce fait pour réaliser un ping vers « www.google.fr » depuis une page Web :</p>
<p></p><pre class="crayon-plain-tag">constellation.server.sendMessageWithSaga(function(response) {
        console.log("Ping %s ms", response.Data);
    }, { Scope: 'Package', Args: ['NetworkTools'] }, 'Ping', "www.google.fr");</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-26.png"><img class="colorbox-2327"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-25.png" alt="image" width="350" height="160" border="0" /></a></p>
<p align="left"><a href="/client-api/arduino-esp-api/recevoir-des-messages-et-exposer-des-methodes-messagecallback-sur-arduino-esp/#Exposer_des_MessageCallbacks_avec_reponse_les_sagas">Souvenez-vous de notre package virtuel de notre ESP8266 / Arduino</a>, on exposait un MessageCallback “Addition” capable de réaliser une addition locale (sur le CPU de l’Arduino ou ESP) en prenant en paramètre deux entiers. Le résultat était retourné dans la saga.</p>
<p></p><pre class="crayon-plain-tag">constellation.server.sendMessageWithSaga(function(response) {
        console.log("Le resultat de 40+2 par l'Arduino est %s", response.Data);
    }, { Scope: 'Sentinel', Args: ['MyArduino'] }, 'Addition', 40, 2);</pre><p></p>
<p>Ainsi vos pages Web peuvent invoquer des méthodes et exploiter la réponse de tous les systèmes connectés sur Constellation exposant des MessageCallbacks.</p>
<h3>Recevoir des messages</h3>
<p>Une page Web connectée sur Constellation peut elle même recevoir des messages et donc exposer des MessageCallbacks que d’autres consommateurs (autres pages Web) ou packages (réels et virtuels) pourront invoquer.</p>
<p>Ceci dit un consommateur tel qu’une page Web n’a pas réellement d’existence. Autrement dit elle n’a pas d’identité et donc ne peut recevoir que des messages adressés à un groupe qu’elle devra joindre.</p>
<p>Pour joindre un groupe vous devez utiliser la méthode “subscribeMessages“ (et “unSubscribeMessages” pour en sortir). Vous pouvez joindre autant de groupe que vous souhaitez.</p>
<p>Par exemple, pour ajouter votre page au groupe “Demo” :</p>
<p></p><pre class="crayon-plain-tag">constellation.server.subscribeMessages("Demo");</pre><p></p>
<p>Vous pourrez ensuite recevoir les messages envoyés dans ce groupe en ajoutant un handler sur le “onReceiveMessage” :</p>
<p></p><pre class="crayon-plain-tag">constellation.client.onReceiveMessage(function (message) {
    console.log("Message recu !", message);
});</pre><p></p>
<p>Dans ce handler vous recevrez TOUS les messages (quelque soit la clé du message).</p>
<p>Vous avez aussi un moyen plus simple consistant à définir un handler pour une clé de message spécifiquement via la méthode “registerMessageCallback”.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.client.registerMessageCallback("ChangeTitle", function (msg) {
    document.title = msg.Data;
});
constellation.client.registerMessageCallback("HelloWorld", function (msg) {
    alert("Hello World");
});</pre><p></p>
<p>Ici on enregistre deux MessageCallbacks.</p>
<p>Si votre page reçoit un MessageCallback “HelloWorld”, une alerte sera ouverte, si elle reçoit un MessageCallback “ChangeTitle”, le titre de votre page sera modifié avec l’argument passé dans le MC.</p>
<p>Imaginez par exemple que vous ouvrez une page Web en plein écran sur différents devices dont vous n’avez pas de contrôle (par exemple des écrans Dashboard). Sur cette page vous affichez différentes données en temps réel, par exemple basées sur les StateObjects Constellation.</p>
<p>Vous modifiez votre page et vous souhaitez donc la rafraîchir sur tous les navigateurs qui ont ouvert votre page pour recharger la nouvelle version.</p>
<p>Pour ce faire, vous pouvez facilement exposer un MessageCallback “ReloadMe” qui recharge la page avec le code :</p>
<p></p><pre class="crayon-plain-tag">constellation.client.registerMessageCallback("ReloadMe", function (msg) {
    location.reload();
});</pre><p></p>
<p>Puis vous ajoutez votre page dans le groupe “ControlPage” :</p>
<p></p><pre class="crayon-plain-tag">constellation.server.subscribeMessages("ControlPage");</pre><p></p>
<p>Dans ce fait, vous pouvez maintenant créer une page “cachée” avec un bouton pour invoquer le MessageCallback “ReloadMe” sur le groupe “ControlPage” afin de recharger toutes les navigateurs qui ont ouvert votre page par la ligne :</p>
<p></p><pre class="crayon-plain-tag">constellation.server.sendMessage({ Scope:'Group', Args:['ControlPage'] }, "ReloadMe", {});</pre><p></p>
<p>Bien entendu, comme vos pages HTML peuvent enregistrer autant de MessageCallbacks qu’elles souhaitent et que ces MessageCallbacks sont invocables depuis n’importe quel système connecté à Constellation, d’autres pages Web, des objets à base d’Arduino, ESP ou autre, des programmes Python, .NET, etc… vous pouvez imaginer tout type d’usage.</p>
<h3>Consommer des StateObjects</h3>
<p>Pour consommer des StateObjects produits par des packages (virtuels ou réels) de votre Constellation, vous avez deux méthodes : l’évènement “onUpdateStateObject” ou les StateObjectLinks.</p>
<p>La première méthode consiste à enregistre un ou plusieurs handlers sur l’évènement “onUpdateStateObject” :</p>
<p></p><pre class="crayon-plain-tag">constellation.client.onUpdateStateObject(function (stateobject) {
    console.log(stateobject);
});</pre><p></p>
<p>Les handlers seront déclenchés à chaque mise à jour ou interrogation des StateObjects de votre page quelque soit le StateObject.</p>
<p>Pour interroger un ou plusieurs StateObjects à un instant T vous disposez de la méthode “requestStateObjects”.</p>
<p>Pour vous abonner aux mises à jour d’un ou plusieurs StateObjects, vous disposez de la méthode “subscribeStateObjects” (et “unSubscribeStateObjects” pour vous désabonner).</p>
<p>Enfin la méthode “requestSubscribeStateObjects” réalise un “requestStateObjects” et un “subscribeStateObjects” c’est à dire que la méthode demande la valeur actuelle du ou des StateObjects et s’abonne auprès du serveur Constellation pour être notifiée des mises à jour.</p>
<p>Toutes ces méthodes prennent en paramètre : le nom de la sentinelle, le nom du package, le nom du StateObject et le type du StateObject. Vous pouvez utiliser le wildcard “*” pour ne pas appliquer de filtre (<a href="/concepts/stateobjects/">plus d’information ici</a>).</p>
<p>Par exemple, pour récupérer tous les StateObjects du package “Demo” quelque soit la sentinelle et pour s’abonner aux mises à jour de ces StateObjects :</p>
<p></p><pre class="crayon-plain-tag">constellation.server.requestSubscribeStateObjects("*", "Demo", "*", "*");</pre><p></p>
<p>L’autre méthode consiste à enregistrer un (ou plusieurs) StateObjectLink. Cela permet de lier une fonction à un abonnement.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.client.registerStateObjectLink("*", "HWMonitor", "/intelcpu/0/load/0", "*", function (so) {
    // Code A
});

constellation.client.registerStateObjectLink("*", "Demo", "*", "*", function (so) {
    // Code B
});</pre><p></p>
<p>Ci-dessus le code A sera invoqué dès qu’un SO nommé « /intelcpu/0/load/0” et produit par le package “HWMonitor” est modifié alors que le code B sera déclenché dès qu’un StateObject du package “Demo” est modifié.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/javascript-api/consommer-constellation-api-javascript/">Consommer Constellation avec l&rsquo;API Javascript</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/javascript-api/consommer-constellation-api-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Consommer Constellation avec Angular JS</title>
		<link>https://developer.myconstellation.io/client-api/javascript-api/consommer-constellation-angular-js/</link>
					<comments>https://developer.myconstellation.io/client-api/javascript-api/consommer-constellation-angular-js/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 19 Aug 2016 08:27:12 +0000</pubDate>
				<category><![CDATA[Javascript API]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[Saga]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[SendMessage]]></category>
		<category><![CDATA[ReceiveMessage]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[Subscribe]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2331</guid>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

controller.requestPackageDescriptor(packageName);</pre><p></p>
<p>Par exemple sur notre page ci-dessus, ajoutons un bouton permettant d’afficher dans une simple boite de dialogue la liste des MessageCallbacks d’un package :</p>
<p>Dans le template HTML :</p>
<p></p><pre class="crayon-plain-tag">&lt;button ng-click="controller.requestPackageDescriptor(p.Package.Name)"&gt;Show MessageCallbacks&lt;/button&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-42.png"><img class="colorbox-2329"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-41.png" alt="image" width="350" height="144" border="0" /></a></p>
<p align="left">Et dans le code de notre contrôleur, de manière grossière :</p>
<p></p><pre class="crayon-plain-tag">controller.onUpdatePackageDescriptor(function (descriptor) {
  var result = "Package "+ descriptor.PackageName + " :";
  for(var idx in descriptor.Descriptor.MessageCallbacks) {
    result += "\n - " + descriptor.Descriptor.MessageCallbacks[idx].MessageKey;
  }
  alert(result);          
});</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-43.png"><img class="colorbox-2329"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-42.png" alt="image" width="350" height="195" border="0" /></a></p>
<p align="left">Une <a href="/client-api/rest-api/interface-rest-constellation/#Declarer_le_Package_Descriptor">description plus détaillée des PackageDesciptors</a> se trouve <a href="/client-api/rest-api/interface-rest-constellation/#Declarer_le_Package_Descriptor">ici</a>.</p>
<h3>Effacer des StateObjects</h3>
<p>Vous pouvez effacer des StateObjects en invoquant la méthode “purgeStateObjects” :</p>
<ul>
<li>Avec l’API JS :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.server.purgeStateObjects(sentinelName, packageName, name, type);</pre><p></p>
<ul>
<li>Avec l’API NG :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.purgeStateObjects(sentinelName, packageName, name, type);</pre><p></p>
<p>Vous devez indiquer les filtres de sélection des StateObjects à supprimer avec la possibilité d’utiliser le wildcard ”*” seulement pour les paramètres “name” et “type”. Autrement dit vous êtes obliger de spécifier le “sentinelName” et “packageName”.</p>
<h3>Rafraichir et déployer la configuration</h3>
<p>Vous pouvez recharger la configuration Constellation avec la méthode “reloadServerConfiguration” :</p>
<ul>
<li>Avec l’API JS :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.server.reloadServerConfiguration(deployConfiguration);</pre><p></p>
<ul>
<li>Avec l’API NG :</li>
</ul>
<p></p><pre class="crayon-plain-tag">controller.reloadServerConfiguration(deployConfiguration);</pre><p></p>
<p>Cette méthode attend un booléen (deployConfiguration) pour indiquer si oui ou non la configuration doit être déployée après son rechargement. Dans le cas d’un déploiement, la nouvelle configuration est envoyée à toutes les sentinelles et packages de votre Constellation.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/javascript-api/controler-constellation-api-javascript/">Contrôler votre Constellation en Javascript</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/javascript-api/controler-constellation-api-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Créer une application mobile multi-plateforme connectée à Constellation avec Cordova</title>
		<link>https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-cordova/</link>
					<comments>https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-cordova/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 19 Aug 2016 08:28:47 +0000</pubDate>
				<category><![CDATA[Javascript API]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[SendMessage]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[Cordova]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2335</guid>

					<description><![CDATA[<p>La plateforme Apache Cordova (anciennement PhoneGap) permet de créer des applications mobiles (Android, Windows Phone, iPhone, Blackberry, …) en utilisant les technologies Web (HTML, JS, CSS). Couplée à la libraire JavaScript Constellation, il devient très facile de créer une application</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-cordova/">Créer une application mobile multi-plateforme connectée à Constellation avec Cordova</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>La plateforme <a href="http://cordova.apache.org/">Apache Cordova</a> (anciennement PhoneGap) permet de créer des applications mobiles (Android, Windows Phone, iPhone, Blackberry, …) en utilisant les technologies Web (HTML, JS, CSS).</p>
<p align="center"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="cordova_logo_normal_dark" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/cordova_logo_normal_dark.png" alt="cordova_logo_normal_dark" width="240" height="71" border="0" /></p>
<p>Couplée à la <a href="/client-api/javascript-api/">libraire JavaScript Constellation</a>, il devient très facile de créer une application mobile pour votre smartphone ou tablette connectée à Constellation.</p>
<h3>Installer Cordova</h3>
<p>Cordova utilise nodejs, l&rsquo;installation est donc très simple et rapide :</p>
<ol>
<li>Installer <a href="http://nodejs.org/">NodeJS</a> si vous ne l&rsquo;avez pas déjà</li>
<li>Depuis le terminal (ou cmd pour windows) lancez la commande :</li>
</ol>
<p></p><pre class="crayon-plain-tag">npm install -g cordova</pre><p></p>
<p>Et voila Cordova est installé, mais il vous faut maintenant installer les SDK spécifiques aux plateformes que vous comptez utiliser.</p>
<p>Pour plus d’information, quelques ressources :</p>
<ul>
<li><a href="https://www.grafikart.fr/tutoriels/cordova/apache-cordova-installation-432">Installer et configurer Cordova</a></li>
<li><a href="http://cordova.apache.org/#getstarted">Guide de démarrage Cordova</a></li>
<li><a href="https://cordova.apache.org/docs/fr/latest/guide/platforms/android/">Guide pour la plate-forme Android</a></li>
</ul>
<h3>Créer un projet Cordova</h3>
<p>Lancez une invite de commande Windows et tapez la ligne suivante pour créer votre projet :</p>
<p></p><pre class="crayon-plain-tag">cordova create Demo</pre><p></p>
<p>Ensuite ajoutez le ou les plateformes cibles de votre application. Par exemple, développons une application pour Android :</p>
<p></p><pre class="crayon-plain-tag">cd Demo
cordova platform add android</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-154.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-149.png" alt="image" width="350" height="311" border="0" /></a></p>
<p>Pour démarrer votre application sur l’émulateur Android ou sur votre terminal Android (connecté en USB) :</p>
<p></p><pre class="crayon-plain-tag">cordova run android</pre><p></p>
<h4>Tester votre application sur l’émulateur</h4>
<p>En utilisant le “<em>Android Virtual Device (AVD) Manager</em>” créez un device que l’on nommera ici “SmartphoneDemo” sous Android 5.1.1 :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-165.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-160.png" alt="image" width="250" height="364" border="0" /></a></p>
<p align="left">Vous pouvez ensuite cliquer sur le bouton “Start” pour lancer le device virtuel :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-160.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-155.png" alt="image" width="254" height="161" border="0" /></a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-161.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-156.png" alt="image" width="250" height="432" border="0" /></a></p>
<p>Enfin lancez la commande suivante pour déployer et démarrer votre application dans l’émulateur :</p>
<p></p><pre class="crayon-plain-tag">cordova run android</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-162.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-157.png" alt="image" width="354" height="229" border="0" /></a></p>
<h4>Debugger votre application avec l’inspecteur Chrome</h4>
<p>Dans un nouvel onglet Chrome, rendez-vous sur <a title="chrome://inspect/#devices" href="chrome://inspect/#devices">chrome://inspect/#devices</a>. Vous pourrez alors inspecter votre application Cordova :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-163.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-158.png" alt="image" width="350" height="220" border="0" /></a></p>
<p align="left">Ainsi vous profiterez de tous les outils de debugging Web pour votre application mobile.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-164.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-159.png" alt="image" width="354" height="211" border="0" /></a></p>
<h4>Déployer votre application sur votre téléphone</h4>
<p>En connectant votre téléphone Android en USB ( sans oublier d’activer le debugging USB dans les paramètres de votre téléphone) vous pouvez, toujours avec la commande :</p>
<p></p><pre class="crayon-plain-tag">cordova run android</pre><p></p>
<p>… lancer votre application sur votre téléphone et utiliser l’inspecteur Chrome pour la debugger à distance.</p>
<p>Autrement vous pouvez aussi utiliser la commande :</p>
<p></p><pre class="crayon-plain-tag">cordova build android</pre><p></p>
<p>… pour générer le fichier APK, l’équivalent de l’installeur de votre application, qu’il faudra copier et lancer sur votre téléphone ou tablette Android.</p>
<h3>Connecter votre application Cordova à Constellation</h3>
<p>La structure d’une application Cordova est la suivante :</p>
<ul>
<li>Une page “index.html”, la page de démarrage de votre application</li>
<li>Des dossiers css, img et js pour ranger respectivement les feuilles de style CSS, les images et les scripts JS</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-166.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-161.png" alt="image" width="350" height="293" border="0" /></a></p>
<p align="left">En clair votre application mobile se développe comme une véritable application Web. Vous pouvez ensuite <a href="http://cordova.apache.org/docs/en/latest/guide/cli/#add-plugins">ajouter des plugins</a> pour accéder fonctionnalités du téléphone depuis votre code JavaScript (téléphonie, SMS, contacts, GPS, Bluetooth, Wifi, appareil photo, etc..).</p>
<h4 align="left">Ajouter les librairies Constellation</h4>
<p align="left">Comme il s’agit d’une application Web, connecter une application Cordova à Constellation revient à <a href="/getting-started/connectez-vos-pages-web-constellation/">connecter une page Web à Constellation</a>.</p>
<p align="left">Vous pouvez donc inclure les libraires en utilisant les CDN (en prenant soin de spécifier le schème explicitement, par exemple ‘https’) :</p>
<p></p><pre class="crayon-plain-tag">&lt;script type="text/javascript" src="https://code.jquery.com/jquery-2.2.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.1.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://cdn.myconstellation.io/js/Constellation-1.8.1.min.js"&gt;&lt;/script&gt;</pre><p></p>
<p align="left">Par contre afin d’améliorer les performances de votre application mobile, il est recommandé d’embarquer ces libraires dans votre application.</p>
<p align="left">Pour cela téléchargez (<em>clique-droit &gt; Enregistrer sous …</em>) dans le dossier “js” les librairies JavaScript suivantes :</p>
<ul>
<li>
<div align="left"><a href="https://code.jquery.com/jquery-2.2.4.min.js">https://code.jquery.com/jquery-2.2.4.min.js</a></div>
</li>
<li>
<div align="left"><a href="https://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.1.min.js">https://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.1.min.js</a></div>
</li>
<li>
<div align="left"><a href="https://cdn.myconstellation.io/js/Constellation-1.8.1.min.js">https://cdn.myconstellation.io/js/Constellation-1.8.1.min.js</a></div>
</li>
</ul>
<p>Puis ajoutez-les dans votre page “index.html” de cette façon:</p>
<p></p><pre class="crayon-plain-tag">&lt;script type="text/javascript" src="js/jquery-2.2.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="js/jquery.signalr-2.2.1.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="js/Constellation-1.8.1.min.js"&gt;&lt;/script&gt;</pre><p></p>
<h4 align="left">Connecter votre application</h4>
<p align="left">Tout d’abord dans le ficher “config.xml” à la racine de votre projet Cordova, ajoutez ces quelques lignes :</p>
<p></p><pre class="crayon-plain-tag">&lt;allow-intent href="ws://"/&gt;
&lt;allow-intent href="*" /&gt;
&lt;access origin="*" subdomains="true" /&gt;</pre><p></p>
<p align="left">Cela permet d’autoriser le container Cordova à accéder à des ressources externes comme le serveur Constellation !</p>
<p align="left">Aussi dans votre page principale,<em> index.html</em>, modifiez le “Content-Security-Policy” par :</p>
<p></p><pre class="crayon-plain-tag">&lt;meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval';"&gt;</pre><p></p>
<p align="left">On autorise ainsi notre page à exploiter des services et scripts externes.</p>
<p align="left">Dans le fichier de script principal (<em>app.js</em>), créez un client “Consumer” en spécifiant l’adresse de votre serveur Constellation, une clé d’accès et un friendly name :</p>
<p></p><pre class="crayon-plain-tag">constellation: $.signalR.createConstellationConsumer("http://constellation.monServer.com:8088", "MaCle123!", "Demo Cordova"),</pre><p></p>
<p align="left">Dans la fonction “onDeviceReady” lancez la connexion au serveur Constellation par la ligne :</p>
<p></p><pre class="crayon-plain-tag">app.constellation.connection.start();</pre><p></p>
<p align="left">Pour finir dans la fonction “<em>initialize</em>” attachez un handler sur le changement d’état de la connexion Constellation. L’idée étant d’afficher le texte “Connected to Constellation” à la place du message “Device is Ready” du sample Cordova.</p>
<p></p><pre class="crayon-plain-tag">app.constellation.connection.stateChanged(function (change) {
  if (change.newState === $.signalR.connectionState.connected) {
    $('.received').text('connected to constellation');
  }
});</pre><p></p>
<p align="left">En démarrant l’application dans l’émulateur, votre application se connectera au hub “Consumer” de votre Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-167.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-162.png" alt="image" width="250" height="432" border="0" /></a></p>
<p align="left">Vous pouvez maintenant envoyer des messages et invoquer des MessageCallbacks de vos différents packages, recevoir des messages pour que les autres clients de la Constellation puissent invoquer des méthodes de votre application mobile par exemple, interroger ou suivre en temps réel des StateObjects publiés par les packages de votre Constellation.</p>
<p align="left">Quelques exemples ci-après &#8230;</p>
<h4 align="left">Afficher en temps réel des StateObjects</h4>
<p align="left">Reprenons l’exemple du StateObject “/intelcpu/0/load/0” produit par le package “HWMonitor” et correspondant à la consommation de votre CPU.</p>
<p align="left">Pour cela nous allons enregistrer <a href="/client-api/javascript-api/consommer-constellation-api-javascript/#Consommer_des_StateObjects">StateObjectLink</a> sur ce StateObject en ciblant une sentinelle en particulier. Ici la sentinelle UI de mon ordinateur se nomme “PC-SEB_UI”.</p>
<p align="left">Vous pouvons écrire :</p>
<p></p><pre class="crayon-plain-tag">app.constellation.connection.stateChanged(function (change) {
  if (change.newState === $.signalR.connectionState.connected) {
    $('.received').text('connected to constellation');
    app.constellation.client.registerStateObjectLink("PC-SEB_UI", "HWMonitor", "/intelcpu/0/load/0", "*", function (so) {
      $("#cpu").text(Math.round(so.Value.Value * 100) / 100);
    });
  }
});</pre><p></p>
<p align="left">Sans oublier d’ajouter le “span” dans lequel afficher notre consommation :</p>
<p></p><pre class="crayon-plain-tag">&lt;h2&gt;PC-SEB CPU: &lt;span id="cpu"&gt;0&lt;/span&gt; %&lt;/h2&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-168.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-163.png" alt="image" width="250" height="432" border="0" /></a></p>
<p align="left">Et voilà comment en quelques lignes afficher des StateObjects en temps réel dans une application mobile multi-plateforme.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/DemoCordova.gif"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="DemoCordova" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/DemoCordova_thumb-gap.jpg" data-gif="https://developer.myconstellation.io/wp-content/uploads/2016/09/DemoCordova_thumb.gif" alt="DemoCordova" width="350" height="400" border="0" /></a></p>
<p align="left">Dans cet exemple nous affichons la consommation CPU capturée par le package HWMonitor mais nous pouvons bien sûr afficher n’importe quel StateObject : des capteurs de température, état d’une zone de l’alarme, position de votre voiture, volume de l’ampli, consommation électrique, état d’une lampe, etc.…</p>
<h4 align="left">Invoquer des MessageCallbacks</h4>
<p align="left">Tout comme n’importe quel “consommateur”, votre application mobile multi-plateforme peut envoyer des messages et donc invoquer des MessageCallbacks.</p>
<p align="left">Pour découvrir les MessageCallbacks de votre Constellation, vous pouvez utiliser le <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallback Explorer</a> de la Console Constellation.</p>
<p align="left">Par exemple, après avoir déployé le package “WindowsControl” sur une sentinelle Windows, vous pouvez invoquer des MC pour arrêter votre Windows, verrouiller la session, se déconnecter, redémarrer ou encore mettre en veille la machine.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb.png" alt="image" width="350" height="185" border="0" /></a></p>
<p align="left">Ajoutons à notre application Android la capacité de verrouiller notre PC Windows. Pour cela vous pouvez cliquer sur l’icone <img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-20.png" alt="image" width="20" height="19" border="0" /> pour générer le code d’invocation de ce MC en sélectionnant le langage de votre choix, dans notre cas, “Javascript” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-2.png"><img class="colorbox-2335"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-2.png" alt="image" width="350" height="217" border="0" /></a></p>
<p align="left">Dans notre page “index.html”, ajoutons un simple bouton (ou lien) HTML :</p>
<p></p><pre class="crayon-plain-tag">&lt;a id="lockPC" href="#" class="btn"&gt;LOCK MY PC&lt;/a&gt;</pre><p></p>
<p align="left">Et dans notre fichier Javascript, invoquons le MessageCallback “&rsquo;LockWorkStation” lorsque l’utilisateur clique sur notre bouton :</p>
<p></p><pre class="crayon-plain-tag">$("#lockPC").click(function () 
  constellation.server.sendMessage({ Scope: 'Package', Args: ['PC-SEB_UI/WindowsControl'] }, 'LockWorkStation', {});
});</pre><p></p>
<p>Notez que dans le code ci-dessus, à l’inverse de l’exemple donné par le générateur de code de la Console Constellation, nous avons défini le nom de l’instance du package et non le nom du package seul. En effet, en envoyant un message au scope de type Package ”WindowsControl”, votre message sera reçu par toutes les instances du package “WindowsControl” quelque soit la sentinelle. Autrement dit, toutes les sentinelles Windows qui exécutent le package “WindowsControl” seront verrouillées. Pour cibler votre sentinelle en particulier, nous avons indiqué ici le nom de l’instance, c’est à dire le couple “Sentinelle + Package”, ici “PC-SEB_UI/WindowsControl”.</p>
<p>Aussi, d’un point de vue visuel, Cordova n’inclut pas de framework CSS à l’inverse <a href="/client-api/javascript-api/application-mobile-multi-plateforme-avec-ionic-et-angular-js/">d’Ionic </a>par exemple. De ce fait tout est à votre charge. Ici nous avons créer un lien (&lt;a&gt;) sur lequel nous avons appliqué la classe CSS “btn”. Vous pouvez, pour l’exemple, utiliser des générateurs tel que <a href="http://www.cssbuttongenerator.com/">celui-ci</a> ou encore <a href="http://www.bestcssbuttongenerator.com/">celui-la</a> pour générer la classe “btn”.</p>
<p>Et voilà, notre application Android est maintenant capable de verrouiller notre poste Windows et d’afficher la consommation CPU en temps réel :</p>
<p align="center">(screen here)</p>
<h3>Pour aller plus loin …</h3>
<p>Donc vous avez pu le découvrir dans cet article, réaliser des applications mobiles (ou tablettes) pour Android, iOS, Windows ou autre est relativement facile avec des plateformes comme Cordova. En utilisant la <a href="/client-api/javascript-api/">libraire JavaScript Constellation</a>, vous pouvez donc développer des applications mobile connectées à Constellation en quelques minutes.</p>
<p>Une fois que votre application mobile est connectée à votre Constellation, elle peut suivre en temps réel tous les StateObjects produits par les packages de votre Constellation et invoquer des méthodes de ces packages en envoyant des messages.</p>
<p>De ce fait vous êtes libre de créer vos propres applications de supervision ou de contrôle de vos systèmes, services, réalisations, de votre domotique, etc…</p>
<p>Par exemple, vous créer un objet connecté avec un Raspberry et du Python ou bien un Arduino ou ESP8266, et vous pouvez créer facilement l’enrichir avec une application mobile. Ou bien vous ajoutez des lampes Hue et un media-center Kodi et vous décidez de créer une applications mobile unique pour tout contrôler en utilisant Constellation comme centralisateur.</p>
<p>Pour ma part je vous recommande vivement d’utiliser Ionic plutôt que Cordova. En effet, <a href="/client-api/javascript-api/application-mobile-multi-plateforme-avec-ionic-et-angular-js/">Ionic</a> n’est ni plus ni moins qu’une surcouche à Cordova qui intègre le framework AngularJS et un framework CSS. Grace à Ionic vous pouvez développer des applications plus riche et beaucoup plus rapidement.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-cordova/">Créer une application mobile multi-plateforme connectée à Constellation avec Cordova</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-cordova/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Créer une application mobile multi-plateforme connectée à Constellation avec Ionic</title>
		<link>https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-ionic-et-angular-js/</link>
					<comments>https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-ionic-et-angular-js/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 19 Aug 2016 08:29:16 +0000</pubDate>
				<category><![CDATA[Javascript API]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[SendMessage]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[Cordova]]></category>
		<category><![CDATA[Ionic]]></category>
		<category><![CDATA[StateObject]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2337</guid>

					<description><![CDATA[<p>// En cours  de rédaction &#8230; intro install / base / link hello world (request SO &#38; send msg) déploiement</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-ionic-et-angular-js/">Créer une application mobile multi-plateforme connectée à Constellation avec Ionic</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>// En cours  de rédaction &#8230;</p>
<ul>
<li>intro</li>
<li>install / base / link</li>
<li>hello world (request SO &amp; send msg)</li>
<li>déploiement</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-ionic-et-angular-js/">Créer une application mobile multi-plateforme connectée à Constellation avec Ionic</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/mobile/application-mobile-multi-plateforme-avec-ionic-et-angular-js/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Connecter une application Tizen sur Samsung Gear à Constellation</title>
		<link>https://developer.myconstellation.io/client-api/mobile/connecter-application-tizen-montre-samsung-gear/</link>
					<comments>https://developer.myconstellation.io/client-api/mobile/connecter-application-tizen-montre-samsung-gear/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 23 Sep 2016 09:42:43 +0000</pubDate>
				<category><![CDATA[Javascript API]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Tizen]]></category>
		<category><![CDATA[Gear S2]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[AngularJS]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2746</guid>

					<description><![CDATA[<p>Découverte de Tizen La Samsung Gear S2 tourne sous Tizen. Cet OS a été initié par Samsung sous le nom LiMo (Linux Mobile) avant d’être renommé en 2011 par Tizen lorsque qu’Intel a rejoint le projet en abandonnant MeeGo. Depuis</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/mobile/connecter-application-tizen-montre-samsung-gear/">Connecter une application Tizen sur Samsung Gear à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-3.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-3.png" alt="image" width="117" height="145" border="0" /></a></p>
<h3>Découverte de Tizen</h3>
<p>La Samsung Gear S2 tourne sous Tizen. Cet OS a été initié par Samsung sous le nom LiMo (Linux Mobile) avant d’être renommé en 2011 par Tizen lorsque qu’Intel a rejoint le projet en abandonnant MeeGo. Depuis 2012, Tizen est développé par la “Tizen Association” qui regroupe entre autres Samsung et Intel mais aussi Huawei, Fujitsu, NEC, Panasonic, Orange, NTT DoCoMo ou encore Vodafone.</p>
<p>Dans ses premières versions toutes les applications Tizen étaient des applications HTML/JS permettant de garantir une portabilité entre les différents équipements. Depuis la version 2.0 sortie en 2013, il est également possible de développer des applications natives. C’est également à cette date que Samsung a annoncé l’abandon de son précédent système Bada pour se consacrer exclusivement à Tizen.</p>
<p>On retrouve Tizen dans plusieurs équipements de la marque : des smartphones (série Samsung Z), tablettes ou PC aux wearables (série Gear) en passant par les TV comme la dernière UN65H8000AF ou les appareils photos (comme le NX1). Cet OS a pour objectif d’équiper une multitude équipement dont des produits électroménagers (micro-onde, lave-linge, réfrigérateur), des voitures, des imprimantes, etc…</p>
<h3>Hello World Tizen</h3>
<p>Pour commencer, rendez-vous sur le site développeur Samsung pour télécharger le SDK Tizen.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-4.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-4.png" alt="image" width="350" height="115" border="0" /></a></p>
<p>Une fois la base installée, il faudra lancer l’<em>Update Manager</em> afin de sélectionner les composants dont vous avez besoin.</p>
<p>Dans notre cas, nous allons télécharger le Framework “Wearable” 2.3.1 pour développer des applications pour la Gear S2 ainsi que les outils du SDK Tizen (dont l’Emulateur Manager) mais surtout, dans la catégorie “Extras”, les extensions “Tizen Wearable” et le Certification Manager.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-5.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-5.png" alt="image" width="350" height="222" border="0" /></a></p>
<p>Pour développer une application Tizen Wearable, on peut soit faire une application “Web” en utilisant HTML5/CSS/JavaScript, soit une application native C/C++ ou soit une application hydride (Web + native).</p>
<p>Ces applications Wearables peuvent être rangées dans deux catégories :</p>
<ul>
<li>“Standalone” : fonctionne sur votre montre de manière autonome</li>
<li>“Companion” : est liée à une application “host” qui tourne sur un mobile (Tizen ou Android)</li>
</ul>
<p>Lançons donc l’IDE Tizen, un IDE basé sur Eclipse. Nous pouvons alors créer un nouveau projet à partir de template ou d’exemple prêt à l’emploi.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-6.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-6.png" alt="image" width="350" height="316" border="0" /></a></p>
<p>Ici la page HTML est un simple Hello World avec quelques lignes de JS pour changer le contenu d’une div au clic et gérer le bouton « back ».</p>
<p>Pour tester votre application, vous disposez du « Emulator Manager » vous permettant de créer des VM pour émuler votre Gear S2 et tester vos applications en local :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-7.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-7.png" alt="image" width="350" height="367" border="0" /></a></p>
<p>Comme pour le développement d’une application Cordova/Ionic sur Android, vous disposez de l’inspecteur Chrome intégré :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-8.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-8.png" alt="image" width="350" height="168" border="0" /></a></p>
<p>Bien entendu, vous pouvez également déployer et debugger directement sur votre montre. La première chose à faire est d’activer le débogage dans les paramètres de votre Gear S2 et de la connecter sur votre réseau Wifi.</p>
<p>Depuis le “Connection Explorer” de l’IDE Tizen, vous pourrez alors ajouter un nouveau “Remote Device” en spécifiant l’IP de votre Gear :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-9.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-9.png" alt="image" width="350" height="258" border="0" /></a></p>
<p>Vous devrez alors approuver la connexion sur votre montre :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-10.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-10.png" alt="image" width="350" height="197" border="0" /></a></p>
<p>Après quoi elle sera connectée dans l’IDE Tizen de la même manière que l’émulateur :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-11.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-11.png" alt="image" width="350" height="185" border="0" /></a></p>
<p>Nous pouvons alors relancer l’application en mode “Run” ou “Debug” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-12.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-12.png" alt="image" width="350" height="197" border="0" /></a></p>
<p>Avec toujours avec la possibilité de faire du “Remote Debug” avec l’inspecteur Chrome directement sur la montre !</p>
<h3>Créer une application Tizen connectée à Constellation</h3>
<p>Comme il s’agit d’une application Web/Javascript, nous pouvons simplement utiliser la librairie JavaScript de Constellation. Et pour simplifier d’avantage le code, utilisons AngularJS et son module Constellation.</p>
<p>Créons donc un nouveau projet Tizen Wearable :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-13.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-13.png" alt="image" width="350" height="319" border="0" /></a></p>
<p>Puis ajoutons les libraires Constellation dans le dossier « js » :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-14.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-14.png" alt="image" width="232" height="203" border="0" /></a></p>
<p>Après avoir référencé ces libraires dans la page « index.html », éditons le fichier « app.js » à la racine pour créer un contrôleur AngularJS en y injectant le module Constellation.</p>
<p>Nous initialiserons le client Constellation avec l’URI de votre Constellation et une clé d’accès :</p>
<p></p><pre class="crayon-plain-tag">var swatch = angular.module('swatch', ['ngConstellation'])  .controller('MainController', ['$scope', 'constellationConsumer',
     function ($scope, constellation) { 
      
     constellation.initializeClient("https://monServerConstellation.com/constellation", "MonAccessKey", "SWatch");
        
     constellation.connect();  
}]);</pre><p></p>
<p>Pour chaque StateObject reçu de la Constellation, stockons-le dans une variable de notre scope Angular ce qui nous permettra de les exploiter dans le template HTML :</p>
<p></p><pre class="crayon-plain-tag">constellation.onUpdateStateObject(function (message) {
  $scope.$apply(function () {                  
    if ($scope[message.PackageName] == undefined) {
      $scope[message.PackageName] = {}; 
    }
    $scope[message.PackageName][message.Name] = message;      
    });
});</pre><p></p>
<p>Enfin, lorsque que nous sommes connecté à Constellation abonnons-nous aux StateObjects des différents packages de notre Constellation que nous souhaitons intégrer dans notre application Tizen.</p>
<p>Pour ma part je demande les StateObjects du thermostat Nest, des caméras de sécurité connectés à ZoneMinder, de mon système home-made de monitoring des ressources énergétiques S-Energy (basé sur un Raspberry) et S-Opener (gestion de la porte de garage), des capteurs NetAtmo et Oregon via un RFXCOM, de la domotique Z-Wave via une Vera, des media-centers Xbmc/Kodi, de mon ampli Pioneer, des onduleurs, de l’alarme (Paradox), des capteurs de luminosité home-made (à base de Raspberry et ESP8266), des capteurs hardware via WMI et ceux du routeur DD-WRT et également les StateObjects du package Tesla présentés dans l’article précédent.</p>
<p></p><pre class="crayon-plain-tag">constellation.onConnectionStateChanged(function (change) {
  if (change.newState === $.signalR.connectionState.connected) {
    constellation.requestSubscribeStateObjects("*", "tesla", "*", "*");
    constellation.requestSubscribeStateObjects("*", "ZoneMinder", "*", "ZoneMinder.Monitor");
    constellation.requestSubscribeStateObjects("*", "SEnergy", "*", "*");
    constellation.requestSubscribeStateObjects("*", "SOpener", "*", "*");       
    constellation.requestSubscribeStateObjects("*", "NetAtmo", "*", "*");       
    constellation.requestSubscribeStateObjects("*", "rfxcom", "*", "*");
    constellation.requestSubscribeStateObjects("*", "Vera", "*", "*");
    constellation.requestSubscribeStateObjects("*", "Nest", "*", "*");
    constellation.requestSubscribeStateObjects("*", "Xbmc", "*", "*");
    constellation.requestSubscribeStateObjects("*", "Pioneer", "*", "*");
    constellation.requestSubscribeStateObjects("*", "BatteryChecker", "*", "*");
    constellation.requestSubscribeStateObjects("*", "Paradox", "*", "*");       
    constellation.requestSubscribeStateObjects("*", "LightSensor", "Lux", "*");     
    constellation.requestSubscribeStateObjects("CEREBRUM", "HWMonitor", "*", "*");
    constellation.requestSubscribeStateObjects("*", "ddwrt", "RouterAJS.WAN", "*");
    constellation.requestSubscribeStateObjects("*", "ddwrt", "RouterAJS.WAN.Stats", "*");
  }
});</pre><p></p>
<p>Pas besoin de plus de code, on peut dès maintenant éditer la page HTML pour créer notre interface.</p>
<p>Par exemple pour afficher la température et l’humidité captées par les sondes NetAtmo, il me suffira dans le template HTML d’ajouter le code suivant :</p>
<p></p><pre class="crayon-plain-tag">&lt;p&gt;Salon : {{NetAtmo['Salon.Temperature'].Value}}°C | {{NetAtmo['Salon.Humidity'].Value}}%&lt;/p&gt;
&lt;p&gt;Jardin : {{NetAtmo['Jardin.Temperature'].Value}}°C | {{NetAtmo['Jardin.Humidity'].Value}}%&lt;/p&gt;
&lt;p&gt;Chambre1 : {{NetAtmo['Chambre1.Temperature'].Value}}°C | {{NetAtmo['Chambre1.Humidity'].Value}}%&lt;/p&gt;
&lt;p&gt;Chambre2 : {{NetAtmo['Chambre2.Temperature'].Value}}°C | {{NetAtmo['Chambre2.Humidity'].Value}}%&lt;/p&gt;</pre><p></p>
<p>Tizen propose des classes CSS prêtes à l’emploi que nous pouvons directement appliquer sur nos balises HTML pour rendre le visuel plus agréable :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-15.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-15.png" alt="image" width="193" height="240" border="0" /></a></p>
<p>De plus grâce à la notion de StateObjects de Constellation, nous pouvons sans trop d’effort afficher tout type de donnée peu importe la source. Par exemple, ici nous affichons la température de 3 pièces différentes captées par trois technologies différentes (NetAtmo, RFXCOM et Z-WAve)</p>
<p></p><pre class="crayon-plain-tag">&lt;p&gt;Chambre (Netatmo) : {{NetAtmo['Chambre1.Temperature'].Value}}°C&lt;/p&gt;
&lt;p&gt;Bureau (RFXCOM/Oregon) : {{rfxcom['Capteur Bureau'].Value.Temperature}}°C&lt;/p&gt;
&lt;p&gt;Cave (Vera/Z-WAve) : {{Vera['Temperature Cave'].Value.Temperature}}°C&lt;/p&gt;</pre><p></p>
<p>La librairie Tizen fournit également quelques contrôles Javascript. Par exemple utilisons le « tau.widget.CircleProgressBar » qui nous attachons sur un élément « progressbar » lié au StateObject « Nest » :</p>
<p></p><pre class="crayon-plain-tag">&lt;div class="ui-content"&gt;
  &lt;div&gt;Consigne: &lt;span id="nestTarget"&gt;{{ Nest['Living Room'].Value.target_temperature_c }}&lt;/span&gt;°C&lt;/div&gt;
  &lt;div&gt;Actuelle: {{Nest['Living Room'].Value.ambient_temperature_c}}°C&lt;/div&gt;
&lt;/div&gt;
&lt;progress class="ui-circle-progress" id="nestProgress" value="{{(Nest['Living Room'].Value.target_temperature_c}}" min="9" max="32"&gt;&lt;/progress&gt;</pre><p></p>
<p>Ainsi il devient alors possible de contrôler son thermostat en tournant le cadran rotatif de la montre :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-16.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-16.png" alt="image" width="193" height="231" border="0" /></a></p>
<p>Pour envoyer la température de consigne, il me suffit d’invoquer le MessageCallback « SetTargetTemperature » au package Nest par la ligne :</p>
<p></p><pre class="crayon-plain-tag">constellation.sendMessage({ Scope: 'Package', Args: [ 'Nest' ] }, 'SetTargetTemperature', [ deviceid, temperature ])</pre><p></p>
<p>Pour reprendre l’exemple de la sonnette connectée à Constellation par un ESP8266, on peut facilement ajouter le contrôle du mode « muet » sur notre montre. Il suffit d’ajouter une checkbox dont l’état est coché si notre StateObject « IsMute » est vrai :</p>
<p></p><pre class="crayon-plain-tag">&lt;div class="ui-toggleswitch ui-toggleswitch-large"&gt;
  &lt;input type="checkbox" class="ui-switch-input" ng-checked="DoorBell.IsMute" ng-click="SetMute(!DoorBell.IsMute)"&gt;
  &lt;div class="ui-switch-button"&gt;&lt;/div&gt;
&lt;/div&gt;</pre><p></p>
<p>Et lorsque l’on clique sur la checkbox, on invoque le MessageCallback « SetMute » en passant l’état inverse de notre StateObject :</p>
<p></p><pre class="crayon-plain-tag">$scope.SetMute = function(isMute) {
  constellation.sendMessage({ Scope: 'Package', Args: [ 'DoorBell' ] }, 'SetMute', isMute);                 
};</pre><p></p>
<p>De quoi contrôler notre sonnette à n’importe quel moment depuis son poignet :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-17.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-17.png" alt="image" width="186" height="232" border="0" /></a></p>
<p>On peut aussi très facilement contrôler toute notre domotique Z-Wave. Pour ce faire, créons une listview (&lt;ul&gt;) pour tous nos StateObjects du package « Vera » afin d’afficher une checkbox liée à l’état de notre module Z-Wave en utilisant un « ng-repeat ».</p>
<p>Et comme pour la sonnette, lorsque l’on clique dessus, on envoie un message au package Vera pour définir le nouvel état :</p>
<p></p><pre class="crayon-plain-tag">&lt;ul class="ui-listview"&gt;
  &lt;li class="li-has-multiline li-has-toggle" ng-repeat="device in Vera"&gt;
   &lt;label&gt;{{device.Name}}
      &lt;span class="li-text-sub ui-li-sub-text"&gt;{{device.Metadatas.Room}}&lt;/span&gt;
      &lt;div class="ui-toggleswitch"&gt;
         &lt;input type="checkbox" class="ui-switch-input" ng-click="SwitchVeraDevice(device)" ng-checked="device.Value.Status"&gt;
         &lt;div class="ui-switch-button"&gt;&lt;/div&gt;
      &lt;/div&gt;
   &lt;/label&gt;
  &lt;/li&gt;
&lt;/ul&gt;</pre><p></p>
<p>Et là encore, juste avec ces quelques lignes de code HTML on obtient une interface de contrôle de tous nos équipements Z-Wave (lumières, appliances, volets) sur notre poignet :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-18.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-18.png" alt="image" width="179" height="240" border="0" /></a></p>
<p>De ce fait, chaque objet, service ou programme connecté dans Constellation peut être facilement intégré dans vos applications Javascript, que ce soit une page Web, une application mobile Cordova/Ionic ou bien comme ici une application Tizen pour votre montre !</p>
<p>Au final avec à peine 150 lignes de Javascript et 350 de code HTML, cette application me permet au quotidien de garder un œil sur mes serveurs, ma consommation énergétique et les différents capteurs météo de la maison, voir en temps réel mes caméras de sécurité, piloter mon système d’alarme, les lampes et volets de la maison, le thermostat, l’ampli ou encore porte ma porte de garage.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/10/image-19.png"><img class="colorbox-2746"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/10/image_thumb-19.png" alt="image" width="186" height="240" border="0" /></a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/mobile/connecter-application-tizen-montre-samsung-gear/">Connecter une application Tizen sur Samsung Gear à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/mobile/connecter-application-tizen-montre-samsung-gear/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 

Served from: developer.myconstellation.io @ 2026-01-21 05:23:45 by W3 Total Cache
-->