<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://chez.jcdenis.fr/feed/rss2/xslt" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Jean-Christian Paul Denis - Mot-clé - portainer</title>
    <link>https://chez.jcdenis.fr/</link>
    <atom:link href="https://chez.jcdenis.fr/feed/tag/portainer/rss2" rel="self" type="application/rss+xml" />
    <description>Moment de vie d'un homme invisible.</description>
    <language>fr</language>
    <pubDate>Sun, 09 Nov 2025 09:31:14 +0100</pubDate>
    <copyright>Tous droits réservés © Jean-Christian Denis</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>Dotclear</generator>
          <item>
        <title>Ma domotique V : Node-RED</title>
        <link>https://chez.jcdenis.fr/post/2024/04/06/Ma-domotique-V-%3A-Node-RED</link>
        <guid isPermaLink="false">urn:md5:e533780ec0ac8a840b247347055050b7</guid>
        <pubDate>Sat, 06 Apr 2024 09:02:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>NRDomV2</category>
                          <category>docker</category>
                  <category>nodered</category>
                  <category>noeud</category>
                  <category>portainer</category>
                  <category>proxmox</category>
                  <category>vm</category>
                <description>&lt;p&gt;J'ai par le passé testé diffèrents logiciels de domotique comme par exemple Jeedom ou Home-Assistant pour ne citer qu'eux et un jour je me suis dit : ce n'est pas compliqué la domotique, c'est marche/arrêt, jour/nuit, on/off, je suis sure de pouvoir le faire.&lt;/p&gt; &lt;p&gt;Et je l'ai fait… et refait !&lt;br&gt;
&lt;br&gt;
J'aurai pu choisir n'importe qu'elle langage de programmation pour le faire, mais je suis fainéant et le temps me manque pour apprendre un nouveau langage, du coup je me suis rabattu sur Nore-RED, parfait pour moi, prendre des nœuds et les déplacer dans une fenêtre c'est à mon niveau. Je vous laisse &lt;a href=&quot;https://nodered.org/&quot; hreflang=&quot;en&quot; title=&quot;Node-RED&quot;&gt;visiter le site officiel&lt;/a&gt; pour savoir ce qu'est Node-RED. Parmi les avantages, une large palette de modules complémentaires, d'exemples, une facilité de bricolage, de débogage, la connexion native à MQTT et à bien d'autres outils utiles à ma domotique, etc...&lt;br&gt;
L'écriture de la première version du cœur de ma domotique en Node-RED m'a pris 1 an, la seconde version 4 mois. (Je ne l'ai pas encore terminé mais ça tourne en &lt;em&gt;prod&lt;/em&gt;.) donc même si c'est simple, ça prend du temps. Et encore je suis très loin de ce que je voudrais notamment un système d'ajout automatique de matériel, ça sera pour la prochaine version peut-être.&lt;br&gt;&lt;/p&gt;&lt;a href=&quot;https://chez.jcdenis.fr/public/domotique/nodered_admin_01.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;figure class=&quot;media-center&quot;&gt;&lt;img src=&quot;https://chez.jcdenis.fr/public/domotique/.nodered_admin_01_m.png&quot; alt=&quot;Node-Red admin 01&quot;&gt;&lt;figcaption&gt;Exemple d&amp;#039;interface d&amp;#039;administration Node-RED, avr. 2024&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;

&lt;h3&gt;Fonctionnement de ma domotique&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Lorsque dans le suite du billet ou même des prochains articles je parle du cœur (ou kernel) de ma domotique, ça sera le partie centrale du code, le flow sous Node-RED qui gère ma domotique.&lt;/em&gt;&lt;br&gt;
&lt;br&gt;
Comme rapidement évoqué dans le billets précédents, ma domotique est basée sur la transmission de messages à 4 niveaux. Le message est composé d'un chemin appelé &lt;strong&gt;topic&lt;/strong&gt; ou &lt;strong&gt;path&lt;/strong&gt; dans le cœur de ma domotique et ce topic propage une valeur correspondante. Par exemple, pour l'information d'une lampe en court de traitement dans le coeur, ce sera :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iotnode/douche/lumiere/plafonnier = true&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Le premier niveau n'est pas spécialement important (ou que rarement) il correspond à l'outil que génère ce topic, sa &lt;code&gt;source&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Le seconde niveau est la pièce de ma maison dans laquelle se situe l'élément, dans le cœur on l'appel &lt;code&gt;bucket&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le troisième niveau est le type d'élement, dans le coeur on l'appel &lt;code&gt;measurement&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le quatrième niveau est l'élement, dans le coeur on l'appel &lt;code&gt;field&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce qui donne :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;source / bucket / measurement / field = value&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A y regarder de plus près, ça ressemble à ce qu'on retrouve dans des outils comme &lt;strong&gt;InfluxDB&lt;/strong&gt; et &lt;strong&gt;Grafana&lt;/strong&gt;, et qu'on appelle des &lt;strong&gt;metric&lt;/strong&gt;, ce n'est pas par hasard car 100% des valeurs générées par ma domotique sont stockées dans une base de données InfluxDB de laquelle j'extrais de jolis graphiques grâce à Grafana. On en reparlera dans de prochains billets&lt;br&gt;
&lt;br&gt;
Le cœur de ma domotique va simplement faire une boucle avec ce topic et chaque élément relié au cœur va pouvoir lire ce message est l'utiliser si besoin. Par exemple, lorsque la lampe s'allume un nouveau minuteur va se lancer et tenter de l'éteindre dans xx minutes. Mais là ou cela devient fou c'est que ce même minuteur génère un message qui va être lu par un scenario qui à son tour dira de ne pas l'éteindre mais de prolonger le minuteur car il y a eu un mouvement dans la pièce, etc... Mais du coup, les boucles peuvent s'empiler et devenir difficile à gérer, par exemple pour la gestion du chauffage ou des volets avec de nombreux éléments à prendre en compte comme les ouvertures, la présence, l'heure, la température, la lumière etc... Du coup il faut quand même mettre des garde-fou en place pour éviter des boucles infinies. Finalement une idée simple fini en casse tête. Voila pour le préambule à la gestion de ma domotique, il faut simplement retenir qu'on fait une boucle avec un message.&lt;br&gt;
&lt;br&gt;
Un élément (ou metric) à l'entrée du cœur doit également suivre des règles bien précises. Il doit être enregistré dans le cœur avant de pouvoir être utilisé correctement. En effet un lampe peut-être simplement en tout ou rien, mais elle peut également être &lt;em&gt;dimmable&lt;/em&gt; (valeur entre 0 et 99 par exemple) il faut donc l'expliquer au cœur. Lorsqu'on enregistre un nouvel élément il doit donc renseigner :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sa pièce : &lt;code&gt;bucket&lt;/code&gt; (douche)&lt;/li&gt;
&lt;li&gt;son type : &lt;code&gt;measurement&lt;/code&gt; (lumiere)&lt;/li&gt;
&lt;li&gt;son nom : &lt;code&gt;field&lt;/code&gt; (plafonnier)&lt;/li&gt;
&lt;li&gt;son type de valeur : &lt;code&gt;format&lt;/code&gt; (boolean)&lt;/li&gt;
&lt;li&gt;sa valeur par défaut : &lt;code&gt;default&lt;/code&gt; (true)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avec ça le cœur saura comment nettoyer et retransmettre une représentation propre de l'élément. Par exemple si un élément tiers demande d'allumer la lampe avec un ordre &lt;code&gt;true&lt;/code&gt; mais que ma lampe est dimmable, le cœur saura transformer cette valeur en &lt;code&gt;99&lt;/code&gt; et la retransmettre.&lt;br&gt;
Dans la seconde version du cœur de ma domotique j'ai ajouté un début de gestion commune de certains appareils, en effet j'ai par exemple des interrupteurs connectés de même modèle un peu partout, donc au lieu répéter du code dans chaque pièce, j'utilise une base commune, pour cela j'ai ajouté dans l'enregistrement d'un élément la possibilité de renseigner un modèle :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;protocol&lt;/code&gt; : le protocole utilisé par l'élément (ex: zigbee)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt; : le model de l'élément (ex: snbz-02 pour un capteur zigbee)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; : l'identifiant dans le protocole  (zwave c'est un nombre, zigbee c'est arbitraire dans zigbee2mqtt, etc)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;option&lt;/code&gt; : une option entre 1 et 3, utile si un élément à deux fonctions identiques (ex double interrupteur) ou un changement de comportement (capteur d'ouverture sur un interrupteur Qubino)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avec ça on est quasi paré à toutes éventualités.&lt;br&gt;
&lt;br&gt;
On continue de s'éloigner du cœur et on va aller voir comment fonctionne un élément de ma domotique dans Node-RED.&lt;br&gt;
On vient de voir la première fonction de l'élement qui est d'enregistrer dans le cœur sa définition.&lt;br&gt;
La seconde fonction est de transmettre les informations du matériel vers le cœur. Pour cela j'ai simplifié la tache en ajoutant des portes de/vers chaque protocole de ma domotique dans Node-RED. En effet tous mes protocoles domotiques atterrissent dans MQTT il est donc simple de les lire dans Node-RED. Si je reprend l'exemple de ma lampe, son élément va se relier à l'entrée Zwave du cœur et lire les informations dont elle a besoin dans son topic dédié, comme l'état de la lampe dans &lt;code&gt;/zwave/10/37/0/currenValue&lt;/code&gt; qu'il va retransmettre au cœur dans &lt;code&gt;/device/douche/lumiere/plafonnier = true&lt;/code&gt;.&lt;br&gt;
La troisième fonction, vous l'aurez sans doute devinez, est transmettre les ordres du cœur vers le matériel. Ici on fait le travail inverse de la seconde fonction, on écoute le cœur pour attraper l'ordre d'allumer la lumière qui sera le message &lt;code&gt;/ionode/douche/lumiere/plafonnier = true&lt;/code&gt; et on le transmet à la sortie Zwave du cœur dans le message &lt;code&gt;/zwave/10/37/0/targetValue/set = true&lt;/code&gt;. La théorie est très simple.&lt;br&gt;
J'ai ajouté une quatrième fonction qui permet d'afficher dans une interface web ces informations. Pour ma lampe un bouton pour l'allumer ou l'éteindre. Node-RED a une extension dashboard qui est une interface web, encore une fois le travail est ici facilité. A noter que je n'ai pas poussé la mise en page de cette interface car pour moi la domotique doit fonctionner toute seule et être transparente au quotidien et de plus je n'ai pas assez de temps pour jouer avec cette partie design.&lt;br&gt;&lt;/p&gt;&lt;a href=&quot;https://chez.jcdenis.fr/public/domotique/nodered_dashboard_01.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;figure class=&quot;media-center&quot;&gt;&lt;img src=&quot;https://chez.jcdenis.fr/public/domotique/.nodered_dashboard_01_m.png&quot; alt=&quot;Node-RED dashboard2 exemple 01&quot;&gt;&lt;figcaption&gt;Exemple de dashboard Node-RED, avr. 2024&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;a href=&quot;https://chez.jcdenis.fr/public/domotique/nodered_dashboard_02.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;figure class=&quot;media-center&quot;&gt;&lt;img src=&quot;https://chez.jcdenis.fr/public/domotique/.nodered_dashboard_02_m.png&quot; alt=&quot;Node-RED dashboard2 exemple 02&quot;&gt;&lt;figcaption&gt;Exemple de dashboard Node-RED, avr. 2024&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;&lt;p&gt;&lt;br&gt;
Voila avec tout ça, un élément représentant un matériel physique (ou une partie de matériel) est géré dans le cœur de ma domotique.&lt;br&gt;
&lt;br&gt;
Maintenant commence le vrai rôle de la domotique, animer tout ça. Pour cela j'utilise des nœuds de scénario, que ce soit l'ouverture des volets, la gestion du chauffage, l'éclairage des escaliers, ou le rappel pour sortir les poubelles, le principe reste le même. Un scénario écoute les messages transmis en boucle par le cœur et va attraper ceux qui l'intéressent. Par exemple pour le volet du salon, je vais écouter les messages de mode Jour/Nuit, ceux des ouvertures de la baie vitrée, ceux de mouvement et même ceux du capteur de luminosité, ben oui si le soleil tape trop fort j'ajoure le volet ! Je ferais des billets plus précis plus tard avec des exemples concrets et complets, ici je présente juste le principe.&lt;br&gt;
&lt;br&gt;
Ce fût long et pourtant je n'ai quasi rien montré de concret du code. Je vais m'arrêter là pour ces premières explications, mais il y a bien d'autres choses dans ce cœur. Il y a les agendas, les assistants vocaux, les graphiques, un peu de configuration, etc. On verra si j'arrive à avancer dans mes billets de présentation pour pousser plus loin les explications…&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;Installation du server Node-RED&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Reportez vous aux billet précédents (&lt;a href=&quot;https://chez.jcdenis.fr/post/2024/04/02/Ma-domotique-III-%3A-Virtualisation&quot;&gt;ici&lt;/a&gt; et &lt;a href=&quot;https://chez.jcdenis.fr/post/2024/04/03/Ma-domotique-IV-%3A-MQTT&quot;&gt;là&lt;/a&gt; ) pour en savoir plus sur ma configuration Proxmox et Docker.&lt;/em&gt;&lt;br&gt;
&lt;br&gt;
On se rend dans le shell de notre serveur Proxmox et on créer notre machine virtuelle à partir du template docker et on lui adresse une IP fixe :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;qm clone 910 122 --name nodered
qm set 122 --ipconfig0 ip=10.1.4.122/23,gw=10.1.4.1&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br&gt;
On peut démarrer notre VM.&lt;br&gt;
Maintenant on se rend dans l'interface web de Portainer, on lie notre VM, et on ajoute Stack qui ressemble à ça :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-docker&quot;&gt;version: &amp;quot;3.8&amp;quot;
services:
  nodered:
    container_name: nodered
    image: nodered/node-red:latest
    restart: always
    environment:
      - TZ=Europe/Paris
    ports:
      - &amp;quot;80:1880&amp;quot;
      - &amp;quot;3456:3456&amp;quot;
    networks:
      - net
    volumes:
      - data:/data
networks:
  net:
volumes:
  data:&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br&gt;
On va modifier le mot de passe de Node-RED , comme pour MQTT cela se fait dans  le Docker. Pour cela on va dans la console Proxmox de la VM, et on ouvre une session docker :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker exec -it nodered /bin/bash&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On demande de hacher notre mot de passe avec :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;node-red admin hash-pw le_mot_de_passe&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On obtient en retour notre mot de passe crypté qu'il va falloir mettre dans le ficher de configuration de Node-Red. On retourne dans la console Proxmox (ou en SSH) de la VM et on va modifier la configuration de node-RED :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nano /var/lib/docker/volumes/nodered_data/_data/settings.js&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;le fichier doit ressembler à ça :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;module.exports = {
    flowFile: &amp;#039;flows.json&amp;#039;,
    credentialSecret: false,
    flowFilePretty: true,
    adminAuth: {
        type: &amp;quot;credentials&amp;quot;,
        users: [{
            username: &amp;quot;bob&amp;quot;,
            password: &amp;quot;le_mot_de_passe_crypté&amp;quot;,
            permissions: &amp;quot;*&amp;quot;
        }]
    },
    httpAdminRoot: &amp;#039;/admin&amp;#039;,
    httpNodeRoot: &amp;#039;/&amp;#039;,
    diagnostics: {
        enabled: true,
        ui: true,
    },
    runtimeState: {
        enabled: false,
        ui: false,
    },
    logging: {
        console: {
            level: &amp;quot;info&amp;quot;,
            metrics: false,
            audit: false
        }
    },
    contextStorage: {
        default: {
            module: &amp;quot;localfilesystem&amp;quot;
        },
        memoryOnly: {
            module: &amp;quot;memory&amp;quot;
        },
    },
    exportGlobalContextKeys: false,
    externalModules: {
    },
    editorTheme: {
        palette: {
        },
        projects: {
            enabled: false,
            workflow: {
                mode: &amp;quot;manual&amp;quot;
            }
        },
        codeEditor: {
            lib: &amp;quot;monaco&amp;quot;,
            options: {
            }
        },
        markdownEditor: {
            mermaid: {
                enabled: true
            }
        },
    },
    functionExternalModules: true,
    functionTimeout: 0,
    functionGlobalContext: {
    },
    ui: { path: &amp;quot;&amp;quot; },
    debugMaxLength: 1000,
    mqttReconnectTime: 15000,
    serialReconnectTime: 15000,
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Par rapport au fichier d'origine, on a ajouté le login, modifié les URI qui finiront par /admin pour la partie administration (la fenêtre de développement de Node-RED) et à la racine pour l'interface web. On indique également d'utiliser deux sortes de mémoire : une vive et une en fichier. (Qui va permettre de garder certaines valeurs lors d'un redémarrage, ou coupure de courant.)&lt;br&gt;
On relance le conteneur et notre instance Node-Red est accessible sur http://10.1.4.122/admin.&lt;br&gt;
&lt;br&gt;
Dans le prochain billet, on va faire une petite pause et &lt;a href=&quot;https://chez.jcdenis.fr/post/2024/04/06/Ma-domotique-VI-%3A-Pause&quot;&gt;parler plus généralement de la domotique&lt;/a&gt; et de ce qu'on peut en tirer.&lt;/p&gt;</description>
        
              </item>
          <item>
        <title>Ma domotique IV : MQTT</title>
        <link>https://chez.jcdenis.fr/post/2024/04/03/Ma-domotique-IV-%3A-MQTT</link>
        <guid isPermaLink="false">urn:md5:5fa13e9fe14197f23baac0c3b0d28c60</guid>
        <pubDate>Wed, 03 Apr 2024 21:24:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>NRDomV2</category>
                          <category>docker</category>
                  <category>mosquitto</category>
                  <category>mqtt</category>
                  <category>portainer</category>
                  <category>proxmox</category>
                  <category>VM</category>
                <description>&lt;p&gt;Le protocole MQTT est un des piliers de ma domotique, toutes les informations relatives la gestion de ma maison passent par lui.&lt;/p&gt; &lt;p&gt;MQTT signifie Message Queuing Telemetry Transport, c'est un protocole de messagerie publish-subscribe basé sur le protocole TCP/IP. Ses avantages sont sa rapidité, sa légèreté, la possibilité de gérer de multiple sessions, ou encore de retenir ou non les messages. Bref il est parfait pour la domotique.&lt;br&gt;
Chacun de mes protocoles domotique va publier ses messages vers un topic dédié du serveur MQTT central :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zigbee avec &lt;strong&gt;zigbee2mqtt&lt;/strong&gt; vers le topic /zigbee&lt;/li&gt;
&lt;li&gt;Zwave avec &lt;strong&gt;zwave-js-ui&lt;/strong&gt; vers le topic /zwave&lt;/li&gt;
&lt;li&gt;RfxCOM avec &lt;strong&gt;rfxcom2mqtt&lt;/strong&gt; vers le topic /rfxcom2mqtt&lt;/li&gt;
&lt;li&gt;TiC avec &lt;strong&gt;teleinfo2mqtt&lt;/strong&gt; vers le topic /telefinfo&lt;/li&gt;
&lt;li&gt;Bluetooth avec &lt;strong&gt;theengsgateway&lt;/strong&gt; vers le topic /ble&lt;/li&gt;
&lt;li&gt;Monitoring avec des scripts perso vers le topic /monitoring&lt;/li&gt;
&lt;li&gt;Noyau domotique Node-RED vers le topic /iotnode&lt;/li&gt;
&lt;li&gt;Assistant vocal local avec Rhasspy vers les topic /hermes et /rhasspy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et oui MQTT transporte même les échantillons audio !&lt;br&gt;
Chacun de ces protocoles domotiques est géré par un conteneur docker sur un VM dédié, cela permet de bien cloisonner les choses et de mettre en place, sauvegarder ou modifier uniquement la partie souhaiter sans casser le reste. Avec le temps je me suis rendu compte que de multiplier les VM ne surchargeait pas plus que ça le serveur Proxmox, couplé à des templates de VM, la mise en œuvre est ultra rapide.&lt;br&gt;
Un logiciel tel MQTT Explorer va permettre de facilement voir tout ce qu'il s'y passe.&lt;br&gt;&lt;/p&gt;&lt;a href=&quot;https://chez.jcdenis.fr/public/domotique/mqttexplorer_topic.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;figure class=&quot;media-center&quot;&gt;&lt;img src=&quot;https://chez.jcdenis.fr/public/domotique/.mqttexplorer_topic_m.jpg&quot; alt=&quot;MQTT Explorer - topic&quot;&gt;&lt;figcaption&gt;Exemple de topic dans le logiciel MQTT Explorer, mars 2024&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;&lt;p&gt;&lt;br&gt;
Le noyau domotique (que j'ai nommé iotnode) va écouter tous ces topics et en récupérer les informations utiles, les traiter et les republier en version propre sur le topic MQTT /ionode, j'ai ainsi une vue simple de l'état de ma domotique. Le noyau va également se charger de publier les ordres vers chacun de ces protocoles.&lt;br&gt;
Par exemple, le noyau va publier la valeur &lt;code&gt;true&lt;/code&gt; vers le topic  &lt;code&gt;/zwave/10/37/0/targetValue/set&lt;/code&gt; pour allumer une lampe. Et il va écouter le topic &lt;code&gt;/zwave/10/37/0/currentValue&lt;/code&gt; pour savoir si la lampe est allumée. Il va également reporter cette information dans le topic &lt;code&gt;/iotnode/douche/lumiere/plafonnier&lt;/code&gt; ce qui est plus lisible pour le commun des mortels :)&lt;br&gt;&lt;/p&gt;&lt;a href=&quot;https://chez.jcdenis.fr/public/domotique/mqttexplorer_message.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;figure class=&quot;media-center&quot;&gt;&lt;img src=&quot;https://chez.jcdenis.fr/public/domotique/.mqttexplorer_message_m.jpg&quot; alt=&quot;MQTT Explorer - message&quot;&gt;&lt;figcaption&gt;Exemple de valeur dans le logiciel MQTT Explorer, mars 2024&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;&lt;p&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;Installation du serveur MQTT&lt;/h3&gt;

&lt;p&gt;Dans &lt;a href=&quot;https://chez.jcdenis.fr/post/2024/04/02/Ma-domotique-III-%3A-Virtualisation&quot;&gt;le précédent billet sur la virtualisation&lt;/a&gt;, on a vu comment j'utilise mes machines virtuelles ainsi que l'installation du gestionnaire de Docker nommé Portainer. On va ici cloner un template de VM et utiliser Portainer pour installer notre Docker contenant le serveur MQTT.&lt;br&gt;
&lt;br&gt;
On se rend dans le shell de notre serveur Proxmox et on créer notre machine virtuelle à partir du template docker et on lui adresse une IP fixe :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;qm clone 910 121 --name mqtt
qm set 121 --ipconfig0 ip=10.1.4.121/23,gw=10.1.4.1&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br&gt;
On peut démarrer notre VM.&lt;br&gt;
Maintenant on se rend dans l'interface web de Portainer (cf billet précédent). Dans le menu de gauche &lt;strong&gt;Environements&lt;/strong&gt; ou clique en haut à droite sur &lt;strong&gt;Add environement&lt;/strong&gt;,.&lt;br&gt;&lt;/p&gt;&lt;a href=&quot;https://chez.jcdenis.fr/public/domotique/docker_mqtt_install_01.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;figure class=&quot;media-center&quot;&gt;&lt;img src=&quot;https://chez.jcdenis.fr/public/domotique/.docker_mqtt_install_01_m.png&quot; alt=&quot;Docker MQTT Install 01&quot;&gt;&lt;figcaption&gt;Portainer, menu ajout d&amp;#039;environnement, avr. 2024&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;&lt;p&gt;&lt;br&gt;
On choisie le type &lt;strong&gt;Docker Standalone&lt;/strong&gt; puis &lt;strong&gt;Start wizard&lt;/strong&gt;.&lt;br&gt;&lt;/p&gt;&lt;a href=&quot;https://chez.jcdenis.fr/public/domotique/docker_mqtt_install_02.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;figure class=&quot;media-center&quot;&gt;&lt;img src=&quot;https://chez.jcdenis.fr/public/domotique/.docker_mqtt_install_02_m.png&quot; alt=&quot;Docker MQTT Install 02&quot;&gt;&lt;figcaption&gt;Portainer, sélection nouvel environnement, avr. 2024&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;&lt;p&gt;&lt;br&gt;
Et on indique un nom et l'adresse de liaison qui sera l'IP de la VM sur le port 9001 et on clique sur &lt;strong&gt;Connect&lt;/strong&gt;. Rien besoin de faire sur la VM puisque notre template est déjà prêt.&lt;br&gt;&lt;/p&gt;&lt;a href=&quot;https://chez.jcdenis.fr/public/domotique/docker_mqtt_install_03.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;figure class=&quot;media-center&quot;&gt;&lt;img src=&quot;https://chez.jcdenis.fr/public/domotique/.docker_mqtt_install_03_m.png&quot; alt=&quot;Docker MQTT Install 03&quot;&gt;&lt;figcaption&gt;Portainer, configuration agent, avr. 2024&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;&lt;p&gt;&lt;br&gt;
Notre VM Docker est désormais liée à Portainer d'où on gèrera le conteneur.&lt;br&gt;
Maintenant on va créer notre conteneur MQTT toujours depuis Portainer. Pour cela on se rend dans le menu &lt;strong&gt;Stacks&lt;/strong&gt; de notre environnement fraichement créé, et on clique sur &lt;strong&gt;Add stack&lt;/strong&gt;, on lui donne un nom et on va remplir la fenêtre d'édition avec la configuration nécessaire à notre Docker MQTT :&lt;/p&gt;&lt;a href=&quot;https://chez.jcdenis.fr/public/domotique/docker_mqtt_install_04.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;figure class=&quot;media-center&quot;&gt;&lt;img src=&quot;https://chez.jcdenis.fr/public/domotique/.docker_mqtt_install_04_m.png&quot; alt=&quot;Docker MQTT Install 04&quot;&gt;&lt;figcaption&gt;Portainer, ajout de stack, avr. 2024&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;&lt;p&gt;&lt;br&gt;
Le configuration sera celle ci-dessous. Puis on clique sur &lt;strong&gt;Update the stack&lt;/strong&gt;. Notre serveur est en fonction.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-docker&quot;&gt;version: &amp;quot;3.8&amp;quot;
services:
  mosquitto:
    image: eclipse-mosquitto:latest
    container_name: mqtt
    restart: always
    volumes:
      - config:/mosquitto/config
      - data:/mosquitto/data
      - log:/mosquitto/log
    ports:
      - 1883:1883
      - 8883:9001
volumes:
  config:
  data:
  log:&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br&gt;
Quelques explications, on lui donne l'image docker du serveur mqtt qu'on désire &lt;code&gt;eclipse-mosquitto:latest&lt;/code&gt;, le conteneur se nommera &lt;code&gt;mqtt&lt;/code&gt;, il redémarrera dans tous les cas, et il écoutera sur les ports &lt;code&gt;1883&lt;/code&gt; et &lt;code&gt;8883&lt;/code&gt; (le port 9001 étant déjà utilisé par l'agent Portainer), ensuite on lui indique les différents volumes à utiliser, ici &lt;code&gt;config&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt; et &lt;code&gt;log&lt;/code&gt;. Ces volumes seront accessible dans la VM dans &lt;strong&gt;/var/lib/docker/volumes/mqtt_config/_data/xxx&lt;/strong&gt;. A noter qu'on va faire en sorte à chaque création de configuration que ce chemin d'accès soit identique pour toutes les VMs cela évite de chercher on se trouve les fichiers de config d'une installation à une autre. ET cela peut-être utile pour des sauvegardes, mais personnellement je sauvegarde la VM entière.&lt;br&gt;
On va aller modifier le fichier de configuration du serveur MQTT pour coller au besoin de notre domotique. Pour cela on se rend dans la console Proxmox de notre VM (ou par ssh) et on édite le fichier de configuration :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nano /var/lib/docker/volumes/mqtt_config/_data/mosquitto.conf&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Il doit contenir cela :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;listener 1883
listener 9001
protocol websockets
persistence true
persistence_location /mosquitto/data
allow_anonymous false
password_file mosquitto/config/mqtt_passwd&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pour faire simple, on écoute sur les port 1883 et 9001, ici on est dans le conteneur donc le port d'écoute est bien le 9001 à l'intèrieur de conteneur alors qu'à l'extèrieur on écoute le port 8883. On autorise les websockets. on interdit les connexions anonymes et on utilise un fichier pour les mots de passe de connexions. Ce fichier de mot de passe est encrypté par le serveur MQTT il faut donc passer par lui pour le créer, pour cela toujours depuis notre console VM, on lance une session docker :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker exec -it mqtt sh&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pour ajouter un login/mot de passe, on exécute la commande :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mosquitto_passwd mosquitto/config/mqtt_passwd un_login&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Il va nous demander un mot de passe pour ce login. Ensuite on sort de la session en tapant &lt;code&gt;exit&lt;/code&gt;.&lt;br&gt;
Pour prendre en compte ces changement on relance le conteneur MQTT depuis Portainer depuis le menu de notre environement &lt;strong&gt;Containers -&amp;gt; mqtt -&amp;gt; Restar&lt;/strong&gt;t.&lt;br&gt;
Voila notre serveur MQTT domotique prêt. Et vous incollable sur Portainer.&lt;br&gt;
Ne pas hésiter à se promener dans les menus de Portainer et voir tout ce qu'il est possible de faire comme mettre à jour le stack, une image ou modifier un conteneur.&lt;br&gt;
&lt;br&gt;
Dans le prochaine billet on va voir l'installation et le début de programmation du &lt;a href=&quot;https://chez.jcdenis.fr/post/2024/04/06/Ma-domotique-V-%3A-Node-RED&quot;&gt;cœur de ma domotique sous Node-RED&lt;/a&gt;.&lt;/p&gt;</description>
        
              </item>
      </channel>
</rss>
