﻿<?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 Settings - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/tag/settings/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/tag/settings/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Tue, 21 May 2019 14:41:14 +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 Settings - Constellation</title>
	<link>https://developer.myconstellation.io/tag/settings/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Le fichier de configuration</title>
		<link>https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/</link>
					<comments>https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 12:52:30 +0000</pubDate>
				<category><![CDATA[Constellation Server]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[AccessKey]]></category>
		<category><![CDATA[SettingsGroups]]></category>
		<category><![CDATA[Authorization]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2149</guid>

					<description><![CDATA[<p>Une Constellation est décrite en un seul fichier : le fichier de configuration Constellation. Ce fichier se nomme “Constellation.Server.exe.config” et se trouve dans le répertoire d’installation du serveur (par défaut dans “Program Files\Constellation Plateform\Server« ). Vous pouvez le modifier de différente</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/">Le fichier de configuration</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Une Constellation est décrite en un seul fichier : le <strong>fichier de configuration Constellation</strong>.</p>
<p>Ce fichier se nomme “<em>Constellation.Server.exe.config</em>” et se trouve dans le répertoire d’installation du serveur (par défaut dans “<em>Program Files\Constellation Plateform\Server</em>« ).</p>
<p>Vous pouvez le modifier de différente manière :</p>
<ul>
<li>En éditant ce fichier directement sur le serveur (avec un éditeur de texte type Notepad)</li>
<li>Via la Console Constellation (sur la page Configuration Editor)</li>
<li>Via Visual Studio</li>
<li>Via l’API de Management Constellation</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image75-4.png"><img class="colorbox-2149"  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/image75_thumb.png" alt="Edition de la configuration" width="363" height="200" border="0" /></a></p>
<p>Le fichier contient une balise globale “configuration” dans laquelle vous trouverez 4 sections :</p>
<ul>
<li><u>configSections</u> : réservé au moteur .NET</li>
<li><u>constellation</u> : la section de configuration Constellation (anciennement nommée &lsquo;constellationSection&rsquo;)</li>
<li><u>startup</u> : réservé au moteur .NET</li>
<li><u>runtime</u> : réservé au moteur .NET</li>
</ul>
<p>Vous ne devez en aucun cas modifier les sections réservées au moteur .NET sans savoir exactement ce que vous faites.</p>
<p>La section de “<strong>constellation</strong>” se décompose de la façon suivante :</p>
<ul>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_listenUris">listenUris</a></u> : définit la configuration des URI d’écoute du serveur Constellation</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_fileServer">fileServer</a></u> : définit la configuration du serveur Web statique utilisé pour l’hébergement de la Console Constellation</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_recoveryOptions">recoveryOptions</a></u> : définit les options de récupération des packages</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_sentinels">sentinels</a></u> : définit la configuration des sentinelles (et des packages) de votre Constellation</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_settingsGroups">settingsGroups</a></u> : définit la configuration des groupes de “settings”</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">credentials</a></u> : définit la configuration des credentials pour l’accès à votre Constellation</li>
</ul>
<p>A chaque modification vous devez recharger la configuration soit via le hub de contrôle ou la Console Constellation (bouton “Reload Configuration”) ou soit en redémarrant le service Constellation Server.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-10.png"><img class="colorbox-2149"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Schéma de configuration" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-10.png" alt="Schéma de configuration" width="350" height="261" border="0" /></a></p>
<h3>Section “listenUris”</h3>
<p>Cette section permet de définir les URI sur lesquels le serveur Constellation doit écouter.</p>
<p></p><pre class="crayon-plain-tag">&lt;listenUris&gt;
  &lt;uri listenUri="http://+:8088/" /&gt;
&lt;/listenUris&gt;</pre><p></p>
<p>Ici le serveur répondra sur le port HTTP 8088 quelque soit le host (nom DNS ou adresse IP) car nous utilisons le wildcard “+” (pour plus d’information, <a href="https://msdn.microsoft.com/en-us/library/system.net.httplistener(v=vs.100).aspx#Anchor_6">lisez ceci</a>).</p>
<p>Vous pouvez configurer autant de “listenUri” que vous souhaitez. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;listenUris&gt;
  &lt;uri listenUri="http://+:8088/" /&gt;
  &lt;uri listenUri="http://constellation.mydomain.net:8888/" /&gt;
  &lt;uri listenUri="http://+:8080/constellation/" /&gt;
  &lt;uri listenUri="https://+:8089/" /&gt;
&lt;/listenUris&gt;</pre><p></p>
<p>Ici, le serveur Constellation répondra :</p>
<ul>
<li>Aux requêtes sur le port HTTP 8088</li>
<li>Aux requêtes sur le port HTTP 8888 où le host est “constellation.mydomain.net” (en clair une requête <a href="http://&lt;ip&gt;:8888">http://&lt;ip&gt;:8888</a>  ne fonctionnera pas)</li>
<li>Aux requêtes sur le port HTTP 8080 quelque soit le host mais dont le path doit forcement démarrer par “/constellation/”</li>
<li>Aux requêtes sur le port HTTPS 8089 en utilisant un cryptage SSL (<a href="/constellation-platform/constellation-server/configuration-ssl/">plus d’information</a>)</li>
</ul>
<p>Pour prendre en compte les modifications de cette section vous devez redémarrer le service Constellation.</p>
<h3>Section “fileServer”</h3>
<p>Cette section permet d’activer et configurer le “fileServer” de Constellation pour héberger des fichiers statiques (pages HTML, fichiers CSS, JS, images, etc..).</p>
<p>Cela sert principalement pour “auto-héberger”  la Console Constellation par le serveur Constellation lui-même.</p>
<p>En effet, la Console Constellation n’est ni plus ni moins qu’une application Web client-side, c’est à dire une série de pages HTML avec scripts JS et fichiers CSS/Image. Libre à vous de l’héberger sur vos serveurs Web mais afin de limiter les prérequis, le serveur Constellation peut lui-même héberger la console grâce au “fileServer” intégré.</p>
<p>La section “fileServer” ne contient que quatre attributs :</p>
<p></p><pre class="crayon-plain-tag">&lt;fileServer enable="true" path="/WebConsole" localhostOnly="true" physicalPath="D:\App\Constellation\Console" /&gt;</pre><p></p>
<ul>
<li>“<u>enable</u>” : indique si le serveur de fichier statique sur le serveur Constellation doit être activé (<em>true</em> ou <em>false</em>).</li>
<li>“<u>path</u>” : le répertoire d’écoute (préfixé par la listenUri).</li>
<li>“<u>localhostOnly</u>” : indique si le fileServer répond seulement aux requêtes “locales” ou à toutes les requêtes (<em>true</em> ou <em>false</em>).</li>
<li>“<u>physicalPath</u>” : le répertoire physique</li>
</ul>
<p>Dans l’exemple ci-dessus, le serveur de fichier est activé mais ne répondra qu’aux requêtes locales. Le serveur délivra les fichiers dans “D:\App\Constellation\Console” sur l’URL “&lt;listen_URI_du_serveur_Constellation&gt;/WebConsole” par exemple <a href="http://localhost:8088/WebConsole">http://localhost:8088/WebConsole</a> ou <a href="http://127.0.0.1:8088/WebConsole">http://127.0.0.1:8088/WebConsole</a> en partant du principe qu’il existe une listenUri “http://+:8088”.</p>
<p>Comme pour la section précédente (listenUris), il faut obligatoirement redémarrer le service Constellation Server pour prendre en compte ces modifications.</p>
<h3>Section “recoveryOptions”</h3>
<p>Les options de récupération (recoveryOptions) permettent de définir le comportement de la sentinelle en cas d’arrêt brutale de l’exécution d’un package (crash du package).</p>
<p>Chaque package peut avoir ses propres options de récupération mais cette section permet de définir les options “globales”, c’est à dire appliqué par défaut pour chaque package de la Constellation.</p>
<p>Les options de récupérations se résume en quatre propriétés :</p>
<ul>
<li>“<u>restartAfterFailure</u>” (<em>true</em> par défaut) : définit si la sentinelle doit redémarrer un package en cas de crash de ce dernier</li>
<li>“<u>numberOfRetry</u>” (<em>3 </em>par défaut) : définit le nombre maximal de tentative de redémarrage d’un package</li>
<li>“<u>restCounterAfterMinutes</u>” (<em>15 </em>par défaut) : définit la période (en minute) au delà de laquelle le compteur d’erreur est réinitialisé</li>
<li>“<u>restartPackageAfterSeconds</u>” (<em>30 </em>par défaut) : définit le délai d’attente avant de redémarrer un package suite à un crash</li>
</ul>
<p>Dans la configuration par défaut, si un package “crash” il est automatiquement redémarré 30 secondes après son crash dans la limite de 3 tentatives sachant qu’au bout de 15 minutes, le compteur de tentative est réinitialisé à 0.</p>
<h3>Section “sentinels”</h3>
<p>Dans cette section vous allez déclarer vos sentinelles (virtuelles ou non) dans lesquelles vous déclarerez les packages (virtuels ou non) qui eux même déclarons leurs settings et leurs groupes.</p>
<p>En clair, c’est cette section qui décrit votre “Constellation”.</p>
<p>Prenez l’exemple de la Constellation suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;sentinels&gt;
  &lt;sentinel name="SENTINEL-NAME-DEMO" credential="Standard"&gt;
    &lt;packages&gt;    
      &lt;package name="HWMonitor" enable="true"&gt;&lt;/package&gt;          
      &lt;package name="DemoPackage" credential="ControlHubAccess" enable="true"&gt;
        &lt;settings&gt;
        &lt;import&gt;
          &lt;settingGroup groupName="GroupSettingsDemo" /&gt;
        &lt;/import&gt;
        &lt;setting key="IntSetting" value="42" /&gt;
        &lt;setting key="StringSetting" value="sample config value 2" /&gt;
        &lt;setting key="SettingXml"&gt;
          &lt;content&gt;
            &lt;demo type="test"&gt;
              &lt;list count="42"&gt;
              &lt;a&gt;123&lt;/a&gt;
              &lt;b&gt;test&lt;/b&gt;
              &lt;/list&gt;
            &lt;/demo&gt;
          &lt;/content&gt;
        &lt;/setting&gt;
        &lt;setting key="SettingJson"&gt;
          &lt;content&gt;
          &lt;![CDATA[
          {
            ListenPorts: [ 80, 443 ],
            EnableCaching : true,
            ServerProgramName: "Hypothetical WebServer 1.0",
            Websites: [
              {
                Path: "/srv/www/example/",
                Domain: "example.com",
                Contact: "admin@example.com"    
              },
              {
                Path: "/srv/www/somedomain/",
                Domain: "somedomain.com",
                Contact: "admin@somedomain.com"
              }
            ]
          }
          ]]&gt;
          &lt;/content&gt;
        &lt;/setting&gt;
        &lt;/settings&gt;
      &lt;/package&gt;
    &lt;/packages&gt;
  &lt;/sentinel&gt;
  &lt;sentinel name="ANOTHER-SENTINEL" credential="Standard"&gt;
    &lt;!-- ..... --&gt;
  &lt;/sentinel&gt;
&lt;/sentinels&gt;</pre><p></p>
<p>Voici ce qu’elle décrit :</p>
<ul>
<li>Nous avons deux sentinelles “SENTINEL-NAME-DEMO” et “ANOTHER-SENTINEL »</li>
<li>Les deux sentinelles utilisent le même <a href="/concepts/securite-accesskey-credential-authorization/">credential</a> “Standard” (déclaré dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">section credentials</a>).</li>
<li>Sur la première sentinelle est déployée deux packages :
<ul>
<li>“HWMonitor” : le package utilise le même credential que sa sentinelle (car non défini explicitement donc hérite du credential de sa sentinelle)</li>
<li>“DemoPackage” : ce package utilise le credential nommé “ControlHubAccess” et déclare les settings suivants :
<ul>
<li>IntSetting et StringSetting associés à des valeurs (numérique et string)</li>
<li>SettingXml et SettingJson associés à des contenus (XML et JSON)</li>
<li>Importe le groupes de settings nommé “GroupSettingsDemo” défini dans <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_settingsGroups">la section “settingsGroups”</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>Les sentinelles</h4>
<p>Pour entrer dans le détail, vous allez déclarer dans la section “sentinels”, les sentinelles de votre Constellation que ce soit des sentinelles réelles ou virtuelles.</p>
<p>Pour cela, vous utiliser la balise “&lt;sentinel&gt;” qui comporte les attributs suivants :</p>
<ul>
<li>“<u>name</u>” : le nom de la sentinelle (obligatoire et unique)</li>
<li>“<u>credential</u>” : le nom du credential (déclaré dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">section credentials</a>) à utiliser pour l’authentification (obligatoire)</li>
</ul>
<p>La section “&lt;sentinel&gt;” contient une collection de “&lt;package&gt;” rangée dans la balise “&lt;packages&gt;”. Chaque package peut-être réel ou virtuel.</p>
<h4>Les packages</h4>
<p>L’élément “&lt;package&gt;” contient les attributs suivants :</p>
<ul>
<li>“<u>name</u>”: le nom de l’instance du package (obligatoire et unique)</li>
<li>“<u>filename</u>” (facultatif) : le nom du fichier du package à utiliser dans le repository (<a href="/concepts/instance-package/">plus d’info</a>)</li>
<li>“<u>enable</u>” (facultatif, par defaut <em>true</em>) : indique si le package est activé ou désactivé</li>
<li>“<u>credential</u>” (facultatif, utilise par défaut du credential de sa sentinelle) : spécifie le <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">credential</a> que le package va utiliser pour s’authentifier sur le serveur Constellation</li>
<li>“<u>autostart</u>” (facultatif, par defaut <em>true</em>) : indique si le package doit automatiquement démarrer sur sa sentinelle ou juste être déployé (et donc démarré manuellement)</li>
</ul>
<p>Un package peut contenir ensuite trois sous sections :</p>
<ul>
<li>“<u>recoveryOptions</u>” : définit les options de récupération du package (par défaut, la sentinelle utilise les <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_recoveryOptions">options globales</a>)</li>
<li>“<u>settings</u>” : définit les paramètres/variables de configuration d’un package</li>
<li>“<u>groups</u>” : définit les groupes dans lesquels le package sera abonné</li>
</ul>
<h5>Les options de récupérations</h5>
<p>La balise est la même que la <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_recoveryOptions">section globale</a>.</p>
<p>Par exemple si on ne souhaite pas que le package redémarre en cas de crash, on peut écrire :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="MonPackage" enable="true"&gt;
  &lt;recoveryOptions restartAfterFailure="false" /&gt;
&lt;/package&gt;</pre><p></p>
<h5>Les paramètres de configuration</h5>
<p>Chaque package peut définir des paramètres de configuration 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” : il s’agit d’un couple clé/value</li>
<li>Les “Setting Content”  : il s’agit d’un setting dont la valeur peut être un XML ou JSON</li>
</ul>
<p>Dans l’exemple plus haut, le package “DemoPackage” contient à la fois des settings de type “value” et de type “content”.</p>
<p>Vous pouvez également regrouper des settings dans les groupes afin de les partager entre plusieurs package grâce aux <a href="/constellation-server/fichier-de-configuration/#Section_settingsGroups">settingsGroups</a>. Toujours dans l&rsquo;exemple précédent, le package “DemoPackage” inclut le groupe “GroupSettingsDemo”, un groupe de settings décrit dans la section ”<a href="/constellation-server/fichier-de-configuration/#Section_settingsGroups">settingsGroups</a>”.</p>
<p>Pour plus d’information sur les settings, consultez l’article sur l’exploitation des <a href="/client-api/net-package-api/settings/">settings avec l’API .NET</a>.</p>
<h5>Les groupes</h5>
<p>Comme <a href="/concepts/messaging-message-scope-messagecallback-saga/#Message_Scope">vous le savez</a>, un message peut être envoyé à un groupe dans lequel des packages réels ou virtuels peuvent s’abonner.</p>
<p>Il y a deux manières d’abonner un package à un groupe :</p>
<ul>
<li>Soit par le package lui même en invoquant la méthode “SubscribeToMessage” via les différentes API Constellation misent à disposition</li>
<li>Soit dans la configuration du package au niveau du serveur Constellation</li>
</ul>
<p>Cela vous permet d’avoir la main sur l’appartenance des packages aux groupes que vous pouvez administrer sans devoir modifier vos packages (virtuels ou non).</p>
<p>La section “groups” sur un package permet de définir ces liens. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="MonPackage" enable="true"&gt;
  &lt;groups&gt;
    &lt;group name="MonGroupeA" /&gt;
    &lt;group name="MonGroupeB" /&gt;
  &lt;/groups&gt;
&lt;/package&gt;</pre><p></p>
<p>Ici le package “MonPackage” est abonné aux groupes “MonGroupeA” et “MonGroupeB”. En cas de modification des affectations aux groupes, il faudra redémarrer le package soit via vos applications en utilisant les API du hub de contrôle soit depuis la Console Constellation.</p>
<h3>Section “settingsGroups”</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 SettingValue ou des SettingContent :</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” définie au niveau du serveur (= sans prendre en compte les settings déclarés dans le fichier local et le manifeste) 7 settings :</p>
<ul>
<li>numberTest = 42 (définit dans les settings du package)</li>
<li>Demo1 = “It’s me” (définit dans les settings du package, cette valeur écrase celle des groupes importés)</li>
<li>Demo2 = 2015 (définit 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éfinies par le groupe “common” (groupe importé dans le groupe “test2” lui même importé sur le package “DemoPackage”).</li>
</ul>
<h3>Section “credentials”</h3>
<p>Comme évoqué dans <a href="/concepts/securite-accesskey-credential-authorization/">l’article lié à la sécurité</a>, tous les appels (http) au serveur Constellation doivent être authentifiés en utilisant une clé d’accès que l’on nomme “AccessKey”.</p>
<p>Ces clé d’accès sont liés à des credentials.</p>
<p>Dans la section “credentials” nous allons donc définir les différents credentials ainsi que les différentes autorisations et droits sur ces credentials.</p>
<p>Chaque credential comporte obligatoirement deux propriétés :</p>
<ul>
<li>Le nom (unique) du credential</li>
<li>L’AccessKey</li>
</ul>
<p>Ainsi que les propriétés suivantes :</p>
<ul>
<li>“<u>enable</u>” (<em>true</em> par défaut) : indique si le credential est activé ou désactivé</li>
<li>“<u>enableControlHub</u>” (<em>false</em> par défaut) : indique si le credential peut se connecter sur le hub de contrôle (pour l’administration de la Constellation)</li>
<li>“<u>enableManagementAPI</u>” (<em>false</em> par défaut) : indique si le credential peut se connecter à l’API de Management (pour l’édition de la configuration)</li>
<li>“<u>enableDeveloperAccess</u>” (<em>false </em>par défaut) : indique si le credential peut utiliser la sentinelle virtuelle “Developer” pour debugger des packages (utilisé par le SDK Visual Studio)</li>
</ul>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;credentials&gt;
  &lt;credential name="Standard" accessKey="fb1af70a46057dbf4f2ff3f43b6ec0c544b22749" /&gt;
  &lt;credential name="Administrator" accessKey="b363d6ccb86ef1418a72f9fea4b96975d8a1f2c7" enableControlHub="true" enableDeveloperAccess="true" enableManagementAPI="true" /&gt;
&lt;/credentials&gt;</pre><p></p>
<p>Vous pouvez ensuite définir des <a href="/concepts/securite-accesskey-credential-authorization/#Les_Authorizations">autorisations</a> particulières sur un credential pour l’envoi de message, l’abonnement aux groupes de message ou encore l’interrogation de StateObject.</p>
<p>Pour cela il existe trois sous-sections :</p>
<ul>
<li>“<u>stateObjects</u>” : autorisations spécifiques pour l’interrogation (Request ou Subscribe) des StateObjects</li>
<li>“<u>messages</u>” : autorisations spécifiques pour l’envoi de messages</li>
<li>“<u>groups</u>” : autorisations spécifiques pour l’abonnement aux groupes</li>
</ul>
<h4>Les autorisations sur l’interrogation des StateObjects</h4>
<p>Par défaut un credential actif (<em>enable=true</em>) peut interroger (Request ou Subscribe) tous les StateObjects de votre Constellation sans restriction.</p>
<p>Pour modifier ce comportement vous pouvez utiliser les autorisation sur les StateObjects.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;credential name="Standard" accessKey="fb1af70a46057dbf4f2ff3f43b6ec0c544b22749"&gt;
  &lt;authorizations&gt;
    &lt;stateObjects defaultAuthorization="Deny"&gt;
      &lt;authorization id="Paradox" authorization="Allow" packageName="Paradox" /&gt;
      &lt;authorization id="MonPC" authorization="Allow" sentinelName="PC-SEB" /&gt;
      &lt;authorization id="LesCPU" authorization="Allow" packageName="HWMonitor" name="/intelcpu/load/0" /&gt;
      &lt;authorization id="ServerRAM" authorization="Allow" sentinelName="SERVER" packageName="HWMonitor" name="/ram/load" /&gt;
    &lt;/stateObjects&gt;
  &lt;/authorizations&gt;
&lt;/credential&gt;</pre><p></p>
<p>Ici le credential “Standard” ne pourra pas interroger les StateObjects de la Constellation (defaultAuthorization = Deny) sauf pour les exceptions suivantes :</p>
<ul>
<li>Les StateObjects produits par le(s) instance(s) du package “Paradox”</li>
<li>Les StateObjects produits par les packages (quel qu’il soit) de la sentinelle “PC-SEB”</li>
<li>Les StateObjects nommés “/intelcpu/load/0” et produits par le package “HWMonitor” peu importe la sentinelle</li>
<li>Le StateObject nommé “/ram/load” produit par le package “HWMonitor” sur la sentinelle “SERVER”</li>
</ul>
<p>Vous devez donc définir l’autorisation par défaut (defaultAuthorization) et optionnellement ajouter une ou plusieurs exceptions avec l’élément &lt;authorization&gt; dont les attributs sont les suivants :</p>
<ul>
<li>“<u>id</u>” (obligatoire) : identifiant unique de l’autorisation</li>
<li>“<u>authorization</u>” (facultatif &#8211; <em>Allow</em> par défaut) : type de l’exception (<em>Allow</em> ou <em>Deny</em>)</li>
<li>“<u>sentinelName</u>” (facultatif – <em>*</em> par défaut) : sentinelle producteur du StateObject</li>
<li>“<u>packageName</u>” (facultatif – <em>*</em> par défaut) : package producteur du StateObject</li>
<li>“<u>name</u>” (facultatif – <em>*</em> par défaut) :  nom du StateObject</li>
</ul>
<h4>Les autorisations sur l’envoi de messages</h4>
<p>Par défaut un credential actif (<em>enable=true</em>) peut envoyer un message à n’importe quel scope dans votre Constellation sans restriction.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;credential name="Standard" accessKey="fb1af70a46057dbf4f2ff3f43b6ec0c544b22749"&gt;
  &lt;authorizations&gt;
    &lt;messages defaultAuthorization="Deny"&gt;
      &lt;authorization id="GroupA" authorization="Allow" scope="Group" args="A" /&gt;
      &lt;authorization id="DemoSeb" authorization="Allow" scope="Package" args="DemoPackage" /&gt;
      &lt;authorization id="TemperatureNest" authorization="Allow" scope="Package" args="Nest" messageKey="SetTargetTemperature"  /&gt;
    &lt;/messages&gt;
  &lt;/authorizations&gt;
&lt;/credential&gt;</pre><p></p>
<p>Ici le credential “Standard” ne pourra pas envoyer de message dans la Constellation (defaultAuthorization = Deny) sauf pour les exceptions suivantes :</p>
<ul>
<li>Messages envoyés au groupe “A”</li>
<li>Messages envoyés au package “DemoPackage”</li>
<li>Message “SetTargetTemperature” envoyé au package “Nest”</li>
</ul>
<p>Vous devez donc définir l’autorisation par défaut (defaultAuthorization) et optionnellement ajouter une ou plusieurs exceptions avec l’élément &lt;authorization&gt; dont les attributs sont les suivants :</p>
<ul>
<li>“<u>id</u>” (obligatoire) : identifiant unique de l’autorisation</li>
<li>“<u>scope</u>” (obligatoire) : type de <a href="/concepts/messaging-message-scope-messagecallback-saga/#Message_Scope">scope</a> pour le message (<em>All</em>, <em>Group</em>, <em>Package</em> ou <em>Sentinel</em>)</li>
<li>“<u>authorization</u>” (facultatif &#8211; <em>Allow</em> par défaut) : type de l’exception (<em>Allow</em> ou <em>Deny</em>)</li>
<li>“<u>args</u>” (facultatif) : les arguments du scope</li>
<li>“<u>messageKey</u>” (facultatif) :  la clé du message</li>
</ul>
<h4>Les autorisation sur l’abonnement aux groupes</h4>
<p>Par défaut un credential actif (<em>enable=true</em>) peut s’abonner à n’importe quel groupe sans restriction.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;credential name="Standard" accessKey="fb1af70a46057dbf4f2ff3f43b6ec0c544b22749"&gt;
  &lt;authorizations&gt;
    &lt;groups defaultAuthorization="Deny"&gt;
      &lt;authorization groupName="A" /&gt;
    &lt;/groups&gt;
  &lt;/authorizations&gt;
&lt;/credential&gt;</pre><p></p>
<p>Ici le credential “Standard” ne pourra pas s’abonner à des groupes (defaultAuthorization = Deny) à l’exception du groupe “A”. Les attributs sont les suivants :</p>
<ul>
<li>“<u>groupName</u>” (obligatoire) : le nom du groupe</li>
<li>“<u>authorization</u>” (facultatif &#8211; <em>Allow</em> par défaut) : type de l’exception (<em>Allow</em> ou <em>Deny</em>)</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/">Le fichier de configuration</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cr&#233;ez votre premier package Constellation en Python</title>
		<link>https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-python/</link>
					<comments>https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-python/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 01 Apr 2016 08:28:19 +0000</pubDate>
				<category><![CDATA[Guide de démarrage]]></category>
		<category><![CDATA[Python API]]></category>
		<category><![CDATA[Publish]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[PushStateObject]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=1737</guid>

					<description><![CDATA[<p>Vous pouvez développer des packages Constellation avec le langage Python. Sur vos sentinelles Windows comme sur vos sentinelles Linux vous pourrez profiter des différentes libraires et de l’écosystème Python connectés dans Constellation. Découvrons dans cet article comment créer et déployer</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-python/">Cr&eacute;ez votre premier package Constellation en Python</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Vous pouvez développer des packages Constellation avec le langage Python. Sur vos sentinelles Windows comme sur vos sentinelles Linux vous pourrez profiter des différentes libraires et de l’écosystème Python connectés dans Constellation.</p>
<p>Découvrons dans cet article comment créer et déployer votre premier package Constellation en Python.</p>
<p><span id="more-1737"></span></p>
<h3>Prérequis</h3>
<p>Tout d’abord, que vous soyez sur Windows ou Linux, il vous faudra un interpréteur Python 2 ou Python 3 et une ou deux libraires indispensables pour Constellation.</p>
<p>Notez que ces prérequis sont automatiquement installés sur Linux avec le <em><a href="/dowload/">Web Platform Installer</a></em>.</p>
<h4>Installer Python sur Windows</h4>
<p>Téléchargez <a href="https://www.python.org/downloads/windows/">Python pour Windows</a> (en version 2.x ou 3.x) puis lancez l’installation en choisissant une installation pour tous les utilisateurs :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-1.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation Python" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-1.png" alt="Installation Python" width="424" height="364" border="0" /></a></p>
<p align="left">Sélectionnez le composant “PIP” ( le gestionnaire de package Python) et ajoutez “Python.exe” dans les “Paths” Windows :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-2.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation des composants Python" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-2.png" alt="Installation des composants Python" width="424" height="363" border="0" /></a></p>
<p align="left">Une fois l’installation terminée, lancez une invite de commande (cmd.exe) et assurez-vous que la commande “python” fonctionne :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-3.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Python.exe fonctionnel" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-3.png" alt="Python.exe fonctionnel" width="424" height="130" border="0" /></a></p>
<p align="left">Toujours dans une invite de commande Windows, installez via PIP les librairies “pyzmq” (et “enum34” si vous êtes en Python 2.x) grâce aux commandes suivantes :</p>
<p></p><pre class="crayon-plain-tag">pip install pyzmq
pip install enum34</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/install-python-tools-windows.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation des libs pour Python" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/install-python-tools-windows_thumb.png" alt="Installation des libs pour Python" width="424" height="330" border="0" /></a></p>
<p align="left">Si vous êtes sur Python 3.x, vous n’avez pas besoin du module “enum34”, seulement “pyzmq”.</p>
<p align="left">Et voilà, votre environnement Windows est prêt !</p>
<h4>Installer Python sur Linux</h4>
<p>Sur un système Debian ou similaire (Raspbian, Ubuntu, etc …), vous n’avez qu’à installer (et enregistrer dans votre Constellation) <a href="/getting-started/ajouter-des-sentinelles/#Installation_dune_sentinelle_sur_un_systeme_Linux">une sentinelle Constellation</a>.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-1.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation des prérequis via PIP" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-1.png" alt="Installation des prérequis via PIP" width="350" height="222" border="0" /></a></p>
<p>Le <a href="/dowload/"><em>Web Platform Installer</em></a> vous proposera d’installer tous les prérequis nécessaires à savoir Python et les librairies “pyZmq” et “enum34” (si Python 2.x) via PIP.</p>
<p>Autrement, pour installer manuellement ces prérequis, vous pouvez utiliser les mêmes commandes que sur Windows :</p>
<p></p><pre class="crayon-plain-tag">sudo easy_install pip
sudo pip install pyzmq
sudo pip install enum34</pre><p></p>
<p>Encore une fois, la libraire “enum34” est seulement requise sur Python 2.x.</p>
<p>Enfin si vous utilisez un Raspberry Pi, vous pouvez également <a href="/constellation-platform/constellation-server/constellation-raspberry-pi/">consulter cet article en particulier</a>.</p>
<p>Et voilà, votre environnement Linux est prêt !</p>
<h3>Développer un package Python en ligne de commande</h3>
<p>Vous pouvez soit utiliser le SDK Constellation basé sur Visual Studio pour créer, tester et déployer des packages Constellation (.NET ou Python) ou bien, utiliser l&rsquo;outil en ligne de commande nommé <a href="/client-api/python-api/developper-avec-le-package-tools-cli/"><strong><em>« Constellation Package Tools CLI »</em></strong></a>.</p>
<p>Le développement sous Visual Studio est abordé ci-dessous. Pour l&rsquo;outil en ligne de commande, rendez-vous sur la page : <a href="/client-api/python-api/developper-avec-le-package-tools-cli/">Créer, tester et déployer des packages Python en ligne de commande</a></p>
<h3>Développer un package Python avec Visual Studio</h3>
<p>Après avoir installé les prérequis et le <a href="/getting-started/installer-constellation/#Etape_5_selectionnez_les_composants_Constellation_a_installer">SDK Constellation</a>, lancez Visual Studio et créez un nouveau package Constellation de type “Python” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image.png"><img class="colorbox-1737"  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 Python" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb.png" alt="Création d'un package Python" width="424" height="294" border="0" /></a></p>
<p align="left">Une fois créé le projet Visual Studio a la structure suivante :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-4.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Structure d'un package Python" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-4.png" alt="Structure d'un package Python" width="244" height="199" border="0" /></a></p>
<p align="left">Vous retrouverez une structure classique pour un package Constellation :</p>
<ul>
<li>
<div align="left"><u>App.config</u> : le fichier de configuration local pour définir les valeurs locales de vos settings (<a href="/client-api/net-package-api/settings/">lire ici</a>) ainsi que<span style="text-decoration: underline;"> les scripts Python à démarrer</span></div>
</li>
<li>
<div align="left"><u>PackageInfo.xml</u> : le <a href="/concepts/package-manifest/">manifeste de votre package</a></div>
</li>
<li>
<div align="left"><u>packages.config</u> : le fichier des packages Nuget de votre projet (réservé à Nuget)</div>
</li>
<li>
<div align="left"><u>Program.cs</u> : le point d’entrée (C#) de votre package qui se chargera de lancer le “Python Proxy” (le pont entre vos scripts Python et Constellation)</div>
</li>
<li>
<div align="left">Le répertoire “Scripts” (qui contient vos scripts Python)</div>
<ul>
<li>
<div align="left"><u>Constellation.py</u> : le proxy Python Constellation (la librairie Python) : <u>ne pas modifier</u> !</div>
</li>
<li>
<div align="left"><u>Demo.py</u> : un script Python d’exemple</div>
</li>
</ul>
</li>
</ul>
<h4 align="left">Configurer les scripts à démarrer</h4>
<p align="left">Vous pouvez ajouter autant de scripts Python dans le dossier “Scripts” comme vous le souhaitez. Pour cela, cliquez-droit sur ce répertoire et sélectionnez « <em>Ajouter un nouvel élément »</em>.</p>
<p align="left">Dans la catégorie « Constellation » sélectionnez « <strong><em>Constellation Python Script</em></strong> » :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/06/image-1.png"><img class="colorbox-1737"  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 nouveau script Constellation Python" src="https://developer.myconstellation.io/wp-content/uploads/2017/06/image_thumb-1.png" alt="Création d'un nouveau script Constellation Python" width="354" height="246" border="0" /></a></p>
<p align="left">Chaque script sera démarré dans un processus dédié et connecté à Constellation.</p>
<p align="left"><u>Attention</u> : si vous rajoutez des scripts Python dans ce dossier, il faut obligatoirement les inclure dans le package en sélectionnant “<em>Copy if newer</em>” pour la propriété “<em>Copy to Output directory</em>”. Cette propriété est automatiquement définie à cette valeur si vous avez créé votre fichier Python en sélectionnant l’élément « <em>Constellation Python Script</em> » comme expliqué ci-dessus.</p>
<p align="left"><strong>Dans le fichier « <em>App.config</em> » vous devez déclarer les fichiers Python à démarrer</strong>. Les scripts Python créé en sélectionnant l’élément « Constellation Python Script » sont automatiquement ajoutés dans ce fichier lors de la création. <strong>Si vous renommez ou supprimer vos scripts, n&rsquo;oubliez pas de mettre à jour ce fichier</strong>.</p>
<p></p><pre class="crayon-plain-tag">&lt;pythonProxy xmlns="urn:Constellation.PythonProxy"&gt;
  &lt;scripts&gt;
    &lt;script filename="Scripts\Demo.py" /&gt;
    &lt;script filename="Scripts\LightSensor.py" /&gt;
    &lt;script filename="Scripts\Camera.py" /&gt;
  &lt;/scripts&gt;
&lt;/pythonProxy&gt;</pre><p></p>
<p align="left">Le script “Demo.py” est créé à titre d’exemple. Vous pouvez le supprimer, renommer ou modifier à votre convenance.</p>
<p align="left">Grâce à Visual Studio et au SDK Constellation, vous bénéficiez d’un environnement de développement agréable pour créer vos packages Python avec la coloration syntaxique et l’IntelliSense :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-6.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="IntelliSense VisualStudio" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-6.png" alt="IntelliSense VisualStudio" width="420" height="276" border="0" /></a></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-7.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="IntelliSense VisualStudio" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-7.png" alt="IntelliSense VisualStudio" width="420" height="61" border="0" /></a></p>
<h4 align="left">Les bases</h4>
<p align="left">Chaque script Python doit impérativement importer la librairie Constellation et démarrer la “connexion” avec le proxy Python en invoquant la méthode “Start” :</p>
<p></p><pre class="crayon-plain-tag">import Constellation
# Votre code !
Constellation.Start()</pre><p></p>
<p align="left">Vous avez trois façon de démarrer cette connexion :</p>
<p align="left">1 – La plus simple est d’invoquer la méthode “Start” :</p>
<p></p><pre class="crayon-plain-tag">Constellation.Start()</pre><p></p>
<p align="left">La méthode “Start” démarre la connexion et maintient le script en “vie” grâce à une boucle qui tourne tant que le package Constellation est lancé.</p>
<p align="left">Autrement dit le code après la méthode “Start” ne sera jamais appelé !</p>
<p align="left">2 – Invoquer la méthode “Start” en passant une fonction de démarrage :</p>
<p align="left">Vous pouvez passer le nom d’une fonction en paramètre de la méthode “Start” qui sera invoquée dès que le script Python est connecté à Constellation.</p>
<p align="left">Cela vous permet de définir du code au démarrage du package :</p>
<p></p><pre class="crayon-plain-tag">def OnStart():
    # Mon code de démarrage ici
    pass

Constellation.Start(OnStart);</pre><p></p>
<p align="left">3 – Troisième méthode : invoquer la méthode “StartAsync” (non bloquante)</p>
<p align="left">Mais attention vous devrez vous même créer une boucle pour maintenant votre script “en vie” autrement il s’arrêtera automatiquement !</p>
<p></p><pre class="crayon-plain-tag">Constellation.StartAsync()
while Constellation.IsRunning:
    pass
    time.sleep(1)</pre><p></p>
<h4 align="left">Interpréteurs Python et environnements virtuels</h4>
<p align="left">Par défaut chaque script est lancé avec la commande “python”. C’est pour cela qu’il est recommandé d’ajouter Python dans le PATH de votre système afin de pouvoir “résoudre” la commande “python”.</p>
<p>Vous pouvez aussi définir dans le fichier <em>App.config</em> de votre package Python, l’attribut “<em>pythonCmd</em>” pour spécifier la commande à lancer. Ci-dessous un exemple avec l’interpréteur Python 2.7 :</p>
<p></p><pre class="crayon-plain-tag">&lt;pythonProxy xmlns="urn:Constellation.PythonProxy" pythonCmd="C:\Python27\python.exe"&gt;
  &lt;scripts&gt;
    &lt;script filename="Scripts\Demo.py" /&gt;
    &lt;script filename="Scripts\Demo2.py" /&gt;
  &lt;/scripts&gt;
&lt;/pythonProxy&gt;</pre><p></p>
<p>L’attribut “<em>pythonCmd</em>” peut-être également défini de manière individuelle pour chaque script. Prenez par exemple la configuration suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;pythonProxy xmlns="urn:Constellation.PythonProxy" pythonCmd="python3"&gt;
  &lt;scripts&gt;
    &lt;script filename="Scripts\Demo.py" /&gt;
    &lt;script filename="Scripts\Demo2.py" pythonCmd="C:\Users\Sebastien\venv\Scripts\python.exe" /&gt;
    &lt;script filename="Scripts\Demo3.py" pythonCmd="C:\Python27\python.exe" /&gt;
  &lt;/scripts&gt;
&lt;/pythonProxy&gt;</pre><p></p>
<p>Ci-dessus le package Python démarre trois scripts Demo.py, Demo2.py et Demo3.py de la façon suivante :</p>
<ul>
<li>Demo.py sera lancé par l’interpréteur Python 3 (via la commande “python3” défini au niveau global)</li>
<li>Demo2.py sera lancé par un environnement virtuel ici nommé “venv” (défini pour le script)</li>
<li>Demo3.py sera lancé par l’interpréteur Python 2.7 installé dans “C:\Python27”</li>
</ul>
<p>Vous pouvez donc utiliser cet attribut pour spécifier l’interpréteur Python à utiliser (Python 2 vs 3 ou même des interpréteurs dans des environnements virtuels). Quelque soit l’interpréteur utilisé n’oubliez d’installer les librairies “pyzmq” (et “enum34” si Python 2.x).</p>
<p><span style="text-decoration: underline;">Note</span> : vous pouvez aussi les Settings Constellation dans l&rsquo;attribut « pythonCmd » vous permettant ainsi de définir/changer d&rsquo;interpréteur sans modifier le code de votre package, simplement en manipulant les settings de votre package depuis la Console Constellation. Plus d&rsquo;information <a href="/blog/support-python-3-et-environnements-virtuels/#La_configuration_du_Proxy_par_settings_Constellation">sur ce billet</a>.</p>
<h4 align="left">Produire des logs</h4>
<p align="left">Pour écrire des logs dans le hub Constellation, <a href="/client-api/net-package-api/les-bases-des-packages-net/#Ecrire_des_logs">tout comme en C#,</a> vous disposez des méthodes suivantes :</p>
<ul>
<li>
<div align="left">WriteInfo</div>
</li>
<li>
<div align="left">WriteWarn</div>
</li>
<li>
<div align="left">WriteError</div>
</li>
</ul>
<p align="left">Exemple :</p>
<p></p><pre class="crayon-plain-tag">Constellation.WriteInfo("Hello world from Python !")
Constellation.WriteWarn("This is a warning !")
Constellation.WriteError("This is an error !")</pre><p></p>
<p align="left">En Python vous pouvez formater vos messages avec des variables grâce à l’opérateur “%”.</p>
<p align="left">Par exemple, affichons dans les logs Constellation l’état de notre package :</p>
<p></p><pre class="crayon-plain-tag">Constellation.WriteInfo("Hi I'm '%s' and I run on %s" % (Constellation.PackageName, Constellation.SentinelName))
Constellation.WriteInfo("IsConnected = %s | IsStandAlone = %s " % (Constellation.IsConnected, Constellation.IsStandAlone))</pre><p></p>
<p align="left">Vous remarquez par la même occasion <a href="/client-api/net-package-api/les-bases-des-packages-net/#Proprietes_du_PackageHost">quelques propriétés</a> accessibles dans vos scripts Python (<em>IsConnected</em>, <em>IsStandAlone</em>, <em>SentinelName</em>, <em>PackageName</em>, etc…).</p>
<h4 align="left">Accès aux settings</h4>
<p align="left">Le fonctionnement des settings est strictement identique à l’API .NET <a href="/client-api/net-package-api/settings/">décrite ici</a>.</p>
<p align="left">Les settings sont définis sur le serveur au niveau du package ou via des groupes, et par héritage peuvent être définis dans le fichier local App.config et/ou dans le manifeste. Je vous invite vivement <a href="/client-api/net-package-api/settings/">à lire cet article</a> pour bien comprendre le fonctionnement des settings.</p>
<p align="left">Avec l’API Python de Constellation vous disposez de la méthode “GetSetting” pour récupérer la valeur de vos settings.</p>
<p align="left">Par exemple pour afficher la valeur du setting “Demo1” :</p>
<p></p><pre class="crayon-plain-tag">Constellation.WriteInfo("Demo1 = " + str(Constellation.GetSetting("Demo1")))</pre><p></p>
<p align="left">Si la valeur du setting n’existe pas, la méthode vous retourne un “Null” :</p>
<p></p><pre class="crayon-plain-tag">if Constellation.GetSetting("Demo1") &lt;&gt; Null:
     Constellation.WriteInfo("Demo1 = " + str(Constellation.GetSetting("Demo1")))</pre><p></p>
<p align="left">Vous avez également la possibilité d’attacher une méthode callback pour être notifier dans votre code Python lorsque les settings de votre packages sont mises à jour dans Constellation :</p>
<p></p><pre class="crayon-plain-tag">import Constellation

def OnSettingsUpdated():
    print("Mise à jour de mes settings depuis Constellation !!")

def Start():
    Constellation.OnSettingsUpdated = OnSettingsUpdated

Constellation.Start(Start);</pre><p></p>
<h4 align="left">Publier des StateObjects</h4>
<p align="left"><a href="/client-api/net-package-api/stateobjects/">Comme pour l’API .NET</a>, vous disposez de la méthode PushStateObject pour publier un StateObject.</p>
<p align="left">Chaque StateObject a obligatoirement un nom et une valeur de n’importe quel type :</p>
<p></p><pre class="crayon-plain-tag">Constellation.PushStateObject("MyString", "OK")
Constellation.PushStateObject("MyNumber", 123)
Constellation.PushStateObject("MyDecimal", 123.12)
Constellation.PushStateObject("MyBoolean", True)</pre><p></p>
<p align="left">Vous pouvez publier des StateObjects dont la valeur est un objet complexe :</p>
<p></p><pre class="crayon-plain-tag">Constellation.PushStateObject("Demo", { "UneString": "DemoPython", "UnNombre": 123 })</pre><p></p>
<p align="left">Dans l&rsquo;exemple ce-dessus, le StateObject « Demo » est un objet contenant deux propriétés : « UneString » et « UnNombre ».</p>
<p align="left">Lorsqu&rsquo;il s&rsquo;agit de type complexe, il est vivement conseiller de décrire le type du StateObject à Constellation.</p>
<p align="left">Pour cela au démarrage de votre package (méthode Start), enregistrez vos différents types de StateObjects avec la méthode « DescribeStateObjectType ».</p>
<p align="left">Par exemple :</p>
<p></p><pre class="crayon-plain-tag">Constellation.DescribeStateObjectType("MyStateObject", "StateObject à deux propriétés de démonstration", [
    { 'Name':'UneString', 'Type':'string', 'Description': 'Une chaine de caractère tout simplement' },        
    { 'Name':'UnNombre', 'Type':'int', 'Description': 'Un nombre entier' }
])</pre><p></p>
<p>Pour chaque type on spécifiera un nom, une description du type et la liste ses propriétés. Sachant que pour chaque propriété nous avons un nom, un type et une description.</p>
<p>Le type d&rsquo;une propriété peut faire elle-même référence à un autre type complexe que vous avez enregistré.</p>
<p>Pour finir il faudra déclarer le package descriptor après avoir décrit tous vos types :</p>
<p></p><pre class="crayon-plain-tag">Constellation.DeclarePackageDescriptor()</pre><p></p>
<p align="left">Enfin, pour chaque publication de StateObject, vous pouvez spécifier le type (simple ou complexe que vous aurez enregistré ci-dessus), un dictionnaire de méta-données ou encore une durée de vie (en seconde)  :</p>
<p></p><pre class="crayon-plain-tag">Constellation.PushStateObject("Demo", { "UneString": "DemoPython", "UnNombre": 123 }, type = "MyStateObject", metadatas = { "DeviceId": "RPi", "SerialNumber":"123" }, lifetime = 300)</pre><p></p>
<h4 align="left">Tester son package dans Visual Studio</h4>
<p align="left">Laissons le code de démo du script “Demo.py” créé par le Template du projet tel quel :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-8.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Demo Python" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-8.png" alt="Demo Python" width="420" height="130" border="0" /></a></p>
<p align="left">Notons simplement qu’au démarrage du package on enregistre la méthode “OnStart” pour :</p>
<ul>
<li>
<div align="left">Produire différents logs via des “WriteInfo” (Warning &amp; Error) contenant notamment différentes propriétés comme le <em>IsConnected</em> &amp; <em>IsStandalone</em>.</div>
</li>
<li>
<div align="left">Publier le StateObject “Demo”</div>
</li>
</ul>
<h5 align="left">Debug local (hors Constellation)</h5>
<p align="left">Commençons par tester notre package hors Constellation en lançant simplement le package avec le bouton “Start” de Visual Studio (F5) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-9.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Debug local" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-9.png" alt="Debug local" width="424" height="55" border="0" /></a></p>
<p align="left">Votre package démarre et vous pouvez suivre dans la console les différents logs produits par votre package.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-10.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-10.png" alt="image" width="420" height="138" border="0" /></a></p>
<p align="left">Vous observerez que votre package n’est pas connecté à Constellation (<em>IsConnected = false</em>).</p>
<h5 align="left">Debug dans Constellation</h5>
<p align="left">Maintenant lançons toujours le debugging de votre package Constellation depuis Visual Studio mais en connectant votre package à Constellation. (Assurez-vous d’avoir défini dans Visual Studio la Constellation à utiliser pour le debug comme nous l’avons vu dans <a href="/getting-started/creez-votre-premier-package-constellation-en-csharp/#Tester_son_package_dans_sa_Constellation">ce guide</a>).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-11.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Debug On Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-11.png" alt="Debug On Constellation" width="424" height="55" border="0" /></a></p>
<p align="left">Cette fois ci, votre package démarre dans Visual Studio mais en étant connecté à Constellation (<em>IsConnected = true</em>).</p>
<p align="left">Vous pouvez donc suivre en temps réel les logs depuis la Console Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-12.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Debug On Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-12.png" alt="Debug On Constellation" width="424" height="226" border="0" /></a></p>
<p align="left">Vous retrouverez également dans le StateObject Explorer de la Console, le StateObject “Demo” publié par notre package :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-13.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="StateObject Demo" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-13.png" alt="StateObject Demo" width="424" height="302" border="0" /></a></p>
<h4 align="left">Publiez votre package</h4>
<p align="left">Lorsque votre package est testé et validé, nous pouvons le publier dans Constellation.</p>
<p align="left">Pour cela cliquez sur le bouton de publication :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-14.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Publication du package" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-14.png" alt="Publication du package" width="424" height="55" border="0" /></a></p>
<p align="left">Sélectionnez votre serveur Constellation cible et cliquez sur “Publish” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-15.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-15.png" alt="image" width="424" height="212" border="0" /></a></p>
<p align="left">Une fois publié, vous retrouverez votre package dans le “Package Repository” de la Console.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-16.png"><img class="colorbox-1737"  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/04/image_thumb-16.png" alt="Package Repository" width="424" height="158" border="0" /></a></p>
<p align="left">N’oubliez pas que vous pouvez personnaliser les différentes informations (nom du package, auteur, URL, version, description, etc…) en <a href="/concepts/package-manifest/">éditant le manifeste</a> de votre package.</p>
<h4 align="left">Déployez votre package sur une sentinelle</h4>
<p align="left">Maintenant que votre package est dans le catalogue de votre Constellation, vous pouvez le déployer sur autant de sentinelle que vous le souhaitez!</p>
<h5 align="left">Par l&rsquo;édition du fichier de configuration</h5>
<p align="left">Pour cela, vous pouvez éditer manuellement la configuration (via le <em><a href="/constellation-platform/constellation-console/configuration-editor/">Configuration Editor</a></em>) pour ajouter une instance de package sur la sentinelle de votre choix par la ligne :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="MonPackagePython" /&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-17.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Deploiement du package" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-17.png" alt="Deploiement du package" width="424" height="195" border="0" /></a></p>
<p align="left">On peut également déclarer le setting “Demo1” pour cette instance de package :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="MonPackagePython"&gt;
  &lt;settings&gt;
    &lt;setting key="Demo1" value="Hello Python !!!!" /&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<p align="left">Cliquez sur le bouton “Save &amp; Deploy” et votre package sera automatiquement démarré sur la sentinelle ici nommée “PO-SWARIN” !</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/04/image-18.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Package déployé" src="https://developer.myconstellation.io/wp-content/uploads/2016/04/image_thumb-18.png" alt="Package déployé" width="424" height="182" border="0" /></a></p>
<h5 align="left">Par l&rsquo;interface graphique de la Console Constellation</h5>
<p align="left">Autre moyen, plus intuitif et rapide pour déployer un package, cliquez sur le bouton “Deploy” dans menu contextuel de votre package Python :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-6.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Déploiement d'un package" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-6.png" alt="Déploiement d'un package" width="428" height="149" border="0" /></a></p>
<p align="left">Vous pouvez également cliquer sur le bouton “<a href="/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/#Deployer_un_package">Deploy new package</a>” sur la page “Packages”.</p>
<p align="left">Un assistant vous proposera de sélectionner la sentinelle sur laquelle déployer votre package Python :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-7.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Déploiement d'un package" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-7.png" alt="Déploiement d'un package" width="428" height="158" border="0" /></a></p>
<p align="left">Si les settings de votre package sont déclarés dans le manifeste (<a href="/concepts/package-manifest/#Informations_sur_les_Settings_du_package">voir ici</a>), la Console vous affichera une fenêtre de paramétrage :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-8.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Configuration des settings" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-8.png" alt="Configuration des settings" width="428" height="246" border="0" /></a></p>
<p align="left">Une fois votre package déployé, vous pourrez suivre dans la Console Log votre package :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-9.png"><img class="colorbox-1737"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Démarrage du package" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image_thumb-9.png" alt="Démarrage du package" width="428" height="163" border="0" /></a></p>
<p align="left">Et voilà votre premier package Python créé et déployé dans votre Constellation !</p>
<h4 align="left">Next steps</h4>
<ul>
<li>
<div align="left"><a href="/client-api/python-api/messagecallbacks-exposer-des-methodes-python/">MessageCallback : exposer des méthodes Python dans la Constellation</a></div>
</li>
<li>
<div align="left"><a href="/client-api/python-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-en-python/">Envoyer des messages et invoquer des MessageCallbacks de la Constellation</a></div>
</li>
<li>
<div align="left"><a href="/client-api/python-api/consommer-des-stateobjects-en-python/">StateObjectLink : consommer des StateObjects de votre Constellation</a></div>
</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-python/">Cr&eacute;ez votre premier package Constellation en Python</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-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Connecter un Arduino ou un ESP8266 à Constellation</title>
		<link>https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/</link>
					<comments>https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 19 Aug 2016 09:22:50 +0000</pubDate>
				<category><![CDATA[Guide de démarrage]]></category>
		<category><![CDATA[Arduino / ESP API]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[WriteLog]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[PushStateObject]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[Virtuel]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2342</guid>

					<description><![CDATA[<p>Vous pouvez connecter tout type d’objet ou système dans Constellation à partir du moment où vous disposez d’une connectivité IP pour réaliser des appels HTTP. Introduction Par exemple si vous disposez d’un Arduino il vous faudra un shield Ethernet ou</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">Connecter un Arduino ou un ESP8266 à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Vous pouvez connecter tout type d’objet ou système dans Constellation à partir du moment où vous disposez d’une connectivité IP pour réaliser des appels HTTP.</p>
<h3>Introduction</h3>
<p>Par exemple si vous disposez d’un Arduino il vous faudra un shield Ethernet ou Wifi bien que ces derniers ont été retirés du support Arduino.</p>
<p>Arduino propose en alternative des modèles déjà équipés d’une connectivité Ethernet et/ou Wifi comme le <a href="https://www.arduino.cc/en/Main/ArduinoMKR1000">MKR1000</a>, le <a href="https://www.arduino.cc/en/Main/ArduinoYunShield">Yun Shield</a> ou le <a href="https://www.arduino.cc/en/Main/ArduinoWiFiShield101">Wifi Shield 101</a>.</p>
<p align="center"><a href="https://www.arduino.cc/en/Main/ArduinoMKR1000"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-25.png" alt="image" width="240" height="145" border="0" /></a><a href="https://www.arduino.cc/en/Main/ArduinoYunShield"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-26.png" alt="image" width="225" height="145" border="0" /></a><a href="https://www.arduino.cc/en/Main/ArduinoWiFiShield101"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-27.png" alt="image" width="176" height="145" border="0" /></a></p>
<p align="left">En alternative vous avez les ESP8266 que j’ai <a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/">pu vous présenter sur mon blog personnel</a>.</p>
<blockquote>
<p align="left">Ce microcontrôleur est cadencé à 80Mhz par un processeur 32bits RISC avec 96K de RAM et une mémoire flash de 512Ko à 4Mo selon les modèles.</p>
<p align="left">Il dispose d’une connectivité Wifi 802.11 b/g/n supportant le WEP, WPA/2/WPS et réseau ouvert et 16 GPIO dont le support du SPI, I²C, UART et un port ADC (pour les I/O analogiques).</p>
</blockquote>
<p align="center"><a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-22.png" alt="image" width="204" height="132" border="0" /></a></p>
<p align="left">Vous trouverez différents modèles sur internet, comme ceux produit par AI-Thinker mais il faudra réaliser vous même la carte de programmation comme <a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/#prettyPhoto">je l’explique sur mon blog</a> ou bien des modules “tout en un” comme ceux d’<a href="https://www.adafruit.com/product/2821">Adafruit</a> ou <a href="https://www.sparkfun.com/products/13231">Sparkfun</a> disposant d’un port USB intégré pour une programmation facile :</p>
<p align="center"><a href="https://www.adafruit.com/product/2821"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-28.png" alt="image" width="240" height="185" border="0" /></a> <a href="https://www.sparkfun.com/products/13231"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-29.png" alt="image" width="231" height="185" border="0" /></a></p>
<p align="left">Si vous débutez je vous recommande la Wemos D1 Mini qui intègre un ESP8266 avec 4M de mémoire Flash, 11 I/O digitales et 1 analogique (ADC) ainsi qu’une interface USB le tout pour moins de 5€ :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/mini_v2.jpg"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="mini_v2" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/mini_v2_thumb.jpg" alt="mini_v2" width="305" height="211" border="0" /></a></p>
<p align="left">Pour bien comprendre les ESP8266, je vous recommande une nouvelle fois mon article <a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/#prettyPhoto"><strong>Découverte des ESP8266 : le microcontrôleur connecté par Wifi pour 2€ au potentiel phénoménal avec Constellation</strong></a></p>
<p align="left">Le plus important étant que les ESP8266 peuvent être programmés comme les Arduino avec l’IDE Arduino.</p>
<h3 align="left">Arduino/ESP8266 = package virtuel</h3>
<p>Ce <a href="/concepts/sentinels-packages-virtuels/">concept a déjà été abordé ici</a>. En clair le micro-programme d’un Arduino ou d’un ESP est stocké dans la puce elle même et il n’y a pas de concept de “processus” sur ce genre de device. Il n’est donc pas possible d’avoir une véritable sentinelle qui tourne ce genre d’objet pour déployer et superviser des packages Constellation à la volée comme sur un système Windows ou Linux.</p>
<p>C’est pour cela qu’on parle de sentinelle et de package “<strong>virtuel</strong>” : on déclare bien dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/">configuration de notre Constellation</a> une sentinelle (par exemple nommée “Arduino” et associée à un credential) et contenant un package (par exemple nommé  “TemperatureSensor”). Ce package peut être joint à des groupes et avoir des settings qui lui sont propres.</p>
<p>Dans le microprogramme téléversé sur votre Arduino/ESP vous allez vous connecter en spécifiant le nom de la sentinelle et du package virtuel (ici Arduino/TemperatureSensor) et la clé d’accès associée. Votre device sera alors connecté à Constellation comme étant le package “TemperatureSensor” sur la sentinelle “Arduino”. Comme n&rsquo;importe quel package il pourra produire des logs, publier des StateObjects, récupérer ses settings, envoyer ou recevoir des messages ou encore consommer les StateObjects d’autres packages.</p>
<p>Techniquement parlant l’Arduino/ESP utilise <a href="/client-api/rest-api/interface-rest-constellation/">l’API REST “Constellation”</a>.</p>
<h3>Installer la librairie Constellation dans l’IDE Arduino</h3>
<p>Ouvrez le « Gestionnaire de bibliothèque » dans le menu « <i>Croquis &gt; Inclure une bibliothèque &gt; Gérer les bibliothèques</i> » :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/12/image-2.png"><img class="colorbox-2342"  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/12/image_thumb-2.png" alt="image" width="450" height="274" border="0" /></a></p>
<p>Avec le moteur de recherche, recherchez le terme « <i>ArduinoJson</i> » :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/12/image-3.png"><img class="colorbox-2342"  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/12/image_thumb-3.png" alt="image" width="450" height="253" border="0" /></a></p>
<p>Vous trouverez lors la bibliothèque « ArduinoJson » de Benoit Blanchon (dépendance de la librairie Constellation) ainsi que la librairie Constellation.</p>
<p>Pour ces deux bibliothèques, cliquez sur le bouton « Installer » (ou « Mise à jour » si la librairie est déjà installée).</p>
<h3>Hello World, Hello Constellation</h3>
<p>Commencez par créer un nouveau sketch et ajoutez la librairie Constellation :</p>
<p></p><pre class="crayon-plain-tag">#include &lt;Constellation.h&gt;</pre><p></p>
<p>Vous pouvez maintenant déclarer le client “Constellation” en l’initialisant avec l’adresse (IP ou DNS) de votre serveur Constellation, le port et les informations de connexion de Constellation, c’est à dire le nom de votre sentinelle et package ainsi que la clé d’accès que vous aurez déclarés sur votre serveur :</p>
<p></p><pre class="crayon-plain-tag">Constellation&lt;WiFiClient&gt; constellation("IP or DNS du serveur constellation", 8088, "MyVirtualSentinel", "MyVirtualPackage", "123456789");</pre><p></p>
<p>Pour ajouter <a href="/constellation-platform/constellation-console/gerer-sentinelles-avec-la-console-constellation/#Ajouter_une_sentinelle">une sentinelle virtuelle</a> cliquez sur le bouton “Add sentinel” sur la page “Sentinels” de la Console Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-61.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-50.png" alt="image" width="350" height="111" border="0" /></a></p>
<p align="left">Puis ajoutons un <a href="/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/#Les_packages_virtuels">package virtuel</a> en cliquant sur le bouton contextuel de notre sentinelle “Deploy package” ou directement depuis la package “Packages” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-62.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-51.png" alt="image" width="350" height="124" border="0" /></a></p>
<p align="left">Déclarez ensuite le nom de votre package, ici “MyVirtualPackage” utilisant la même clé que celle définie au niveau de la sentinelle :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-63.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-52.png" alt="image" width="350" height="143" border="0" /></a></p>
<p>Vous remarquerez que dans la déclaration du client Constellation nous avons spécifié dans le template de la classe Constellation le type de notre client réseau, qui dans le cas d’un ESP8266 ou d’un Arduino MKR1000 est “WifiClient”.</p>
<p>N’oubliez pas d’ajouter les librairies de votre client réseau, quelques exemples :</p>
<p></p><pre class="crayon-plain-tag">/* Arduino Wifi (ex: Wifi Shield) */
#include &lt;SPI.h&gt;
#include &lt;WiFi.h&gt;

/* Arduino Wifi101 (for WiFi Shield 101 and MKR1000 board) */
#include &lt;SPI.h&gt;
#include &lt;WiFi101.h&gt;

/* Arduino Ethernet */
#include &lt;SPI.h&gt;
#include &lt;Ethernet.h&gt;

/* ESP8266 Wifi */
#include &lt;ESP8266WiFi.h&gt;</pre><p></p>
<p>Au démarrage du programme, nous allons d’abord connecter votre client réseau sur le réseau. Dans le cas d’un ESP8266, on se connecte au réseau Wifi de cette façon :</p>
<p></p><pre class="crayon-plain-tag">void setup(void) {
  Serial.begin(115200);

  // Connect to Wifi  
  WiFi.begin("MY-SSID", "MY-WIFI_KEY");  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // For WiFi101, wait 10 seconds for connection!
  // delay(10000);

  Serial.println("WiFi connected. IP: ");
  Serial.println(WiFi.localIP());
}</pre><p></p>
<p>Une fois connecté au réseau, on peut utiliser les méthodes de la librairie Constellation.</p>
<p>Par exemple, produisons un log avec la méthode “WriteInfo” :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeInfo("Hello Constellation");</pre><p></p>
<p>Cette méthode gère nativement le formatage “à la printf”, par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeInfo("Hello Constellation, I'm '%s !", constellation.getSentinelName());</pre><p></p>
<p>Notez que vous pouvez produire de la même façon des messages de type “Info”, “Warning” ou “Error” :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeInfo("This is an information"); 
constellation.writeWarn("This is a warning"); 
constellation.writeError("This is an error");</pre><p></p>
<p>Bien entendu, comme n’importe quel package, les logs sont remontés en temps réel dans la Constellation ce qui permet à n’importe quel “contrôleur” de voir les logs de votre Arduino/ESP en temps réel.</p>
<p>Par exemple, en ouvrant la Console Constellation on pourra suivre votre Arduino/ESP en temps réel :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-37.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-26.png" alt="image" width="425" height="118" border="0" /></a></p>
<h3>Accès aux settings</h3>
<p>Tous les settings des packages de votre Constellation sont déclarés depuis <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Les_parametres_de_configuration">le fichier de configuration</a> de votre Constellation. Vous pouvez aussi utiliser la <a href="/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/#Editer_les_settings_dun_package">Console Constellation pour les administrer</a>.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-68.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-57.png" alt="image" width="230" height="118" border="0" /></a> <a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-69.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-58.png" alt="image" width="240" height="118" border="0" /></a></p>
<p align="left">Dans votre code Arduino, vous devez utiliser la méthode “getSettings” pour récupérer un objet JSON contenant les settings (clé/valeur).</p>
<p></p><pre class="crayon-plain-tag">JsonObject&amp; settings = constellation.getSettings();</pre><p></p>
<p align="left">Par exemple pour récupérer la valeur du setting “MonChiffre” déclarée sur le serveur à 42 :</p>
<p></p><pre class="crayon-plain-tag">JsonObject&amp; settings = constellation.getSettings();
static int monChiffre= settings["MonChiffre"].as&lt;int&gt;()</pre><p></p>
<p align="left">La variable “monChiffre” sera donc affectée à la valeur “42”. Dans l’exemple ci-dessus, la variable est statique pour pouvoir être utilisée n’importe où dans votre code.</p>
<p align="left">Pour les chaines de caractères vous pouvez utiliser la classe “String” :</p>
<p></p><pre class="crayon-plain-tag">JsonObject&amp; settings = constellation.getSettings();
static String strMaChaine = String(settings["MaChaine"].as&lt;char *&gt;());</pre><p></p>
<p>Encore une fois la variable est statique pour pouvoir l’utiliser n’importe où dans votre code.</p>
<p>Si vous devez convertir votre chaîne de caractères en <em>const char *</em>, vous pouvez utiliser la fonction <em>c_str()</em> :</p>
<p></p><pre class="crayon-plain-tag">const char* maChaine = strMaChaine.c_str();</pre><p></p>
<p>Vous pouvez également tester la présence d&rsquo;un setting avec la méthode « containsKey » :</p>
<p></p><pre class="crayon-plain-tag">if(settings.containsKey("MySetting")) {  
  // Do something with settings["MySetting"]  
}</pre><p></p>
<p>Par exemple vous pouvez gérer les valeurs par défaut. Imaginez un code où la valeur d&rsquo;un timeout est de 5 secondes par défaut mais vous vous laissez la possibilité de surcharger cette variable depuis les settings Constellation :</p>
<p></p><pre class="crayon-plain-tag">// Default value
int timeout = 5; // sec

setup() {
  // .....
  JsonObject&amp; settings = constellation.getSettings();
  if(settings.containsKey("Timeout")) {  
    timeout = settings["Timeout"].as&lt;int&gt;();
  }
}

void loop() {
   // DO something with 'timeout'
}</pre><p></p>
<p>Si le setting « Timeout » est défini dans les settings de votre package sur Constellation, la variable « timeout » sera affectée à votre valeur, autrement, si le setting n&rsquo;existe pas, la valeur de cette variable sera de 5.</p>
<h3>Publier des StateObjects</h3>
<p>Pour produire et publier un StateObject dans votre Constellation vous devez invoquer la méthode “pushStateObject” :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject(name, value);</pre><p></p>
<p>Vous pouvez aussi passer le “type” de votre StateObject :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject(name, value, type);</pre><p></p>
<p>Notez que pour les types simples (int,bool, long, float et double) le type est spécifié implicitement.</p>
<p>Par exemple, pour publier un StateObject dont la valeur est un chiffre :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("Temperature", 21);</pre><p></p>
<p>Vous pouvez aussi publier des StateObject avec un objet complexe en utilisant la fonction “stringFormat” pour formater votre valeur en JSON.</p>
<p>Par exemple pour publier un StateObject nommé “Lux” étant un objet contenant 3 propriétés :</p>
<p></p><pre class="crayon-plain-tag">constellation.pushStateObject("Lux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir));</pre><p></p>
<p>Vous pouvez également faire la même chose en construisant un “JsonObject” :</p>
<p></p><pre class="crayon-plain-tag">StaticJsonBuffer&lt;200&gt; jsonBuffer;
JsonObject&amp; root = jsonBuffer.createObject();

root["Lux"] = lux;
root["Broadband"] = full;
root["IR"] = ir;
constellation.pushStateObject("Lux", &amp;root);</pre><p></p>
<p>Une fois vos StateObjects publiés, ils sont accessibles en temps réel aux autres packages et consommateurs de votre Constellation. Vous pouvez également utiliser le “StateObject Explorer” de la Console Constellation pour explorer tous les StateObjects de votre Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-70.png"><img class="colorbox-2342"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-59.png" alt="image" width="240" height="181" border="0" /></a></p>
<h3>Next steps</h3>
<ul>
<li><a href="/client-api/arduino-esp-api/produire-des-stateobjects-depuis-arduino-esp/">Publier des StateObjects</a></li>
<li><a href="/client-api/arduino-esp-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-depuis-arduino-esp/">Envoyer des messages</a></li>
<li><a href="/client-api/arduino-esp-api/recevoir-des-messages-et-exposer-des-methodes-messagecallback-sur-arduino-esp/">Recevoir des messages</a></li>
<li><a href="/client-api/arduino-esp-api/consommer-des-stateobjects-depuis-arduino-esp/">Consommer des StateObjects</a></li>
<li><a href="/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/">Connectez vos ESP8266 à Constellation en Lua avec NodeMCU</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/">Connecter un Arduino ou un ESP8266 à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/getting-started/connecter-un-arduino-ou-un-esp8266-constellation/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Gérer les packages avec la Console Constellation</title>
		<link>https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/</link>
					<comments>https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 19 Aug 2016 15:31:54 +0000</pubDate>
				<category><![CDATA[Constellation Console]]></category>
		<category><![CDATA[Virtuel]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[group]]></category>
		<category><![CDATA[Console]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2404</guid>

					<description><![CDATA[<p>Dans le menu principal de gauche, cliquez sur “Packages”. Vous obtiendrez alors l’ensemble des instances de package déployées dans votre Constellation : Pour chaque package (réel) vous avez en temps réel : Le statut : Starting : package en cours</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/">Gérer les packages avec la Console Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p align="left">Dans le menu principal de gauche, cliquez sur “Packages”. Vous obtiendrez alors l’ensemble des instances de package déployées dans votre Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-45.png"><img class="colorbox-2404"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-34.png" alt="image" width="450" height="249" border="0" /></a></p>
<p align="left">Pour chaque package (réel) vous avez en temps réel :</p>
<ul>
<li>
<div align="left">Le statut :</div>
<ul>
<li>
<div align="left">Starting : package en cours de démarrage</div>
</li>
<li>
<div align="left">Started : package démarré et en cours de fonctionnement</div>
</li>
<li>
<div align="left">Stopping : package en cours d’arrêt</div>
</li>
<li>
<div align="left">Stopped : package arrêté</div>
</li>
</ul>
</li>
<li>
<div align="left">L’état de connexion qui indique si le package est bien connecté au serveur</div>
</li>
<li>
<div align="left">La date de la dernière activité (il s’agit de la date de la dernière modification du statut)</div>
</li>
<li>
<div align="left">La consommation en CPU et RAM sur la sentinelle sur lequel le package est démarré</div>
</li>
<li>
<div align="left">Des informations quant à la version du package et de la librairie Constellation utilisée par le package</div>
</li>
</ul>
<p align="left">En fonction de l’état du package le bouton d’action permettra de démarrer le package (Start) et de l’arrêter (Stop).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-48.png"><img class="colorbox-2404"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-37.png" alt="image" width="450" height="99" border="0" /></a></p>
<p align="left">Comme sur les autres pages de la Console, vous avez un menu contextuel pour chaque package vous permettant de contrôler le package, d’éditer sa configuration ou ses settings, etc.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-47.png"><img class="colorbox-2404"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-36.png" alt="image" width="200" height="338" border="0" /></a></p>
<p align="left">La fenêtre d’information permet de retrouver toutes les informations sur le statut du package :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-46.png"><img class="colorbox-2404"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-35.png" alt="image" width="450" height="223" border="0" /></a></p>
<p align="left">Notez également que vous avez la possibilité de filtrer dans la liste des packages soit avec la zone de texte ou soit en cliquant sur le bouton “Show filters” afin de filtrer le type de package (réel ou virtuel), l&rsquo;état de connexion (connecté ou non) et l&rsquo;état activé/désactivé. Par défaut tous les packages sont affichés à l’exception des packages marqués “Désactivé” (<em>Enable=false</em>).</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-49.png"><img class="colorbox-2404"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-38.png" alt="image" width="450" height="62" border="0" /></a></p>
<h3 align="left">Contrôler un package</h3>
<p align="left">Pour pouvez pour chaque package le démarrer ou l’arrêter avec le bouton d’action sur la droite ou depuis le menu contextuel.</p>
<p align="left">Vous pouvez également redémarrer le package (restart) c’est à dire demander à la sentinelle de stopper le package (si il est “Started”)  puis de le démarrer.</p>
<p align="left">Vous pouvez aussi faire un rechargement du package : “reload”. Cette action fonctionne comme un “restart” mais force la sentinelle à (re)télécharger le package du “Package Repository” du serveur. Cela permet de déployer les mises à jours de vos packages : vous envoyez la nouvelle version de votre package sur votre serveur Constellation puis vous faites un “reload” afin de reforcer les sentinelles à redémarrer le package avec sa nouvelle version.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-50.png"><img class="colorbox-2404"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-39.png" alt="image" width="350" height="80" border="0" /></a></p>
<p align="left">Pour finir vous pouvez également “pousser” les settings vers un package en cas de modification (sans avoir à redémarrer le package).</p>
<h3>Editer la configuration d’un package</h3>
<p>Pour chaque package (réel ou virtuel) vous pouvez saisir le nom de l’instance (seulement lors de la création) et le credential utilisé pour la connexion du package. Vous pouvez également définir si le package est activé ou non.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-51.png"><img class="colorbox-2404"  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/08/image_thumb-40.png" alt="image" width="350" height="219" border="0" /></a></p>
<p align="left">S&rsquo;il s’agit d’un package réel, vous pouvez définir si le package doit démarré automatiquement lorsque la sentinelle se démarre et vous pouvez également redéfinir les <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_recoveryOptions">options de récupération</a> :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-52.png"><img class="colorbox-2404"  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/08/image_thumb-41.png" alt="image" width="350" height="472" border="0" /></a></p>
<h3>Editer les settings d’un package</h3>
<p>Il s’agit des paramètres propre au package (<a href="/constellation-platform/constellation-server/fichier-de-configuration/#Les_parametres_de_configuration">voir ici</a>).</p>
<p>Pour chaque package vous définir autant de variable de configuration (= une clé et une valeur) que vous désirez en cliquant sur le bouton “Add new setting” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-53.png"><img class="colorbox-2404"  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/08/image_thumb-42.png" alt="image" width="350" height="274" border="0" /></a></p>
<p align="left">Dans le cas d’un package dit “réel” il est grandement recommandé de déclarer les settings utilisés par le package dans son manifeste : <a href="/concepts/package-manifest/#Informations_sur_les_Settings_du_package">voir ici</a>.</p>
<p align="left">Cette déclaration permet à la Console Constellation de connaitre les settings obligatoires ou non, le type de chaque setting, la description et valeur par défaut.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-54.png"><img class="colorbox-2404"  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/08/image_thumb-43.png" alt="image" width="263" height="180" border="0" /></a> <a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-55.png"><img class="colorbox-2404"  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/08/image_thumb-44.png" alt="image" width="241" height="180" border="0" /></a></p>
<h3>Editer les groupes d’un package</h3>
<p>Pour <a href="/concepts/messaging-message-scope-messagecallback-saga/">rappel</a>, un message peut être envoyé à un (ou plusieurs) groupe qui regroupe des packages ou des consommateurs. Chaque package ou consommateur peut joindre un groupe depuis les API mais vous pouvez également définir ces liens d’appartenance au niveau de la <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Les_groupes">configuration du serveur</a>.</p>
<p>Pour cela, cliquez sur “Group membership” dans le menu contextuel d’un page et définissez les groupes dont fait partie votre package :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-56.png"><img class="colorbox-2404"  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/08/image_thumb-45.png" alt="image" width="350" height="204" border="0" /></a></p>
<h3>Déployer un package</h3>
<p>Pour déployer un package, vous avez plusieurs solutions :</p>
<ul>
<li>Cliquez sur le bouton “Deploy new package” depuis la page “Packages”</li>
<li>Cliquez sur le bouton “Deploy new package” dans le menu contextuel d&rsquo;une sentinelle sur la page « Sentinels »</li>
<li>Utiliser la page “Package Repository”</li>
</ul>
<p>Depuis la page des Packages, cliquez sur le bouton “Deploy new package” en haut à gauche  :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-57.png"><img class="colorbox-2404"  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/08/image_thumb-46.png" alt="image" width="240" height="130" border="0" /></a></p>
<p align="left">Vous obtiendrez alors une pop-in vous permettant de sélectionner la sentinelle sur laquelle déployer et le package à déployer :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-58.png"><img class="colorbox-2404"  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/08/image_thumb-47.png" alt="image" width="350" height="115" border="0" /></a></p>
<p align="left">S&rsquo;il s’agit d’un page virtuel, sélectionnez “Virtual package” (voir ci-dessous) sinon sélectionner un package présent dans votre “Package repository”.</p>
<p align="left">Vous serez alors guidé dans les étapes de configuration du package.</p>
<p align="left"><u>Note</u> : par défaut le champ “Package file” est nul, c’est à dire que le fichier à utiliser pour votre instance sera déterminé dynamiquement (<a href="/concepts/instance-package-versioning-et-resolution/">lire ici</a>).</p>
<p align="left">Dans le cas où une instance est déjà présente sur la sentinelle vous serez obligé de définir un autre nom et donc de spécifier le “Package file”.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-59.png"><img class="colorbox-2404"  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/08/image_thumb-48.png" alt="image" width="350" height="89" border="0" /></a></p>
<p align="left">Par exemple, ici je pourrais nommer cette nouvelle instance “HWMonitor2” en utilisant le fichier “HWMonitor”.</p>
<p align="left">Veuillez lire ceci pour bien comprendre le <a href="/concepts/instance-package-versioning-et-resolution/">mécanisme de résolution</a>.</p>
<h3>Les packages virtuels</h3>
<p>Comme <a href="/concepts/sentinels-packages-virtuels/">expliqué ici</a>, un package virtuel n’est pas réel dans le sens où ce n’est pas un processus lancé et supervisé par une sentinelle.</p>
<p>De ce fait, dans la Console, vous n’aurez aucun information remontée à son sujet.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-60.png"><img class="colorbox-2404"  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/08/image_thumb-49.png" alt="image" width="350" height="147" border="0" /></a></p>
<p align="left">Vous pouvez seulement les déclarer ou supprimer, les associer à des credenitals, gérer l’appartenance aux groupes ou bien sûr gérer les settings.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/">Gérer les packages avec la Console Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Créer, tester et déployer des packages Python en ligne de commande</title>
		<link>https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/</link>
					<comments>https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Thu, 07 Sep 2017 21:50:15 +0000</pubDate>
				<category><![CDATA[Python API]]></category>
		<category><![CDATA[Constellation SDK]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Constellation]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[WriteLog]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=5341</guid>

					<description><![CDATA[<p>Vous pouvez créer des packages Constellation Python avec Visual Studio ou alors sans IDE avec l&#8217;outil en ligne de commande nommé « Constellation Package Tools CLI ». Nous allons dans cet article créer, tester et déployer sur votre Constellation un package Python</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/">Créer, tester et déployer des packages Python en ligne de commande</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Vous pouvez <a href="https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-python/">créer des packages Constellation Python avec Visual Studio</a> ou alors sans IDE avec l&rsquo;outil en ligne de commande nommé <em><strong>« Constellation Package Tools CLI ».</strong></em></p>
<p>Nous allons dans cet article créer, tester et déployer sur votre Constellation un package Python avec cet outil.</p>
<h2>Prérequis</h2>
<p>Le « Constellation Package Tools CLI » est un outil en ligne de commande compatible Windows et Linux. Il est écrit en Python et s&rsquo;installe via PIP avec la commande :</p>
<p></p><pre class="crayon-plain-tag">pip install constellation-pkgtools-cli</pre><p></p>
<p>Sur Windows vous devriez au préalable avoir installé Python 2.7 ainsi que l&rsquo;outil « pip » et les libraires « pyzmq » et « enum34 ». La procédure complète d&rsquo;installation est <a href="https://developer.myconstellation.io/getting-started/creez-votre-premier-package-constellation-en-python/#Installer_Python_sur_Windows">décrite sur cette page</a>.</p>
<p>Via une invite de commande, tapez la commande ci-dessus :</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation sur Windows" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb.png" alt="Installation sur Windows" width="354" height="246" border="0" /></a></p>
<p>Sur Linux, vous devez également avoir installé Python 2.7 (généralement installé par défaut),  l&rsquo;outil « pip » et les libraires « pyzmq » et « enum34 » sans oublier le moteur Mono. Pour cela, utilisez le WPI (<em>Web Platform Installer</em>) pour <a href="/getting-started/ajouter-des-sentinelles/#Installation_dune_sentinelle_sur_un_systeme_Linux">installer une sentinelle Constellation</a>. Celui-ci se chargera de déployer l&rsquo;ensemble des prérequis nécessaire.</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-1.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Installation sur Linux" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-1.png" alt="Installation sur Linux" width="354" height="226" border="0" /></a></p>
<h2>La commande « ctln »</h2>
<p>Une fois le package Python « <em>constellation-pkgtools-cli</em> » installé via PIP, vous aurez accès à une commande nommée « ctln » (abréviation de <strong>C</strong>ons<strong>t</strong>e<strong>l</strong>latio<strong>n</strong>)</p>
<p style="text-align: center;"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-3.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Commande &quot;ctln&quot;" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-3.png" alt="Commande &quot;ctln&quot;" width="454" height="229" border="0" /></a></p>
<p>Cette commande vous permettra de créer de nouveau package, les tester et déployer en local ou directement sur un serveur Constellation.</p>
<h2>Créer son premier package Python</h2>
<p>Pour créer un nouveau package utilisez simplement la commande “create” en spécifiant le nom de votre package. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">ctln create &lt;mon projet&gt;</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-4.png"><img class="colorbox-5341"  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 nouveau package" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-4.png" alt="Création d'un nouveau package" width="354" height="234" border="0" /></a></p>
<p align="left">Et voilà, votre package “MyFirstPackage” est créé dans le répertoire du même nom !</p>
<h3 align="left">Template de package</h3>
<p>Chaque package est créé à partir d’un template. Vous pouvez lister les templates avec la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln template list</pre><p></p>
<p>A l’heure où est écrit cet article il y a deux templates de type “projet” :</p>
<ul>
<li>Python Base Template : le template de base (créé par défaut)</li>
<li>Python Demo template : package Python avec du code de “demo”</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-5.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Listing des templates de package" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-5.png" alt="Listing des templates de package" width="354" height="234" border="0" /></a></p>
<p align="left">Lorsque vous créez un package avec la commande “ctln create”, le template “python-base” est sélectionné par défaut.</p>
<p align="left">Vous pouvez cependant préciser l’Id du template à utiliser dans la commande “ctln create”. Par exemple pour créer un package sur base du template de demo :</p>
<p></p><pre class="crayon-plain-tag">ctln create &lt;mon projet&gt; python-demo</pre><p></p>
<p align="left">Il y a aussi des templates de type “item”, c’est à dire des templates pour les scripts que vous allez rajouter par la suite à votre package.</p>
<h3 align="left">Mise à jour du template</h3>
<p align="left">Comme vous le constatez dans le listing des templates ci-dessus, chaque template comporte un numéro de version car ils sont amenés à évoluer notamment en cas de mise à jour des librairies Constellation.</p>
<p align="left">Avec le SDK Constellation Visual Studio, les nouvelles versions des librairies sont diffusées avec NuGet. Ici avec cet outil en ligne de commande, les nouvelles librairies sont embarquées dans des mises à jour des templates.</p>
<p align="left">Ainsi pour mettre à jour vos packages, vous pouvez tout simplement mettre à jour le template de votre package par la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln update</pre><p></p>
<p align="left">Cette commande doit être lancé depuis le répertorie racine de votre package.</p>
<p align="left">Notez également que la mise à jour est “intelligente” dans la mesure où elle n’écrase pas vos fichiers de configuration, le manifeste du package ou encore vos scripts Python.</p>
<h2>Développer son package</h2>
<p>Le développement de package Python est <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Creez_le_package_Python_dans_Visual_Studio">expliqué dans cet article</a>. Bien que l&rsquo;article se base sur Visual Studio, l&rsquo;API Python est strictement identique.</p>
<p>Ainsi, pour rappel, vous avez à la racine de votre projet le fichier « <a href="/concepts/package-manifest/">PackageInfo.xml</a> » qui contient l&rsquo;ensemble des informations de votre package (<a href="/concepts/package-manifest/">plus de détail ici</a>) mais aussi le fichier de configuration nommé « PythonPackageHost.exe.config » qui contient la liste des scripts Python à lancer.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-7.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Structure du package" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-7.png" alt="Structure du package" width="354" height="234" border="0" /></a></p>
<p>Les <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">bases </a>du développement d&rsquo;un script Constellation Python <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">sont expliquées ici</a>.</p>
<p>Pour faciliter le développement, vous n&rsquo;êtes pas obligé de modifier manuellement le fichier de configuration pour gérer les scripts Python. Pour cela vous avez à disposition différentes commandes pour lister, ajouter, renommer ou supprimer des scripts.</p>
<h3>Lister les scripts du package</h3>
<p>Les scripts Constellation Python lancés par votre package peuvent être listés par la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript list</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-6.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Listing des scripts Python du package" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-6.png" alt="Listing des scripts Python du package" width="354" height="234" border="0" /></a></p>
<p style="text-align: left;">Ici votre package « MyFirstPackage » ne contient qu&rsquo;un seul script nommé « Main.py » dans le répertoire Scripts du package.</p>
<h3 style="text-align: left;">Ajouter des scripts Python</h3>
<p style="text-align: left;">Pour ajouter un script Constellation Python, vous pouvez soit ajouter un script existant sur votre système de fichier dans votre package ou soit créer un nouveau script à partir d&rsquo;un modèle (template).</p>
<h4 style="text-align: left;">Ajouter un script existant</h4>
<p style="text-align: left;">Pour un script existant, il suffit d&rsquo;utiliser l&rsquo;option « add » :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript add &lt;filepath&gt; [--filename=&lt;name&gt;]</pre><p></p>
<p>Vous devez spécifier le chemin complet vers votre fichier à ajouter (filepath) et optionnellement le nom du fichier une fois ajouté dans votre package.</p>
<p>Par exemple la commande ci-dessous ajoutera dans votre package le fichier « ~/demo/MyDemo.py » sous le nom « DemoSeb.py »</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript add ~/demo/MyDemo.py --filename=DemoSeb.py</pre><p></p>
<h4 style="text-align: left;">Ajouter de nouveau script</h4>
<p style="text-align: left;">L&rsquo;action la plus courante sera de créer un nouveau script Python dans votre package avec l&rsquo;action « new » via la commande suivante :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript new &lt;filename&gt; [&lt;item_template_name&gt;]</pre><p></p>
<p>Vous devez obligatoirement spécifier le nom du fichier (filename) avec ou sans l’extension .py (rajoutée automatiquement). Le script sera créé dans le répertoire Scripts de votre package et automatiquement déclaré dans la configuration.</p>
<p>Vous pouvez également spécifier l&rsquo;identifiant du template à utiliser. Les templates peuvent être listés avec la commande « <em>ctln template list</em> » comme vu ci-dessus.  A l&rsquo;heure où cet article est écrit il y a trois templates de type « item » :</p>
<ul>
<li>« python-base » : le template de base</li>
<li>« python-demo »  : un template avec du code de demonstration</li>
<li>« python-empty »  : un squelette vide</li>
</ul>
<p>Si vous ne précisez pas l&rsquo;identifiant, c&rsquo;est le template « python-base » qui sera utilisé.</p>
<p>Par exemple ajoutons à notre package un deuxième script (avec le template de base) :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript new Main2</pre><p></p>
<p>Rajoutons également un troisieme scriupt de démonstation en utilisant le template de demo (python-demo) :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript new DemoConstellation python-demo</pre><p></p>
<p>Notre package a maintenant trois scripts : Main.py (créé avec le template du package), Main2.py (créé ci-dessus avec le template de base), DemoConstellation.py (créé avec le template de demo) :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-8.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Ajout de scripts Python" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-8.png" alt="Ajout de scripts Python" width="354" height="226" border="0" /></a></p>
<h3 style="text-align: left;">Renommer ou supprimer des scripts</h3>
<p style="text-align: left;">Vous pouvez renommer les scripts du package avec l’option “rename”. Par exemple renommons “DemoConstellation” par “Demo” (les extensions “.py” sont optionnelles) :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript rename DemoConstellation Demo</pre><p></p>
<p><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-9.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; margin-right: auto; border-width: 0px;" title="Renommer des scripts" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-9.png" alt="Renommer des scripts" width="354" height="226" border="0" /></a></p>
<p>Pour supprimer des scripts il suffit d’utiliser l’option “remove” en spécifiant le nom du script (avec ou sans son extension .py).</p>
<p>Par exemple supprimons les deux fichiers “Main2.py” et “Demo.py” que nous avons ajoutés (et renommés) ci-dessus :</p>
<p></p><pre class="crayon-plain-tag">ctln pyscript remove Main2
ctln pyscript remove Demo</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-10.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Supprimer des scripts" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-10.png" alt="Supprimer des scripts" width="354" height="226" border="0" /></a></p>
<h3>Editer les scripts Python du package</h3>
<p>Une fois vos scripts ajoutés, renommés ou supprimés avec la commande “ctln”, libre à vous d’utiliser votre éditeur de texte préféré pour éditer votre code !</p>
<p>Par exemple de le cas ici présent d’un accès SSH Linux, je pourrais utiliser “nano” ou “vim” (ou encore Notepad++ sur ma station WIndows via un tranfert SCP avec WInSCP par exemple).</p>
<p></p><pre class="crayon-plain-tag">nano Scripts/Main.py</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-11.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Edition des scripts Python avec Nano" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-11.png" alt="Edition des scripts Python avec Nano" width="354" height="226" border="0" /></a></p>
<p align="left">Ici le script “Main” défini une fonction de démarrage (<em>OnStart</em>) et une fonction de fermeture (<em>OnExit</em>). Pour rappel, les <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">bases </a>de l’API Constellation Python <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">sont expliquées ici</a>.</p>
<p align="left">Notez simplement que dans cet exemple, le WriteInfo déclenché au démarrage (<em>OnStart</em>) écrit un log dasn Constellation de type “Information” en concaténant dans un message textuel les propriétés suivantes :</p>
<ul>
<li>
<div align="left">“<span style="text-decoration: underline;">PackageName</span>” : le nom du package</div>
</li>
<li>
<div align="left">“<span style="text-decoration: underline;">SentinelName</span>” : le nom de la sentinelle sur laquelle est déployée ce package</div>
</li>
<li>
<div align="left">“<span style="text-decoration: underline;">IsStandAlone</span>” : un booléen indiquant si le package tourne de façon indépendante ou hébergée au sein d’une sentinelle</div>
</li>
<li>
<div align="left">“<span style="text-decoration: underline;">IsConnected</span>” : un booléen indiquant si le package est connecté ou non à une Constellation</div>
</li>
</ul>
<h2>Tester son package</h2>
<p>Pour tester notre package en local, il suffit de lancer la commande suivante :</p>
<p></p><pre class="crayon-plain-tag">ctln run</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-12.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Démarrage du package en local" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-12.png" alt="Démarrage du package en local" width="354" height="215" border="0" /></a></p>
<p>Comme vous pouvez le lire sur la console, le nom de la sentinelle affichée est “local sandbox” étant donné que la propriété <em>IsStandalone</em> est <em>true</em> (la propriété <em>SentinelName</em> est None). En effet votre package n’est pas déployé/démarré par Constellation sur une véritable sentinelle. Il est juste démarré en “standalone” par la commande “run”.</p>
<p>De plus la propriété “<em>IsConnected</em>” est <em>false</em> car votre package n’est pas connecté à une Constellation.</p>
<p>Vous pouvez donc tester des éléments de base de votre package mais de façon déconnecté, il manquera donc plusieurs fonctionnalités (les logs produits resterons local dans votre console, pas d&rsquo;accès aux settings hormis ceux déclarés en local, la publication ou consommation de StateObjects sera impossible tout comme l’invocation ou l&rsquo;exposition de MessageCallbacks).</p>
<p>Pour tester votre package complètement, il est possible de le lancer en local tout en le connectant à une Constellation.</p>
<p>Tout d&rsquo;abord, il faudra déclarer des serveurs Constellation dans l&rsquo;outil <em>ctln</em>.</p>
<h3>Ajouter et gérer des serveurs Constellation</h3>
<p>Les commandes sont les suivantes :</p>
<p></p><pre class="crayon-plain-tag">ctln server list
ctln server (add | set) &lt;name&gt; --url=&lt;url&gt; --accesskey=&lt;key&gt;
ctln server (add | set) &lt;name&gt; --url=&lt;url&gt; --username=&lt;user&gt;
ctln server check &lt;name&gt;
ctln server remove &lt;name&gt;</pre><p></p>
<p>Vous pouvez lister les serveurs, ajouter ou mettre à jour des serveurs avec la clé d’accès ou un couple login/password, tester la connectivité ou supprimer des serveurs.</p>
<p>Par exemple je dispose d’une Constellation installée à l’adresse : <a title="http://pc-seb.ajsinfo.loc:8088" href="http://pc-seb.ajsinfo.loc:8088">http://pc-seb.ajsinfo.loc:8088</a>. Un credential basé sur le couple login/password “admin/seb” a été configuré. Je peux donc ajouter ce serveur que je nommerai ici “pc-seb” via la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln server add pc-seb --url=http://pc-seb.ajsinfo.loc:8088 --username=admin</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-13.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Ajout de serveur Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-13.png" alt="Ajout de serveur Constellation" width="354" height="215" border="0" /></a></p>
<p>Le serveur ajouté est testé au moment de l’ajout mais vous pouvez à tout moment tester la connectivité vers cette Constellation avec la commande “<em>ctln server check</em>”. Par exemple pour tester la Constellation nommée “pc-seb” :</p>
<p></p><pre class="crayon-plain-tag">ctln server check pc-seb</pre><p></p>
<h3>Tester son package dans Constellation</h3>
<p>Maintenant que nous avons ajouté un serveur Constellation dans l’outil, nous pouvons relancé notre package en le connectant à notre Constellation nommée “pc-seb” via la commande :</p>
<p></p><pre class="crayon-plain-tag">ctln run --server=pc-seb</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-14.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Démarrage du package en local mais connecté à un serveur Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-14.png" alt="Démarrage du package en local mais connecté à un serveur Constellation" width="354" height="215" border="0" /></a></p>
<p align="left">Le package démarre toujours dans la « sandbox locale » (<em>IsStandalone = true</em>) mais cette fois ci il est connecté à ma Constellation nommée « pc-seb » (<em>IsConnected = true</em>).</p>
<p align="left">D’ailleurs en lançant la Console Constellation je peux maintenant suivre en temps réel les logs de ce package, les StatesObjects qu’il produit ou encore les MessageCallbacks qu’il expose.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-15.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Connexion du package avec sa Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-15.png" alt="Connexion du package avec sa Constellation" width="354" height="208" border="0" /></a></p>
<h2>Publier son package</h2>
<p>Une fois le package développé et testé, il ne reste plus qu’à le packager pour pouvoir le déployer dans Constellation.</p>
<p>Vous pouvez soit le packager dans un fichier en local (que vous pourrez uploader sur une Constellation ou échanger avec d&rsquo;autre) ou soit le déployer directement dans une Constellation référencée dans l&rsquo;outil.</p>
<p>Par exemple pour publier ce package dans un fichier local dans le répertoire “/home/pi” :</p>
<p></p><pre class="crayon-plain-tag">ctln publish --output=/home/pi</pre><p></p>
<p>Maintenant, pour déployer ce même package directement sur une Constellation, il suffit simplement de spécifier le nom du serveur Constellation enregistré sur la commande “publish”.</p>
<p>Par exemple pour publier ce package sur la Constellation nommée ici “pc-seb” :</p>
<p></p><pre class="crayon-plain-tag">ctln publish pc-seb</pre><p></p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-16.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Publication d'un package sur une Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-16.png" alt="Publication d'un package sur une Constellation" width="354" height="215" border="0" /></a></p>
<p align="left">En vous rendant sur le <a href="/constellation-platform/constellation-console/package-repository/">Package Repository</a> de votre Console Constellation, votre package fraîchement publié sera prêt à être <a href="/constellation-platform/constellation-console/gerer-packages-avec-la-console-constellation/#Deployer_un_package">déployé sur vos sentinelles Windows ou Linux</a> de votre Constellation.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2017/09/image-17.png"><img class="colorbox-5341"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Package Repository" src="https://developer.myconstellation.io/wp-content/uploads/2017/09/image_thumb-17.png" alt="Package Repository" width="354" height="268" border="0" /></a></p>
<h2>Next steps</h2>
<p>Pour en savoir plus sur le développement de package en Python :</p>
<ul>
<li>Retour sur <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Les_bases">les bases</a> de l’API Python  (<a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Produire_des_logs">produire des logs</a>, <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Acces_aux_settings">accéder aux settings</a>, <a href="/getting-started/creez-votre-premier-package-constellation-en-python/#Publier_des_StateObjects">publier des StateObjects</a>)</li>
<li><a href="/client-api/python-api/messagecallbacks-exposer-des-methodes-python/">Exposer vos fonctions</a> Python dans Constellation (les MessageCallbacks)</li>
<li><a href="/client-api/python-api/envoyer-des-messages-et-invoquer-des-messagecallbacks-en-python/">Invoquer des MessageCallbacks</a> des autres packages de votre Constellation en Python</li>
<li><a href="/client-api/python-api/consommer-des-stateobjects-en-python/">Consommer les StateObjects</a> de votre Constellation</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/">Créer, tester et déployer des packages Python en ligne de commande</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/python-api/developper-avec-le-package-tools-cli/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Utiliser Lua sur NodeMCU pour connecter des ESP8266 à Constellation</title>
		<link>https://developer.myconstellation.io/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/</link>
					<comments>https://developer.myconstellation.io/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 23 Aug 2016 13:21:29 +0000</pubDate>
				<category><![CDATA[Arduino / ESP API]]></category>
		<category><![CDATA[StateObject]]></category>
		<category><![CDATA[WriteLog]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[Virtuel]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[Lua]]></category>
		<category><![CDATA[NodeMCU]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2465</guid>

					<description><![CDATA[<p>Développer sur ESP8266 en Lua avec NodeMCU Développer des applications natives sur ESP peut être assez compliqué pour celui qui ne connait pas le développement bas niveau ! NodeMCU a eu l’idée de créer un firmware ESP8266 embarquant eLua, un</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/">Utiliser Lua sur NodeMCU pour connecter des ESP8266 à Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Développer sur ESP8266 en Lua avec NodeMCU</h3>
<p>Développer des applications natives sur ESP peut être assez compliqué pour celui qui ne connait pas le développement bas niveau !</p>
<p style="text-align: center;"><img loading="lazy" class="alignnone wp-image-4491 size-full colorbox-2465" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/nodemcu-style5-150px.png_150x150.png" alt="" width="100" height="100" /></p>
<p><a href="http://nodemcu.com/index_en.html">NodeMCU</a> a eu l’idée de créer un firmware ESP8266 embarquant eLua, un interpréteur Lua très minimaliste pour système embarqué. Grace à ce firmware vous pouvez développer des programmes pour votre ESP très facilement en Lua.</p>
<p>Concrètement il faut commencer par flasher votre ESP avec le firmware NodeMCU en utilisant un outil comme ESP Flash Download (<a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/">voir ici</a>). Vous pouvez télécharger le firmware directement sur le <a href="https://github.com/nodemcu/nodemcu-firmware">GitHub de NodeMCU</a> ou bien sur <a href="http://nodemcu-build.com/">http://nodemcu-build.com/</a>  pour compiler son firmware à la demande en personnalisant différentes options (branche à compiler, modules à inclure, support ou non du SSL, activation du mode debug, etc..).</p>
<p>Une fois installé utilisez l’outil <a href="https://esp8266.ru/esplorer/">Esplorer</a>, une application Java (compatible Linux/Windows et Mac OS) pour éditer les scripts Lua directement depuis le système de fichier de votre ESP.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-5-1.png"><img class="colorbox-2465"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image-5" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-5_thumb.png" alt="image-5" width="354" height="195" border="0" /></a></p>
<p>A gauche vous retrouverez l’éditeur, à droite la sortie de votre ESP. Chaque fichier est enregistré dans le système de fichier de votre ESP avant d’être exécuté.</p>
<p>Par exemple pour se connecter au Wifi :</p>
<p></p><pre class="crayon-plain-tag">print("Démarrage")
wifi.setmode(wifi.STATION)
print("set mode=STATION (mode="..wifi.getmode()..")")
wifi.sta.config{ssid="MON RESEAU WIFI", pwd="Ma clé Wifi"}

tmr.alarm(0, 1000, 1, function()
   if wifi.sta.getip() == nil then
      print("Connecting to AP...")
   else
      print("Connected! IP: ",wifi.sta.getip())
      tmr.stop(0)
   end
end)</pre><p></p>
<p>On commence par définir le mode Wifi à Station (client) puis on se connecte en spécifiant le SSID et la clé Wifi. Ensuite on lance une tache qu’on exécute sur le timer « 0 » (vous pouvez aller de 0 à 6), à une seconde d’intervalle (1000ms) de façon répétitive afin de récupérer l’IP. Si la connexion n’est pas encore effective on affiche le message « Connecting » sinon on coupe le timer « 0 » et on affiche l’adresse IP de votre ESP.</p>
<p>Pour plus d’information je vous invite à lire ou relire cet article : <a href="http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/">http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/</a></p>
<h3>Connexion à Constellation</h3>
<p>Commencez tout d’abord par télécharger la librairie “<em>Constellation pour NodeMCU</em>” et transférez les fichiers du fichier ZIP sur votre ESP avec Esplorer.</p>

<p>Créez ensuite un script Lua en incluant cette librairie afin d&rsquo;initialiser le client Constellation avec l’adresse du serveur, votre Sentinelle &amp; package virtuel ainsi que la clé d’accès :</p>
<p></p><pre class="crayon-plain-tag">local constellation = require("constellation")
constellation.init("constellation.monserveur.com", 8088, "MyVirtualSentinel", "MyVirtualPackage", "123456789")</pre><p></p>
<h3>Fonctionnalités de base</h3>
<p>Vous pouvez écrire dans les logs Constellation grâce à la méthode “writeLog”. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeLog("Je suis pret avec " .. node.heap())</pre><p></p>
<p>Par défaut les logs sont envoyés comme “Information”, mais vous pouvez spécifier “Warn” ou “Error” dans le 2ème arguments de cette méthode :</p>
<p></p><pre class="crayon-plain-tag">constellation.writeLog("Ceci est un warning", "Warn")
constellation.writeLog("Ceci est une erreur", "Error")</pre><p></p>
<p>Vous pouvez également récupérer les settings de votre package virtuel du serveur Constellation avec la méthode “getSettings” :</p>
<p></p><pre class="crayon-plain-tag">constellation.getSettings(function(messages)
      print("Settings received :")
      for k,v in pairs(messages) do
          print(" -&gt; " .. k .. " = " .. v)
      end        
  end)</pre><p></p>
<h3>Publier des StateObjects</h3>
<p>Pour publier un StateObject, vous disposez de la méthode “push” prenant en paramètre le nom et la valeur. Dans la version 1.0 le “lifetime”, “type” ou les “métadatas” ne sont pas supportés.</p>
<p>Vous pouvez publier soit des types simples, par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.push("Lux", math.floor(lux))</pre><p></p>
<p>Soit des types complexes, c’est à dire des objets formatés en JSON. Vous pouvez formater vous même vos objets par concaténation :</p>
<p></p><pre class="crayon-plain-tag">constellation.push("Lux", "{ Broadband:" .. broadband .. ", IR:" .. ir .. ", Lux:" .. math.floor(lux) .. "}")</pre><p></p>
<p>Ou bien via le module Lua “cjson” :</p>
<p></p><pre class="crayon-plain-tag">constellation.push("Lux", cjson.encode({ Broadband=broadband, IR=ir, Lux= math.floor(lux) }))</pre><p></p>
<h3>Recevoir des messages</h3>
<p>Vous pouvez également recevoir des messages sur votre ESP8266 en enregistrant une fonction “callback” qui sera invoquée à chaque message reçu.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">constellation.subscribeToMessage(function(message)
    print(message["Sender"]["FriendlyName"], message["Key"], message["Data"][2])  
    if message["Key"] == "Restart" then
        node.restart()
    end        
end)</pre><p></p>
<p>Dans cette première version de la librairie la description des messages callback (<em>Package Descriptor</em>) n’est pas supportée.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/">Utiliser Lua sur NodeMCU pour connecter des ESP8266 à 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/arduino-esp-api/utiliser-lua-sur-nodemcu-pour-connecter-des-esp8266/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[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>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[group]]></category>
		<category><![CDATA[Request]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Subscribe]]></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>
		<item>
		<title>L&#8217;interface REST « Management »</title>
		<link>https://developer.myconstellation.io/client-api/rest-api/interface-rest-management/</link>
					<comments>https://developer.myconstellation.io/client-api/rest-api/interface-rest-management/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 23 Sep 2016 21:19:38 +0000</pubDate>
				<category><![CDATA[REST API]]></category>
		<category><![CDATA[Repository]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[RecoveryOptions]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[group]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[Licence]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2939</guid>

					<description><![CDATA[<p>L’interface REST “Management” (ou Management API) fournit des opérations permettant de configurer la Constellation : Gestion des sentinelles Gestion des packages Gestion des groupes Gestion des settings Gestion des RecoveryOptions Gestion des credentials et autorisations Gestion du Package Repository et</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/rest-api/interface-rest-management/">L&rsquo;interface REST « Management »</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>L’interface REST “Management” (ou Management API) fournit des opérations permettant de configurer la Constellation :</p>
<ul>
<li>Gestion des sentinelles</li>
<li>Gestion des packages</li>
<li>Gestion des groupes</li>
<li>Gestion des settings</li>
<li>Gestion des RecoveryOptions</li>
<li>Gestion des credentials et autorisations</li>
<li>Gestion du Package Repository et upload de package</li>
<li>Gestion de la licence</li>
<li>Lire / Ecriture du fichier de configuration</li>
<li>Récupération du numéro de version du serveur</li>
<li>Rechargement et déploiement de la configuration</li>
</ul>
<h3>Généralités</h3>
<h4>Construction de l’URL</h4>
<p>L’URL est :  &lt;Root URI&gt;/rest/management/&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="https://developer.myconstellation.io/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/management/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>Dans le cas de l’API “Management”, la “SentinelName” est “Management” et le “PackageName” est le nom de votre choix que l’on considère comme un “FriendlyName”. Typiquement le “FriendlyName” est par exemple le nom de l’application/page qui se connecte.</p>
<p>L’AccessKey doit bien sûr être déclaré et activé sur le serveur. De plus elle doit avoir le droit  d’utiliser l’API de Management, soit depuis la <a href="/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">Console Constellation</a> ou soit directement dans le <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">fichier de configuration</a> en ajoutant l’attribut “<a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">enableManagementAPI</a>”.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-121.png"><img class="colorbox-2939"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-116.png" alt="image" width="240" height="192" border="0" /></a></p>
<p>Ainsi chaque appel aura le format suivant :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/&lt;action&gt;?SentinelName=Management&amp;PackageName=&lt;Friendly name&gt;&amp;AccessKey=&lt;access key&gt;&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/management/CheckAccess?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Récupérer la version du serveur</h4>
<p>Pour connaitre la version du serveur Constellation, vous pouvez invoquer l’action “/server/version”.</p>
<ul>
<li>Action : “/server/version” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/server/version?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h3>Edition du fichier de configuration</h3>
<h4>Lire le fichier de configuration</h4>
<p>Vous pouvez récupérer le contenu entier du fichier de configuration de votre Constellation en invoquant l’action ”/configuration”</p>
<ul>
<li>Action : “/configuration” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/configuration?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Ecrire le fichier de configuration</h4>
<p>Vous pouvez également réécrire le fichier de configuration en postant le nouveau contenu sur la même URL.</p>
<ul>
<li>Action : “/configuration” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête : le fichier de configuration XML<!--EndFragment--></li>
</ul>
<p>Le serveur vérifiera le bon format du fichier XML avant d’écraser le fichier de configuration existant par votre nouvelle version. Vous devrez ensuite recharger la configuration pour appliquer les modifications.</p>
<h3>Recharger et déployer la configuration</h3>
<p>Pour recharger le fichier de configuration vous devez invoquer l’action “/configuration/reload” :</p>
<ul>
<li>Action : “/configuration/reload ” (GET)</li>
<li>Paramètres :
<ul>
<li>deployConfiguration (optionnel – par défaut “false”) : indique si l’ordre de mise à jour doit être envoyé aux sentinelles et packages de la Constellation</li>
</ul>
</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/configuration/reload?deployConfiguration=true&amp;SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h3>La License Constellation</h3>
<p>Vous pouvez récupérer les caractéristiques de la licence affectée à votre serveur en invoquant l’action  “/license”.</p>
<ul>
<li>Action : “/license” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/license?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Vous pouvez également charger une nouvelle licence en utilisant le verbe “POST” sur cette action et en plaçant le contenu de la nouvelle licence dans le corps de la requête.</p>
<h3>Gestion du Package Repository</h3>
<h4>Lister le Package Repository</h4>
<p>Pour récupérer la liste des packages de le Package Repository :</p>
<ul>
<li>Action : “/packages” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/packages?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Récupérer un package</h4>
<p>Pour récupérer un package en particulier de votre Package Repository :</p>
<ul>
<li>Action : “/packages/{packageName}” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/packages/{packageName}?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Renommer un package</h4>
<p>Pour renommer un package de votre Package Repository vous devez poster un objet JSON contenant son nouveau nom :</p>
<ul>
<li>Action : “/packages/{packageName}” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : { « newName »: newName }</li>
</ul>
<h4>Supprimer un package</h4>
<p>Pour supprimer package de votre Package Repository :</p>
<ul>
<li>Action : “/packages/{packageName}” (DELETE)</li>
<li>Paramètres : aucun</li>
</ul>
<h4>Récupérer l’icone d’un package</h4>
<p>Pour récupérer l’icone d’un package de votre Package Repository :</p>
<ul>
<li>Action : “/packages/{packageName}/icon” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Vous obtiendrez l’icone au format “PNG”.</p>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/packages/{packageName}/icon?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Récupérer le schéma XSD d’un paramètre de configuration d’un package</h4>
<p>Chaque package peut avoir des settings. Ces settings peuvent être de plusieurs types (types simples, objet JSON ou XML). Chaque package doit (ou devrait) <a href="/concepts/package-manifest/#Informations_sur_les_Settings_du_package">déclarer la liste des settings</a> qu’il utilise dans son “<a href="/concepts/package-manifest/">Package Manifest</a>”.</p>
<p>Si le setting est de type XML (“<em>ConfigurationSection</em>” ou “<em>XmlDocument</em>”) il peut être lié à un schéma XSD pour décrire le format XML du setting en question.</p>
<p>L’action ci-dessous permet de récupérer ce schema XSD pour un setting d’un package de votre Package Repository.</p>
<ul>
<li>Action : ”/packages/{package}/settings/{settingName}/xsd ” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/packages/{packageName}}/settings/{settingName}/xsd?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Télécharger un package vers votre Package Repository</h4>
<p>Vous pouvez ordonner à votre serveur Constellation de télécharger un fichier vers le Package Repository.</p>
<p>Pour cela vous utiliserez l’action “/download-package” en spécifiant l’URL du fichier à télécharger.</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>Action : ”/download-package” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : { « url »: url}</li>
</ul>
</li>
</ul>
<p><!--EndFragment--></p>
<h4>Téléverser un package vers votre Package Repository</h4>
<p>Vous pouvez également envoyer un fichier vers votre Package Repository en utilisant l’action “/upload-package”.</p>
<ul>
<li>Action : ”/upload-package” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (multipart/form-data) : les fichiers à enregistrer dans votre Package Repository.</li>
</ul>
<h3>Les RecoveryOptions</h3>
<p>Les <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_recoveryOptions">Recovery Options</a> spécifient les options de récupération en cas de crash d’un package sur vos sentinelles.</p>
<p>Chaque package peut avoir ses propres options mais par défaut il hérite des options “globales”.</p>
<p>Pour récupérer ces options “globales” :</p>
<ul>
<li>Action : ”/configuration/recoveryoptions” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/configuration/recoveryoptions?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Vous pouvez également redéfinir ces options en postant sur cette même URI votre nouvel objet JSON :</p>
<ul>
<li>Action : ”/configuration/recoveryoptions” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : l’objet “RecoveryOptions” avec les nouvelles valeurs</li>
</ul>
<h3>Gestion des sentinelles</h3>
<h4>Lister les sentinelles</h4>
<p>Pour récupérer la liste des sentinelles de votre Constellation :</p>
<ul>
<li>Action : “/sentinels” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Ajouter ou modifier une sentinelle</h4>
<p>Pour ajouter ou modifier une sentinelle de votre Constellation :</p>
<ul>
<li>Action : “/sentinels” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : un objet JSON contenant deux propriétés :
<ul>
<li>“Name”  : le nom de la sentinelle</li>
<li>“Credential” : le nom du credential associé à cette sentinelle</li>
</ul>
</li>
</ul>
<h4>Supprimer une sentinelle</h4>
<p>Pour supprimer une sentinelle de votre Constellation :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}” (DELETE)</li>
<li>Paramètres : aucun</li>
</ul>
<h3>Gestion des packages et des settings</h3>
<h4>Lister les packages d’une sentinelles</h4>
<p>Pour récupérer la liste des packages (virtuels ou non) d’une sentinelle (virtuelle ou non) de votre Constellation :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Récupérer une instance d’un package</h4>
<p>Pour récupérer le détail d’une instance de package sur une sentinelle donnée :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages/{packageName}?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Ajouter ou modifier une instance d’un package</h4>
<p>Pour ajouter ou modifier un package sur une sentinelle de votre Constellation :</p>
<ul>
<li>Action : “/sentinels/{sentinel}/packages” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : un objet JSON contenant cinq propriétés :
<ul>
<li>“Name”: le nom de l’instance du package (obligatoire et unique)</li>
<li>“PackageFile” (facultatif) : le nom du fichier du package à utiliser dans le repository (<a href="https://developer.myconstellation.io/concepts/instance-package/">plus d’info</a>)</li>
<li>“Enable” (facultatif, par defaut <em>true</em>) : indique si le package est activé ou désactivé</li>
<li>“Credential” (facultatif, utilise par défaut du credential de sa sentinelle) : spécifie le <a href="https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">credential</a> que le package va utiliser pour s’authentifier sur le serveur Constellation</li>
<li>“AutoStart” (facultatif, par defaut <em>true</em>) : indique si le package doit automatiquement démarrer lorsque sa sentinelle démarre</li>
</ul>
</li>
</ul>
<h4>Supprimer une instance d’un package</h4>
<p>Pour supprimer un package sur une sentinelle de votre Constellation :</p>
<ul>
<li>Action : “/sentinels/{sentinel}/packages/{packageName}” (DELETE)</li>
<li>Paramètres : aucun</li>
</ul>
<h4>Options de récupération d’une instance d’un package</h4>
<p>Pour récupérer les options de récupération d’une instance d&rsquo;un package :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/recoveryoptions” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages/{packageName}/recoveryoptions?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Pour les redéfinir vous devez poster la nouvelle valeur de votre objet “RecoveryOptions” sur cette même URI.</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/recoveryoptions” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : l’objet “RecoveryOptions” avec les nouvelles valeurs</li>
</ul>
<h4>Groupes d’une instance d’un package</h4>
<p>Pour récupérer les <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Les_groupes">groupes d’une instance d’un package</a> :</p>
<ul><!--EndFragment--></ul>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/groups” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages/{packageName}/groups?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Utilisez cette même URI pour poster la nouvelle liste des groupes de votre instance :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/groups” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : la liste des groupes de votre instance<!--EndFragment--></li>
</ul>
<h4>Settings d’une instance d’un package</h4>
<p>Pour récupérer les settings d’une instance d’un package :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/settings” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages/{packageName}/settings?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Utilisez cette même URI pour poster le nouveau dictionnaire (clé/valeur) des settings :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/settings” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : le dictionnaire (clé/valeur) des settings de votre instance</li>
</ul>
<h3>Gestion des credentials et autorisations</h3>
<h4>Lister les credentials</h4>
<p>Pour récupérer la liste des credentials de votre Constellation :</p>
<ul>
<li>Action : “/credentials” (GET)</li>
<li>Paramètres :
<ul>
<li>includeAccessKeys (optionnel – par défaut “false”) : indique si vous souhaitez inclure les AccessKeys de chaque credentials</li>
</ul>
</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/credentials?includeAccessKeys=true&amp;SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Ajouter ou modifier un credential</h4>
<p>Pour ajouter ou modifier un credential de votre Constellation :</p>
<ul>
<li>Action : “/credentials” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : un objet JSON contenant six propriétés :
<ul>
<li>“Name” : le nom du credential</li>
<li>“AccessKey” : la clé d’accès du credential</li>
<li>“Enable” (<em>true</em> par défaut) : indique si le credential est activé ou désactivé</li>
<li>“EnableControlHub” (<em>false</em> par défaut) : indique si le credential peut se connecter sur le hub de contrôle (pour l’administration de la Constellation)</li>
<li>“EnableManagementAPI” (<em>false</em> par défaut) : indique si le credential peut se connecter à l’API de Management (pour l’édition de la configuration)</li>
<li>“EnableDeveloperAccess” (<em>false </em>par défaut) : indique si le credential peut utiliser la sentinelle virtuelle “Developer” pour debugger des packages (utilisé par le SDK Visual Studio)</li>
</ul>
</li>
</ul>
<h4>Supprimer un credential</h4>
<p>Pour supprimer un credential de votre Constellation :</p>
<ul>
<li>Action : “/credentials/{credentialName}” (DELETE)</li>
<li>Paramètres : aucun</li>
</ul>
<h4>Récupérer les autorisations d’un credential</h4>
<ul>
<li>Action : “/credentials/{credentialName}/authorizations” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Vous récupérerez un objet de type “<em>CredentialAuthorizations</em>“ sérialisé en JSON</p>
<h4>Définir les autorisations d’un credential</h4>
<ul>
<li>Action : “/credentials/{credentialName}/authorizations” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : l’objet <em>CredentialAuthorizations</em> sérialisé en JSON</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/rest-api/interface-rest-management/">L&rsquo;interface REST « Management »</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-management/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 

Served from: developer.myconstellation.io @ 2026-01-22 01:02:24 by W3 Total Cache
-->