﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tag Setting - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/tag/setting/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/tag/setting/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Thu, 19 Apr 2018 07:53:40 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.11</generator>

<image>
	<url>https://developer.myconstellation.io/wp-content/uploads/2016/02/256x256-e1457476015859.png</url>
	<title>Tag Setting - Constellation</title>
	<link>https://developer.myconstellation.io/tag/setting/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Créez votre premier package Constellation en C#</title>
		<link>https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-csharp/</link>
					<comments>https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-csharp/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 16 Mar 2016 10:00:22 +0000</pubDate>
				<category><![CDATA[.NET API]]></category>
		<category><![CDATA[Guide de démarrage]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[PackageHost]]></category>
		<category><![CDATA[WriteLog]]></category>
		<category><![CDATA[Setting]]></category>
		<category><![CDATA[Publish]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=1287</guid>

					<description><![CDATA[<p>Dans cet article nous allons découvrir comment créer et déployer votre premier package Constellation en C# avec Visual Studio. Prérequis Un accès “Administrator” à une Constellation (Management API &#38; Developper access) Le SDK Constellation installé Nous vous conseillons de suivre</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-csharp/">Créez votre premier package Constellation en C#</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Dans cet article nous allons découvrir comment créer et déployer votre premier package Constellation en C# avec Visual Studio.</p>
<p style="text-align: center;"><span id="more-1287"></span><br />
<iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/wo3960Gwv6k" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<h3>Prérequis</h3>
<ul>
<li>Un accès “Administrator” à une Constellation (Management API &amp; Developper access)</li>
<li>Le SDK Constellation installé</li>
</ul>
<p>Nous vous conseillons de suivre <a href="/getting-started/installer-constellation/">le guide de démarrage ici</a> avant de démarrer.</p>
<h3>Créez le package dans Visual Studio</h3>
<ul>
<li>Lancez Visual Studio</li>
<li>Créez un nouveau projet de type “Constellation Package Console” (dans la catégorie Constellation) :</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-98.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Création d'un package Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-75.png" alt="Création d'un package Constellation" width="424" height="294" border="0" /></a></p>
<ul>
<li>Démarrez le package en mode debug en cliquant sur le bouton “Start” ou en pressant la touche “F5” :</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-160.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Debugging Visual Studio" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-137.png" alt="Debugging Visual Studio" width="424" height="111" border="0" /></a></p>
<ul>
<li>
<div align="left">Au démarrage, votre package affichera une sorte de ”Hello World” :</div>
</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-100.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Hello World" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-77.png" alt="Hello World" width="424" height="209" border="0" /></a></p>
<p align="left">Vous constaterez que :</p>
<ul>
<li>
<div align="left">La méthode “<em>OnStart</em>” est la méthode invoquée au démarrage de votre package</div>
</li>
<li>
<div align="left"><em>PackageHost.WriteInfo</em> est une méthode pour écrire des logs de type “info”</div>
</li>
<li>
<div align="left">PackageHost.IsRunning = true (votre package est bien en cours)</div>
</li>
<li>
<div align="left">PackageHost.IsConnected = false (votre package n’est pas connecté à Constellation, car nous l’avons lancé en local)</div>
</li>
</ul>
<h3 align="left">Fonctionnement de base</h3>
<p align="left">Un package est une application !</p>
<p align="left">Il faut impérativement appeler la méthode “<em>PackageHost.Start</em>” au démarrage de l’application, c’est à dire dans la méthode “Main” autrement, ce n’est pas un package Constellation mais une simple application !</p>
<p align="left">Lorsque vous appelez la méthode “<em>PackageHost.Start</em>” vous devez impérativement transférer les arguments (args) et indiquer la classe de votre package qui est dans notre exemple “Program”.</p>
<p></p><pre class="crayon-plain-tag">static void Main(string[] args)
{
    PackageHost.Start&lt;Program&gt;(args);
}</pre><p></p>
<p align="left">La classe d’un package doit être une classe qui implémente l’interface “<u>IPackage</u>”. Cette interface définie trois méthodes :</p>
<ul>
<li>
<div align="left"><u>OnStart</u> qui sera invoqué lorsque le package a démarré</div>
</li>
<li>
<div align="left"><u>OnPreShutdown</u> : invoqué lorsque le package va s’arrêter (à ce stade votre package est toujours connecté à Constellation, vous pouvez encore pusher des StateObjects, envoyer des messages, écrire des logs sur le hub, etc..)</div>
</li>
<li>
<div align="left">OnShutdown : invoqué après le <u>OnPreShutdown</u> et après avoir fermé les connexions.</div>
</li>
</ul>
<p>Pour vous éviter de devoir implémenter ces trois méthodes, votre classe peut hériter de la classe “PackageBase”. Cette classe abstraite implémente l’interface <u>IPackage</u> dans des méthodes virtuelles vides.</p>
<p>Libre à vous d’implémenter les méthodes que vous souhaitez !</p>
<p>Dans le template de projet créé ci-dessus, la classe “Program” hérite de “PackageBase” et redéfinie la méthode “OnStart” pour écrire un message de type “info” (<em>PackageHost.WriteInfo</em>) lorsque le package a démarré.</p>
<h3>Ecrire des logs</h3>
<p>Pour écrire des logs depuis un package Constellation vous disposez des méthodes :</p>
<ul>
<li>PackageHost.WriteDebug</li>
<li>PackageHost.WriteInfo</li>
<li>PackageHost.WriteWarn</li>
<li>PackageHost.WriteError</li>
</ul>
<p>Chacune de ces méthodes écrivent un message qui peut être formaté avec des arguments à la manière d’un “string.Format” :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.WriteInfo("Je suis le package nommé {0} version {1}", PackageHost.PackageName, PackageHost.PackageVersion);</pre><p></p>
<p><u>Attention</u> : bien respecter les index dans le format de votre message sous peine d’avoir une erreur.</p>
<p><u>Note</u> : la méthode WriteDebug écrit seulement dans la console (mode debug local). Les logs de type “Debug” ne sont jamais envoyés dans la Constellation.</p>
<h3>Accéder aux settings</h3>
<p>Chaque package peut définir des paramètres de configuration définis au niveau du serveur Constellation. Cela vous permet de changer ces paramètres directement depuis la Constellation qui se chargera de redescendre ces paramètres sur vos packages.</p>
<p>Il y a deux types de settings :</p>
<ul>
<li>Les “Setting Value” : très simple il s’agit d’un couple clé/value à l’instant des &lt;appSettings&gt; d’une application .NET</li>
<li>Les “Setting Content”  : au lieu de définir la valeur d’un paramètre dans un attribut XML, on peut la définir dans un élément XML enfant permettant d’avoir des settings qui renferme du XML ou JSON</li>
</ul>
<p>Voici par exemple des “SettingValues”  déclarés dans notre configuration :</p>
<p></p><pre class="crayon-plain-tag">&lt;setting key="MyBoolSetting" value="true" /&gt;      
&lt;setting key="MyStringSetting" value="This is a string" /&gt;
&lt;setting key="MyIntSetting" value="123" /&gt;</pre><p></p>
<p>Ces trois settings définissent la valeur dans l’attribut “value” (= SettingValue).</p>
<p>Pour récupérer la valeur du paramètre “MyStringSetting”  dans votre code, utilisez la méthode “GetSettingValue” :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.WriteInfo("My String = {0}", PackageHost.GetSettingValue("MyStringSetting"));</pre><p></p>
<p>La méthode “GetSettingValue” renvoie la valeur d’un setting de type “string” mais vous pouvez également caster la valeur depuis cette méthode en utilisant sa forme générique :</p>
<p></p><pre class="crayon-plain-tag">int myIntSetting = PackageHost.GetSettingValue&lt;int&gt;("MyIntSetting");
bool myBoolSetting = PackageHost.GetSettingValue&lt;bool&gt;("MyBoolSetting");</pre><p></p>
<p>Si par contre vous avez un modèle de configuration plus compliqué qu’une série de clé/valeur vous pouvez utiliser les “Setting Contents” pour définir du XML ou JSON comme valeur de setting.</p>
<p>Par exemple la configuration de votre package peut définir deux autres settings, contenant du XML ou JSON de cette façon :</p>
<p></p><pre class="crayon-plain-tag">&lt;setting key="MyXmlDocument"&gt;
  &lt;content&gt;
    &lt;note date="09-02-2016"&gt;
      &lt;to&gt;Tove&lt;/to&gt;
      &lt;from&gt;Jani&lt;/from&gt;
      &lt;heading&gt;Reminder&lt;/heading&gt;
      &lt;body&gt;Don't forget me this weekend!&lt;/body&gt;
    &lt;/note&gt;
  &lt;/content&gt;
&lt;/setting&gt;

&lt;setting key="MyJsonObject"&gt;
  &lt;content&gt;
    &lt;![CDATA[
    {
      "Number": 123,
      "String" : "This is a test (local)",
      "Boolean": true
    }
    ]]&gt;
  &lt;/content&gt;
&lt;/setting&gt;</pre><p></p>
<p>Plusieurs méthodes pour récupérer ces settings :</p>
<ul>
<li><u>GetSettingValue</u> : vous pouvez toujours récupérer le contenu brute de votre setting sous forme d’un string</li>
<li><u>GetSettingAsJsonObject</u> : dé-sérialise le contenu JSON de votre setting et vous retourne un objet dynamique</li>
<li><u>GetSettingAsJsonObject&lt;T&gt;</u> : dé-sérialise le contenu JSON de votre setting et le convertie dans un objet de votre type (T)</li>
<li><u>GetSettingAsXmlDocument</u> : dé-sérialise le contenu XML de votre setting et vous retourne un XmlDocument</li>
<li><u>GetSettingAsConfigurationSection&lt;TConfigurationSection&gt;</u> : dé-sérialise le contenu XML de votre setting sous forme d’un ConfigurationSection .NET</li>
</ul>
<p>Par exemple, pour manipuler le setting XML on pourrait écrire :</p>
<p></p><pre class="crayon-plain-tag">var xml = PackageHost.GetSettingAsXmlDocument("MyXmlDocument");
PackageHost.WriteInfo("My XmlDocument Attribute = {0} , first node value = {1}", xml.ChildNodes[0].Attributes["date"].Value, xml.ChildNodes[0].FirstChild.InnerText);</pre><p></p>
<p>Autre exemple avec le setting JSON :</p>
<p></p><pre class="crayon-plain-tag">dynamic json = PackageHost.GetSettingAsJsonObject("MyJsonObject");
PackageHost.WriteInfo("My JsonObject String={0}, Int={1}, Boolean={2}", json.String, json.Number, json.Boolean);</pre><p></p>
<p>Les settings d’un package sont déclarés au niveau du serveur dans la déclaration du package et/ou dans le fichier App.config.</p>
<p>Tous les settings doivent être déclarés dans le manifeste du package (fichier PackageInfo.xml).</p>
<p>Retrouvez plus d’information sur les settings <a href="/client-api/net-package-api/les-settings/">dans cet article</a>.</p>
<h3>Publier des StateObjects</h3>
<p>Pour publier (Push) un StateObject dans Constellation vous devez invoquer la méthode “<em>PackageHost.PushStateObject</em>” en précisant obligatoirement le nom du StateObject et sa valeur.</p>
<p>Par exemple, vous pouvez publié n’importe quel type de base :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.PushStateObject("MyString", "OK");
PackageHost.PushStateObject("MyNumber", 123);
PackageHost.PushStateObject("MyDecimal", 123.12);
PackageHost.PushStateObject("MyBoolean", true);</pre><p></p>
<p>Pouvez également publié des objets anonymes :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.PushStateObject("AnonymousObject", new { String = "test", Number = 123 });</pre><p></p>
<p>Ou encore avec des types plus complexes :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.PushStateObject&lt;MyCustomObject&gt;("MyObject",  new MyCustomObject() { String = "test", Number = 123 });</pre><p></p>
<p>Vous avez également la possibilité de définir des paramètres optionnels comme les métadonnées de votre StateObject ou sa durée de vie.</p>
<p>Par exemple, le StateObject “ShortLife” a une durée de vie de 20 secondes après sa publication. Au delà il sera marqué comme expiré.</p>
<p></p><pre class="crayon-plain-tag">PackageHost.PushStateObject("ShortLife", "Expire in 20 secs !!!", lifetime: 20);</pre><p></p>
<p>Ici, on publie un StateObject “Salon” en lui associé les metadatas “Id” et “Zone”.</p>
<p></p><pre class="crayon-plain-tag">PackageHost.PushStateObject("Salon", monObjetZoneSalon, metadatas: new Dictionary&lt;string, object&gt; { { "Id", 42 }, { "Zone", "Salon" } });</pre><p></p>
<p>Sur les objets personnalisés il est recommande de décorer les classes de l’attribut [StateObject] si vous avez possibilité de modifier le code de la classe. Autrement, sur votre classe IPackage, ajoutez l’attribut [StateObjectKnownTypes] en définissant tous les types de StateObjects que vous serez amener à publier. Cela permet de décrire ces types dans la Constellation pour l’auto-description (utilisez entre autre par les générateurs de code).</p>
<p>Pour plus d’information sur <a href="/client-api/net-package-api/les-stateobjects/">les StateObjects dans l’API .NET cliquez ici</a>.</p>
<h3>Tester son package dans sa Constellation</h3>
<p>Pour tester nous allons créer un package qui push à intervalle régulier un StateObject.</p>
<p>Le code de notre Package sera :</p>
<p></p><pre class="crayon-plain-tag">public class Program : PackageBase
{
    static void Main(string[] args)
    {
        PackageHost.Start&lt;Program&gt;(args);
    }

    public override void OnStart()
    {
        PackageHost.WriteInfo("Package starting - IsRunning: {0} - IsConnected: {1}", PackageHost.IsRunning, PackageHost.IsConnected);
        PackageHost.WriteInfo("Je suis le package nommé {0} version {1}", PackageHost.PackageName, PackageHost.PackageVersion);

        while (PackageHost.IsRunning)
        {
            PackageHost.WriteInfo("Je push un long !");
            PackageHost.PushStateObject("DemoLong", DateTime.Now.Ticks);

            Thread.Sleep(PackageHost.GetSettingValue&lt;int&gt;("Interval"));
        }
    }
}</pre><p></p>
<p>Notre application console démarre bien le package au démarrage (Main) où le package est notre classe Program qui hérite de PackageBase (donc c’est un IPackage).</p>
<p>Au démarrage on écrit deux logs de type information qui indique notamment le nom du package, sa version, si il est démarré (IsRunning) et si il est connecté (IsConnected).</p>
<p>Ensuite on crée une boucle qui tournera tant que le package est démarré. A chaque itération on écrit un log, publie un StateObject avant de mettre le thread en pause avant la prochaine itération.</p>
<p>Le temps de pause est un setting de type “Int” que l’on a nommé “Interval”.</p>
<p>L’utilisateur pourra le configurer dans la configuration du package sur le serveur, mais pour être sûr d’avoir une valeur par défaut nous allons déclarer ce setting ainsi que sa valeur par default dans son manifest.</p>
<p>Editez le fichier PackageInfo.xml pour ajouter :</p>
<p></p><pre class="crayon-plain-tag">&lt;Setting name="Interval" type="Int32" defaultValue="5000" description="Interval en millisecondes" /&gt;</pre><p></p>
<p>Ainsi même si le setting n’est pas déclaré sur le serveur ni dans le App.config local,  cette valeur sera par défaut égale à 5 secondes.</p>
<p>Vous pouvez démarrer le projet en mode debug (“F5” ou bouton “Start”) mais bien entendu il ne sera pas connecté à Constellation.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-101.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Debug dans Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-78.png" alt="Debug dans Constellation" width="424" height="216" border="0" /></a></p>
<p>Pour débugger dans Constellation, vous trouverez une icone dans la toolbar (en en pressant Ctrl+Alt+F8) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-161.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Debug dans Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-138.png" alt="Debug dans Constellation" width="424" height="100" border="0" /></a></p>
<p>Vous pouvez également cliquez droit sur votre projet et dans le menu Constellation sélectionnez “Debug On Constellation” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-102.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Debug dans Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-79.png" alt="Debug dans Constellation" width="424" height="307" border="0" /></a></p>
<p align="left">Si vous n’avez pas encore configuré la Constellation utilisée pour le débogage, vous devriez voir une alerte vous invitant à configurer vos accès :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-103.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Enregistrement de la Constellation dans VS" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-80.png" alt="Enregistrement de la Constellation dans VS" width="424" height="205" border="0" /></a></p>
<p align="left">Cette fois ci, votre package tourne bien en étant connecté à votre Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-104.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Hello World Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-81.png" alt="Hello World Constellation" width="424" height="216" border="0" /></a></p>
<p align="left">Lancez maintenant votre Console Constellation, vous verrez en temps réel les logs de votre package.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-105.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Hello World Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-82.png" alt="Hello World Constellation" width="424" height="232" border="0" /></a></p>
<p align="left">Sur le StateObject Explorer, vous verrez également le StateObject “DemoLong” publié par le package “MonPremierPackage”.</p>
<p align="left">Notez que la sentinelle qui héberge le package est une sentinelle virtuelle nommée “Developer”.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-106.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="StateObject Explorer" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-83.png" alt="StateObject Explorer" width="424" height="140" border="0" /></a></p>
<p align="left">Vous pouvez cliquer sur “View” pour voir toutes les informations à propos de ce StateObject.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-107.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Visualisation des StateObjects" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-84.png" alt="Visualisation des StateObjects" width="227" height="244" border="0" /></a></p>
<p align="left">Pour finir, cliquez sur “Subscribe” pour vous abonner aux mises à jour.</p>
<h3 align="left">Publier son package dans Constellation</h3>
<p align="left">Nous voulons maintenant publier ce package et le déployer sur une des sentinelles de notre Constellation.</p>
<p align="left">Toujours dans la toolbar “Constellation”, cliquez sur “Publish Constellation package” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-162.png"><img class="colorbox-1287"  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/03/image_thumb-139.png" alt="image" width="424" height="100" border="0" /></a></p>
<p align="left">Ou depuis le menu contextuel de votre projet, sélectionnez “Publish Constellation package” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-108.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Publier un package Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-85.png" alt="Publier un package Constellation" width="424" height="324" border="0" /></a></p>
<p align="left">Vous pouvez soit le publier en local puis l’uploader manuellement via la Console par exemple, soit le publier directement dans votre Constellation.</p>
<p align="left">Pour cela, sélectionnez “Upload on Constellation Server”.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-109.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Publier un package Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-86.png" alt="Publier un package Constellation" width="424" height="212" border="0" /></a></p>
<p align="left">Sélectionnez ensuite l’adresse de votre Constellation et cliquez sur “Publish”.</p>
<p align="left">Un message vous informera de la réussite de la publication. Dans le panneau “Ouput” de Visual Studio vous retrouvez également le détail de la publication :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-110.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Publier un package Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-87.png" alt="Publier un package Constellation" width="424" height="98" border="0" /></a></p>
<p align="left">Depuis la Console, sur la page “Package Repository” vous pourrez apercevoir votre package fraichement publié :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-111.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Package Repository" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-88.png" alt="Package Repository" width="424" height="153" border="0" /></a></p>
<p align="left">Pour le déployer, vous devez éditer la configuration de votre Constellation pour ajouter le package à une (ou plusieurs) sentinelle. Vous pouvez également redéfinir le setting “Interval” que nous exploitations dans notre package (bien que nous avons défini une valeur par défaut).</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="MonPremierPackage" enable="true"&gt;
    &lt;settings&gt;
        &lt;setting key="Interval" value="2000" /&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<p align="left">Vous pouvez éditer la configuration du serveur Constellation directement depuis Visual Studio en cloquant sur “Edit Constellation Server configuration” (depuis la toolbar ou via le menu contextuel).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-163.png"><img class="colorbox-1287"  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/03/image_thumb-140.png" alt="image" width="424" height="100" border="0" /></a></p>
<p align="left">La configuration sera automatiquement téléchargée du serveur et ouverte dans Visual Studio :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-164.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Edition de la configuration depuis VS" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-141.png" alt="Edition de la configuration depuis VS" width="424" height="230" border="0" /></a></p>
<p align="left">L’avantage est de pouvoir profiter de la validation du schéma XML et de l&rsquo;IntelliSense de Visual Studio :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-165.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Intellisense" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-142.png" alt="Intellisense" width="420" height="163" border="0" /></a></p>
<p align="left">Dès que vous enregistrerez votre configuration, Visual Studio détectera les modifications et vous proposera d’uploader et de recharger la nouvelle configuration sur votre serveur Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-166.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Upload de la configuration" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-143.png" alt="Upload de la configuration" width="242" height="144" border="0" /></a></p>
<p align="left">Vous pouvez aussi éditer la configuration de votre Constellation depuis la Console. Après avoir ajouter votre package, cliquez sur “Save &amp; Deploy” (pour informer les sentinelles des nouveaux packages) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-115.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Edition de la configuration" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-92.png" alt="Edition de la configuration" width="424" height="233" border="0" /></a></p>
<p align="left">Vous pourrez alors voir dans les logs que le package est automatiquement téléchargé et déployé sur sa sentinelle et commence à pusher des StateObject toutes les 2 secondes comme nous l’avons indiqué dans sa configuration :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-113.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Console log temps réel" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-90.png" alt="Console log temps réel" width="424" height="207" border="0" /></a></p>
<p align="left">Sur la page “Packages” vous pouvez maintenant contrôler votre package, l’arrêter, le redémarrer ou le recharger (= déploiement d’une nouvelle version).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-114.png"><img class="colorbox-1287"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Contrôle des packages" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-91.png" alt="Contrôle des packages" width="424" height="126" border="0" /></a></p>
<h3 align="left">Next steps</h3>
<ul>
<li>
<div align="left">Les <a href="/client-api/net-package-api/les-bases-des-packages-net/">bases des packages .NET</a></div>
</li>
<li>
<div align="left"><a href="/client-api/net-package-api/settings/">Les Settings</a> : paramètres de configuration de vos packages</div>
</li>
<li>
<div align="left"><a href="/client-api/net-package-api/pushstateobject/">Publier des StateObjects</a></div>
</li>
<li>
<div align="left">Exposer vos méthodes dans Constellation grâce aux <a href="/client-api/net-package-api/messagecallbacks/">MessageCallbacks</a></div>
</li>
<li>
<div align="left"><a href="/client-api/net-package-api/envoyer-des-messages-invoquer-des-messagecallbacks/">Envoyer des messages &amp; Invoquer des méthodes</a></div>
</li>
<li>
<div align="left"><a href="/client-api/net-package-api/consommer-des-stateobjects/">Consommer des StateObjects</a></div>
</li>
<li>
<div align="left">Accéder au hub de contrôle depuis un package C# avec le <a href="/client-api/net-package-api/controlmanager/">ControlManager</a></div>
</li>
<li>
<div align="left">Créer des <a href="/client-api/net-package-api/packages-ui-wpf-winform/">Packages UI</a> en Winform ou WPF</div>
</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-csharp/">Créez votre premier package Constellation en C#</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/creez-votre-premier-package-constellation-en-csharp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Settings : paramètres de configuration de vos packages</title>
		<link>https://developer.myconstellation.io/client-api/net-package-api/settings/</link>
					<comments>https://developer.myconstellation.io/client-api/net-package-api/settings/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 16 Mar 2016 12:15:58 +0000</pubDate>
				<category><![CDATA[.NET API]]></category>
		<category><![CDATA[SettingValue]]></category>
		<category><![CDATA[SettingContent]]></category>
		<category><![CDATA[Setting]]></category>
		<category><![CDATA[SettingsGroups]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=1297</guid>

					<description><![CDATA[<p>Chaque package peut définir des paramètres de configuration centralisés au niveau du serveur Constellation. L&#8217;ensemble des paramètres des configurations de vos différents packages, virtuels ou non, sont donc centralisés dans un fichier unique. Une modification de valeur est automatiquement mis</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/net-package-api/settings/">Settings : paramètres de configuration de vos packages</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Chaque package peut définir des paramètres de configuration centralisés au niveau du serveur Constellation.</p>
<p>L&rsquo;ensemble des paramètres des configurations de vos différents packages, virtuels ou non, sont donc centralisés dans un fichier unique. Une modification de valeur est automatiquement mis à jour sur le package cible.</p>
<p>Il y a deux types de settings :</p>
<ul>
<li>Le “Setting Value” : il s’agit d’un couple clé/valeur défini dans des attributs XML à l’instar des &lt;appSettings&gt; d’une application .NET</li>
<li>Le “Setting Content”  : au lieu de définir la valeur d’un paramètre dans un attribut XML, on peut la définir dans un élément XML enfant permettant d’avoir des settings renfermant du XML ou JSON</li>
</ul>
<h3>Les Settings Values</h3>
<p>Voici par exemple des “SettingValues”  déclarés dans la configuration d&rsquo;un package :</p>
<p></p><pre class="crayon-plain-tag">&lt;setting key="MyBoolSetting" value="true" /&gt;      
&lt;setting key="MyStringSetting" value="This is a string" /&gt;
&lt;setting key="MyIntSetting" value="123" /&gt;</pre><p></p>
<p>Ces trois settings définissent la valeur dans l’attribut “value” (= SettingValue).</p>
<p>Pour récupérer la valeur du paramètre “MyStringSetting”  dans votre code C#, vous pouvez utiliser la méthode “<em>GetSettingValue</em>” :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.WriteInfo("My String = {0}", PackageHost.GetSettingValue("MyStringSetting"));</pre><p></p>
<p>La méthode “<em>GetSettingValue</em>” vous retourne par défaut la valeur d’un setting en “string” mais vous pouvez également convertir cette valeur en précisant le type attendu :</p>
<p></p><pre class="crayon-plain-tag">int myIntSetting = PackageHost.GetSettingValue&lt;int&gt;("MyIntSetting");
bool myBoolSetting = PackageHost.GetSettingValue&lt;bool&gt;("MyBoolSetting");</pre><p></p>
<h3>Les Settings Contents</h3>
<p>Si vous avez un modèle de configuration plus compliqué qu’une série de clé/valeur vous pouvez utiliser les “Setting Contents” pour définir du XML ou JSON comme valeur de setting.</p>
<p>Par exemple la configuration de votre package peut définir deux autres settings, l’un contenant du XML et l’autre du JSON de cette façon :</p>
<p></p><pre class="crayon-plain-tag">&lt;setting key="MyXmlDocument"&gt;
  &lt;content&gt;
    &lt;note date="09-02-2016"&gt;
      &lt;to&gt;Tove&lt;/to&gt;
      &lt;from&gt;Jani&lt;/from&gt;
      &lt;heading&gt;Reminder&lt;/heading&gt;
      &lt;body&gt;Don't forget me this weekend!&lt;/body&gt;
    &lt;/note&gt;
  &lt;/content&gt;
&lt;/setting&gt;

&lt;setting key="MyJsonObject"&gt;
  &lt;content&gt;
    &lt;![CDATA[
    {
      "Number": 123,
      "String" : "This is a test (local)",
      "Boolean": true
    }
    ]]&gt;
  &lt;/content&gt;
&lt;/setting&gt;</pre><p></p>
<p>Voici les méthodes pour récupérer ces settings :</p>
<ul>
<li><u>GetSettingValue</u> : récupère le contenu brute de votre setting sous forme d’un string</li>
<li><u>GetSettingAsJsonObject</u> : dé-sérialise le contenu JSON de votre setting et vous retourne un objet dynamique</li>
<li><u>GetSettingAsJsonObject&lt;T&gt;</u> : dé-sérialise le contenu JSON de votre setting et le converti dans un objet de votre type (T)</li>
<li><u>GetSettingAsXmlDocument</u> : dé-sérialise le contenu XML de votre setting et vous retourne un XmlDocument</li>
<li><u>GetSettingAsConfigurationSection&lt;TConfigurationSection&gt;</u> : dé-sérialise le contenu XML de votre setting sous forme d’un ConfigurationSection .NET</li>
</ul>
<p>Par exemple, pour manipuler le setting XML on pourrait écrire :</p>
<p></p><pre class="crayon-plain-tag">var xml = PackageHost.GetSettingAsXmlDocument("MyXmlDocument");
PackageHost.WriteInfo("My XmlDocument Attribute = {0} , first node value = {1}", xml.ChildNodes[0].Attributes["date"].Value, xml.ChildNodes[0].FirstChild.InnerText);</pre><p></p>
<p>Autre exemple avec le setting JSON :</p>
<p></p><pre class="crayon-plain-tag">dynamic json = PackageHost.GetSettingAsJsonObject("MyJsonObject");
PackageHost.WriteInfo("My JsonObject String={0}, Int={1}, Boolean={2}", json.String, json.Number, json.Boolean);</pre><p></p>
<h3>TryGetSettings</h3>
<p>Notez que toutes ces méthodes citées ci-dessus ont un équivalent de type “<em><strong>Try</strong>GetSettingXXX</em>” :</p>
<ul>
<li>TryGetSettingAsConfigurationSection&lt;TConfigurationSection&gt;</li>
<li>TryGetSettingAsJsonObject</li>
<li>TryGetSettingAsJsonObject&lt;T&gt;</li>
<li>TryGetSettingAsXmlDocument</li>
<li>TryGetSettingValue&lt;T&gt;</li>
</ul>
<p>Ces méthodes placent le résultat dans un paramètre de sortie (“out”) et vous retourne un booléen indiquant si l’opération est réussite ou non.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">int monParametre = 0;
if (PackageHost.TryGetSettingValue&lt;int&gt;("MyIntSetting", out monParametre))
{
    PackageHost.WriteInfo("Lecture de 'MyIntSetting' en int OK. Valeur = {0}", monParametre);
}
else
{
    PackageHost.WriteError("Impossible de récupérer le setting 'MyIntSetting' en int");
}</pre><p></p>
<h3>Déclarer les settings dans le Package Manifest</h3>
<p>Tous les settings devraient être déclarés dans le <a href="/concepts/package-manifest/">manifeste du package</a> (fichier PackageInfo.xml).</p>
<p>La déclaration des settings dans le manifeste n’a pas impact dans le fonctionnement du package mais il permet de décrire la configuration du package pour que des outils tel que la Console puisse proposer une interface graphique de configuration pour chaque package. Il est donc vivement recommandé de décrire les settings de ses packages. De plus il est possible de définir des valeurs par défaut dans le manifeste.</p>
<p>Chaque setting déclaré dans le manifeste doit obligatoirement comporter les attributs suivants  :</p>
<ul>
<li><u>Name</u> : le nom (clé) du setting</li>
<li><u>Type</u> : le type du setting</li>
</ul>
<p>Le type peut être :</p>
<ul>
<li><u>Boolean</u> : un booléen (true/false)</li>
<li><u>Double</u> : un double</li>
<li><u>String</u> : un chaine de caractère</li>
<li><u>Int32</u> : un entier (32 bits)</li>
<li><u>Int64</u> : un long (64 bits)</li>
<li><u>ConfigurationSection</u> : un section de configuration .NET</li>
<li><u>DateTime</u> : un DateTime</li>
<li><u>TimeSpan</u> : une durée</li>
<li><u>XmlDocument</u> : un document XML</li>
<li><u>JsonObject</u> : un objet JSON (objet ou tableau)</li>
</ul>
<p>Ensuite vous pouvez définir d’autre attribut pour décrire vos settings :</p>
<ul>
<li>“<u>isRequired</u>“ : indique si le setting est obligatoire ou non (par défaut “false”)</li>
<li>“<u>description</u>” : la description du setting (texte qui sera affiché à l’utilisateur)</li>
<li>“<u>defaultValue</u>” : la valeur par défaut du setting si le setting n’est pas déclaré (ni sur le serveur, ni dans le fichier local App.config et seulement si le setting n’est pas obligatoire)</li>
<li>“<u>schemaXSD</u>” : indique le nom du fichier du schéma XSD (chemin relatif au package) que la valeur XML doit valider (seulement pour les settings de type XmlDocument ou ConfigurationSection)</li>
<li>“<u>ignoreLocalValue</u>” : si “true” alors la valeur définie dans le fichier local App.config est ignorée</li>
<li>“<u>ignoreDefaultValue</u>” : si “true” alors la valeur par défaut définie dans le manifeste est ignorée</li>
</ul>
<p>Pour les settings <em>XmlDocument</em>, <em>ConfigurationSection</em> et <em>JsonObject</em> vous pouvez également ajouter une sous-section &lt;defaultContent&gt; sur vos settings pour définir le contenu par défaut.</p>
<p>Pour plus d’information, veuillez lire l&rsquo;article sur le <a href="/concepts/package-manifest/">Package Manifest</a>.</p>
<h3>Déclarez des settings dans votre configuration locale</h3>
<p>Les settings d’un package sont déclarés au niveau du serveur Constellation mais vous pouvez également les déclarer dans le fichier App.config de votre package. Cela est très utile pendant la phase de développement.</p>
<p>Pour définir les settings dans le fichier App.config vous devez utiliser la section “constellationSettings ». Le schéma et le fonctionnement sont exactement les mêmes que pour la configuration définie sur le serveur Constellation.</p>
<p>Par exemple, dans le fichier App.config de votre package, on peut écrire :</p>
<p></p><pre class="crayon-plain-tag">&lt;constellationSettings xmlns="http://schemas.myconstellation.io/Constellation/1.8/ConstellationSettings"&gt;
  &lt;settings&gt;
    &lt;setting key="MyStringSetting" value="This is a string" /&gt;
    &lt;setting key="MyBoolSetting" value="true" /&gt;
    &lt;setting key="MyXmlDocument"&gt;
      &lt;content&gt;
        &lt;note date="09-02-2016"&gt;
          &lt;to&gt;Tove&lt;/to&gt;
          &lt;from&gt;Jani&lt;/from&gt;
          &lt;heading&gt;Reminder&lt;/heading&gt;
          &lt;body&gt;Don't forget me this weekend!&lt;/body&gt;
        &lt;/note&gt;
      &lt;/content&gt;
    &lt;/setting&gt;
    &lt;setting key="MyJsonObject"&gt;
      &lt;content&gt;
        &lt;![CDATA[
        {
          "Number": 123,
          "String" : "This is a test (local)",
          "Boolean": true
        }
        ]]&gt;
      &lt;/content&gt;
    &lt;/setting&gt;
  &lt;/settings&gt;
&lt;/constellationSettings&gt;</pre><p></p>
<p>La structure est présente par défaut dans les projets Constellation créés depuis le SDK Constellation pour Visual Studio.</p>
<p>Si un même setting (= même clé) est déclaré à la fois sur le serveur Constellation et dans le fichier local, c’est toujours la valeur définie sur le serveur qui gagne (<a href="#Resolution_des_settings">voir ci-dessous</a>).</p>
<p>Notez également que si un setting est déclaré comme obligatoire dans le manifeste, il est automatiquement supprimé du fichier App.config lorsque <a href="/constellation-platform/constellation-sdk/publier-package-visual-studio/">vous publiez ce package depuis Visual Studio</a> (que ce soit en local ou sur un serveur). Vous pouvez donc mettre vos “credentials” ou autre information personnel pour vos développements tout en sachant qu’ils seront supprimés lorsque vous publierez votre package.</p>
<h3>Résolution des settings</h3>
<p>Par défaut, la valeur d’un setting est en priorité récupérée depuis la configuration du package défini sur le serveur Constellation.</p>
<p>Si le setting n’existe pas sur le serveur (et qu’il n’est pas déclaré comme obligatoire dans le manifeste du package), le package va chercher la valeur du setting dans le fichier de configuration local App.config.</p>
<p>Si le fichier local App.config ne défini pas non plus de valeur pour ce setting ou que le manifeste demande d’ignorer cette valeur (<em>ignoreLocalValue</em> à true), le package va alors chercher la valeur par défaut de ce setting dans le manifeste (attribut “<em>defaultValue</em>” ou section”<em>defaultContent</em>”).</p>
<p>Si le manifeste du package ne défini pas de valeur par défaut pour ce setting, ou que cette valeur doit être ignorée (<em>ignoreDefaultValue</em> à true), la valeur du setting sera nulle.</p>
<p>Le processus de résolution des settings peut se résumé ainsi :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/SettingResolution-1.png"><img class="colorbox-1297"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Résolution des settings" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/SettingResolution_thumb-1.png" alt="Résolution des settings" width="420" height="236" border="0" /></a></p>
<p>Prenons un exemple pour bien comprendre. Si votre package est déclaré sur le serveur de cette façon :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="MonPackage" enable="true"&gt;
  &lt;settings&gt;
    &lt;setting key="MyStringSetting" value="Valeur du serveur" /&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<p>Et que le package contient dans son fichier local App.config la section suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;constellationSettings xmlns="http://schemas.myconstellation.io/Constellation/1.8/ConstellationSettings"&gt;
  &lt;settings&gt;
    &lt;setting key="MyStringSetting" value="Valeur locale" /&gt;
    &lt;setting key="MyIntSetting" value="42" /&gt;
  &lt;/settings&gt;
&lt;/constellationSettings&gt;</pre><p></p>
<p>Avec dans son manifeste, la déclaration suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;Settings&gt;
   &lt;Setting name="MyStringSetting" type="String" description="This is a String setting" /&gt;
   &lt;Setting name="MyIntSetting" type="Int32" isRequired="false" ignoreLocalValue="true"  defaultValue="1234" /&gt;
&lt;/Settings&gt;</pre><p></p>
<p>Imaginez maintenant le code C# suivant :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.WriteInfo("My String = {0}", PackageHost.GetSettingValue("MyStringSetting"));
PackageHost.WriteInfo("My Int = {0}", PackageHost.GetSettingValue("MyIntSetting"));</pre><p></p>
<p>Si vous lancez le package en debug depuis Visual Studio :</p>
<ul>
<li>My String = “Valeur locale”</li>
<li>My Int = 123</li>
</ul>
<p>Les valeurs sont simplement lues depuis le fichier de configuration locale. Si maintenant vous supprimez le setting dans votre App.config, la valeur de MyIntSetting sera 1234, c’est à dire la valeur par défaut du manifest.</p>
<p>Maintenant si vous déployez votre package dans votre Constellation :</p>
<ul>
<li>My String = “Valeur du serveur”</li>
<li>My Int = 1234</li>
</ul>
<p>My String est bien récupéré depuis la configuration du serveur (car prioritaire), cependant “MyIntSetting” n’étant pas  déclaré sur le serveur, le package va tenter de lire cette valeur depuis la configuration locale (123) mais le manifeste demande à ignorer la valeur locale (<em>ignoreLocalValue</em>= »true » dans le manifeste) ce qui l’amène à récupérer la valeur par défaut (<em>defaultValue</em>) déclaré dans le manifeste du package. Donc MyIntSetting = 1234.</p>
<p><u>Note sur le “ignoreDefaultValue”</u></p>
<p>On peut se demander quel est l’intérêt de définir une valeur par défaut tout demandant de l’ignorer (<em>ignoreDefaultValue</em> = true).</p>
<p>En fait la valeur par défaut du manifeste peut être considérée comme un “exemple”. La <em>defaultValue</em> ou <em>defaultContent</em> est affiché à titre d’exemple à l’utilisateur lors de la configuration de son package dans la Console Constellation. Cela est surtout fort utile pour les “Setting Contents”, car ça renseigne l’utilisateur la structure du XML ou du JSON du setting.</p>
<p>Mais une valeur d’ “exemple” ne doit pas être chargée ! De ce fait on déclare un setting avec une defaultValue/defaultContent pour l’exemple et on demande à ne jamais tenir compte de cette valeur en l&rsquo;ignorant (ignoreDefaultValue = true).</p>
<p>Si on veut une valeur “par défaut”, on utilisera le fichier local App.config.</p>
<p>En clair, on peut voir les choses ainsi :</p>
<ul>
<li>Valeur déclarée dans la configuration du package au niveau du serveur Constellation = configuration de l’utilisateur</li>
<li>Valeur déclarée dans la configuration locale du package (App.config) = configuration pour le développement ou valeur par défaut</li>
<li>Valeur déclarée dans le manifeste du package (PackagInfo.xml) = exemple de configuration ou valeur par défaut</li>
</ul>
<h3>Mise à jour dynamique</h3>
<p>Les settings d&rsquo;un package sont récupérés du serveur Constellation au démarrage du package. Il est également possible de “pusher” les settings d’un package lorsque le package est en fonctionnement.</p>
<p>Il y a trois façons de “pusher” les settings sur un package :</p>
<ul>
<li>Lors du rechargement de la configuration Constellation sur le serveur</li>
<li>Lors d’un “UpdateSettings” sur un package en particulier via le hub contrôle</li>
<li>A la demande d’un package via la méthode “RequestSettings”</li>
</ul>
<p>Le hub de contrôle (control hub) expose une méthode “reloadServerConfiguration” permettant de recharger la configuration de la Constellation au niveau du serveur.  Cette méthode prend en paramètre un booléen (optionnel) indiquant si il faut ou non déployer la configuration après son rechargement sur le serveur. Par défaut ce paramètre est à “false” (la configuration est seulement rechargée).</p>
<p>Lorsque la configuration est déployée, le serveur Constellation informe toutes les sentinelles et tous les packages que la configuration a changé. Chaque package recevra la valeurs des settings déclarées dans la nouvelle configuration et chaque sentinelle se conformera à sa configuration (arrêt des packages supprimés et déploiement/démarrage des packages ajoutés).</p>
<p>Il est possible de lancer cette action depuis la Console Constellation (soit depuis la page “<a href="/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/">Packages</a>” ou soit depuis la page “<a href="/constellation-platform/constellation-console/configuration-editor/">Configuration Editor</a>« ).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-140.png"><img class="colorbox-1297"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Rechargement de la configuration" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-117.png" alt="Rechargement de la configuration" width="244" height="109" border="0" /></a></p>
<p align="left">L’autre possibilité, toujours sur le hub de contrôle, avec une méthode “<em>updateSettings</em>” permettant de pusher les settings du serveur vers un package en particulier. Vous retrouverez également cette action depuis la Console Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image-141.png"><img class="colorbox-1297"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Mise à jour des settings d'un package" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image_thumb-118.png" alt="Mise à jour des settings d'un package" width="244" height="173" border="0" /></a></p>
<p align="left">Enfin, le package lui-même peut faire la demande au serveur de lui renvoyer ses settings par la méthode suivante :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.RequestSettings();</pre><p></p>
<p align="left">Dans tous les cas, le dictionnaire des settings de votre package (propriété <em>PackageHost.Settings</em>) sera mis à jour de façon de transparent (en tenant compte du processus de résolution des settings décrit ci-dessus).</p>
<p align="left">Ainsi, lorsque vous appelez les méthodes <em>GetSettingXXXX</em>, elles vous retourneront toujours les dernières valeurs des settings. C&rsquo;est pourquoi il est conseillé de ne jamais mettre en cache les valeurs des settings et de toujours invoquer les méthodes <em>GetSettingsXXX</em> pour tenir compte des modifications en temps réel.</p>
<p align="left">Vous avez également la possibilité de vous abonnez à l’événement “<em>PackageHost.SettingsUpdated</em>” pour être informé de ces mises à jour et agir en conséquence :</p>
<p></p><pre class="crayon-plain-tag">PackageHost.SettingsUpdated += (s, e) =&gt;
{
    PackageHost.WriteInfo("Mise à jours des settings");
    PackageHost.WriteInfo("Il y a {0} setting(s)", PackageHost.Settings.Count);
};</pre><p></p>
<h3>Les groupes de Settings</h3>
<p>Vous pouvez grouper des settings (Content ou Value) dans des groupes au niveau du serveur et importer ces groupes dans les settings de vos packages ou dans d’autres groupes.</p>
<p>Par exemple, créons un groupe pour “HWMonitorSettings” qui contient le setting “Interval” :</p>
<p></p><pre class="crayon-plain-tag">&lt;settingsGroups&gt;
  &lt;group name="HWMonitorSettings"&gt;
    &lt;settings&gt;
      &lt;setting key="Interval" value="500" /&gt;
    &lt;/settings&gt;
  &lt;/group&gt;
&lt;/settingsGroups&gt;</pre><p></p>
<p>Ainsi pour chaque instance du package “HWMonitor”, vous pouvez importer le groupe “HWMonitorSettings” afin de centraliser la configuration de ce package :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="HWMonitor"&gt;
  &lt;settings&gt;
    &lt;import&gt;
      &lt;settingGroup groupName="HWMonitorSettings" /&gt;
    &lt;/import&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<p>Vous pouvez importer des groupes dans des groupes sans limite.</p>
<p>C’est toujours la valeur du setting la plus proche du package qui gagne (surcharge).</p>
<p>Bien entendu, vous pouvez créer autant de groupe que vous voulez et chaque groupe peut contenir des SettingValues ou des SettingContents :</p>
<p></p><pre class="crayon-plain-tag">&lt;settingsGroups&gt;
  &lt;group name="test"&gt;
    &lt;settings&gt;
      &lt;setting key="Demo1" value="Seb" /&gt;
      &lt;setting key="Demo2" value="123" /&gt;
    &lt;/settings&gt;
  &lt;/group&gt;
  &lt;group name="test2"&gt;
    &lt;settings&gt;
      &lt;import&gt;
        &lt;settingGroup groupName="common" /&gt;
      &lt;/import&gt;
      &lt;setting key="Demo1" value="Sebastien" /&gt;
      &lt;setting key="Demo2" value="2015" /&gt;
    &lt;/settings&gt;
  &lt;/group&gt;
  &lt;group name="common"&gt;
    &lt;settings&gt;
      &lt;setting key="MyStringSetting" value="This is a string" /&gt;
      &lt;setting key="MyBoolSetting" value="true" /&gt;
      &lt;setting key="MyXmlDocument"&gt;
        &lt;content&gt;
          &lt;note date="09-02-2016"&gt;
            &lt;to&gt;Tove&lt;/to&gt;
            &lt;from&gt;Jani&lt;/from&gt;
            &lt;heading&gt;Reminder&lt;/heading&gt;
            &lt;body&gt;Don't forget me this weekend!&lt;/body&gt;
          &lt;/note&gt;
        &lt;/content&gt;
      &lt;/setting&gt;
      &lt;setting key="MyJsonObject"&gt;
        &lt;content&gt;
          &lt;![CDATA[
        {
          "Number": 123,
          "String" : "This is a test (local)",
          "Boolean": true
        }
        ]]&gt;
        &lt;/content&gt;
      &lt;/setting&gt;
    &lt;/settings&gt;
  &lt;/group&gt;
&lt;/settingsGroups&gt;</pre><p></p>
<p>Pour bien comprendre, imaginez le package suivant :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="DemoPackage"&gt;
  &lt;settings&gt;
    &lt;import&gt;
      &lt;settingGroup groupName="test" /&gt;
      &lt;settingGroup groupName="test2" /&gt;
    &lt;/import&gt;
    &lt;setting key="numberTest" value="42" /&gt;
    &lt;setting key="Demo1" value="It’me" /&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<p>Ici cette instance du package “DemoPackage” contient 7 settings (sans prendre en compte les settings déclarés dans le fichier local et le manifeste) :</p>
<ul>
<li>numberTest = 42 (défini dans les settings du package)</li>
<li>Demo1 = “It’s me” (défini dans les settings du package, cette valeur écrase celle des groupes importés)</li>
<li>Demo2 = 2015 (défini par le groupe “test2”. Cette valeur écrase la valeur du groupe “test”, car le groupe “test2” est importé APRES le groupe “test”)</li>
<li>MyStringSetting, MyBoolSetting, MyXmlDocument et MyJsonObject définis par le groupe “common” (groupe importé dans le groupe “test2” lui même importé sur le package “DemoPackage”).</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/net-package-api/settings/">Settings : paramètres de configuration de vos packages</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/net-package-api/settings/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>L&#8217;interface REST « Constellation »</title>
		<link>https://developer.myconstellation.io/client-api/rest-api/interface-rest-constellation/</link>
					<comments>https://developer.myconstellation.io/client-api/rest-api/interface-rest-constellation/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 16 Aug 2016 08:51:20 +0000</pubDate>
				<category><![CDATA[REST API]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[group]]></category>
		<category><![CDATA[Request]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Subscribe]]></category>
		<category><![CDATA[SendMessage]]></category>
		<category><![CDATA[PushStateObject]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[WriteLog]]></category>
		<category><![CDATA[Setting]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[PurgeStateObject]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[PackageDescriptor]]></category>
		<category><![CDATA[Saga]]></category>
		<category><![CDATA[AccessKey]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Virtuel]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2296</guid>

					<description><![CDATA[<p>L’interface REST “Constellation” est une API HTTP permettant d’exposer les fonctionnalités de base pour les packages “virtuels”. Avec cette interface vous pourrez via des requêtes HTTP : Publier, consommer ou purger des StateObjects Envoyer et recevoir des messages Récupérer les</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/rest-api/interface-rest-constellation/">L&rsquo;interface REST « Constellation »</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>L’interface REST “Constellation” est une API HTTP permettant d’exposer les fonctionnalités de base pour les <a href="/concepts/sentinels-packages-virtuels/">packages “virtuels”</a>.</p>
<p>Avec cette interface vous pourrez via des requêtes HTTP :</p>
<ul>
<li>Publier, consommer ou purger des StateObjects</li>
<li>Envoyer et recevoir des messages</li>
<li>Récupérer les settings du package « virtuel »</li>
<li>Produire des logs</li>
<li>Déclarer le “Package Descriptor” (MessageCallbacks exposés ou les types utilisés par les MC ou SO)</li>
</ul>
<p>De ce fait un script Bash ou Powershell, une page PHP, un Arduino, ESP ou NetDuino, bref n’importe quel système, objet ou langage pouvant effectuer des appels HTTP peut être considéré comme un package (dit virtuel) de votre Constellation et produire ou consommer des StateObjects, envoyer ou recevoir des messages, écrire des logs, etc…</p>
<h3>Généralités</h3>
<h4>Construction de l’URL</h4>
<p>L’URL est :  &lt;Root URI&gt;/rest/constellation/&lt;action&gt;?&lt;paramètres&gt;</p>
<p>Partons du principe que votre Constellation est exposée en HTTP sur le port 8088 (sans path). On retrouvera dans le <a href="/constellation-server/fichier-de-configuration/">fichier de configuration</a> la section suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;listenUris&gt;
  &lt;uri listenUri="http://+:8088/" /&gt;
&lt;/listenUris&gt;</pre><p></p>
<p>La “Root URI “ est donc “<strong>http://&lt;ip ou dns&gt;:8088/</strong>”.</p>
<p>Par exemple si nous sommes en local, nous pourrions écrire :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/xxxxx</pre><p></p>
<h4>Authentification</h4>
<p>Comme pour toutes les requêtes vers Constellation vous devez impérativement spécifier dans <u>les headers HTTP</u> <strong>ou</strong> dans <u>les paramètres de l’URL</u> (querystring), les paramètres “SentinelName”, “PackageName” et “AccessKey” pour l’authentification.</p>
<p>Ici votre “<a href="/concepts/sentinels-packages-virtuels/">package virtuel</a>” doit être déclaré dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/">configuration</a> de votre Constellation comme un véritable package, c’est à dire avec une sentinelle (dite virtuelle) et un package qui peut contenir des settings, etc…</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;sentinels&gt;
  &lt;sentinel name="MyVirtualSentinel" credential="Standard"&gt;
    &lt;packages&gt;        
      &lt;package name="MyVirtualPackage" enable="true"&gt;
        &lt;settings&gt;
          &lt;setting key="IntSetting" value="42" /&gt;
          &lt;setting key="StringSetting" value="sample config value" /&gt;
        &lt;/settings&gt;
      &lt;/package&gt;
    &lt;/packages&gt;
  &lt;/sentinel&gt;
&lt;/sentinels&gt;</pre><p></p>
<p>On a ici déclaré une sentinelle virtuelle “MyVirtualSentinel” qui contient le package virtuelle “MonPackageVirtuel”. Ce package <a href="/concepts/securite-accesskey-credential-authorization/">utilise implicitement l’AccessKey</a> du credential “Standard” déclaré au niveau de la sentinelle.</p>
<p>De ce fait, pour chaque appel on passera les paramètres suivants (dans l’URL ou dans les headers) :</p>
<ul>
<li>SentinelName = MyVirtualSentinel</li>
<li>PackageName = MyVirtualPackage</li>
<li>AccessKey = MyAccessKey (en partant du principe que l’AccessKey déclaré pour le credential “Standard” est “MyAccessKey”)</li>
</ul>
<p>Pour la suite de cet article nous passerons tous les paramètres dans l’URL, ainsi chaque appel sera sous la forme :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/&lt;action&gt;?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;&lt;paramètres&gt;</pre><p></p>
<h4>Check Access</h4>
<p>Toutes les API REST de Constellation exposent une méthode en GET “CheckAccess” qui retourne un code HTTP 200 (OK). Cela permet de tester la connexion et l’authentification au serveur Constellation.</p>
<ul>
<li>Action : “CheckAccess” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/CheckAccess?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey</pre><p></p>
<h3>Publier des StateObjects</h3>
<ul>
<li>Action : “PushStateObject” (GET ou POST)</li>
<li>En GET, voici les paramètres de l’URL :
<ul>
<li><u>name</u> : le nom du StateObject</li>
<li><u>value</u> : la valeur du StateObject</li>
<li><u>type</u> (optionnel) : le type du StateObject</li>
<li><u>lifetime</u> (optionnel – par défaut 0) : la durée de vie (en seconde) du StateObject avant d’être marqué “expiré”. (0 = durée de vie infinie)<!--EndFragment--></li>
</ul>
</li>
</ul>
<p>Pour publier un StateObject vous devez obligatoirement spécifier son nom (name) et sa valeur (value). La valeur peut être un type simple (un Int, String, bool, etc..) ou un objet complexe formaté en JSON. Optionnellement vous pouvez spécifier le type et la durée de vie de votre SO (en seconde).</p>
<p>Par exemple publions un StateObject nommé “Temperature” dont la valeur est le nombre “21” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PushStateObject?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;name=Temperature&amp;value=21</pre><p></p>
<p>Autre exemple avec un objet complexe contenant deux propriété (Temperature et Humidity) dont la durée de vie est de 60 secondes et le type nommé “TemperatureHumidity” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PushStateObject?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;name=Temperature&amp;value={ Temperature: 21, Humidity: 72 }&amp;type=TemperatureHumidity&amp;lifetime=60</pre><p></p>
<p>Si la valeur du StateObject est trop grande pour être passée dans l’URL ou si vous souhaitez ajouter des métadonnées (metadatas) à votre StateObject vous pouvez “poster” le StateObject dans le corps de la requête HTTP en utilisant le verbe “POST” (sans oublier de définir le Content-Type à “application/json”).</p>
<p>Pour publier par un POST le même StateObject en lui ajoutant deux métadonnées :</p>
<p></p><pre class="crayon-plain-tag">POST http://localhost:8088/rest/constellation/PushStateObject?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey
Host: localhost:8088
Content-Length: 189
Content-Type: application/json

{
  "Name" : "Temperature",
  "Value" : { Temperature: 21, Humidity: 72 },
  "Type" : "TemperatureHumidity",
  "Lifetime" : 60,
  "Metadatas": { "ChipId":"ABC123", "Room":"Garden" }
}</pre><p></p>
<h3>Purger ses StateObjects</h3>
<p>Un package peut supprimer ses StateObjects qu’il produit avec la méthode “PurgeStateObjects”.</p>
<ul>
<li>Action : “PurgeStateObjects” (GET)</li>
<li>Paramètres:
<ul>
<li><u>name</u> (optionnel – par défaut “*”) : le nom du StateObject</li>
<li><u>type</u> (optionnel – par défaut “*”) : le type du StateObject</li>
</ul>
</li>
</ul>
<p>Vous pouvez spécifier le nom du StateObject à supprimer et/ou son type. Par défaut ces deux paramètres sont définis à “*”. C’est à dire que si vous ne précisez rien, tous les StateObjects du package seront purgés.</p>
<ul><!--EndFragment--></ul>
<p>Par exemple pour purger tous les StateObjects de notre package virtuel (instance MyVirtualSentinel/MyVirtualPackage):</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PurgeStateObjects?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey</pre><p></p>
<p>Pour purger tous les StateObjects de type “Temperature” de cette même instance :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PurgeStateObjects?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;type=Temperature</pre><p></p>
<p>Ou pour supprimer le StateObject nommé “Demo” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PurgeStateObjects?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;name=Demo</pre><p></p>
<h3>Ecrire des logs</h3>
<p>Les packages peuvent écrire des logs qui seront remontés dans le hub Constellation.</p>
<ul>
<li>Action : “WriteLog” (GET)</li>
<li>Paramètres:
<ul>
<li><u>message</u> : texte du log</li>
<li><u>level</u> (optionnel – par défaut “Info”) : le niveau du log (Info, Warn ou Error)</li>
</ul>
<p><!--EndFragment--></li>
</ul>
<p>Exemple d’un message “Info” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/WriteLog?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;message=Hello World</pre><p></p>
<p>Exemple pour produire un message d’erreur (Error) :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/WriteLog?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;message=Il y  a une erreur ici&amp;level=Error</pre><p></p>
<h3>Récupérer ses settings</h3>
<p>Les settings sont récupérés en invoquant la méthode “GetSettings”.</p>
<ul>
<li>Action : “GetSettings” (GET)</li>
<li>Paramètres:  aucun</li>
</ul>
<p>Par exemple pour récupérer les settings (dictionnaire de clé / valeur) définis pour notre package virtuel :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/GetSettings?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey</pre><p></p>
<h3>Envoyer des messages</h3>
<ul>
<li>Action : “SendMessage” (GET ou POST)</li>
<li>En GET, voici les paramètres de l’URL :
<ul>
<li><u>scope</u> : le type de scope (All, Other, Group, Sentinel ou Package)</li>
<li><u>args</u> : les arguments du scope (par exemple le nom du groupe, de la sentinelle, du package ou de l’instance du package – plusieurs valeurs possibles séparées par des virgules)</li>
<li><u>key</u> : la clé du message (= la méthode à invoquer)</li>
<li><u>data</u> : le contenu du message (= les arguments de la méthode)</li>
<li><u>sagaId</u> (optionnel) : l’identification de la saga si le message est envoyé dans une saga</li>
</ul>
</li>
</ul>
<p>Vous pouvez également invoquer cette action en POST. Le corps de votre requête contiendra l’objet JSON suivant :</p>
<p></p><pre class="crayon-plain-tag">{
  "Scope" : { "Type" : "&lt;type&gt;", Args: [ "&lt;arg1&gt;", "&lt;args2&gt;", .... ], "SagaId":"Identifiant de la Saga" },
  "Key" : "&lt;Key&gt;",
  "Data" : "&lt;Data&gt;"
}</pre><p></p>
<p>La propriété “SagaId” dans le JSON ci-dessus est optionnelle.</p>
<p>Par exemple pour envoyer un message au package Nest en invoquant la méthode (key) “SetTargetTemperature” avec en paramètre le nombre “21” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SendMessage?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;scope=Package&amp;args=Nest&amp;key=SetTargetTemperature&amp;data=21</pre><p></p>
<p>Ce même MessageCallback “SetTargetTemperature” du package Nest peut être invoqué dans une saga afin de recevoir un accusé de réception :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SendMessage?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;scope=Package&amp;args=Nest&amp;key=SetTargetTemperature&amp;data=21&amp;sagaId=123456789</pre><p></p>
<p>Il faudra ensuite “récupérer” les messages reçus (voir dessous) pour lire la réponse à votre saga que nous avons ici identifié par la clé “123456789”.</p>
<h3>Recevoir des messages</h3>
<h4>Créer un abonnement de réception</h4>
<p>Tout d’abord pour recevoir des messages il faut s’abonner aux messages.</p>
<ul>
<li>Action : “SubscribeToMessage” (GET)</li>
<li>Paramètres :
<ul>
<li><u>subscriptionId</u> (optionnel) : identifiant de l’abonnement si déjà connu</li>
</ul>
</li>
</ul>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SubscribeToMessage?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Vous obtiendrez en réponse l’ID de votre abonnement, le “Subscription Id”.</p>
<h4>Relever les messages</h4>
<ul>
<li>Action : “GetMessages” (GET)</li>
<li>Paramètres :
<ul>
<li><u>subscriptionId</u> : identifiant de l’abonnement</li>
<li><u>timeout</u> (optionnel – par défaut 60000) : temps maximal en milliseconde de la mise en attente de la requête (entre 1000ms et 120000ms)</li>
<li><u>limit</u> (optionnel – par défaut 0) : nombre maximum de message à retourner pour l’appel</li>
</ul>
</li>
</ul>
<p>Il s’agit d’une requête en “long-polling” c’est à dire que la requête sera “bloquée” sur le serveur tant qu’il n’y a pas de message reçu évitant ainsi de “flooder” en continue le serveur pour savoir si de nouveaux messages sont disponibles ou non. Par défaut la requête est bloquée 60 secondes maximum mais vous pouvez personnaliser cette valeur avec le paramètre “timeout”. Si il y a des messages disponibles, le serveur vous renvoi un tableau JSON avec les messages reçus. Si il n’y a pas de réponse dans le délai spécifié par le paramètre “timeout” (60 secondes par défaut), le tableau retourné sera vide.</p>
<p>A chaque réponse vous devez donc relancer une requête “GetMessages” pour “écouter” les prochains messages qui vont sont destinés.</p>
<p>Il est également possible de limiter le nombre de message dans la réponse avec le paramètre “limit” ce qui peut être utile sur de petits “devices” ne disposant pas de beaucoup de mémoire RAM pour désérialiser de gros tableaux JSON.</p>
<p>Exemple simple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/GetMessages?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;subscriptionId=xxxxx</pre><p></p>
<p>Autre exemple en limitant le nombre de message à 2 par appel et en bloquant la requête pendant 10 secondes au maximum :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/GetMessages?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;subscriptionId=xxxxx&amp;timeout=10000&amp;limit=2</pre><p></p>
<h4>S’abonner à un groupe</h4>
<p>Vous pouvez vous abonner à des groupes pour recevoir les messages envoyés dans ces groupes par l’action “SubscribeToMessageGroup” en précisant le nom du groupe et votre ID d’abonnement.</p>
<ul>
<li>Action : “SubscribeToMessageGroup” (GET)</li>
<li>Paramètres :
<ul>
<li><u>group</u> : le nom du groupe à joindre</li>
<li><u>subscriptionId</u> (optionnel) : identifiant de l’abonnement si déjà connu</li>
</ul>
</li>
</ul>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SubscribeToMessageGroup?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;subscriptionId=xxxxx&amp;group=A</pre><p></p>
<p>Comme l’action “SubscribeToMessage”, cette action vous retourne l’ID d’abonnement à utiliser pour l’action “GetMessages”.</p>
<h3>Consommation de StateObjects</h3>
<h4>Request</h4>
<p>Cette méthode permet de récupérer la valeur actuelle d’un ou de plusieurs StateObjects.</p>
<ul>
<li>Action : “RequestStateObjects” (GET)</li>
<li>Paramètres :
<ul>
<li><u>sentinel</u> (optionnel – par défaut “*”): nom de la sentinelle</li>
<li><u>package</u> (optionnel – par défaut “*”) : nom du package</li>
<li><u>name</u> (optionnel – par défaut “*”) : nom du StateObject</li>
<li><u>type</u> (optionnel – par défaut “*”) : type du StateObject</li>
</ul>
</li>
</ul>
<p>Par exemple pour récupérer tous les StateObject de votre Constellation :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/RequestStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Ou seulement ceux produits par le package “HWMonitor” (quelque soit la sentinelle) :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/RequestStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;package=HWMonitor</pre><p></p>
<p>Ou encore tous les StateObjects nommés “/intelcpu/load/0” et produits le package “HWMonitor” (quelque soit la sentinelle) :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/RequestStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;package=HWMonitor&amp;name=/intelcpu/load/0</pre><p></p>
<h4>Subscribe</h4>
<p>Vous pouvez également vous abonner aux mises à jour des StateObjects.</p>
<p>Le principe est le même qu’avec les messages : il faut récupérer un ID d’abonnement et invoquer une méthode en long-polling pour recevoir les mises à jour.</p>
<h5>S’abonner à des StateObjects</h5>
<ul>
<li>Action : “SubscribeToStateObjects” (GET)</li>
<li>Paramètres :
<ul>
<li><u>subscriptionId</u> (optionnel) : identifiant de l’abonnement si déjà connu</li>
<li><u>sentinel</u> (optionnel – par défaut “*”): nom de la sentinelle</li>
<li><u>package</u> (optionnel – par défaut “*”) : nom du package</li>
<li><u>name</u> (optionnel – par défaut “*”) : nom du StateObject</li>
<li><u>type</u> (optionnel – par défaut “*”) : type du StateObject</li>
</ul>
</li>
</ul>
<p>En retour vous obtiendrez l’ID d’abonnement (un GUID).</p>
<p>Par exemple pour s’abonner au SO “/intelcpu/load/0”, produit le package “HWMonitor” sur la sentinelle “MON-PC” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SubscribeToStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;sentinel=MON-PC&amp;package=HWMonitor&amp;name=/intelcpu/load/0</pre><p></p>
<p><strong>ATTENTION</strong> : si vous souhaitez “ajouter” des SO à votre abonnement vous devez <u>impérativement</u> préciser votre ID d’abonnement récupéré lors du 1er appel autrement vous allez créer un nouvel abonnement.</p>
<p>Par exemple pour “ajouter” le SO correspondant à la consommation RAM :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SubscribeToStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;sentinel=MON-PC&amp;package=HWMonitor&amp;name=/ram/load&amp;subscriptionId=&lt;subId&gt;</pre><p></p>
<h5>Relever les StateObjects mis à jour</h5>
<p>Pour récupérer les SO de votre abonnement qui ont changés entre deux appels vous devez invoquer l’action “GetStateObjects” en spécifiant l’ID de votre abonnement :</p>
<ul>
<li>Action : “GetStateObjects” (GET)</li>
<li>Paramètres :
<ul>
<li><u>subscriptionId</u> : identifiant de l’abonnement</li>
<li><u>timeout</u> (optionnel – par défaut 60000) : temps maximal en milliseconde de la mise en attente de la requête (entre 1000ms et 120000ms)</li>
<li><u>limit</u> (optionnel – par défaut 0) : nombre maximum de message à retourner pour l’appel</li>
</ul>
</li>
</ul>
<p>Comme pour les messages, vous pouvez limiter le nombre de SO (limit) et le timeout de la requête (timeout).</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/GetStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;subscriptionId=&lt;subId&gt;</pre><p></p>
<p>Notez que si un StateObject pour lequel vous êtes abonné change plusieurs fois entre deux appels “GetStateObjects”, vous obtiendrez la dernière valeur et non l’historique de tous les changements.</p>
<h3>Déclarer le “Package Descriptor”</h3>
<p>Action : “DeclarePackageDescriptor” (POST)</p>
<p>Le “<a href="/concepts/messaging-message-scope-messagecallback-saga/#Auto-description_des_MessageCallbacks">Package Descriptor</a>” permet décrire les MessagesCallbacks d’un package ainsi que les types utilisés par ses MC ou StateObjects.</p>
<p>Ainsi en publiant le PackageDescriptor, la Constellation aura connaissance des MessageCallbacks qu’expose un package ainsi que le type des StateObject qu’il publie. C’est grâce au Package Descriiptor que fonctionne le “MessageCallback Explorer” de la Console Constellation.</p>
<p>Le Package Descriptor est un objet JSON contenant :</p>
<ul>
<li>Le nom du package</li>
<li>La liste des MessageCallbacks du package</li>
<li>La liste des types utilisés par les MessageCallbacks du package</li>
<li>La liste des types utilisés par les StateObjects publiés par le package</li>
</ul>
<p>La structure de base est donc :</p>
<p></p><pre class="crayon-plain-tag">{
  "PackageName": "MyVirtualPackage",
  "MessageCallbacks": [],
  "MessageCallbackTypes": [],
  "StateObjectTypes": [],
}</pre><p></p>
<p>Chaque “MessageCallback” est un objet contenant :</p>
<ul>
<li><u>MessageKey</u> : la clé du message (le nom/clé du MessageCallback)</li>
<li><u>Description</u> (optionnel) : description du MessageCallback</li>
<li><u>ResponseType</u> (optionnel) : le type du message de retour dans le cas où le MC répond au Saga</li>
<li><u>Parameters</u> (optionnel) : la liste des paramètres du MC</li>
</ul>
<p>Un paramètre est décrit par un objet contenant :</p>
<ul>
<li><u>Name</u> : le nom du paramètre</li>
<li><u>TypeName</u> : le type du paramètre</li>
<li><u>Description</u> (optionnel) : la description du paramètre</li>
<li><u>Type</u> : le type de paramètre (doit être obligatoirement défini à 2 pour un paramètre d’un MC)</li>
<li><u>IsOptional</u> (optionnel) : booléen (true ou false) qui indique si le paramètre est optionnel ou non</li>
<li><u>DefaultValue</u> (optionnel) : la valeur par défaut du paramètre si optionnel</li>
</ul>
<p>Le type d’un paramètre peut être un type simple décrit par les types .NET (System.Int16, System.Int32, System.Int64, System.Double, System.Decimal, System.Float, System.Boolean, System.String) ou un type personnalisé.</p>
<p>Les types personnalisés utilisés dans les paramètres des MC seront décrits dans la propriété “MessageCallbackTypes” du Package Descriptor et les types personnalisés utilisés pour les StateObjects seront décrits dans la propriété “StateObjectTypes” du Package Descriptor.</p>
<p>Dans les deux cas il s’agit de la même structure de donnée.</p>
<p>La description d’un type est un objet contenant :</p>
<ul>
<li><u>TypeName</u> : le nom du type (l’identifiant)</li>
<li><u>TypeFullname</u> : le nom complet du type (utilisé pour identifier le nom complet d’un type .NET par exemple)</li>
<li><u>Description</u> (optionnel) : la description du type</li>
<li><u>IsGeneric</u> (optionnel) : booléen (true ou false) qui indique si le type est un type générique</li>
<li><u>IsArray</u> (optionnel) : booléen (true ou false) qui indique si le type est un tableau</li>
<li><u>GenericParameters</u> (optionnel) : la liste des types génériques si il s’agit d’un type générique ou d’un tableau</li>
<li><u>IsEnum</u> (optionnel) : booléen (true ou false) qui indique si le type est une énumération</li>
<li><u>EnumValues</u> (optionnel) : la liste des valeurs de l’énumérations si le type est une énumération</li>
<li><u>Properties</u> (optionnel) : la liste des propriétés du type</li>
</ul>
<p>Les propriétés d’un type tout comme les valeurs d’une énumération sont décrits de la même manière qu’un paramètre d’un MessageCallback déjà détaillé ci-dessus.</p>
<p>Seule la propriété “Type” change :</p>
<ul>
<li>Type = 0 : pour décrire une propriété</li>
<li>Type = 1 : pour décrire une valeur d’une énumération</li>
<li>Type = 2 : pour décrire une paramètre d’un MessageCallback comme expliqué précédemment</li>
</ul>
<h4>Exemple 1 – Package “NetworkTools”</h4>
<p>Voici le Package Descriptor du package “NetworkTools” :</p>
<p></p><pre class="crayon-plain-tag">{
   "PackageName":"NetworkTools",
   "MessageCallbacks":[  
      {  
         "MessageKey":"Ping",
         "Description":"Pings the specified host and return the response time.",
         "ResponseType":"System.Int64",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"timeout",
               "TypeName":"System.Int32",
               "Description":"The timeout (5000ms by defaut).",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"CheckPort",
         "Description":"Check a port's status by entering an address and port number above and return the response time.",
         "ResponseType":"System.Int64",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"port",
               "TypeName":"System.Int32",
               "Description":"The port.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"timeout",
               "TypeName":"System.Int32",
               "Description":"The timeout (5000ms by defaut).",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"CheckHttp",
         "Description":"Checks the HTTP address and return the response time.",
         "ResponseType":"System.Int64",
         "Parameters":[  
            {  
               "Name":"address",
               "TypeName":"System.String",
               "Description":"The address.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"ScanPort",
         "Description":"Scans TCP port range to discover which TCP ports are open on your target host.",
         "ResponseType":"System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"startPort",
               "TypeName":"System.Int32",
               "Description":"The start port.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"endPort",
               "TypeName":"System.Int32",
               "Description":"The end port.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"timeout",
               "TypeName":"System.Int32",
               "Description":"The timeout (5000ms by defaut).",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"WakeUp",
         "Description":"Wakes up the specified host.",
         "ResponseType":"System.Boolean",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"macAddress",
               "TypeName":"System.String",
               "Description":"The mac address.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"DnsLookup",
         "Description":"Resolves a host name or IP address.",
         "ResponseType":"System.String[]",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      }
   ],
   "MessageCallbackTypes":[  
      {  
         "Description":null,
         "IsGeneric":true,
         "IsArray":false,
         "GenericParameters":[  
            "System.Int32",
            "System.Boolean"
         ],
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"Dictionary`2",
         "TypeFullname":"System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "Properties":null
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":true,
         "GenericParameters":[  
            "System.String"
         ],
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"String[]",
         "TypeFullname":"System.String[]",
         "Properties":null
      }
   ],
   "StateObjectTypes":[  
      {  
         "Description":"Monitoring type",
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"MonitoringResult",
         "TypeFullname":"NetworkTools.MonitoringResult",
         "Properties":[  
            {  
               "Name":"ResponseTime",
               "TypeName":"System.Int64",
               "Description":"Gets or sets the response time in millisecond.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"State",
               "TypeName":"System.Boolean",
               "Description":"Gets or sets the state.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      }
   ]
}</pre><p></p>
<h4>Exemple 2 – Package “Paradox”</h4>
<p>Autre exemple plus complet, le Package Descriptor du package “Paradox” :</p>
<p></p><pre class="crayon-plain-tag">{  
   "PackageName":"Paradox",
   "MessageCallbacks":[  
      {  
         "MessageKey":"AreaArm",
         "Description":"Arm the area.",
         "ResponseType":"System.Boolean",
         "Parameters":[  
            {  
               "Name":"request",
               "TypeName":"ParadoxOnConstellation.ArmingRequestData",
               "Description":"The request.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"AreaDisarm",
         "Description":"Disarm the area.",
         "ResponseType":"System.Boolean",
         "Parameters":[  
            {  
               "Name":"request",
               "TypeName":"ParadoxOnConstellation.ArmingRequestData",
               "Description":"The request.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"RefreshArea",
         "Description":"Refreshes the area.",
         "ResponseType":null,
         "Parameters":[  
            {  
               "Name":"area",
               "TypeName":"Paradox.Core.Area",
               "Description":"The area.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"RefreshAll",
         "Description":"Refreshes all.",
         "ResponseType":null,
         "Parameters":[  

         ]
      }
   ],
   "MessageCallbackTypes":[  
      {  
         "Description":"Arming or disarming request",
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"ArmingRequestData",
         "TypeFullname":"ParadoxOnConstellation.ArmingRequestData",
         "Properties":[  
            {  
               "Name":"Area",
               "TypeName":"Paradox.Core.Area",
               "Description":"The number of area.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Mode",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":"The mode number.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"PinCode",
               "TypeName":"System.String",
               "Description":"The pin code.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":true,
         "EnumValues":[  
            {  
               "Name":"All",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area1",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area2",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area3",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area4",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area5",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area6",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area7",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area8",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            }
         ],
         "TypeName":"Area",
         "TypeFullname":"Paradox.Core.Area",
         "Properties":null
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":true,
         "EnumValues":[  
            {  
               "Name":"RegularArm",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"ForceArm",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"StayArm",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"InstantArm",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            }
         ],
         "TypeName":"ArmingMode",
         "TypeFullname":"Paradox.Core.ArmingMode",
         "Properties":null
      }
   ],
   "StateObjectTypes":[  
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"UserInfo",
         "TypeFullname":"ParadoxOnConstellation.UserInfo",
         "Properties":[  
            {  
               "Name":"Id",
               "TypeName":"System.Int32",
               "Description":"The identifier.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Type",
               "TypeName":"System.String",
               "Description":"The object type.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Name",
               "TypeName":"System.String",
               "Description":"The name.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"LastActivity",
               "TypeName":"System.DateTime",
               "Description":"The last activity.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"DateTime",
         "TypeFullname":"System.DateTime",
         "Properties":[  
            {  
               "Name":"Date",
               "TypeName":"System.DateTime",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Day",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"DayOfWeek",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"DayOfYear",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Hour",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Kind",
               "TypeName":"System.DateTimeKind",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Millisecond",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Minute",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Month",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Now",
               "TypeName":"System.DateTime",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"UtcNow",
               "TypeName":"System.DateTime",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Second",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Ticks",
               "TypeName":"System.Int64",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TimeOfDay",
               "TypeName":"System.TimeSpan",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Today",
               "TypeName":"System.DateTime",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Year",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":true,
         "EnumValues":[  
            {  
               "Name":"Sunday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Monday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Tuesday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Wednesday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Thursday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Friday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Saturday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            }
         ],
         "TypeName":"DayOfWeek",
         "TypeFullname":"System.DayOfWeek",
         "Properties":null
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":true,
         "EnumValues":[  
            {  
               "Name":"Unspecified",
               "TypeName":"System.DateTimeKind",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Utc",
               "TypeName":"System.DateTimeKind",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Local",
               "TypeName":"System.DateTimeKind",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            }
         ],
         "TypeName":"DateTimeKind",
         "TypeFullname":"System.DateTimeKind",
         "Properties":null
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"TimeSpan",
         "TypeFullname":"System.TimeSpan",
         "Properties":[  
            {  
               "Name":"Ticks",
               "TypeName":"System.Int64",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Days",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Hours",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Milliseconds",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Minutes",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Seconds",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalDays",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalHours",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalMilliseconds",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalMinutes",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalSeconds",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":"Represent Zone information",
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"ZoneInfo",
         "TypeFullname":"ParadoxOnConstellation.ZoneInfo",
         "Properties":[  
            {  
               "Name":"IsOpen",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone is open.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"IsTamper",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone is tamper.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"InAlarm",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone is in alarm.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"InFireAlarm",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone is in fire alarm].",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"SupervisionLost",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone has supervision lost.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"LowBattery",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone has low battery.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Id",
               "TypeName":"System.Int32",
               "Description":"The identifier.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Type",
               "TypeName":"System.String",
               "Description":"The object type.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Name",
               "TypeName":"System.String",
               "Description":"The name.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"LastActivity",
               "TypeName":"System.DateTime",
               "Description":"The last activity.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"AreaInfo",
         "TypeFullname":"ParadoxOnConstellation.AreaInfo",
         "Properties":[  
            {  
               "Name":"IsFullArmed",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"IsStayArmed",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"ZoneInMemory",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"HasTrouble",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"IsReady",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"IsInProgramming",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"InAlarm",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Strobe",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Id",
               "TypeName":"System.Int32",
               "Description":"The identifier.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Type",
               "TypeName":"System.String",
               "Description":"The object type.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Name",
               "TypeName":"System.String",
               "Description":"The name.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"LastActivity",
               "TypeName":"System.DateTime",
               "Description":"The last activity.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      }
   ]
}</pre><p></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/rest-api/interface-rest-constellation/">L&rsquo;interface REST « 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/rest-api/interface-rest-constellation/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 

Served from: developer.myconstellation.io @ 2026-01-23 02:01:55 by W3 Total Cache
-->