<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://civade.com/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>Civade.com</title>
    <link>https://civade.com/</link>
    <atom:link href="https://civade.com/feed/rss2" rel="self" type="application/rss+xml" />
    <description></description>
    <language>fr</language>
    <pubDate>Mon, 06 Apr 2026 11:01:15 +0200</pubDate>
    <copyright>(c) Jean-Philippe Civade</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>Dotclear</generator>
          <item>
        <title>Clones Arduino Pro micro ne bootent pas si alimentés en externe sans branchement USB</title>
        <link>https://civade.com/post/2026/01/05/Clones-Arduino-Pro-micro-ne-bootent-pas-si-aliment%C3%A9s-en-externe-sans-branchement-USB</link>
        <guid isPermaLink="false">urn:md5:d13ea3d0200fb0ac6f41378b092a6590</guid>
        <pubDate>Mon, 05 Jan 2026 10:43:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Technologies</category>
                          <category>Arduino</category>
                  <category>DIY</category>
                  <category>Firmware</category>
                  <category>OpenSource</category>
                <description>&lt;p&gt;L'aduino pro micro est sympatique car petite et intègre la connexion USB native grace à l'ATMEGA32U4. Malheureusement j'ai découvert que les clones chinois, si ils fonctionnent très bien lorsqu'alimentés en USB, ne bootent pas correctement lorsqu'ils sont alimentés via via la broche Raw (6&amp;gt;12V) ou 5V. L'absence de connexion USB les empeche de booter correctement et elles restent bloquées avec les leds TX et RX allumées.&lt;/p&gt;          &lt;p&gt;&lt;img src=&quot;https://civade.com/images/promicro/ProMicro.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;Ceci est du au bootloader flashé par les chinois qui nécessite une connexion USB.&lt;/p&gt;


&lt;p&gt;Pour remédier à cela il faut flasher le bootloader officiel Sparkfun.  Cela se fait à l'aide d'un programmateur dédié connecté à votre pro micro.
Vous pouvez soit utiliser un programmateur spécialisé (ex: USBASP, 4€ sur Ali) ou le fabriquer à l'aide d'une carte arduino reprogrammée avec un sketche de programmateur (Exemples/11/ArduinoISP).
Personnellement je préfère la solution USBASP car elle dispose de conecteurs à 6 et 8 broches qui permettent de brancher le programmateur directement sur une carte disposant d'une connexion ICSP (la plupart des cartes du fabriquant Arduino).&lt;/p&gt;


&lt;p&gt;Si vous n'avez pas de programmateur, vous devrez utiliser une carte Arduino Uno ou du même type et la transformer en programmateur.  Vous trouverez de nombreux tutoriels sur comment le faire comme sur &lt;a href=&quot;https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP/&quot;&gt;https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP/&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Une fois que vous disposez d'un programmateur  ICSP, il va falloir se mettre dans les bonne conditions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installer l'extension Sparkfun à l'environnement arduino en ajoutant l'url https://raw.githubusercontent.com/sparkfun/Arduino_Boards/main/IDE_Board_Manager/package_sparkfun_index.json aux &quot;URL de gestionnaire de cartes supplémentaires&quot;&lt;/li&gt;
&lt;li&gt;Sélectionner votre carte &quot;Sparkfun Pro micro&quot; dans &quot;Outils&quot;/&quot;Cartes&quot;&lt;/li&gt;
&lt;li&gt;Choisir la version 5V ou 3.3V dans &quot;Outils&quot;/&quot;Processeur&quot;. C'est très important car vous risquez d'endommager le bootloader si vous ne sélectionnez pas le bon.&lt;/li&gt;
&lt;li&gt;Dans &quot;Outils&quot; / Programmeur&quot;, sélectionnez le programmeur choisi pour flasher le boot. Pour une arduino en ISP, ce sera &quot;Arduino en ISP&quot; ou &quot;Arduino en ISP 32U4&quot; si vous avez fabriqué le programmeur avec une leonardo ou une Pro micro. Pour un USBASP, ce sera USBASP.&lt;/li&gt;
&lt;li&gt;Câbler votre programeur comme suit sur votre carte Pro micro à reprogrammer :&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Pour une Arduino en ISP:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;https://civade.com/images/promicro/promicro-isp.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;Pour un USBASP:&lt;/p&gt;


&lt;pre&gt;USB-ASP   Arduino
1 MOSI   &amp;gt;&amp;gt;  D16
2 VCC    &amp;gt;&amp;gt;  VCC
5 RST    &amp;gt;&amp;gt;  RST
7 SCK    &amp;gt;&amp;gt;  D15
9 MISO   &amp;gt;&amp;gt; D14
10 GND   &amp;gt;&amp;gt; GND&lt;/pre&gt;


&lt;p&gt;Il ne va plus vous rester qu'à flasher le bootloader, en allant dans &quot;Outils&quot; / &quot;graver la séquence d'initialisation&quot;.&lt;/p&gt;


&lt;p&gt;A l'issue vous pourrez reflasher votre programme normalement par l'USB et la carte pourra être&quot; alimentée en 5V ou via RAW sans poser de soucis au boot à cause de l'USB déconnecté.&lt;/p&gt;</description>
        
              </item>
          <item>
        <title>Arduino et ESP32: timeout lors de la mise à jour du package ESP32 dans l'environnement graphique arduino</title>
        <link>https://civade.com/post/2025/12/21/Arduino-et-ESP32%3A-timeout-lors-de-la-mise-%C3%A0-jour-du-package-ESP32-dans-l-environnement-graphique-arduino</link>
        <guid isPermaLink="false">urn:md5:a6575e57ca12c14078c33093ad5c5b4f</guid>
        <pubDate>Sun, 21 Dec 2025 09:12:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Logiciels Libres</category>
                        <description>          &lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/esp32/.esp32s_m.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;La mise à jour du package ESP32 de décembre 2025 (esp32:esp32@3.3.5) se passe mal sur l'environnement Arduino. En effet, l'environnement est paramétré avec un timeout réseau de 60 secondes. SI le téléchargement en cours de la mise à jour ne se termine pas dans ce temps elle échoue. Il est malheureusement impossible de changer ce timeout dans l'environnement graphique. Heureusement l'environnement de ligne de commande fournit une solution.&lt;/p&gt;

&lt;p&gt;Procédure :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Quitter l'environnement graphique Arduino&lt;/li&gt;
	&lt;li&gt;Télécharger l'environnement Arduino en ligne de commande à partir de https://docs.arduino.cc/arduino-cli/installation/ . Installer Arduino_cli (Sous Winfows préférer la version MSI: https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Windows_64bit.msi)&lt;/li&gt;
	&lt;li&gt;Lancer un command.com ou un powershell&lt;/li&gt;
	&lt;li&gt;Aller dans le répertoir d'installation de arduino_cli (cd &quot;\Program Files\Arduino cli&quot;&lt;/li&gt;
	&lt;li&gt;Paramétrer le timeout (arduino-cli config set network.connection_timeout 600s)&lt;/li&gt;
	&lt;li&gt;Lancer l'update (arduino-cli core upgrade esp32:esp32 --additional-urls https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Downloading index: package_index.tar.bz2 downloaded&lt;br /&gt;
Downloading index: package_esp32_index.json downloaded&lt;br /&gt;
Tool esp32:xtensa-esp-elf-gdb@16.3_20250913 already installed&lt;br /&gt;
Tool esp32:riscv32-esp-elf-gdb@16.3_20250913 already installed&lt;br /&gt;
Tool esp32:openocd-esp32@v0.12.0-esp32-20250707 already installed&lt;br /&gt;
Tool esp32:esptool_py@5.1.0 already installed&lt;br /&gt;
Tool esp32:mkspiffs@0.2.3 already installed&lt;br /&gt;
Tool esp32:mklittlefs@4.0.2-db0513a already installed&lt;br /&gt;
Tool arduino:dfu-util@0.11.0-arduino5 already installed&lt;br /&gt;
Téléchargement des paquets...&lt;br /&gt;
esp32:esp32-arduino-libs@idf-release_v5.5-9bb7aa84-v2 downloaded&lt;br /&gt;
esp32:esp-x32@2511 downloaded&lt;br /&gt;
esp32:esp-rv32@2511 downloaded&lt;br /&gt;
esp32:esp32@3.3.5 downloaded&lt;br /&gt;
Installing esp32:esp32-arduino-libs@idf-release_v5.5-9bb7aa84-v2...&lt;br /&gt;
Configuring tool....&lt;br /&gt;
esp32:esp32-arduino-libs@idf-release_v5.5-9bb7aa84-v2 installed&lt;br /&gt;
Installing esp32:esp-x32@2511...&lt;br /&gt;
Configuring tool....&lt;br /&gt;
esp32:esp-x32@2511 installed&lt;br /&gt;
Installing esp32:esp-rv32@2511...&lt;br /&gt;
Configuring tool....&lt;br /&gt;
esp32:esp-rv32@2511 installed&lt;br /&gt;
Replacing platform esp32:esp32@3.3.3 with esp32:esp32@3.3.5...&lt;br /&gt;
Uninstalling esp32:esp32@3.3.3...&lt;br /&gt;
Running pre_uninstall script....&lt;br /&gt;
Platform esp32:esp32@3.3.3 uninstalled&lt;br /&gt;
Uninstalling arduino:dfu-util@0.11.0-arduino5, tool is no more required...&lt;br /&gt;
Uninstalling esp32:esp-rv32@2507, tool is no more required...&lt;br /&gt;
Running pre_uninstall script....&lt;br /&gt;
Tool esp32:esp-rv32@2507 uninstalled&lt;br /&gt;
Uninstalling esp32:esp-x32@2507, tool is no more required...&lt;br /&gt;
Running pre_uninstall script....&lt;br /&gt;
Tool esp32:esp-x32@2507 uninstalled&lt;br /&gt;
Uninstalling esp32:esp32-arduino-libs@idf-release_v5.5-f1a1df9b-v3, tool is no more required...&lt;br /&gt;
Running pre_uninstall script....&lt;br /&gt;
Tool esp32:esp32-arduino-libs@idf-release_v5.5-f1a1df9b-v3 uninstalled&lt;br /&gt;
Uninstalling esp32:esptool_py@5.1.0, tool is no more required...&lt;br /&gt;
Uninstalling esp32:mklittlefs@4.0.2-db0513a, tool is no more required...&lt;br /&gt;
Uninstalling esp32:mkspiffs@0.2.3, tool is no more required...&lt;br /&gt;
Uninstalling esp32:openocd-esp32@v0.12.0-esp32-20250707, tool is no more required...&lt;br /&gt;
Uninstalling esp32:riscv32-esp-elf-gdb@16.3_20250913, tool is no more required...&lt;br /&gt;
Uninstalling esp32:xtensa-esp-elf-gdb@16.3_20250913, tool is no more required...&lt;br /&gt;
Configuration de la plateforme....&lt;br /&gt;
Platform esp32:esp32@3.3.5 installed&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et voila. Le prochain lancement de l'environnement graphique vous montrera un système à jour.&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2025/12/21/Arduino-et-ESP32%3A-timeout-lors-de-la-mise-%C3%A0-jour-du-package-ESP32-dans-l-environnement-graphique-arduino#comment-form</comments>
          <wfw:comment>https://civade.com/post/2025/12/21/Arduino-et-ESP32%3A-timeout-lors-de-la-mise-%C3%A0-jour-du-package-ESP32-dans-l-environnement-graphique-arduino#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/135</wfw:commentRss>
              </item>
          <item>
        <title>Behringer FCB1010, implémentation et modifications pour piloter les amplis Hughes &amp; Kettner série Grandmeister 36 et 40</title>
        <link>https://civade.com/post/2025/11/24/Behringer-FCB1010%2C-impl%C3%A9mentation-et-modifications-pour-piloter-les-amplis-Hughes-Kettner-s%C3%A9rie-Grandmeister-36-et-40</link>
        <guid isPermaLink="false">urn:md5:0f99ac36962bdc15e610586cf03a29ec</guid>
        <pubDate>Mon, 24 Nov 2025 08:29:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>Arduino</category>
                  <category>DIY</category>
                  <category>Embarqué</category>
                  <category>ESP32</category>
                  <category>Musique</category>
                  <category>OpenSource</category>
                <description>&lt;p&gt;Hughes &amp;amp; Kettner a développé une série d'amplificateurs guitare à lampes étonnants à bien des aspects et notamment sur leur capacité à être pilotés en Midi. En intégrant un jeu d'effets minimum (reverb, delai, noise gate, et modulation) ainsi que 4 canaux (clair, crunch, lead et ultra) ils sont en capacité dans un format mini de fournir tout ce qu'il faut pour gérer une palette de sons énorme et très polyvalente. Mais le pilotage via midi, bien que facilité avec le pédalier de la marque devient une sinécure lorsque l'on veut utiliser un pédalier midi alternatif. Malheureusement, il y a quelques bugs dans le firmware et une fonction particulièrement mal implémentée qui ne rendent pas le produit des plus lisibles. Nous allons ici voir comment contourner les bugs, et ajouter les fonctionnalités manquantes à un FCB1010 de Behringer en vue de piloter complètement un Grandmeister.&lt;/p&gt;          &lt;p&gt;&lt;u&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/.IMG_4627_m.jpg&quot; /&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Grandmeister&amp;nbsp; 36 &amp;amp; et Grandmeister 40 Deluxe&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Tout d'abord, faisons un petit tour d'horizon du Grandmeister.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;En voici ses caractéristiques générales :&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;✅ Tête d'ampli à lampes&lt;br /&gt;
✅ Puissance : 36 W (ou 40 W pour le Deluxe)&lt;br /&gt;
✅ Réducteur de puissance : 18, 5, 1, 0 W. En mode 0W, pas de son sur l'ampli, parfait pour utiliser en studio avec le DI intégré par exemple.&lt;br /&gt;
✅ Lampes de préa mplification / phase inverter : 3x 12AX7&lt;br /&gt;
✅ Lampes de puissance : 4x EL84&lt;br /&gt;
✅ Canaux : 4 (Clean, Crunch, Lead, Ultra)&lt;br /&gt;
✅ Modulation: Chorus, Flanger, Phaser, Tremolo, Tap-Delay, Digital Spring Reverb, noise gate&lt;br /&gt;
✅ Boucle d'effets : commutable en midi&lt;br /&gt;
✅ Fonctions de commutation : Presets / Channels, Boost, Delay, Modulation, Gate, boucle d'effet&lt;br /&gt;
✅ Fonctions spéciales : réducteur de puissance programmable, Noise Gate, potentiomètres avec fonction de mémoire&lt;br /&gt;
✅ TSC (Tube Safety Control) avec réglage de Bias automatique et continu + protection des tubes de puissance.&lt;br /&gt;
✅ Entrée/sortie/thru MIDI, 128 programmes sauvegardables et rappelables par un pédalier midi&lt;br /&gt;
✅ Boîte de direct intégré : (Redbox 1 pour le Grandmeister 36, Redbox 5 pour le Grandmeister Deluxe 40) avec simulateur de HP et sortie XLR&lt;br /&gt;
✅ Sortie line out pour sono ou accordeur&lt;/p&gt;

&lt;p&gt;A l'exception du volume principal (main volume) tous les réglages (y compris la sélection de canaux) sont mémorisables et rappelables en MIDI. Si l'on veut un son avec la Modulation et le Delay allumé par exemple, pas de soucis, il suffit de sauver dans un preset le son avec tous les réglages positionnés.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Problèmes sur les Grandmeister : &lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;On ne peut programmer les mémoires internes du GM que si l'on dispose soit d'un éditeur (tablette/PC/Mac), soit d'un pédalier midi. En effet, au moment de la sauvegarde d'un programme, il faut envoyer le program change du programme de destination avant de confirmer l'écriture. C'est d'ailleurs pour cela que l'on le trouve en bundle chez Thomann avec le pédalier midi de la marque.. (et seulement pour 100€ de plus, ce qui n'est pas cher).&lt;/p&gt;

&lt;p&gt;Mais là ou les choses se compliquent, c'est lorsque l'on veut préparer un preset ou l'on sauve avec Chorus et/ou Delay éteint pour pouvoir le cas échéant l'allumer en cours de jeu. Cela ne fonctionne pas! En effet, lorsque l'on coupe l'un de ces deux effets et que l'on sauve, plutôt que de simplement garder trace du fait que l'on ait coupé l'effet, l'ampli met le réglage d'efficacité à zéro. Lorsque l'on l'allume en midi, il n'est du coup plus actif! Ce point m'a été confirmé par le support H&amp;amp;K (très réactif et courtois par ailleurs) qui ne souhaite pas le corriger, car ils ont arrêté les développements, malgré le très bon placement en terme de ventes (#7 et #8 des amplis à lampes chez Thomann en Novembre 2025).&lt;/p&gt;

&lt;p&gt;Par ailleurs, il n'y a pas d'implémentation Tap Tempo dans le midi (voir tableau ci-dessous). Il ne peut être utilisé qu'à l'aide du pédalier fourni par la marque. Lorsqu'on recourt à un pédalier externe, tel que le FCB1010, il faut jouer sur le &quot;delay time&quot;, ce qui n'est pas franchement très pratique sur scène pour caler le tempo du délai à un morceau en cours de jeu.&lt;/p&gt;

&lt;p&gt;Néanmoins l'implémentation midi est déjà intéressante et permet de faire pas mal de choses.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Implémentation midi sur base de control change:&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;table style=&quot;border-collapse:collapse; width:569px&quot; width=&quot;569&quot;&gt;
	&lt;colgroup&gt;
		&lt;col style=&quot;width:89pt&quot; width=&quot;119&quot; /&gt;
		&lt;col style=&quot;width:338pt&quot; width=&quot;450&quot; /&gt;
	&lt;/colgroup&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl71&quot; style=&quot;border-bottom:1px solid black; height:51px; width:119px; vertical-align:top; white-space:normal; padding-top:1px; padding-right:1px; padding-left:1px; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;font-weight:700&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;CTRL&amp;nbsp;(dec)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl72&quot; style=&quot;border-bottom:1px solid black; width:450px; vertical-align:top; white-space:normal; padding-top:1px; padding-right:1px; padding-left:1px; border-top:1px solid black; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;font-weight:700&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Fonction&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl73&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;001&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl70&quot; style=&quot;border-bottom:1px solid black; width:450px; white-space:normal; padding-top:1px; padding-right:1px; padding-left:1px; vertical-align:bottom; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Modulation Intensity (0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;004&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl67&quot; style=&quot;border-bottom:1px solid black; width:450px; white-space:normal; padding-top:1px; padding-right:1px; padding-left:1px; vertical-align:bottom; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Delay Time, 128 steps, 51 ms to 1360 ms&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;007&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl67&quot; style=&quot;border-bottom:1px solid black; width:450px; white-space:normal; padding-top:1px; padding-right:1px; padding-left:1px; vertical-align:bottom; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Volume (soft)&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:40px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;009&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl67&quot; style=&quot;border-bottom:1px solid black; width:450px; white-space:normal; padding-top:1px; padding-right:1px; padding-left:1px; vertical-align:bottom; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Mute On-Off. On status remains active until the amp channel is changed, the volume parameter is changed or the amp is re-started.&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;012&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Mod-FX Type (0&amp;gt;31, 32&amp;gt;63, 64&amp;gt;95, 96&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;020&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Gain (soft)&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;021&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Bass&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;022&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Mid&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;023&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Treble&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;024&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Resonance&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;025&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Presence&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;026&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Modulation Speed (always for the active modulation effect)&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;027&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Delay Feedback&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;028&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Delay Volume&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;029&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Reverb Volume&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;030&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Power Soak Switching (5 sectors)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;031&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Channel Switching (4 sectors)&amp;nbsp;(0&amp;gt;31, 32&amp;gt;63, 64&amp;gt;95, 96&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;052&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Mod-FX On-Off&amp;nbsp;(0, &amp;gt;0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;053&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Delay On-Off&amp;nbsp;(0, &amp;gt;0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;054&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Reverb On-Off&amp;nbsp;(0, &amp;gt;0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;055&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;FX-Loop On-Off&amp;nbsp;(0, &amp;gt;0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;056&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Gain (hard)&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;057&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Volume (hard)&amp;nbsp;(0&amp;gt;127)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl74&quot; style=&quot;border-bottom:1px solid black; height:25px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;063&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl68&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Noise Gate On-Off&amp;nbsp;(0, &amp;gt;0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td class=&quot;xl75&quot; style=&quot;border-bottom:1px solid black; height:26px; text-align:center; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:1px solid black&quot;&gt;&lt;span style=&quot;font-size:19px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;064&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td class=&quot;xl69&quot; style=&quot;border-bottom:1px solid black; vertical-align:top; padding-top:1px; padding-right:1px; padding-left:1px; white-space:nowrap; border-top:none; border-right:1px solid black; border-left:none&quot;&gt;&lt;span style=&quot;font-size:15px&quot;&gt;&lt;span style=&quot;color:black&quot;&gt;&lt;span style=&quot;font-weight:400&quot;&gt;&lt;span style=&quot;font-style:normal&quot;&gt;&lt;span style=&quot;text-decoration:none&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Aptos Narrow&amp;quot;,sans-serif&quot;&gt;Boost On-Off&amp;nbsp;(0, &amp;gt;0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Implementation midi en Sysex&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Une implémentation midi alternative existe, basée sur des commandes SYSEX. Elle n'est pas documentée, mais j'ai fait un peu d'ingénierie inverse sur les échanges entre l'éditeur sur tablette et l'ampli et j'ai pu voir qu'il n'y a pas plus de contrôles disponibles que dans l'implémentation midi basée sur des control change, plus facile à manipuler. La seule chose que l'on semble y gagner est le fait que le paramètres est sur 8 bits (256 valeurs) au lieu de 7 si envoyé par un contrôleur.&lt;/p&gt;

&lt;p&gt;Voici un exemple sur le paramètre Delay Time, en Sysex :&lt;/p&gt;

&lt;p&gt;F0 00 20 44 00 10 00 05 00 04 04 &lt;strong&gt;01 7F&lt;/strong&gt; 7F F7 tempo 44 (le mini, valeur 255, 1360ms)&lt;br /&gt;
F0 00 20 44 00 10 00 05 00 04 04 &lt;strong&gt;01 00&lt;/strong&gt; 00 F7 tempo 84 (valeur 128, 708 ms)&lt;br /&gt;
F0 00 20 44 00 10 00 05 00 04 04 &lt;strong&gt;00 7F&lt;/strong&gt; 7E F7 tempo 85 (valeur 127, 703 ms)&lt;br /&gt;
F0 00 20 44 00 10 00 05 00 04 04 &lt;strong&gt;00 00&lt;/strong&gt; 01 F7 tempo 1176 (le max, valeur 0, 51 ms)&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Explication:&amp;nbsp;&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F0 &lt;/strong&gt;Sysex start&lt;br /&gt;
&lt;strong&gt;00 20 44&lt;/strong&gt; Manufacturer code (Stamer Musikanlagen GmbH, AKA Hughes and Kettner)&lt;br /&gt;
&lt;strong&gt;00 10 00 05 00 04&lt;/strong&gt; Parameter change&lt;br /&gt;
&lt;strong&gt;04&lt;/strong&gt; Delay time&lt;br /&gt;
&lt;strong&gt;XX YY&lt;/strong&gt; Valeur (de 0 à 255, codés sur 8 bits. Le MSB est dans le 2e octef, car une valeur de données ne peut être codée que sur 7 bits)&lt;br /&gt;
&lt;strong&gt;ZZ &lt;/strong&gt;Checksum&lt;br /&gt;
&lt;strong&gt;F7 &lt;/strong&gt;Sysex end&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pédalier midi FCB1010 de Berhringer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le firmware livré avec le FCB1010 n'est pas génial, et ne permet pas de disposer d'une rangée de switches en mode &quot;stomp boxe&quot; (pour allumer ou éteindre les effets) et d'une autre rangée pour changer les programmes. Il n'a que peu évolué (version actuelle V1.50.1E), et la programmation manuelle est fastidieuse. Heureusement, depuis près de 10 ans, la communauté a développé des firmwares alternatifs. Le plus connu est UnO, développé par &lt;span&gt;Ossandust&lt;/span&gt;. La dernière version gratuite est la 1.04. Une version payante existe aussi (la 1.40). Il est difficile de trouver la version gratuite en téléchargement, aussi vous pourrez &lt;a href=&quot;https://civade.com/images/hk/FCB_V104_256.BIN&quot;&gt;la trouver ICI&lt;/a&gt;. Voici le &lt;a href=&quot;https://civade.com/images/hk/FCB_UnO_RevisionHistory.txt&quot;&gt;changelog&lt;/a&gt;, le &lt;a href=&quot;https://civade.com/images/hk/FCB_UnO_v1_0_4_UserGuide.pdf&quot;&gt;guide de l'utilisateur&lt;/a&gt; et le &lt;a href=&quot;https://civade.com/images/hk/FCB_UnO_v1_0_4_ProgrammingChart.pdf&quot;&gt;diagramme de programmation&lt;/a&gt;., On peut aisément acheter une eprom programmée avec la version 1.0.4 sur Ebay par exemple. Son changement assez simple, puisqu'il suffit de changer une mémoire à l'intérieur du FCB1010. La suite de ce tutoriel repose sur un firmware 1.04...&lt;/p&gt;

&lt;p&gt;Pour faciliter l'édition, il existe un éditeur sur PC ou Mac: &lt;a href=&quot;https://www.fcb1010.uno/&quot;&gt;FCB1010 Control Center&lt;/a&gt;. Pour la modique somme de 24 euros, il facilite grandement la programmation et donne une vision synthétique de ses programmes.&lt;/p&gt;

&lt;p&gt;Muni de l'éditeur, et de la version 1.04 de Uno, on dispose désormais d'un pédalier midi capable de :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Gérer l'accès direct à 10 programmes, et le changement de banque (10 par 10)&lt;/li&gt;
	&lt;li&gt;OU Gérer l'accès direct à 5 programmes ET à 5 foot switches assignables à des contrôles midi quel que soit le programme choisi (ils ne changeront donc pas de fonction d'un programme à un autre).&lt;/li&gt;
	&lt;li&gt;De disposer pour chaque programme :
	&lt;ul&gt;
		&lt;li&gt;De 2 pédales d'expression librement assignables, et sur lesquelles pou pourra préciser les valeurs min et max envoyables (super pratique dans certains cas pour fixer des limites qui soient &quot;musicales&quot;.).&amp;nbsp;&lt;/li&gt;
		&lt;li&gt;De la faculté d'allumer&amp;nbsp;ou d'éteindre 2 sorties sur contact sec (relais) par exemple pour changer de canal sur un ampli en lieu et place du foot switch de changement de canaux. Elles peuvent être pulsées, ou allumées/éteintes en permanence selon votre choix de config.&lt;/li&gt;
		&lt;li&gt;D'envoyer jusqu'à 5 programmes change sur 5 canaux midi différents, pour piloter différents effets&lt;/li&gt;
		&lt;li&gt;D'envoyer jusqu'à 2 control change de votre choix&lt;/li&gt;
		&lt;li&gt;D'envoyer une note (par exemple pour gérer le tap tempo sur les effets qui utilisent cette méthode)&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;Dans le cas ou l'on a choisi la config 5 programmes + 5 stompboxes, On peut préciser l'état de chaque stompbox au changement de programme (On / Off / Sans changement). Si l'état est on ou off, le pédalier enverra automatiquement le contrôle considéré à la bonne valeur. Nous verrons l'intérêt que cela va représenter pour piloter le Grandmeister.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Mise en oeuvre du FCB1010 avec le Grandmeister&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Lors de la configuration du FCB1010 pour sa mise en oeuvre avec le Grandmeister, l'idéal est de disposer de 2 interfaces midi ou d'une à 2 ports:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;L'une connectée en in/out sur le FCB1010&lt;/li&gt;
	&lt;li&gt;La seconde connectée en in/out sur le Grandmeister&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On peut bien sur le faire avec une seule mais il faudra brancher / débrancher ce qui risque d'être fastidieux&lt;/p&gt;

&lt;p&gt;Bien que l'on puisse éditer aussi bien le Grandmeister que le FCB par leurs panneaux avant, j'ai choisi de travailler avec des logiciels sur PC pour le faire, c'est plus simple. Pour le FCB, cela se fait avec le FCB/Uno Control center (voir plus haut). Pour le Grandmeister, H&amp;amp;K ne fournit pas d'éditeur autre que sur tablette. Un français (très sympa d'ailleurs) nommé Frédéric Bory a développé un éditeur basé sur CTRLR, qui fonctionne sur PC, Mac et peut éditer aussi bien le GM36 que le GM40. Il est téléchargeable &lt;a href=&quot;https://civade.com/images/hk/Hughes___Kettner_Remote_-_v1.0.0.exe&quot;&gt;ICI pour PC&lt;/a&gt; et &lt;a href=&quot;https://civade.com/images/hk/Hughes___Kettner_Remote_-_v1.0.app.zip&quot;&gt;ICI pour mac&lt;/a&gt;. Une version dédiée au GM36 pour pc existe aussi et est &lt;a href=&quot;https://civade.com/images/hk/GrandMeister-Remote-v.2.5.2.exe&quot;&gt;téléchargeable ici&lt;/a&gt;. A noter que Frédéric Bory a publié le code source de son éditeur (&lt;a href=&quot;https://github.com/fredzo/Hughes-KettnerRemote&quot;&gt;https://github.com/fredzo/Hughes-KettnerRemote&lt;/a&gt;) mais que pour le compiler, il faut une version spécitique de CTRLR (&lt;span style=&quot;font-size:12.0pt&quot;&gt;&lt;span style=&quot;font-family:&amp;quot;Calibri&amp;quot;,sans-serif&quot;&gt;&lt;span style=&quot;color:#1f497d&quot;&gt;&lt;a href=&quot;https://github.com/fredzo/ctrlr&quot; style=&quot;color:blue; text-decoration:underline&quot; target=&quot;_blank&quot;&gt;https://github.com/fredzo/ctrlr&lt;/a&gt;). Je n'ai pas creusé de ce coté, l'étiteur fonctionnant très bien.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;H&amp;amp;K fournit des éditeurs pour tablette, Android ou IOS. Mais pour les faire fonctionner il faut disposer d'une interface midi Bluetooth que l'on connecte à l'arrière du GM. Les interfaces les plus fiables dans ce domaine sont celles de CME/Widi. Malheureusement elles ne sont pas données (autour de 50 euros par point). CME vient de sortie une nouvelle interface qui sort du lot par son coté couteau suisse:&amp;nbsp; la &lt;a href=&quot;https://www.cme-pro.com/h4midi-wc-usb-host-midi-interface/&quot;&gt;H4MidiWC&lt;/a&gt;. Elle dispose de 2 ports midi complets in/out, d'un hote USB/Midi pouvant accepter jusqu'à 8 hôtes (via un hub), d'une interface PC/Mac projetant 4 ports dans l'ordinateur, et d'un support que l'on peut équiper de Bluetooth midi à l'aide de leur module optionnel Widi Core. J'en ai acheté une et c'est un super couteau suisse. Elle me permet d'éditer simultanément le H&amp;amp;K par l'Ipad ou le PC, d'envoyer les messages de changement de programme par le pédalier midi, etc.. On peut également faire du routage d'un port à l'autre, filter les messages midi, et le tout par l'application mobile (ou pc/mac) livrée avec.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/inovate-mode-1-1024x517.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Bien sur elle ne sert uniquement qu'à la maison ou pour programmer le GM+FCB. En config live, je n'ai que pédalier midi branché au GM, car je n'ai pas besoin d'éditer mes presets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edition des presets sur le GM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La premètre chose à faire va être de préparer ses presets sur le H&amp;amp;K. Le mieux est de le faire par l'éditeur (PC/Mac ou mobile) car lorsque l'on sauve le programme, il faudra préciser dans quel emplacement mémoire on souhaite le mettre et ca on ne peut pas le faire par le panneau avant de l'ampli.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;A l'aide de l'éditeur sur PC ou Mac vous allez pouvoir faire une chose que vous ne pourriez pas faire sur mobile : conserver les anciens programmes livrés avec. Il y a 17 banques livrées avec le H&amp;amp;K. Je vous recommande de les déplacer de la banque 1 à la banque 16, ce qui vous laissera les 15 premières pour votre usage (soit 60 sons). Vous pourrez utiliser le bouton &quot;Lib. Editor&quot; pour cette action.&lt;/p&gt;

&lt;p&gt;Ainsi préparé votre mémoire devrait ressembler à cela (les programmes 61 à 128 sont ceux d'usine qui étaient en 1 avant, les programmes 1 à 10 sont les miens) :&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/LibEditor.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Astuce&lt;/strong&gt;: Si vous souhaitez pouvoir allumer les effets de phase et/ou le delay lors du jeu, il vous faut &lt;strong&gt;IMPERATIVEMENT &lt;/strong&gt;sauver le programme avec ces deux effets allumés sinon vous en perdrez l'usage:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/EffectOn.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Pour le reste, gérez votre preset comme vous l'entendez...&amp;nbsp; et faites ceci pour tous les presets dont vous allez avoir besoin. Je vous recommande de faire ensuite une sauvegarde de tous les programmes sur votre ordi (Save AS en bas à droite) pour pouvoir recharger votre banque à la demande.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Préparation de la config du FCB1010&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Ici, nous allons faire travailler le FCB en &quot;Stomp mode&quot;, avec les switches supérieurs configurés en stomp et ceux du bas en changement de programme. Sur le GM, nous avons 6 fonctions qui peuvent faire l'objet d'allumage / extinction :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Boost (CC 064 décimal)&lt;/li&gt;
	&lt;li&gt;Modulation (CC 052 décimal)&lt;/li&gt;
	&lt;li&gt;Delay (CC 053 décimal)&lt;/li&gt;
	&lt;li&gt;Reverb (CC 054 décimal)&lt;/li&gt;
	&lt;li&gt;Noise gate (CC 063 décimal)&lt;/li&gt;
	&lt;li&gt;Effect loop (CC 055 décimal)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Du coup, vous ne pourrez en commander directement que 5 sur les 6 par les stomp.&amp;nbsp;Dans l'editeur FCB, vous avez une icone represantant un listing qui va vous permettre d'éditer les paramètres globalement / plus facilement. La première action va consister à affecter les contrôleurs que vous souhaitez affecter aux stomp. Dans mon cas, j'ai choisi de mettre dans l'odre BOOST | MODULATION | DELAY | REVERB | NOISE GATE. J'ai choisi de ne pas mettre l'effect loop, car je ne l'utilise pas pour le moment.&lt;/p&gt;

&lt;p&gt;Cela donne l'assignations de contrôleurs suivante (en jaune):&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/stomp.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ensuite, pour un programme donné (ici, Bank 0 / Programme 1), vous allez pouvoir choisir quels seront les stomp allumés / éteints dans la colonne de droite (0 / éteint, 1/allumé)² :&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/bank0-Prog1.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ici,&amp;nbsp;BOOST | MODULATION | DELAY | NOISE GATE sont off, seul REVERB est allumée. Ceci veut dire que lorque vous appuierez sur Program 1 de la banque zero, le FCB enverra les valeurs des 5 contrôles à la valeur précisée (0 correspondant à 0, et 1 correpondant à 127). Du coup, cela éteindra le Delay et la modulation que je vous rappelle vous avez sauvé à On lors de la phase de programmation du preset sur l'ampli.&amp;nbsp; Mais si en cours de jeu sur ce programme vous décidez d'utiliser le Delay, il vous suffit d'appuyez sur le stomp considéré et il s'allumera ainsi que le délai. Mon explication semble fastidieuse. C'est pour bien insister que le fait que si lors de l'édition du programme sur l'ampli vous avez la mauvaise idée de le sauver avec Delay et/ou Modulation à off, vous allez écraser les valeurs d'efficacité de l'effet à cause du bug sur l'ampli précisé en intro de cet article. Il faut donc bien penser à rallumer ces 2 effets AVANT de sauver le programme... et c'est le FCB qui les éteindra ou les allumera en fonction de ce que vous avez choisi.&lt;/p&gt;

&lt;p&gt;A noter que vous allez aussi pouvoir, pour chaque programme, préciser le control change associé aux 2 pédales d'expression. Ici, j'ai mis le gain sur celle de gauche (CC 064) et le volume sur celle de droite (CC 007). Mais vous pouvez y mettre n'importe quoi, voir un paramètre d'effet par exemple. Vous pouvez également borner les valeurs min / max associées à l'action de la pédale (ex : 027 000 030 permettra de varier le Delay Feedback de 0 à 30).&lt;/p&gt;

&lt;p&gt;Il y a 127 programmes disponibles dans les H&amp;amp;K. Pour appeler ces programmes, il fa vous falloir mettre ne numéro du program change à envoyer dans chaque programme du FCB.&amp;nbsp;Mais le FCB une limitation. A cause des fonctions additionnelles, ils ont du réduire la mémoire de stockage des programme à 95 (banque 0 &amp;gt; 19 de 5 programmes). Bon, ca laisse quand même de quoi faire...&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/ProgramChange.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Comme vous le voyez, il y a encore 4 colonnes (PC2 à PC5) pour envoyer d'autres programmes change à d'autres appareils, CC1 et CC2 pour envoyer des contrôleurs continus, et même SW pour allumer ou éteindre l'un des 2 switches externes. Il y a de quoi faire.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Une fois le job fait vous pourrez envoyer le programme au FCB.&amp;nbsp; Un fois le FCB programmé je vous recommande de faire une sauvegarde de la config sur votre ordi tout comme vous avez déjà du le faire pour le H&amp;amp;K.&lt;/p&gt;

&lt;p&gt;A ce stade, nous avons donc un pédalier midi configuré pour allumer et éteindre jusqu'à 5 fonctions du HK et gérer la navigations dans vos présets ainsi que vos réglages par défaut.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Tap Tempo sur FCB1010 pour H&amp;amp;K&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Sur le FCB 1010, il est possible de gérer le tap tempo avec 2 méthodes :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Note On à intervalle régulier.&lt;/li&gt;
	&lt;li&gt;Envoi d'un CC Tap Tempo&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aucune des deux n'est malheureusement disoniible sur les Grandmeister sur lequel on ne peut changer le tempo qu'en envoyant un CC 004, avec une valeur de 0 à 127 paramétrant l'espacement entre les beats. Il faut donc calculer le Delay Time avec le BPM voulu. D'après la doc, pour la valeur 0 du CC, nous avons 51ms de delay time (soit un BPM de 1176). Pour 127 nous avons 1360 ms de delay time (soit un BPM de 44). La valeur du contrôleur continu se calcule donc ainsi:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CC =&amp;nbsp; (1000*(1/(BPM/60))-51)/((1360-51)/127) avec BPM compris entre 45 et 1176&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mais alors ce qui serait super, serait d'avoir directment un switch sur le FCB1010 qui lorsque frappé à intervalle régulier (au moins 2 fois), puisse faire ce calcul pour nous et l'envoyer en midi ! Le code source du firmware Uno n'étant pas disponible,&amp;nbsp; j'ai choisi de le faire avec une carte électonique additionnelle. J'ai choisi une&lt;a href=&quot;https://fr.aliexpress.com/w/wholesale-esp32C3-oled-0.42.html&quot;&gt; ESP32C3 équipée d'un afficheur OLED&lt;/a&gt;. Cela coute un peu plus de 2 euros sur ali, et dispose d'un processeur à 160Mhz, de wifi, de Bluetooth et d'un petit afficheur oled pratique pour faire le mise au point.&lt;/p&gt;

&lt;p&gt;Pour réaliser la liaison midi, il va nous falloir également un circuit 74HCT14 (octuple inverseur et trigger de schmidt), une résistance de 1K, 2 résistances de 220 ohms. Il nous faudra également une led et une résistance de 100 ohms pour l'affichage du beat, et un footswitch pour indiquer le beat. Le tout sera cablé comme suit :&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/implantation1.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/schema1.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vous pouvez également télécharger le schema Fritzing :&amp;nbsp;&lt;a href=&quot;https://civade.com/images/hk/esp32-taptempo-hk.fzz&quot;&gt;/images/hk/esp32-taptempo-hk.fzz&lt;/a&gt;&amp;nbsp;.&amp;nbsp;Voici le code Arduino pour faire fonctionner la bête:&amp;nbsp;&lt;a href=&quot;https://civade.com/images/hk/ESP32-TapTempo-HK.ino&quot;&gt;/images/hk/ESP32-TapTempo-HK.ino&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A noter que le 7414 est utilisé pour 2 fonctions:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Bufferiser le signal TX pour attaquer le midi (et le convertir en 5V)&lt;/li&gt;
	&lt;li&gt;Bufferiser le signal qui va piloter la led, les IO de l'esp32 n'étant pas assez puissantes pour piloter une led haute luminosité.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A noter sur le schema que vous disposez de 2 possibilités pour le raccorder au FCB:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Soit mettre le montage dans un botier externe, et utiliser la prise midi out du montage pour le raccorder au midi In du FCB1010; Dans ce cas il faudra activer par l'éditeur la fonction &quot;Midi Merge&quot; du FCB1010. Il ajoutera les messages reçus sur le midi in à ceux générés par le pédalier.&lt;/li&gt;
	&lt;li&gt;Soit (plus intrusif) l'intégrer dans le FCB1010. Cela peut se faire simplement en connectant 3 fils sur le connecteur à 4 broches qui va vers la carte midi. Sur le PCB du FCB, la broche 1 est repérée par une pastille carrée. La résistance de 1K en série avec le midi out TTL permettra de faire fonctionner le montage en même temps que l'électronique interne du pédalier sans soucis. En effet, l'opto coupleur du midi in étant en collecteur ouvert avec une résistance de 4.7K au + 5V, il n'y aura pas de conflit.&amp;nbsp;C'est la même technique qui est utilisée sur les arduino pour permettre au RX du microcontroleur de recevoir soit le signal venant des shields, soit celui provenant du convertisseur USB/série.&lt;strong&gt; Bien sur il faudra aussi activer le midi merge sur la config du FCB pour que cela fonctionne...&amp;nbsp;&lt;/strong&gt;Ce qui est bien en l'intégrant, c'est que les alimentation seront directement fournies par le FCB.&amp;nbsp; 2 trous suffisent, l'un pour le switch (12mm) et l'autre pour la led (variable en fonction de la led montée).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La petite carte qui porte les connecteurs midi dans le FCB1010 est cablée comme suit sur le connnecteur à 4 broches:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;1 - Midi Out (TTL) - Ne pas raccorder.&lt;/li&gt;
	&lt;li&gt;2 - Midi In (TTL)&lt;/li&gt;
	&lt;li&gt;3 - 5V&lt;/li&gt;
	&lt;li&gt;4 - GND&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A titre d'info en voici le schéma interne (tiré du service manual de Behringer) :&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/FCBMidiSch.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Voici ce que cela donne une fois intégré:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/.WhatsApp_Image_2025-11-22_a_13.33.11_6a39f2d3_m.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/hk/.WhatsApp_Image_2025-11-22_a_13.34.00_15a7c92b_m.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le switch dépassant bien du pédalier, il est aisé de le manipuler avec le pied, sans toucher aux autres.&lt;/p&gt;

&lt;p&gt;Il permet à partir de 2 tap consécutifs, de calculer le tempo et de l'envoyer au HK. Le tempo est réglabe de 41 (limite basse impoée par l'ampli) à 400 bpm (limite haute codée dans l'arduino, au dessus cela n'a pas beaucoup de sens). On peut faire jusqu'à 10 taps consécutifs, et dans ce cas le tempo sera calculé sur la moyenne des intervalles de frappes. Si l'on ne pappe plus pendant 5 secondes, ce compteur de atap est remis à zero, permettant de frapper un tout autre tempo.&lt;/p&gt;

&lt;p&gt;Bonne réalisation!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2025/11/24/Behringer-FCB1010%2C-impl%C3%A9mentation-et-modifications-pour-piloter-les-amplis-Hughes-Kettner-s%C3%A9rie-Grandmeister-36-et-40#comment-form</comments>
          <wfw:comment>https://civade.com/post/2025/11/24/Behringer-FCB1010%2C-impl%C3%A9mentation-et-modifications-pour-piloter-les-amplis-Hughes-Kettner-s%C3%A9rie-Grandmeister-36-et-40#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/134</wfw:commentRss>
              </item>
          <item>
        <title>Gaussmetre pour mesure de champ magnétique sur les micros de guitare ou basse</title>
        <link>https://civade.com/post/2025/11/02/Gaussmetre-pour-mesure-de-champ-magn%C3%A9tique-sur-les-micros-de-guitare-ou-basse</link>
        <guid isPermaLink="false">urn:md5:a4458f76d99187df49185b01a00d2719</guid>
        <pubDate>Sun, 02 Nov 2025 09:54:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>Arduino</category>
                  <category>DIY</category>
                  <category>Embarqué</category>
                  <category>ESP32</category>
                  <category>Guitare</category>
                  <category>Musique</category>
                <description>&lt;p&gt;Lorsque l'on récupère des micros de guitare vintage, il peut être intéressant de tester l'état des aimants qui sont dessus. Car si la bobine est très importante, les aiments jouent aussi un role déterminant et leur magnétisme peut être dégradé. voyons comment construire un Gaussmètre pour mesurer le champ magnétique et son orientation...&lt;/p&gt;          &lt;p&gt;&lt;img src=&quot;https://civade.com/images/Gaussmeter/.gaussmeter_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;C'est pas nouveau, j'aime bien les ESP32. 160Mhz, assez de ram et de rom pour faire des projets importants, et surtout un cout ridicule.&lt;/p&gt;


&lt;p&gt;Pour fabriquer ce gaussmètre, j'ai choisi un ESP32C3 avec tout petit écran OLED intégré 72X40 pixels. Ceci permettra l'intétgration dans un stylo de mesure qui me semble plus pratique à manipuler. Il sera épaulé par le capteur SS495B qui doit être alimenté en 5V.&lt;/p&gt;


&lt;p&gt;En théorie, cela s'alimente en USB. Si c'est très bien pour la programmation et les tests, cela ne va pas aller pour faire le produit final. En effet, les alimentation USB varient énormément en tension, et comme il me faut un 5V de référence sur le capteur, j'ai préféré utiliser une alimentation 9V, un régulateur 78L05 et un condensateur de 100uF pour filtrer et produit un 5V plus stable. De plus j'ai mis une prise ronde, comme sur les pédales d'effet, que j'ai cablée avec le + à l'extérieur et le - au centre (inversé!!!) comme sur les pédales également. Ainsi je peux utilise rune alim de pédale pour alimenter le gaussmètre.&lt;/p&gt;


&lt;p&gt;Autre difficulté, l'ESP32 ne peut faire des mesures sur l'ADC que jusqu'à 2.5V. Or le capteur produit une tension de sorie allant de 0 à 5V, donc 2 trop élevée. Un pont diviseur bati avec 2 résistances de 2K à 1% fera très bien le boulot. Sa sortie sera reliée à l'entrée 0 (A0 en fait) de l'esp32. A noter que la doc de l'ESP32 précise qu'il est souhaitable de mettre un condensateur de 100nF entre la masse et l'entrée analogique pour filtrer les parasites.&lt;/p&gt;


&lt;p&gt;Le capteur SS495B  sirt une tension entre 0.25V (-640 Gauss) et 4.75V (+640 Gauss). Au repos, sans champ magnétique il sort 2.5V. Après le diviseur c'est donc 1.25V qui sera mesuré par l'esp32. Toutefois, il est possible qu'il y ait une légère erreur de mesure (offset). Ceci est prévu au niveau du code, de façon à ajouter une constante (offset) pour qu'à vide, on ait bien 0 Gauss.&lt;/p&gt;


&lt;p&gt;Nous avons donc tout ce qu'il nous faut pour réaliser ce Gaussmètre :
- ESP32C3 avec écran OLED ( &lt;a href=&quot;https://fr.aliexpress.com/w/wholesale-esp32C3-oled.html&quot;&gt;https://fr.aliexpress.com/w/wholesale-esp32C3-oled.html&lt;/a&gt; )
- 2 résistance de 2K 1%
- 1 concensateur chimique polarisé de 47 ou 100uF / 10V
- 1 condensateur 1000nF
- 1 régulateur 78L05
- 1 capteur SS495B  ( &lt;a href=&quot;https://fr.aliexpress.com/w/wholesale-ss495B.html&quot;&gt;https://fr.aliexpress.com/w/wholesale-ss495B.html&lt;/a&gt; )
- Prise d'alimentation ronde pour alimentation 9V
- Alimentation 9V de pédale d'effet avec - au centre.&lt;/p&gt;


&lt;p&gt;Voici le &lt;a href=&quot;https://civade.com/images/Gaussmeter/GaussMeterESP32C3.ino&quot;&gt;/images/Gaussmeter/GaussMeterESP32C3.inocode source Arduino&lt;/a&gt; pour programmer le Gaussmetre. Penser à sélectionner ESP32C3 comme carte de destination...&lt;/p&gt;


&lt;p&gt;Ici, j'ai récupéré un corps de stylo et fait un petit boitier à l'impression 3D pour embarquer le tout. Ca marche plutot pas mal, indique la polarité (N / S) de l'aimant et la force du champ magnétique.&lt;/p&gt;


&lt;p&gt;A noter que sur le SS495B  la mesure se fait du coté ou il y a les inscriptions. Le code est concu en fonction et affiche correctement la polarité lorsque le capteur est orienté ainsi.&lt;/p&gt;


&lt;p&gt;L'usage de ce gaussmètre et la remagnétisation d'un aimant Altico II, III ou IV fera l'objet d'un prochain article....&lt;/p&gt;


&lt;p&gt;Bonne réalisation!&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2025/11/02/Gaussmetre-pour-mesure-de-champ-magn%C3%A9tique-sur-les-micros-de-guitare-ou-basse#comment-form</comments>
          <wfw:comment>https://civade.com/post/2025/11/02/Gaussmetre-pour-mesure-de-champ-magn%C3%A9tique-sur-les-micros-de-guitare-ou-basse#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/133</wfw:commentRss>
              </item>
          <item>
        <title>Remplacement de l'encodeur abosolu Gray par un codeur incrémental + arduino sur les racks d'effet Digitech</title>
        <link>https://civade.com/post/2025/10/14/Remplacement-de-l-encodeur-abosolu-Gray-par-un-codeur-incr%C3%A9mental-arduino-sur-les-racks-d-effet-Digitech</link>
        <guid isPermaLink="false">urn:md5:d5ac6fbc3d0d5bd658e5f454aa2a8114</guid>
        <pubDate>Tue, 14 Oct 2025 20:42:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                        <description>&lt;p&gt;Les Digitech GSP2101, GSP2101 Artist, GSP2101 Limited Edition, GSP2101 LE, GSP 2101 Artist PRO, Legend II, Valve FXGSP2101, GSP2101 Artist, GSP2101 Limited Edition, GSP2101 LE, GSP 2101 Artist PRO, Legend II, Valve FX ont le très mauvais gout d'utiliser un encodeur de panneau absolu à 4 bits en code Grey de chez CTS. Etant une référence pour le moins spéciale, il n'est pas dispo en france et coute pas loin de 50 USD sur les boutiques US (+ frais de port et de douane.. merci Trump !). Du coup j'ai étudié une solution qui utilise un encodeur absolu et une arduino pour simuler l'encodeur d'origine. A noter que cela ne s'applique qu'au anciens racks Digitech, les nouveaux n'utilisant que des codeurs incrémentaux.&lt;/p&gt;          &lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/Digitech/.ValveFX_m.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Cette solution peut reposer sur n'importe quelle Arduino. Ici, j'ai pris un clone d'arduino Pro Micro, basée sur un ATmega32U4 qui gère directement l'USB et est d'une toute petite taille.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/Digitech/.ProMicro1_m.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/Digitech/.ProMicro2_m.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nous allons utiliser 2 entrées (D2/D3) pour connecter les 2 phases de l'encodeur incrémental, et 4 sorties (D4/D5/D6/D7) pour émuler l'encodeur absolu 4 bits. Les sorties ne sortent pas un code binaire classique, mais un code binaire modifié pour ne changer qu'un bit à la fois afin d'éviter les artefacts. Ceci s'appelle le code Grey. Toutefois, le fabriquant américain CTS a trouvé bon de pas utiliser le code grey standard, mais un code à sa sauce.&lt;/p&gt;

&lt;p&gt;En voici la table de vérité :&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// CTS Gray code, extracted from datasheet. a bit different from standard grey code.&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//&amp;nbsp; &amp;nbsp; &amp;nbsp; A&amp;nbsp; &amp;nbsp; &amp;nbsp;B&amp;nbsp; &amp;nbsp; &amp;nbsp;E&amp;nbsp; &amp;nbsp; &amp;nbsp;F&amp;nbsp; &amp;nbsp;dec value&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// 0&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;0&lt;br /&gt;
// 1&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;1&lt;br /&gt;
// 2&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;3&lt;br /&gt;
// 3&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;2&lt;br /&gt;
// 4&amp;nbsp; &amp;nbsp; 1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;10&lt;br /&gt;
// 5&amp;nbsp; &amp;nbsp; 1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;11&lt;br /&gt;
// 6&amp;nbsp; &amp;nbsp; 1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;15&lt;br /&gt;
// 7&amp;nbsp; &amp;nbsp; 1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;14&lt;br /&gt;
// 8&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;6&lt;br /&gt;
// 9&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;7&lt;br /&gt;
// 10&amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;5&lt;br /&gt;
// 11&amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;4&lt;br /&gt;
// 12&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;12&lt;br /&gt;
// 13&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;13&lt;br /&gt;
// 14&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;9&lt;br /&gt;
// 15&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;8&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Le montage va prélever un GND et un 5V directement sur la carte mère du rack. Il va être raccordé à l'encodeur incrémental par un petit connecteur pour permettre le démontage de la face avant. 3 fils seront nécessaires, une masse au centre, la première sortie (channel A) sur l'entrée 2 de l'arduino et la 2e sortie (channel B) sur l'entrée 3 de l'arduino.&lt;/p&gt;

&lt;p&gt;L'encodeur d'origine devra être dessoudé de la carte mère. Nous pourrons avec 5 fils raccorder la masse, et les 4 sorties de l'arduino comme suit:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//&amp;nbsp; &amp;nbsp; Top view . (x) corresponding Arduino output number&lt;br /&gt;
// +-------------+&lt;br /&gt;
// |(1)E GND F(2)|&lt;br /&gt;
// |&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;
// |(3)A GND B(0)|&lt;br /&gt;
// +-------------+&lt;br /&gt;
//&amp;nbsp; &amp;nbsp; &amp;nbsp; |&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp;&lt;br /&gt;
//&amp;nbsp; &amp;nbsp; &amp;nbsp; |&amp;nbsp; &amp;nbsp;| Axis&lt;br /&gt;
//&amp;nbsp; &amp;nbsp; &amp;nbsp; +---+&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;D'un point de vue logiciel, nous allon sutiliser une bibliothèques additionnelles :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;https://docs.arduino.cc/libraries/encoder/ pour gérer l'encodeur incrémental (avec interruptions pour ne pas rater de pas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici le code source&amp;nbsp; &lt;a href=&quot;https://civade.com/images/Digitech/Quadratic-2-4bit-Gray.ino&quot;&gt;/images/Digitech/Quadratic-2-4bit-Gray.ino&lt;/a&gt;&amp;nbsp;(cliquez pour télécharger)&lt;/p&gt;

&lt;div style=&quot;color: #ffffff;background-color: #000000;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 6px;white-space: pre;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Quadratic-2-4bit-Gray &lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Use an arduino (here mini) to convert a Quadratic encoder (2 wires) to a 4 bit Gray CTS variant&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Those encoders are used on some old Digitech effects :&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// GSP2101, GSP2101 Artist, GSP2101 Limited Edition, GSP2101 LE or GSP 2101 Artist PRO, Legend II, Valve FX, TSR-6&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// CTS &amp;nbsp;(Digitech reference 44-0092, CTS Ref 2-288X Grey)&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Datasheet: https://www.ctscorp.com/Files/DataSheets/Encoders/encoders-288-datasheet.pdf&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Unfortunately, they're difficult to find / buy and very expensive (&amp;gt;50€)&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// This code uses an arduino to read a standard 2 phases quadratic encoder and output &lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// on 4 bits a grey code for direct remplacement.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// &amp;nbsp; &amp;nbsp;Top view . (x) corresponding Arduino output number&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// +-------------+&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// |(1)E GND F(2)|&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// | &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// |(3)A GND B(0)|&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// +-------------+&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; | &amp;nbsp;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; | Axis&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// &amp;nbsp; &amp;nbsp; &amp;nbsp;+---+&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;//&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// I/O&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Prototyping on Arduino Nano / CH340 / USB3&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; InA &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; // to be wired to channel A&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; InB &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; // to be wired to channel B&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; Out0 &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; // to be wired to B on Digitech PCB&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; Out1 &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; // to be wired to E&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; Out2 &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; // to be wired to F&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; Out3 &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; // to be wired to A&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// CTS Gray code, extracted from datasheet. a bit different from standard grey code.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// &amp;nbsp; &amp;nbsp; &amp;nbsp;A &amp;nbsp; B &amp;nbsp; E &amp;nbsp; F &amp;nbsp; dec value&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 0 &amp;nbsp; &amp;nbsp;0 &amp;nbsp; 0 &amp;nbsp; 0 &amp;nbsp; 0 &amp;nbsp; 0&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 1 &amp;nbsp; &amp;nbsp;0 &amp;nbsp; 0 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 1&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 2 &amp;nbsp; &amp;nbsp;0 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 3&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 3 &amp;nbsp; &amp;nbsp;0 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 2&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 4 &amp;nbsp; &amp;nbsp;1 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 10&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 5 &amp;nbsp; &amp;nbsp;1 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 11&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 6 &amp;nbsp; &amp;nbsp;1 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 15&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 7 &amp;nbsp; &amp;nbsp;1 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 14&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 8 &amp;nbsp; &amp;nbsp;0 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 6&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 9 &amp;nbsp; &amp;nbsp;0 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 7&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 10 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 5&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 11 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 0 &amp;nbsp; 4&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 12 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 0 &amp;nbsp; 12&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 13 &amp;nbsp; 1 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 13&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 14 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 0 &amp;nbsp; 1 &amp;nbsp; 9&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// 15 &amp;nbsp; 1 &amp;nbsp; 0 &amp;nbsp; 0 &amp;nbsp; 0 &amp;nbsp; 8&lt;/span&gt;&lt;/div&gt;
 

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;//#define ENCODER_DO_NOT_USE_INTERRUPTS&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;lt;Encoder.h&amp;gt;&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// display on serial if DEBUG set&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;//#define DEBUG &lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// activate input pullups for encoder&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;INPUT_PULLUP&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// If Quadratic inputs do not support interrupts, disable them.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;//#define ENCODER_DO_NOT_USE_INTERRUPTS&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// The encoder&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Encoder&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;myEnc&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;InA&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;InB&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Positions&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; position;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; newPos;&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint8_t&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; GrayCode [] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;13&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;8&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;setup&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;#ifdef&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;DEBUG&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;9600&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Quadratic to 4 bit gray code&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; #endif&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;&amp;nbsp; // 4 grey pins are outputs&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Out0,OUTPUT);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Out1,OUTPUT);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Out2,OUTPUT);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Out3,OUTPUT);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;&amp;nbsp; // Initial position = 0&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;myEnc&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; position &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; newPos &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;loop&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;&amp;nbsp; // Note in library, internal pos is 4* real pos&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;&amp;nbsp; // each step is 4 steps.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; newPos &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;myEnc&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;read&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint8_t&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; Gray;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (newPos &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; position) {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (newPos&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; newPos&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;myEnc&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (newPos&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; newPos&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;myEnc&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; position &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; newPos;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; Gray &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;GrayCode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;[position];&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;&amp;nbsp; &amp;nbsp; // Set outputs to corresponding computed grey code&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;digitalWrite&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Out0 ,&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;bitRead&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(Gray,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;digitalWrite&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Out1 ,&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;bitRead&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(Gray,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;digitalWrite&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Out2 ,&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;bitRead&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(Gray,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;digitalWrite&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Out3 ,&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;bitRead&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(Gray,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;#ifdef&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;DEBUG&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;&amp;nbsp; &amp;nbsp; // print on serial&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(position);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;: &quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;bitRead&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(Gray,i));&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;&amp;nbsp; &amp;nbsp; #endif&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Voici à quoi ressemble le résultat final. En rouge, le +5V, en Jauneles fils du codeur incrémental, en vert les sorties vers l'emplacement de l'encodeur absolu sur le pcb et en noir les masses.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/Digitech/.IMG_4787_m.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/Digitech/.IMG_4788_m.jpg&quot; /&gt;&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2025/10/14/Remplacement-de-l-encodeur-abosolu-Gray-par-un-codeur-incr%C3%A9mental-arduino-sur-les-racks-d-effet-Digitech#comment-form</comments>
          <wfw:comment>https://civade.com/post/2025/10/14/Remplacement-de-l-encodeur-abosolu-Gray-par-un-codeur-incr%C3%A9mental-arduino-sur-les-racks-d-effet-Digitech#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/132</wfw:commentRss>
              </item>
          <item>
        <title>Ajout d'un sélecteur de canaux sur Marshall 6101 compatible avec les racks d'effet TC Electronics (GMajor, etc...)</title>
        <link>https://civade.com/post/2025/09/20/Ajout-d-un-s%C3%A9lecteur-de-canaux-sur-Marshall-6101-compatible-avec-les-racks-d-effet-TC-Electronics-%28GMajor%2C-etc...%29</link>
        <guid isPermaLink="false">urn:md5:8f3c01f1bab3b4c66a2f744882f4ecf4</guid>
        <pubDate>Sat, 20 Sep 2025 05:29:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>Ampli</category>
                  <category>Firmware</category>
                  <category>Musique</category>
                <description>&lt;p&gt;Le Marshall 6101 anniversary dispose d'une entrée pour un pédalier spécifique permettant le changement de canaux (Clean / Rythm / Lead) sur une prise DIN. Il est également midi (quoi que datant de 1992) pour permettre une commutation de canaux. Mais cela peut s'avérer fastidieux de gérer l'envoi de program change d'un rack d'effet pour commuter les canaux du Marshall. Certains racks d'effets disposent de sorties sur contact sec, dont on peut choisir l'état pour chaque programme. Ils sortent généralement sur un Jack stéréo ou Tip (la pointe) est la sortie 1 et ring (l'anneau) est la sortie 2. Cela fonctionne très bien avec des amplis comme les Mesa Boogie Mark V qui sont équipés d'entrées jack de séléection de canux, mais pas sur le Marshall qui n'en a pas. Il me semblat intéressant d'investiguer cette piste en ajoutant au Marshall la possibilité de choisir les canaux sur&amp;nbsp; une entrée jack à brancher sur le rack et ainsi de choisir directmenet dans le programme du TC quelle entrée de l'ampli guitare sélectionner, et ce par programme... Ainsi en commandant le TC en midi, on peut faire des programmes élaborés oû tous les paramètres d'effet sont choisis ET le canal approprié sur l'ampli.&lt;/p&gt;          &lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/6101_anniversary.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Afin de faire une modification simple et surtout réversible (pas de modification durable de l'ampli qui est toute de même un collector de 1992) j'ai choisi d'interfacer cette modification avec les entrées DIN du pédalier. Seules quelques soudures sont à faire sur la Prise DIN à l'intérieur de ampli pour récuérer les 3 fils de sélection de canaux, le 5V et la masse.&lt;/p&gt;

&lt;p&gt;Pour éviter d'interférer avec son fonctionnement normal et permettre le forçage par le pédalier d'un autre canal que celui présélectionné par le GMajor, j'ai choisi d'uiliser un microcontrôleur qui va envoyer une impusion de 100 millisecondes lors du changement de canl, et repasser en tristate (haute iimpédance) à l'issue. Ainsi le micro n'est en sortie que pendant un temps très court et le pédalier du Marshall (ou la sélection de canaux par le panneau avant) reste fonctionnelle. On peut donc forcer le changement de canal bien après avoir choisi le programme sur le TC pour passer en solo par exemple.&lt;/p&gt;

&lt;p&gt;Le micro contrôleur choisi est un AT Tiny85 (ou clone de Digistump) que l'on trouve sous forme de petite carte programmable en USB sur aliexpress pour moins de 2 euros. Sa très faible consommation&amp;nbsp; (une dizaine de milliampères)&amp;nbsp;fait que l'on peut sans problème se brancher sur le 5V disponible dans l'amplli pour alimenter le processeur qui gère le midi.&lt;/p&gt;

&lt;p&gt;Les 6 broches utiles de l'AT Tiny85 suffisent largement pour raccorder les 2 entrées pour le jack 6.35, et les 3 sorties pour la commutation de canaux. Attention toutefois, pour ne pas perturber l'émulation USB lors de la programmation, la carte doit être déconnectée des E/S du pédalier.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/.Image_TE_HE066_G-MAJOR_Left_XL_m.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/.Image_TE_HE066_G-MAJOR_Rear_XL_m.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Les 2 sorties du Gmajor (disponibles sur la prise &quot;Switch Out&quot;) permettent de gérer 4 états, mais nous n'en utiliserons ici que 3, car il n'y a que 3 canaux sur le Marshall :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;00 Aucun relais : canal 1&lt;/li&gt;
	&lt;li&gt;01 Relais 1: Canal 2&lt;/li&gt;
	&lt;li&gt;10 Relais 2: Canal 3&lt;/li&gt;
	&lt;li&gt;11 Les 2 relais : ne fait rien, non supporté.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour le pas modifier la face arrière de l'ampli, c'est un jacks stéréo male qui est sorti du chassis à l'aide d'un cable d'une quarantaine de centimètres. Fixé au chassis par des colliers nylon pour éviter l'arrachement.. Il pourra trainer au font à l'arrière de l'amplli si inutilisé.&lt;/p&gt;

&lt;p&gt;Pour remettre l'ampli en état d'origine, supprimer les colliers nylon, le cable, le jack et dessouder les 5 fils (ou1/out2/out2/Masse/+5) de la prise DIn et virer l'AT Tiny85. C'est donc totalement réversible et ne laisse aucun trou.&lt;/p&gt;

&lt;p&gt;Voici le code, abondamment documenté. Il contient les indications pour le cablage.&lt;/p&gt;

&lt;div style=&quot;color: #ffffff;background-color: #000000;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Adaptateur TC Electronics GMajor &amp;gt; Marshall 6110&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Permet d''utiliser les 2 sorties sur relais du TC pour piloter le cngt de canaux&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Aucun relais : canal 1&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Relais 1: Canal 2&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Relais 2: Canal 3&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Les 2 relais : ne fait rien, non supporté.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Cablage &lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// En sortie du TC, Jack 6.35mm stéréo &quot;Switch out&quot;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Il suffit de relier Tip à In1, Ring à In2, et le pullup intégré à l'arduino fait le reste.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// - Masse: GND&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// - Tip: Relais 1&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// - Ring: Relais 2&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Sur le marshall, prise DIN du pédalier &lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// - Pin 1 Ch3&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// - Pin 2 Ch1&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// - Pin 3 GND&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// - Pin 4 NC&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// - Pin 5 Ch2&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// - Pin 6 +5V&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Target processor : ATTINY85 (Digistump clone). &amp;nbsp;Choose Digispark default 16.5Mhz as target board. Can be programmed with USB.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Driver for windows : https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/Digistump.Drivers.zip&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Digistump addon for ATTINY85: https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Pin 4 &amp;amp; 5 musb be left no connnected during prog for USB to works.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;
 

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// I/O&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Sorties vers pédalier Marshall&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Pour arduino pro mini ou pro micro&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; Ch1 &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; Ch2 &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; Ch3 &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Entrées en provenance du G Major.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Pour arduino pro mini ou pro micro&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; In1 &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; In2 &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;#define&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;DELAYTIME&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;500&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;// Sauvegarde des états&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;////////////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; OldState &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; // State of inputs, old status&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; CurrState &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;// State of inputs, current status&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;setup&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; ()&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;115200&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;TC Gmajor to Marshall 6101&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;&amp;nbsp; // Astuce pour faire des sorties &quot;tristate&quot;: &lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;&amp;nbsp; // on écrit un zero sur la sortie, mais on met la broche en entrée jusqu'à ce qu'on en ait besoin&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt;&amp;nbsp; // et la on la bascule en sortie le temps de la commutation.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;digitalWrite&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch1, LOW) ;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;digitalWrite&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch2, LOW) ;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;digitalWrite&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch3, LOW) ;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch1, INPUT);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch2, INPUT);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch3, INPUT);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (In1, INPUT_PULLUP);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (In2, INPUT_PULLUP);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;Channel1&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch1, OUTPUT) ;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; // drive pin low&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&amp;gt; Channel 1&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;delay&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(DELAYTIME);&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Delay 100ms&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch1, INPUT) ;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; &amp;nbsp;// hi-Z state&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;Channel2&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&amp;gt; Channel 2&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch2, OUTPUT) ;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; // drive pin low&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;delay&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(DELAYTIME);&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Delay 100ms&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch2, INPUT) ;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; &amp;nbsp;// hi-Z state&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;Channel3&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&amp;gt; Channel 3&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch3, OUTPUT) ;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; // drive pin low&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;delay&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(DELAYTIME);&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Delay 100ms&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;pinMode&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (Ch3, INPUT) ;&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; &amp;nbsp;// hi-Z state&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;

&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;loop&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; () {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; CurrState &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;digitalRead&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (In1) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;digitalRead&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(In2) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (CurrState &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; OldState) {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Current state : &quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(CurrState);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Old state : &quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Serial&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;(OldState);&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; OldState &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; CurrState;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (CurrState) {&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;):&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; // Les 2 relais ne sont pas activés&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;Channel1&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;):&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; // 1er relais activé&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;Channel2&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;):&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; // 2e relais activé&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;Channel3&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;):&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; &amp;nbsp; // les 2 relais sont activés : non supporté, ne fait rien.&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; // end switch&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;span style=&quot;color: #7ca668;&quot;&gt; // end state changed&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2025/09/20/Ajout-d-un-s%C3%A9lecteur-de-canaux-sur-Marshall-6101-compatible-avec-les-racks-d-effet-TC-Electronics-%28GMajor%2C-etc...%29#comment-form</comments>
          <wfw:comment>https://civade.com/post/2025/09/20/Ajout-d-un-s%C3%A9lecteur-de-canaux-sur-Marshall-6101-compatible-avec-les-racks-d-effet-TC-Electronics-%28GMajor%2C-etc...%29#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/131</wfw:commentRss>
              </item>
          <item>
        <title>Améliorations guitare Hohner ST59 : le vibrato + infos diverses</title>
        <link>https://civade.com/post/2025/05/14/Am%C3%A9liorations-guitare-Hohner-ST59-%3A-le-vibrato-infos-diverses</link>
        <guid isPermaLink="false">urn:md5:fa3f697428ffed277825e19cc58c8aa0</guid>
        <pubDate>Wed, 14 May 2025 07:25:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>Guitare</category>
                  <category>Musique</category>
                  <category>vibrato</category>
                <description>&lt;p&gt;Hohner a fait de nombreuses guitares, dont de très bonnes copies de stratocaster. Voyons comment il est possible de les améliorer.&lt;/p&gt;          &lt;p&gt;Je possède (entre autres..) une Hohner ST59 ATN de 1995. Cette guitare, manifestement fabriquée en Corée par la marque, dispose d'une lutherie plutôt correcte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 Micro simple bobinage GS 1S ;&lt;/li&gt;
&lt;li&gt;1 potentiomètre de volume ;&lt;/li&gt;
&lt;li&gt;1 potentiomètre de tonalité ;&lt;/li&gt;
&lt;li&gt;1 potentiomètre de réglage de tonalité ATN (fonction spéciale à la ST59) ;&lt;/li&gt;
&lt;li&gt;Electronique passive&lt;/li&gt;
&lt;li&gt;Sélecteur 5 positions, avec les 2 positions 2 et 4 qui mettent les micros en inversion de phase ;&lt;/li&gt;
&lt;li&gt;22 frettes en maillechort ;&lt;/li&gt;
&lt;li&gt;Mécaniques Deluxe ;&lt;/li&gt;
&lt;li&gt;Accastillage doré ;&lt;/li&gt;
&lt;li&gt;Corps en érable massif de Californie ;&lt;/li&gt;
&lt;li&gt;Manche vissé en erable de californie avec touche en bois de rose (palissandre)&lt;/li&gt;
&lt;li&gt;Vibrato 2 points&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Après avoir fait une planimétrie sur les frettes, un réglage de la courbure du manche, de l'intonation et de l'action, la guitare s'avère très agréable à jouer.&lt;/p&gt;


&lt;p&gt;Seul bémol, le vibrato. Il est plutot pas mal grâce à ses 2 points de pivots et la guitare tient assez bien l'accord (mieux que ma strat officielle en fait). Mais par contre, le levier se visse dans un le bloc vibrato qui est en ZAMAC (alliage de Zinc et d'aluminium, très facile à mouler, mais n'ayant pas une bonne tenue mécanique). Or à force de jouer, la tige filetée prend du jeu dans le trou taraudé dans le bloc en Zamac et amène une 'course morte' très désagréable. Pas bon...&lt;/p&gt;


&lt;p&gt;Bien sur on peut changer le vibrato pour en remettre un neuf. La référence adaptée est &lt;a href=&quot;https://www.amazon.fr/dp/B0922CH774?th=1&quot;&gt;Musiclily Pro 52,5mm 2-Point Style Bloc Court Chevalet Tremolo Vibrato pour Guitare Squier Strat, Chrome&lt;/a&gt;. On le trouve aussi assez facilement sur Aliexpress. Mais la joie d'un vibrato neuf est de courte durée, car si l'on joue beaucoup avec le vibratro, le problème réapparait au rapidement, toujours à cause de l'usure du Zamac.&lt;/p&gt;


&lt;p&gt;Une solution plus définitive consiste à monter un bloc vibrato d'une autre matière plus solide. Les cotes de ce vibrato étant assez particulières, c'est pas facile à sourcer. J'ai trouvé une référence compatible, soit en acier soit en laiton: &lt;a href=&quot;https://fr.aliexpress.com/item/1005003647904916.html&quot;&gt;Musiclily Ultra 52.5mm bloc trémolo en laiton massif/acier pour la Chine et l'Indonésie fabriqué par le pont de guitare de la série Standard Squier, 40mm&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Il faut juste agrandir un peu le trou de passage de la tige du vibrato dans la platine vibrato (Perçer à 7mm le trou percé actuellement à 6mm) et le bloc monte parfaitement. Et là c'est le jour et la nuit ! Le sustain est meilleur et il n'y a plus le moindre jeu.&lt;/p&gt;


&lt;p&gt;Pour ceux qui n'aiment pas quand le levier de vibrato ne reste pas en place et descent tout seul, on peut aussi ajouter un ressort en fond de trou du levier du vibrato. C'est assez facile à trouver, comme par exemple &lt;a href=&quot;https://fr.aliexpress.com/item/1005008105741246.html&quot;&gt;ICI&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Le système ATN (Advanced Tonal Network Circuitry) ajoute un petit module qui change pas mal le comportement tonal de la guitare; Il est visiblement basé sur un filtre LC noyé dans de la résine. &lt;a href=&quot;https://civade.com/images/ST59/hohner-st-59-atn-notice-3-472687.pdf&quot;&gt;En voici le mode d'emploi&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;J'ai également relevé le schéma de cablage de ce module, car il est indisponible sur internet:
&lt;img src=&quot;https://civade.com/images/ST59/st59_-2.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;D'autres astuces suivront, et viendront compléter ce post.&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2025/05/14/Am%C3%A9liorations-guitare-Hohner-ST59-%3A-le-vibrato-infos-diverses#comment-form</comments>
          <wfw:comment>https://civade.com/post/2025/05/14/Am%C3%A9liorations-guitare-Hohner-ST59-%3A-le-vibrato-infos-diverses#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/130</wfw:commentRss>
              </item>
          <item>
        <title>Les ports Série et USB Série sous Wine</title>
        <link>https://civade.com/post/2025/01/09/Les-ports-S%C3%A9rie-et-USB-S%C3%A9rie-sous-Wine</link>
        <guid isPermaLink="false">urn:md5:5e0b1008399ccc18e2f6223ea156d9fe</guid>
        <pubDate>Thu, 09 Jan 2025 14:42:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Logiciels Libres</category>
                          <category>DIY</category>
                  <category>Free</category>
                  <category>Linux</category>
                  <category>OpenSource</category>
                <description>&lt;p&gt;Wine permet aux utilisateurs Linux, Mac, FreeBSD et Solaris d'exécuter des applications Windows sans nécessiter de copie de Microsoft Windows. Wine est un logiciel
libre en développement permanent. Mais faire fonctionner des ports série dans Wine avec ces logiciels n'est pas toujours simple.&lt;/p&gt;          &lt;p&gt;&lt;img src=&quot;https://civade.com/images/.winhq-usb_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;Ceci peut être intéressant pour les utilisateurs linux, qui ont besoinde faire fonctionner des application qui n'existent que dans l'environnement windows et sont compatibles Wine. Vous pouvez d'alileurs vérifier si votre application fait partie des plus de 16000 applications testées compatible dans la base de données https://appdb.winehq.org/.&lt;/p&gt;


&lt;p&gt;J'ai eu cette problématique pour faire fonctionner uTracer GUI, un logiciel permettant de piloter le traceur de courbes pour tubes à vides développé par Ronald Dekker afin de tester et caractériser les lampes utilsiées sur mes amplis à lampes. uTracer est bien compatible (https://appdb.winehq.org/objectManager.php?sClass=application&amp;amp;iId=21259 )&lt;/p&gt;


&lt;p&gt;Le logiciel est développé en visual basic, et communique par un port série avec le matériel. Malheureusement de nos jours, les PC ne sont plus livrés avec des ports série. Toutefois les cables adapteateurs USB/série font très bien le boulot. Les meilleurs d'entre eux sont ceux basée sur les composants FT232r de FTDI. En effet ce sont ceux qui bénéficient de la meilleure protection ESD et immunité au bruit. Accessoirement, ce sont également ceux qui bénéficient du meilleur support sur tous les systèmes d'exploitation. Ca nous arrange !&lt;/p&gt;


&lt;p&gt;Installer Wine dans une distribution Linux n'est pas très compliqué. Il vaut d'alleurs privillégier la méthode officielle que la version de Wine livré avec votre distribution Linux, souvent en retard de plusieurs versions.&lt;/p&gt;


&lt;p&gt;Sur Debian, Ubuntu et distritions filles, la méthode &quot;Wine HQ&quot; est assez bien documentée : &lt;a href=&quot;https://gitlab.winehq.org/wine/wine/-/wikis/Debian-Ubuntu&quot;&gt;https://gitlab.winehq.org/wine/wine/-/wikis/Debian-Ubuntu&lt;/a&gt; . Il suffit d'ajouter les clés, le dépot et d'installer le paquet.&lt;/p&gt;


&lt;p&gt;Au passage, petite coquille, il ne faut pas faire :&lt;/p&gt;


&lt;p&gt;&lt;code&gt;sudo apt install --install-recommends winehq-stable&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;mais bien:&lt;/p&gt;


&lt;p&gt;&lt;code&gt;sudo apt install --install-recommends wine-stable&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;Wine étant installé, vous pourrez installer votre programme de façon classique en lancant le setup.exe&lt;/p&gt;


&lt;p&gt;&lt;code&gt;WINEPREFIX=~/.wine wine  ./setup.exe&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;A ce stade, vous pouvez lancer votre programme par l'interface graphique.&lt;/p&gt;


&lt;p&gt;Malheureusement dans le cas de uTracer, seul les ports série physiques sont exportés dans windows (ttyS0=COM1, ttyS1=COM2, etc..). Si vous avez un PC avec un vrai port série, c'est fini. Si vous avez un cable USB &amp;lt;&amp;gt; Série il rete encore une étape.&lt;/p&gt;


&lt;p&gt;Wine prévoir un mécanisme configurable par la registry de windows pour créer des alias de ports, et ainsi permettre l'usage d'adaptateurs USB &amp;lt;&amp;gt; série (ttyUSB0...).&lt;/p&gt;


&lt;p&gt;Pour le configurer il suffit de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vérifier (et le cas échéant ajouter) votre utilisateur dans le groupe dialout avec &quot;sudo adduser $USER dialout&quot;&lt;/li&gt;
&lt;li&gt;Brancher votre cable sur votre poste de travail linux&lt;/li&gt;
&lt;li&gt;faire &quot;sudo dmesg&quot; et regarder sur quel périphérique votre cable est détecté / monté (habituellement /dev/ttyUSB0)&lt;/li&gt;
&lt;li&gt;Lancer l'editeur de registre de wine (&quot;WINEPREFIX=~/.wine wine regedit&quot;)&lt;/li&gt;
&lt;li&gt;Ajouter une valeur chaine dans HKEY_LOCAL_MACHINE\Software\Wine\Ports avec un nom de clé &quot;COM1&quot; et une valeur correspondant à ce que vous avez relevé dans dmesg ( ici /dev/ttyUSB0 ).&lt;/li&gt;
&lt;li&gt;Quitter regedit&lt;/li&gt;
&lt;li&gt;Lancer votre programme windows sous wine&lt;/li&gt;
&lt;li&gt;Quitter votre programme windows sous wine&lt;/li&gt;
&lt;li&gt;Vérifier dans ~/.wine/dosdevices que le lien symbolique vers le port usb a bien été créé :&lt;/li&gt;
&lt;/ul&gt;


&lt;pre&gt;ls ~/.wine/dosdevices
&lt;strong&gt;lrwxrwxrwx 1 jpcivade jpcivade   10 Jan  9 08:44 com1 -&amp;gt; /dev/ttyUSB0&lt;/strong&gt;
lrwxrwxrwx 1 jpcivade jpcivade   10 Jan  9 08:44 com2 -&amp;gt; /dev/ttyS1
lrwxrwxrwx 1 jpcivade jpcivade   10 Jan  9 08:44 com3 -&amp;gt; /dev/ttyS2
lrwxrwxrwx 1 jpcivade jpcivade   10 Jan  9 08:44 com4 -&amp;gt; /dev/ttyS3
lrwxrwxrwx 1 jpcivade jpcivade   10 Jan  9 08:42 com5 -&amp;gt; /dev/ttyS2
lrwxrwxrwx 1 jpcivade jpcivade   10 Jan  9 08:42 com6 -&amp;gt; /dev/ttyS3
lrwxrwxrwx 1 jpcivade jpcivade   12 Jan  9 08:39 com7 -&amp;gt; /dev/ttyUSB0&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Voila maintenant vous pouvez lancer votre programme windows et voir votre cable USB en COM1 !&lt;/li&gt;
&lt;li&gt;Si l'affichage vous parait trop petit, vous  pouvez changer la résolution d'écran ( changer le nombre de dpi).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;code&gt;WINEPREFIX=~/.wine winecfg&lt;/code&gt;&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2025/01/09/Les-ports-S%C3%A9rie-et-USB-S%C3%A9rie-sous-Wine#comment-form</comments>
          <wfw:comment>https://civade.com/post/2025/01/09/Les-ports-S%C3%A9rie-et-USB-S%C3%A9rie-sous-Wine#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/129</wfw:commentRss>
              </item>
          <item>
        <title>Sons, éditeur et documentations pour rack d'effet Johnson Jstation</title>
        <link>https://civade.com/post/2024/09/29/Sons%2C-%C3%A9diteur-et-documentations-pour-rack-d-effet-Johnson-Jstation</link>
        <guid isPermaLink="false">urn:md5:a6e8e78040cc19abe9600e00ce778d7d</guid>
        <pubDate>Sun, 29 Sep 2024 05:27:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>Ampli</category>
                  <category>Guitare</category>
                  <category>Musique</category>
                <description>&lt;p&gt;Le J-Station est un effet guitare / modeleur qui offre dix-neuf types d’amplis différents : quatorze concernent la guitare électrique, trois la basse (basés sur un SWR, un Trace Elliot et un Ampeg SVT) et deux simulent une guitare électroacoustique (son de piezo ou son de dreadnought).&lt;/p&gt;          &lt;p&gt;&lt;a href=&quot;https://civade.com/images/johnson-amplification-j-station-1664.jpg&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;img src=&quot;https://civade.com/images/.johnson-amplification-j-station-1664_m.jpg&quot; alt=&quot;Jstation&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ayant décidé de vendre le mien, j'ai regroupé la documentation et vérifié le bon fonctionnement de l'éditeur sur PC. Malheureusement l'installeur ne fonctionne plus sous windows 11. Je l'ai donc décompressé pour vérifier si les executables contenus étaient eux toujours fonctionnels. C'est le cas cela fonctionne.&lt;/p&gt;


&lt;p&gt;Pour ne pas perdre les sons collectés, l'éditeur et les manuels / documentation, j'ai déposé tout ceci sur un repository git : &lt;a href=&quot;https://gitlab.civade.com/pub/music-patches/-/tree/master/Others/Guitar%20Effect%20Johnson%20Jstation&quot; title=&quot;Jstation editor, Manual and sounds&quot;&gt;https://gitlab.civade.com/pub/music-patches/-/tree/master/Others/Guitar%20Effect%20Johnson%20Jstation&lt;/a&gt;&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2024/09/29/Sons%2C-%C3%A9diteur-et-documentations-pour-rack-d-effet-Johnson-Jstation#comment-form</comments>
          <wfw:comment>https://civade.com/post/2024/09/29/Sons%2C-%C3%A9diteur-et-documentations-pour-rack-d-effet-Johnson-Jstation#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/127</wfw:commentRss>
              </item>
          <item>
        <title>Guitare Musicman Luke 2 - Entretien et améliorations</title>
        <link>https://civade.com/post/2024/06/20/Guitare-Musicman-Luke-2-Entretien-et-am%C3%A9liorations</link>
        <guid isPermaLink="false">urn:md5:8e893cc11ffc5fbc744b1dbb6d79d06f</guid>
        <pubDate>Thu, 20 Jun 2024 15:36:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>Ampli</category>
                  <category>Guitare</category>
                  <category>Musique</category>
                <description>&lt;p&gt;Nouveau propriétaire depuis peu d'une Musicman Luke II de 1999, il y avait quelques petites choses à reprendre dessus. Ce billet a pour objectif de documenter certaines infos que j'ai pu mettre un certain temps à trouver.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;https://civade.com/images/Luke/.musicman-luke_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;          &lt;h3&gt;Historique de la guitare :&lt;/h3&gt;

&lt;p&gt;Musicman dispose d'une base de données bien pratique vous permettant de récupérer des informations d'après le numéro de série sur la guitare. C'est disponible ici: &lt;a href=&quot;https://www.music-man.com/serial-number-database&quot;&gt;https://www.music-man.com/serial-number-database&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Le modèle Music Man Luke est le modèle signature de Steve Lukather. Introduit en 1994, il a commencé comme un design Music Man. Le modèle Luke avait un vibrato à verrouillage Floyd Rose, 2 micros EMG simple bobinage/1 humbucker, un contrôle de volume, un interrupteur à 5 positions, une électronique active et était disponible en finitions Pearl Blue ou Pearl Red.&lt;/p&gt;


&lt;p&gt;En 1998, la conception du modèle Luke a été mise à jour pour mieux répondre aux exigences de Lukather. Ce modèle Luke II comportait un trémolo / vibrato de style vintage Music Man, des mécaniques à verouillage Schaller M6-IND locking (introuvables au détail...), des micros à simple bobinage EMG-SLV à remontage personnalisé, des commandes de volume et de tonalité. La finition Luke Blue (Light Pearl Blue) a été introduite ; Les finitions Pearl Blue et Pearl Red ont été abandonnées.&lt;/p&gt;


&lt;p&gt;En 2012, une autre génération de guitare appelée LIII (Luke III) a été introduite avec un corps légèrement plus grand, un manche en palissandre et des options de configuration de micro passif (double humbucker ou HSS) combinés à un préampli actif et un circuit boost contrôlé à partir d'un contrôle de tonalité push/push. En option sur ce modèle un micro piezo sur le chevalet.&lt;/p&gt;


&lt;p&gt;En 2024, pour fêter les 25 ans de la Luke, MusicMan sort 4 séries limitées exclusives: La Luke 4. Equipées de Micros MusicMan à haut gain (SSH, SSS ou HH), du sélecteur de boost en tirant sur le bouton de volume (+20db, des malades je vous dis!!!) , cette série célèbre aussi l'arrivée d'un novueau vibrato à couteaux avec blocage + vis de micro réglage, ressemblant au Floyd Rose des premières séries et d'un corps en Black Limba avec placage en Erable Ondé. C'est très beau. Ca peut... de 3500 euros à 4700 euros pour une Ball Family Reserve limited (150 exemplaires signés par Mr Luke lui même...)&lt;/p&gt;


&lt;h3&gt;Forum Ernie Ball&lt;/h3&gt;

&lt;p&gt;Le Forum de la marque Ernie Ball (propriétaire de Music Man depuis 1984, après son rachat à Forrest White, Tom Walke et Leo Fender) regorge d'infos et est assez actif.  Ca se passe ici: &lt;a href=&quot;https://forums.ernieball.com/forums/ernie-ball-music-man-guitars/&quot;&gt;https://forums.ernieball.com/forums/ernie-ball-music-man-guitars/&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Micros et câblage&lt;/h3&gt;

&lt;p&gt;Sur le forum il y a pas mal d'informations sur le câblage et les micros, mais malheureusement toutes les séries n'y sont pas documentées.  Le schéma de la mienne n'étant pas disponible sur le forum, j'ai donc fait la demande au support de Musicman qui me l'a très gentiment envoyé. Très pros les gars...&lt;/p&gt;


&lt;p&gt;La Luke II de 1999 dispose de 3 micros actifs, 2 simples et un double, pas de boost, et l'électronique active des micros est intégrée dans ceux ci. Les 2 micros simples sont des EMG custom design pour Steve Lucather nommés  &quot;&lt;a href=&quot;https://www.emgpickups.com/slv.html&quot;&gt;SLV&lt;/a&gt;&quot;. Le double est un &lt;a href=&quot;https://www.emgpickups.com/85.html&quot;&gt;EMG 85&lt;/a&gt; plus classiques. Les 3 utilisent des aimants Alnico V. On trouve d'ailleurs le &lt;a href=&quot;https://www.emgpickups.com/slv-slv-85.html&quot;&gt;set à la vente&lt;/a&gt; sur le site d'EMG pour la somme de 279 USD.&lt;/p&gt;


&lt;p&gt;Un sélecteur 5 positions permet de sélectionner les micros à l'image de ce qui est fait sur une strat :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Position 1: Micro bridge seul (double)&lt;/li&gt;
&lt;li&gt;Position 2: Micro Bridge (double)+ Central (simple)&lt;/li&gt;
&lt;li&gt;Position 3: Micro Central  seul (simple)&lt;/li&gt;
&lt;li&gt;Position 4: Micro Central (simple) + Manche (simple)&lt;/li&gt;
&lt;li&gt;Position 5: Micro Manche seul (simple)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Sur ma série, du fait de l'intégration de l'électronique dans les micros, le câblage est assez simple, d'autant plus que Musicman a fait un petit circuit imprimé qui centralise pratiquement toutes les connexions. C'est très clair à comprendre et très efficient. Voici  le cablage d'un modèle 1999: &lt;a href=&quot;https://civade.com/images/Luke/Luke_HSS_-_1997_12_4__REV._A_.pdf&quot;&gt;Luke HSS - 1997_12_4 (REV. A).pdf&lt;/a&gt;. Il semblerait qu'à partir de l'année 2000, le préampli soit sur une carte séparée et les miicros redeviennet passifs.&lt;/p&gt;


&lt;p&gt;Toute l'électronique est logée dans des cavités blindées par une peinture graphite et refermée par une plaque de protection blindée par une feuille d'aluminium. Un fil de masse, pris entre cuir et chair sur le le rebord de la cavité permet de faire la conductivité sur l'aluminium de la plaque de protection et ainsi d'avoir un blindage intégral. Le résultat est que la guitare est très silencieuse.&lt;/p&gt;


&lt;p&gt;Les 2 potentiomètres sont des 25K A. Ce A nécessite une petite explication. En Europe, A correspond à Linéaire, et B à Logarithmique (ou audio). Aux USA ou en asie c'est le contraire...  La guitare étant équipée de potentiomètres CTS américains (Chicago Telephone Supply), le A veut donc dire logarithmique ou Audio.&lt;/p&gt;


&lt;h3&gt;Amélioration du cablage&lt;/h3&gt;

&lt;p&gt;La Luke II souffre d'un tout petit défaut. Les positions 1 et 2 sont très similaires, car le micro double prédomine sur le simple. Sur le forum certains utilisateurs ont modifé légèrement le cablage en ajoutant en série avec le micro 2 dans la position 2 une capacité de 33nF (0.033 uF) et une résistance de 22Kohms. Ceci atténue le micro bridge dans la combinaison Bridge + Central et permet d'avoir réelement 2 sons distincts entre les positions 1 et 2.&lt;/p&gt;


&lt;p&gt;Cablage non modifié :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;https://civade.com/images/Luke/non_modifie.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;Modification:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Décâbler le fil Orange du 2&lt;/li&gt;
&lt;li&gt;Supprimer le shunt entre 1 et 2&lt;/li&gt;
&lt;li&gt;Recabler le fil orange sur le 1&lt;/li&gt;
&lt;li&gt;Mettre en série la capacité de 0.33uF et la résistance, et cabler une extrémité sur 1 et l'autre sur 2. L'ordre importe peu, et ce n'est pas polarisé.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Cablage modifié :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;https://civade.com/images/Luke/modifie_annote.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;Le résulat est carrément pas mal. Mais au cas ou cela ne vous plairait pas c'est réversible!&lt;/p&gt;


&lt;h3&gt;Vibrato&lt;/h3&gt;

&lt;p&gt;Le vibrato dispose d'une vis de réglage qui permet de freiner la libre rotation du levier. C'est très pratique de pouvoir le régler  à son goût (c'est pas comme sur une Strat ou 50 ans après la conception initiale, cela n'a toujours pas été amélioré!). Elle est située à l'arrière du vibrato dans la semelle.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;https://civade.com/images/Luke/reglage_tremolo_bar.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;h3&gt;Compartiment piles&lt;/h3&gt;

&lt;p&gt;Le compartiment piles peut - si une pile a été stockée longtemps - avoir subi les affres de l'oxidation. Rien de plus simple que de le remplacer par un neuf. C'est du &lt;a href=&quot;https://www.musicstore.com/fr_FR/EUR/Goeldo-Snap-In-Batteriefach-9V-Batterie-Schwarz/art-GIT0008338-001&quot;&gt;Goldo BB-04&lt;/a&gt;.&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2024/06/20/Guitare-Musicman-Luke-2-Entretien-et-am%C3%A9liorations#comment-form</comments>
          <wfw:comment>https://civade.com/post/2024/06/20/Guitare-Musicman-Luke-2-Entretien-et-am%C3%A9liorations#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/126</wfw:commentRss>
              </item>
          <item>
        <title>True bypass intelligent avec At Tiny 85 pour pédale d'effet guitare / basse</title>
        <link>https://civade.com/post/2024/03/21/True-bypass-intelligent-pour-p%C3%A9dale-d-effet-guitare-/-basse</link>
        <guid isPermaLink="false">urn:md5:1e11e3aecc6186c9ce9f7fe3a506e906</guid>
        <pubDate>Thu, 21 Mar 2024 05:57:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                        <description>&lt;p&gt;Un true bypass est un nom compliqué pour une chose simple: un interrupteur qui permet de faire passer directement le signal d'entrée d'une pédale sur sa sortie lorsque l'on ne souhaite pas d'effet. Si cette façon de procéder était courante par le passé, les effets les plus modernes utiliseront plutôt un circuit électronique d'entrée / sortie qui ne sera pas désactivable, seul l'effet le sera. Dans ce cas pas de bruit de commutation lors de la mise en/hors service de l'effet, une sortie à relativement basse impédance, mais à contrario la guitare / basse n'est plus en prise directe avec l'ampli. Et dans le cas d'un ampli à lampes, on peut souhaiter garder la dynamique et l'impedance du micro intact pour jouer avec le headroom et la dynamique de l'étage d'entrée de l'ampli, qui se comporte à lui seul comme un véritable instrument.&lt;/p&gt;          &lt;h3&gt;Le true bypass simple:&lt;/h3&gt;

&lt;p&gt;Un thru bypass de base est confié à un interrupteur au pied (footswitch) fonctionnant en on/off et muni d'au minimum 2 circuits et cablé comme suit :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;https://civade.com/images/Bypass/.2024-03-21_07_35_18-true_bypass_simple.svg_-_Inkscape_m.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;Ce montage est très largement documenté sur internet pour modifier des pédales existantes. La version dessinée ici a le bon gout de mettre l'entrée de l'effet à la masse lorsque le Bypass est On, ce qui évite de laisser son entrée en l'air, et de capter des bruits indésirables.&lt;/p&gt;


&lt;h3&gt;True bypass à relais :&lt;/h3&gt;

&lt;p&gt;Le cablage est similaire à un true bypass à interrupteur, sauf que la commutation est confiée à un relais, donc la commande peut être effectuée par un circuit électronique qui peut être commandé par un fooswitch momentané, ou n'importe quel autre signal logique de commande (ex : midi). Ici le relais a 3 circuits, ce qui permet de surcroit d'alimenter une led on/off de l'effet. On retrouve à nouveau la mise à la masse de l'entrée de l'effet lorsque le Bypass est actif.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;https://civade.com/images/Bypass/.2024-03-21_07_34_34-true_bypass_led.svg_-_Inkscape_m.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;h3&gt;True bypass intelligent&lt;/h3&gt;

&lt;p&gt;Alors tout a été dit sur le true bypass avec les 2 schémas ci dessus? Et bien non... Car on peut souhaiter rendez ce bypass 'intelligent'. Par exemple avoir un dispositif qui fonctionne comme suit avec un footswitch momentané :&lt;/p&gt;


&lt;p&gt;- Pression brève sur le switch: on change l'état du true bypass, le faisant passer de on à off et réciproquement.&lt;/p&gt;


&lt;p&gt;- Pression longue sur le switch: on change momentanément l'état du true bypass (ex: on &amp;gt;off) et ce tant que le switch est appuyé. Si on relache le switch, cela revient à son état initial.&lt;/p&gt;


&lt;p&gt;- Pilotage d'une led à 4 états (couleurs) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;True bypass off&lt;/li&gt;
&lt;li&gt;True bypass on&lt;/li&gt;
&lt;li&gt;True bypass momentanément on (appui long)&lt;/li&gt;
&lt;li&gt;True bypass momentanément off (appui long)&lt;/li&gt;
&lt;li&gt;D'un point de vue logiciel, le double clic reste disponible pour un autre usage!&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Là cela devient intéressant, car on peut imaginer une distorsion ou un boost équipé de ce dispositif. La pédale est éteinte, et en appuyant et restant appuyé on l'allume tant qu'on reste appuyé pour avoir un peu plus de gain / saturation pour faire un solo par exemple.... et on relache quand on a fini!&lt;/p&gt;


&lt;h3&gt;Réalisation&lt;/h3&gt;

&lt;p&gt;Cela aurait pu être réalisé avec des circuits logiques, mais j'ai ici préféré utiliser un petit microprocesseur.  En effet, il est facile d'intervenir dessus pour changer les temps de détection d'appui long, temps de commutation, juste en changeant le code et en reflashant. Pratique.
Ici, j'ai choisi d'utiliser un attiny85. Ce microprocesseur compatible arduino (avec quelques limitations) a très peu de mémoire (8Ko de flash Eprom pour le code, 512 octets d'E2Prom et 512 octets de RAM), mais cela sera largement suffisant pour gérer notre switch. Une petite carte sympa va nous faciliter la vie: la Digispark AtTiny85 :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;https://civade.com/images/Bypass/.Digispark_m.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;https://civade.com/images/Bypass/Digispark-pinout.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;


&lt;p&gt;Nous aurons besoin sur la digispark :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;D'une entrée pour connecter notre interrupteur momentané au pied (P2)&lt;/li&gt;
&lt;li&gt;D'une sortie pour piloter le relais et éventuellement une led m/a (P1)&lt;/li&gt;
&lt;li&gt;Optionnellement d'une sortie SPI pour piloter une led RGB neopixel, ce qui nous permettra de choisir la couleur en fonction de l'état (parmis les 4 états cité ci dessus). Nous utiliserons P0&lt;/li&gt;
&lt;li&gt;A noter qu'il ne vaut mieux pas utiliser P3 et P4 qui sonbt pris par l'usb, ce qui nous permettra de mettre à jour la carte facilement.&lt;/li&gt;
&lt;li&gt;P5 reste disponible pour un usage ultérieur.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Il nous faudra également un relais 5V, 2RT (ou autrement dit 2 contacts repos travail). Chaque circuit du relais founit un point commun (C), sur sortie vers un contact normalement fermé (NC) lorsque le relais n'est pas actionné, et son pendant normalement ouvert (NO) lorsque le relais n'est pas actionné.&lt;/p&gt;


&lt;p&gt;En voici le schéma de principe et le placement sur une platine d'essai:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Bypass/sch.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;img src=&quot;https://civade.com/images/Bypass/.sch_m.png&quot; alt=&quot;schema&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Bypass/brd.png&quot; title=&quot;Ouvrir le média&quot;&gt;&lt;img src=&quot;https://civade.com/images/Bypass/.brd_m.png&quot; alt=&quot;Fritzing&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;A noter que le cablage des 2 contacts du relais n'est pas représenté à des fins de simplification. Ils devront être cablés comme déjà décrit en haut.&lt;/p&gt;



&lt;h3&gt;Code&lt;/h3&gt;

&lt;p&gt;Il va y avoir de petites manipulations pour compiler et installer le code; En effet, en plus de l'environnement Arduino, il va falloir installer les drivers (https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/Digistump.Drivers.zip) et un addon pour l'environnement arduino pour suopporter l'ATTiny85. Pour ce faire il faut aller dans le menu &quot;Fichier / Préférences / URL de gestionnaire de cartes supplémenaires&quot; de l'environnement arduino et ajouter la source &quot;https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json&quot; .&lt;/p&gt;


&lt;p&gt;La bibliothèque &quot;Onebutton&quot; est requise pour ce projet. Pour l'installer, aller dans &quot;Croquis / Importer une bibliothèque / gérer les bibliothèques&quot; et utiliser le moteur de recherche pour isntaller &quot;onebutton&quot;. Malheureusement cette bibliothèque utilise de toutes nouvelles directives qui ne sont pas supportées par le compilateur intégré à l'environnement pour ATTiny85. Cela se corrige simplement en éditant le fichier %homepath%\Documents\Arduino\libraries\OneButton\src\OneButton.h et en mettant // devant les lignes 57, 64 et 71 (celles qui commencent par deprecated...):&lt;/p&gt;


&lt;pre&gt; /**
 * set # millisec after safe click is assumed.
 */
 //  &lt;a href=&quot;https://civade.com/post/2024/03/21/True-bypass-intelligent-pour-p%C3%A9dale-d-effet-guitare-/[deprecated(&amp;quot;Use setDebounceMs() instead.&amp;quot;)&quot; title=&quot;[deprecated(&amp;quot;Use setDebounceMs() instead.&amp;quot;)&quot;&gt;[deprecated(&quot;Use setDebounceMs() in...&lt;/a&gt;]
 void setDebounceTicks(const unsigned int ms) { setDebounceMs(ms); }; // deprecated
 void setDebounceMs(const unsigned int ms);
 /**
  * set # millisec after single click is assumed.
  */
//  &lt;a href=&quot;https://civade.com/post/2024/03/21/True-bypass-intelligent-pour-p%C3%A9dale-d-effet-guitare-/[deprecated(&amp;quot;Use setClickMs() instead.&amp;quot;)&quot; title=&quot;[deprecated(&amp;quot;Use setClickMs() instead.&amp;quot;)&quot;&gt;[deprecated(&quot;Use setClickMs() inste...&lt;/a&gt;]
 void setClickTicks(const unsigned int ms) { setClickMs(ms); }; // deprecated
 void setClickMs(const unsigned int ms);
 /**
  * set # millisec after press is assumed.
  */
 //  &lt;a href=&quot;https://civade.com/post/2024/03/21/True-bypass-intelligent-pour-p%C3%A9dale-d-effet-guitare-/[deprecated(&amp;quot;Use setPressMs() instead.&amp;quot;)&quot; title=&quot;[deprecated(&amp;quot;Use setPressMs() instead.&amp;quot;)&quot;&gt;[deprecated(&quot;Use setPressMs() inste...&lt;/a&gt;]
 void setPressTicks(const unsigned int ms) { setPressMs(ms); }; // deprecated
 void setPressMs(const unsigned int ms);&lt;/pre&gt;


&lt;p&gt;Une fois ceci fait, aller dans &quot;Outils / Cartes / Gestionnaire de cartes&quot;, et installer le paquet nommé &quot;Digistump AVR Boards&quot;.&lt;/p&gt;


&lt;p&gt;Choisir ensuite comme type de carte &quot;Digispark Default 16.5Mhz&quot;. L'environnement de programmation est prêt.&lt;/p&gt;


&lt;p&gt;Le code se trouve ICI: &lt;a href=&quot;https://civade.com/images/Bypass/TrueBypass.ino&quot;&gt;TrueBypass.ino&lt;/a&gt;&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2024/03/21/True-bypass-intelligent-pour-p%C3%A9dale-d-effet-guitare-/-basse#comment-form</comments>
          <wfw:comment>https://civade.com/post/2024/03/21/True-bypass-intelligent-pour-p%C3%A9dale-d-effet-guitare-/-basse#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/125</wfw:commentRss>
              </item>
          <item>
        <title>Stand minimaliste pour ampli guitare et à très bas cout</title>
        <link>https://civade.com/post/2024/01/21/Stand-minimaliste-pour-ampli-guitare-et-%C3%A0-tr%C3%A8s-bas-cout</link>
        <guid isPermaLink="false">urn:md5:f30da67b3fe658d761a517311bafcb8f</guid>
        <pubDate>Sun, 21 Jan 2024 08:56:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>Ampli</category>
                  <category>Guitare</category>
                  <category>Support</category>
                <description>&lt;p&gt;Il existe de multiples solutions de supports pour ampli guitare. Les plus évolués, permettant non seulement de les incliner, mais aussi de les dsurélever de façon à avoir les contrôles plus facilement accessibles pour le guitariste. Lorsqu'un ampli est posé au sol, le soucis est qu'il diffuse le son sur ... les pieds. Voyons si il est possible dde faire quelque chos epour au moins pouvoir mieux entendre le son duffisé.&lt;/p&gt;          &lt;p&gt;Une petite recherche internet sur &quot;Guitare amplifier stand&quot; vous montrera la diversité des solutions disponibles.  En bois, en métal, réglable en inclinaison, et même pour certains réglables en hauteur. Le plus basqiue coute 20 euros, tandis qu'un réglabe en hauteur, inclinaison, pliable et métal peut couter jusqu'à une centaine d'euros.&lt;/p&gt;


&lt;p&gt;Il exite aussi des solutions de béquille intégrées à l'ampli, ou que l'on met sur le coté de l'ampli, et qui permettent de l'incliner. Malheureusement celles-ci nécessitent de percer l'ampli pour fixer la béquille.&lt;/p&gt;


&lt;p&gt;La béquille me semblait une solution intéressante, à condition qu'elle ne nécessite pas de perçage sur l'ampli pour que la solution soit réellement réversible. J'ai donc développé sous OpenSCAD une pièce plastique qui permet de glisser un bout de baguette de batterie (récup, on connait tous un batteur!)  en guise de béquille. La baguette devra être amovible, pour le rangement.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/GuitarAmpStand/2024-01-22_08_34_21-cabinet_12__.skp_-_SketchUp_Pro_2021.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/GuitarAmpStand/.2024-01-22_08_34_21-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Elle sera fixée sur l'ampli par des pads autocollants 3M (double face sur mousse polyuréthane de faible épaisseur) que l'on trouvce assez facilement sur Aliexpress. Par contre bien prendre du 3M.... D'expérience, sur une surface parfaitement dégraissée, ces pads tiennent très très bien.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/GuitarAmpStand/2024-01-22_08_49_27-Ruban_adhesif_double_face_de_3m&lt;strong&gt;10_pieces_lot&lt;/strong&gt;rond_et_carre&lt;strong&gt;epaisseur_1.5mm&lt;/strong&gt;.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/GuitarAmpStand/.2024-01-22_08_49_27-Ruban_adhesif_double_face_de_3m__10_pieces_lot__rond_et_carre__epaisseur_1.5mm___m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Voici le dispositif mis en situation sur une 3D (cliquer pour agrandir):&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/GuitarAmpStand/2024-01-22_08_34_59-cabinet_12__.skp_-_SketchUp_Pro_2021.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/GuitarAmpStand/.2024-01-22_08_34_59-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://civade.com/images/GuitarAmpStand/2024-01-22_08_35_30-cabinet_12__.skp_-_SketchUp_Pro_2021.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/GuitarAmpStand/.2024-01-22_08_35_30-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://civade.com/images/GuitarAmpStand/2024-01-22_08_36_03-cabinet_12__.skp_-_SketchUp_Pro_2021.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/GuitarAmpStand/.2024-01-22_08_36_03-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le support béquille a été développé sous OpenSCAD et rendu paramétrable. Ceci permet de préciser les dimensions de la base (largeur, hauteur, épaisseur) en fonction des pads adhésifs que vous trouverez et de la rigidité souhaitée, l'inclinaison du support baguette (ici, sur la 3D, 35 degrés), le diamètre intérieur (qui doit correspondre au diamètre extérieur de votre baguette de batterie), l'épaisseur du tube support baguette et bien sur sa longeur de guidage.&lt;/p&gt;


&lt;p&gt;OpenSCAD est un logiciel libre téléchargeable sur https://openscad.org/ (PC/Max/Linux). Lorsque vous chargez le fichier dedans vous pourrez ouvrir le panneau de paramètres à droite pour changer les valeurs énumérées ci dessus :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/GuitarAmpStand/2024-01-22_09_07_23-AmplifierTilt.scad_-_OpenSCAD.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/GuitarAmpStand/2024-01-22_09_07_23-AmplifierTilt.scad_-_OpenSCAD.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En voici le code source : &lt;a href=&quot;https://civade.com/images/GuitarAmpStand/AmplifierTilt.scad&quot;&gt;AmplifierTilt.scad&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La pièce est rendue sur OpenScan en prévisualisation par F5:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/GuitarAmpStand/2024-01-22_09_14_33-AmplifierTilt.scad_-_OpenSCAD.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/GuitarAmpStand/.2024-01-22_09_14_33-AmplifierTilt.scad_-_OpenSCAD_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ensuite il vous suffira de calculer le rendu final haute résolution (F6), puis exporter en STL (F7) avant d'utiliser votre logiciel d'impression 3D favori. Un remplissage de 20% et une épaisseur de parois de 1.2 sont suffisant pour assurer une bonne rigidité à la pièce. Pour ma part, j'ai imprimé en couches de 0.2mm d'épaisseurs en PLA+.&lt;/p&gt;


&lt;p&gt;La baguette doit entrer très légèrement en force, de façon à ne pas tomber toute seule, et être facilement enlevable pour le transport. Elle pourra voyager avec vos pédales d'effet. Il faudra la recouper à la bonne longeur, le mieux étant qu'elle soit verticale lorsque l'ampli est basculé pour avoir un appui stable :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/GuitarAmpStand/2024-01-22_08_36_03-cabinet_12__.skp_-_SketchUp_Pro_2021.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/GuitarAmpStand/.2024-01-22_08_36_03-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Vous pouvez aisément changer l'orientation de l'ampli si les 35 degrés ne sont pas suffisants, il suffit de le faire dans le source OpenScad et de réimprimer la pièce.&lt;/p&gt;


&lt;p&gt;Si vous en avez marre, il suffit de décoller le support et l'ampli est intact... pas de trous, pas de vis.. Les éventuelles tradces d'autocollant sont nettoyables à l'essence F.&lt;/p&gt;


&lt;p&gt;Le cout de la solution est imbattable puisqu'il n'y a que la pièce imrpimée en 3D (qq grammes de PLA), et une baguette de batterie de récup!&lt;/p&gt;


&lt;p&gt;Bonne réalisation.&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2024/01/21/Stand-minimaliste-pour-ampli-guitare-et-%C3%A0-tr%C3%A8s-bas-cout#comment-form</comments>
          <wfw:comment>https://civade.com/post/2024/01/21/Stand-minimaliste-pour-ampli-guitare-et-%C3%A0-tr%C3%A8s-bas-cout#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/124</wfw:commentRss>
              </item>
          <item>
        <title>Pilotage de CNC et de découpe laser avec ESP32 et FluidNC</title>
        <link>https://civade.com/post/2023/04/22/Pilotage-de-CNC-et-de-d%C3%A9coupe-laser-avec-ESP32-et-FluidNC</link>
        <guid isPermaLink="false">urn:md5:a5f30bae207b035b2b52909a64632087</guid>
        <pubDate>Fri, 19 May 2023 12:00:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Machines à commande numériques</category>
                          <category>CNC</category>
                  <category>ESP32</category>
                  <category>K40</category>
                  <category>Laser</category>
                <description>&lt;p&gt;Dernière évolution des solutions logicielles de pilotage de CNC et de découpe laser, FluidNC sur ESP32 représente une aubaine pour bien des makers. Facilité de mise en oeuvre, adaptabilité, et faible coût. Faisons ensemble le tout de la question....&lt;/p&gt;          &lt;h3&gt;Généralités&lt;/h3&gt;


&lt;p&gt;Cela fait maintenant près de 15 ans que je m'intéresse aux machines d'usinage à commande numérique et aux solutions logicielles et matérielles pour piloter celles-ci. Cela m'a donné l'occasion de mettre en œuvre sur des machines diverses des solutions logicielles complètes que ce soit sur PC  sous Linux ou Windows ( LinuxCNC/EMC2, Mach 2, Mach3, Mach4), que des solutions sur OrangePi (AllWinCNC), aussi bien que des solutions embarquées avec interface légère (GRBL, TinyG2, Marlin, Smoothieware, etc..).&lt;/p&gt;


&lt;p&gt;Sur cette durée, c'est assez spectaculaire comme il est devenu de plus en plus aisé de manipuler ces technologies. Les limitations de départ (prix, bugs, vitesse d'interprétation et nombre d'entrées sorties) sont repoussées à chaque itération.&lt;/p&gt;


&lt;p&gt;Une bonne partie des solutions fonctionnant sur des cartes autonomes ont été largement inspirées par GRBL. Ce petit logiciel sur Arduino a en effet démontré la possibilité d'interpréter du GCODE (langage de programmation des machines à commande numérique) et de piloter des moteurs avec un petit microprocesseur. Il a servi de base ou inspiré des générations de makers et est à la base du développement de l'impression 3D grand public et de bien des machines low cost. Il a été depuis porté sur de nombreuses plateformes matérielles (autres microprocesseurs que celui de l'Arduino) ou adapté pour répondre à des besoins spécifiques. GRBL a de plus profité de la démocratisation des processeurs 32 bits en étant porté sur de plus puissants processeurs que ceux d'ATMEL/Arduino (STM32, ESP32, Texas, LPC1769, etc...).&lt;/p&gt;


&lt;p&gt;Cette fois ci nous allons nous intéresser à la dernière évolution du logiciel de Bart Ding : &lt;a href=&quot;https://github.com/bdring/FluidNC&quot; title=&quot;FluidNC&quot;&gt;FluidNC&lt;/a&gt;. Le portage de GRBL sur esp32 ayant manifestement atteint ses limites, un tout nouveau projet a été créé, avec une communauté de près d'une trentaine de développeurs pilotée par Mitch Bradley et Bart Ding. Et le moins qu'on puisse dire, c'est qu'avec l'expérience acquise, ils sont allés très vite pour proposer une solution hors du commun.&lt;/p&gt;


&lt;h3&gt;ESP32 ?&lt;/h3&gt;


&lt;p&gt;L'ESP32 est un SOC (System on Chip) embarquant 2 processeurs Tensilica Xtensa LX6 fonctionnant jusqu'à 160 Mhz. L'un est dédié aux télécommunications (Wifi), l'autre aux programmes utilisateur, bien que l'on puisse tout à fait utiliser les 2 cœurs dans une application. Avec ses nombreux périphériques, c'est un ordinateur complet dans une seule puce.&lt;/p&gt;


&lt;p&gt;Le LX6 est en fait un SIP (Semiconductor Interllectual Property core), c'est à dire le &quot;code source silicium&quot; permettant de fabriquer un processeur. Il est commercialisé sous licence par Cadence. Tout comme l'ESP8266 (son prédécesseur et petit frère monocœur), Il repose sur une architecture Harvard ( https://fr.wikipedia.org/wiki/Architecture_Harvard ).&lt;/p&gt;


&lt;p&gt;Les 2 processeurs peuvent chacun accéder à la mémoire et au périphériques sur un bus partagé. La plupart des périphériques ont eux même un accès direct à la mémoire par DMA (Direct memory Access) ce qui en fait une architecture très performante. (pour plus d'infos, voir &lt;a href=&quot;https://en.wikipedia.org/wiki/ESP32&quot;&gt;https://en.wikipedia.org/wiki/ESP32&lt;/a&gt; )&lt;/p&gt;


&lt;p&gt;Avec une fréquence de 160Mhz (240 sur certains produits), du Wifi et du Bluetooth 4 LE intégré, cela fait une solution idéale pour motoriser bon nombre de projets DIY et même pro. On est donc très loin de l'Arduino de base 8 bits / 16 Mhz ! Surtout à 5 euros la carte....&lt;/p&gt;


&lt;h3&gt;FluidNC&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/FluidNC.svg&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/FluidNC.svg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;FluidNC est le logiciel que nous allons installer sur notre ESP32 pour piloter une CNC ou découpe laser.&lt;/p&gt;


&lt;h4&gt;Caractéristiques :&lt;/h4&gt;

&lt;p&gt;FluidNC, reprend les bonnes idées de GRBL/ESP32 et ajoute d'autres fonctionnalités :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pas de nécessité de compiler le firmware pour s'adapter à une carte particulière. C'est un fichier de configuration au format YAML qui est lu au démarrage pour le paramétrer. C'était une idée clé de Smoothieware, qui n'a pas été beaucoup utilisée ailleurs et qui se révèle bien pratique pour les makers en herbe. En effet, plus besoin de compiler le firmware pour l'adapter à votre matériel, c'est le même pour tout le monde. C'est du coup également très simple pour le mettre à jour.&lt;/li&gt;
&lt;li&gt;Mise à jour par USB ou OTA (wofi, over the air) du firmware.&lt;/li&gt;
&lt;li&gt;Conception orientée objet, favorisant l'extensibilité. Une fonctionnalité = un objet logiciel.&lt;/li&gt;
&lt;li&gt;Couche d’abstraction matérielle pour les fonctionnalités machines comme les broches, lasers, moteurs, et contrôleurs moteurs pas à pas. Il est doc facile de lier un objet aux ressources matérielles.&lt;/li&gt;
&lt;li&gt;Support des cinématiques cartésiennes, corexy, midtbot, wallplotter permettant de faire des machines aux caractéristiques  et géométries les plus diverses.&lt;/li&gt;
&lt;li&gt;Multiples interface de contrôle :
&lt;ul&gt;
&lt;li&gt;Interfaces série via usb, la plus classique&lt;/li&gt;
&lt;li&gt;Interface Wifi ou Bluetooth (2 firmwares différents, car l'ESP32 ne peut faire que l'un ou l'autre, mais pas les 2)
&lt;ul&gt;
&lt;li&gt;en Wifi: interfaces complémentaires Webui (port 80), websocket (port 81), telnet (port 23), et donc possibilité de contrôler la machine par des solutions suportant le Wifi (Lightburn, bCNC, etc..)&lt;/li&gt;
&lt;li&gt;en bluetooth, profil serial BT, et utilisation par une application mobile (pour le moment Android only...)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Support d'une carte SD externe pour le stockage des fichiers d'usinage / gravure, accessible par une interface web (WebUI). On peut ainsi lancer des fichier par l'interface web sur des fichiers stockés sur carte SD, la machine devenant autonome dans l'exécutiion, sans ordinateur branché.&lt;/li&gt;
&lt;li&gt;Support d'un système de fichiers interne et indépendant de la carte SD pour stocker les fichiers de configuration, accessible également par WebUI&lt;/li&gt;
&lt;li&gt;Dans la WebUI, pilotage de base de la machine (jog, recherche d'origine machine, déclenchement des broches, lasers et autres, et surtout lancement de l’exécution d'un fichier Gcode stocké sur carte SD. Il est également possible de créer des macros assignables à des boutons personnalisés.&lt;/li&gt;
&lt;li&gt;Documentation très complète sur http://wiki.fluidnc.com/&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Broches d'usinages / lasers:&lt;/h4&gt;


&lt;p&gt;Un grand nombre de types d'outils /  broches sont supportés par Fluid NC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0&amp;gt;10V - Pilotage d'une broche avec vitesse proportionnelle à une tension (classique sur le contrôleurs VFD=Variable Frequency Drive).&lt;/li&gt;
&lt;li&gt;PWM - Modulation de largeur d'impulsion, pour pilotage moteur DC&lt;/li&gt;
&lt;li&gt;BESC - Pilotage d'un moteur Brushless de modélisme par contrôleur ESC	(Electronic Speed Controler)&lt;/li&gt;
&lt;li&gt;VFD - Pilotage de divers systèmes de commandes de broche VFD (Variable Frequency Drive) dialoguant en RS485 (laisiion série) comme les Huanyang, H100, YL620. Très bien pour piloter les plus grosses broches (jusqu'à 5Kw!)&lt;/li&gt;
&lt;li&gt;DAC - Tension continue de 0&amp;gt;3.3V (8 bits)&lt;/li&gt;
&lt;li&gt;HBridge - Pont en H en PWM. Supporte vitesse variable et 2 sens de rotation (ce qui permet un pilotage simplifié de moteur à courant continu à vitesse variable)&lt;/li&gt;
&lt;li&gt;Relais - Le plus classique. On off, et peut supporter le sens de rotation avec 2 relais (On CW, On CCW). Permet aussi de supporter un solénoide (par exemple pour faire un pen up / down sur un wall plotter)&lt;/li&gt;
&lt;li&gt;Laser - Pilotage en PWM, et active le mode &quot;Laser&quot; de FLuidNC (M3= constant power, M4 = Puissance variable). Le mode M4 supporte notamment la modulation de la puissance du laser durant l'accélération afin de maintenir constant le rapport vitesse / puissance pour ne pas bruler le modèle à basse vitesse pendant une accélération.&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Moteurs Pas à Pas:&lt;/h4&gt;


&lt;p&gt;FluidNC est capable de piloter des moteurs avec une grande variété de possibilités :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contrôleurs externes, pilotés par les classiques signaux STEP (pas) et DIR (direction)&lt;/li&gt;
&lt;li&gt;Support d'un &quot;Global Enable&quot; qui permet de couper les moteurs lorsque la machine est en veille.&lt;/li&gt;
&lt;li&gt;Support des Stepstick, très utilisés sur les imprimantes 3D, comme les A4988, DRV8825, TB67S249FTG&lt;/li&gt;
&lt;li&gt;Support des Trinamic contrôlés en mode SPI (TMC2130 et TMC5160)&lt;/li&gt;
&lt;li&gt;Support des Trinamic en mode UART (TMC2209)&lt;/li&gt;
&lt;li&gt;Les Trinamic en mode Step/Dir, peuvent être utilisés en mode &quot;Steptick&quot;, à condition de les avoir préparamétrés avant.&lt;/li&gt;
&lt;li&gt;RC Servo (servo moteur type modélisme), en mode PWM&lt;/li&gt;
&lt;li&gt;Dynamixel Servo en mode série.&lt;/li&gt;
&lt;li&gt;Solenoid&lt;/li&gt;
&lt;li&gt;Moteurs unipolaires.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Maquette de test :&lt;/h3&gt;


&lt;h4&gt;La mécanique&lt;/h4&gt;


&lt;p&gt;Pour les tests, j'ai réalisé une petite machine à 3 axes. Elle a tout d'abord été dessinée sous Sketchup (&lt;a href=&quot;https://civade.com/images/FluidNC/TinyFluid.skp&quot;&gt;fichier ICI: TinyFluid.skp&lt;/a&gt;). J'ai finalement mis un axe Z (ex: &lt;a href=&quot;https://www.aliexpress.com/item/1005004533356691.html&quot;&gt;https://www.aliexpress.com/item/1005004533356691.html&lt;/a&gt; ) trouvé d'occasion sur le bon coin pour 15 euros. A ce prix, et avec le moteur, pas la peine de concevoir quoi que ce soit. Des interrupteurs de détection d'origine ont étés ajoutés sur les 3 axes (X0, Y0, Z max) après le dessin initial. Cela donne ceci sans les fins de courses et l'axe Z:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/TinyFluid1.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/.TinyFluid1_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/TinyFluid2.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/.TinyFluid2_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/TinyFluid3.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/.TinyFluid3_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;L'électronique&lt;/h4&gt;


&lt;p&gt;Le Wiki de FuildNC décrit pas mal de solutions matérielles supportant plus ou moins bien FluidNC: &lt;a href=&quot;http://wiki.fluidnc.com/en/hardware/existing_hardware&quot;&gt;http://wiki.fluidnc.com/en/hardware/existing_hardware&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Pour la mise en œuvre du logiciel, j'ai choisi une carte MKS DLC32 V2.1 (15 euros) qui supporte 3 axes dont un double avec des contrôleurs pas à pas Stepstick ou externes, peut piloter une petit broche d'usinage (sur une sortie de puissance commandée par un MOSFET) ou un laser (en PWM). Elle n'est pas open hardware au sens littéral du terme, puisque les schémas sont à peine publiés. Néanmoins la documentation est plus que suffisante pour mettre en œuvre FluidNC sans surprise.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/dlc32v2.1.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/.dlc32v2.1_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;J'ai réalisé une petite boite pour héberger la carte et son câblage, un ventilateur de refroidissement pour les stepsticks (DRV8825), un arrêt d'urgence, un marche arrêt et une antenne wifi externe. Les découpes permettent un  accès à la prise d'alimentation, prise USB, carte SD, et les sorties des fils. Elle a été réalisée avec une découpe laser K40 sur du contreplaqué de 3mm. En voici les plans  en  format &lt;a href=&quot;https://civade.com/images/FluidNC/mks32.skp&quot;&gt;Sketchup&lt;/a&gt;, &lt;a href=&quot;https://civade.com/images/FluidNC/mks32.dxf&quot;&gt;DXF&lt;/a&gt; et au format &lt;a href=&quot;https://civade.com/images/FluidNC/mks32.lbrn2&quot;&gt;Lightburn&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/TinyFluid4.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/.TinyFluid4_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/TinyFluid5.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/.TinyFluid5_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/TinyFluid6.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/.TinyFluid6_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/TinyFluid7.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/.TinyFluid7_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;Le logiciel: FluidNC&lt;/h4&gt;


&lt;p&gt;Le wiki de FluicNC est assez clair sur la méthode d'installation: &lt;a href=&quot;http://wiki.fluidnc.com/en/installation&quot;&gt;Page d'installation&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Le logiciel est à prendre de &lt;a href=&quot;https://github.com/bdring/FluidNC&quot;&gt;https://github.com/bdring/FluidNC&lt;/a&gt; . A droite se trouve un bloc &quot;Releases&quot; avec lien direct de téléchargement sur la dernière.
Pour une première installation, prendre &quot;fluidnc-vx.y.z-win64.zip&quot;. Puis :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le décompresser.&lt;/li&gt;
&lt;li&gt;Connecter la carte en USB, et l'alimenter en 12, 19 ou 24V, En effet, le câble USB ne permet pas d'alimenter la partie logique, mais seulement de communiquer. Il nous faut donc brancher les 2...&lt;/li&gt;
&lt;li&gt;Lancer install-wifi.bat (ou install-bt.bat pour une connexion Bluetooth uniquement)&lt;/li&gt;
&lt;li&gt;Si c'est une première installation sur la carte, lancer install-fs.bat, qui va créer la partition spiffs pour stocker les fichiers de configuration. Ne le faire que lors de la première installation, sinon vos fichiers de config seront effacés.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A l'issue, votre carte est installée sous FluidNC mais :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N'est pas encore connectée à votre réseau WIfi&lt;/li&gt;
&lt;li&gt;N'a pas encore de fichier de configuration pour faire fonctionner votre machine;&lt;/li&gt;
&lt;li&gt;N'a pas encore l'interface HTML &quot;WebUI&quot; fonctionnelle.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Pour le Wifi,  cela va être assez simple à paramétrer. A la fin de l'installation,  le logiciel lance un terminal qui va nous permettre de communiquer avec la carte afin de paramétrer le wifi grâce à quelques commandes qu'il vous suffira de lancer dans la console. Si vous l'avez fermé, pas de soucis, il suffit de lancer &quot;fluidterm.bat&quot; pour le ré-ouvrir.&lt;/p&gt;


&lt;p&gt;Les commandes Wifi  sont dans le WIKI: &lt;a href=&quot;http://wiki.fluidnc.com/en/features/wifi_bt&quot;&gt;http://wiki.fluidnc.com/en/features/wifi_bt&lt;/a&gt; . C'est en lançant quelques unes de ces commandes que nous allons pouvoir paramétrer le wifi (supprimer les commentaires à la fin avant de lancer les commandes... et remplacez les données par les vôtres):&lt;/p&gt;

&lt;pre&gt;
$Hostname=FluidNC  &amp;#039; nom d&amp;#039;hôte de la carte
$WiFi/Mode=STA    &amp;#039; Connectée à un réseau domestique
$Sta/SSID=SSIDdeMonReseau   &amp;#039; Votre SSID
$Sta/Password=MonMotDePasse  &amp;#039; Votre mit de passe wifi
$Sta/IPMode=DHCP   &amp;#039; Adresse attribuée automatiquement
$HTTP/Enable=1     &amp;#039; interface web adctivée
$HTTP/Port=80    &amp;#039; sur le port 80
$HTTP/BlockDuringMotion=1   &amp;#039; n&amp;#039;actualise pas le web durant les déplacements
$Telnet/Enable=1     &amp;#039; telnet activé 
$Telnet/Port=23     &amp;#039; sur le port 23
&lt;/pre&gt;


&lt;p&gt;Il est également possible de passe en IP Fixe à l'aide des commande complémentaires suivantes :&lt;/p&gt;

&lt;pre&gt;
$Sta/IPMode=Static
$Sta/IP=192.168.0.2
$Sta/Gateway=192.168.0.1
$Sta/Netmask=255.255.255.0
&lt;/pre&gt;


&lt;p&gt;Après redémarrage, la carte est désormais joignable sur votre réseau Wifi. Toutefois, il lui manque encore un fichier pour qu'elle dispose de l'interface web. Celui-ci est livré dans l'archive, dans le sous répertoire &quot;wifi/index.html.gz'.  &lt;a href=&quot;http://wiki.fluidnc.com/en/installation#upgrading-firmware&quot;&gt;Il suffit de suivre la procédure &quot;Upgrading Firmware&quot; dans le Wiki&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Après avoir redémarré la carte, vous devriez maintenant voir l'interface web en vous connectant sur &lt;a href=&quot;http://fluidnc.local&quot;&gt;http://fluidnc.local&lt;/a&gt; :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/FluidNC/FluidNC1.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/FluidNC/.FluidNC1_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il est temps de créer le fichier de configuration. L'ESP32 ne disposant pas d'un grand nombre de sorties, une astuce a été mise en oeuvre par MKS sur la carte DLC32, à savoir utiliser le port i2S (normalement réservé à une sortie audio numérique) et mettre un composant qui désérialise les données pour avoir plusieurs sorties en parallèle. Cela permet d'avoir 8 sorties supplémentaires qui seront utilisées pour les moteurs.&lt;/p&gt;


&lt;p&gt;Voici l'affectation des entrées sorties de la carte, avec les fonctions des signaux et leurs noms. Ceci a été synthétisé à partir du schéma et de diverses inforamtions, n'état pas directment mis à dispoition par MKS :&lt;/p&gt;

&lt;style&gt;
tr
	{mso-height-source:auto;}
col
	{mso-width-source:auto;}
br
	{mso-data-placement:same-cell;}
.style0
	{mso-number-format:General;
	text-align:general;
	vertical-align:bottom;
	white-space:nowrap;
	mso-rotate:0;
	mso-background-source:auto;
	mso-pattern:auto;
	color:black;
	font-size:11.0pt;
	font-weight:400;
	font-style:normal;
	text-decoration:none;
	font-family:Calibri, sans-serif;
	mso-font-charset:0;
	border:none;
	mso-protection:locked visible;
	mso-style-name:Normal;
	mso-style-id:0;}
td
	{mso-style-parent:style0;
	padding-top:1px;
	padding-right:1px;
	padding-left:1px;
	mso-ignore:padding;
	color:black;
	font-size:11.0pt;
	font-weight:400;
	font-style:normal;
	text-decoration:none;
	font-family:Calibri, sans-serif;
	mso-font-charset:0;
	mso-number-format:General;
	text-align:general;
	vertical-align:bottom;
	border:none;
	mso-background-source:auto;
	mso-pattern:auto;
	mso-protection:locked visible;
	white-space:nowrap;
	mso-rotate:0;}
.xl65
	{mso-style-parent:style0;
	border:.5pt solid windowtext;}
.xl66
	{mso-style-parent:style0;
	border-top:1.0pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:1.0pt solid windowtext;}
.xl67
	{mso-style-parent:style0;
	border-top:1.0pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:.5pt solid windowtext;}
.xl68
	{mso-style-parent:style0;
	border-top:1.0pt solid windowtext;
	border-right:1.0pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:.5pt solid windowtext;}
.xl69
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:1.0pt solid windowtext;}
.xl70
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:1.0pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:.5pt solid windowtext;}
.xl71
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:1.0pt solid windowtext;
	border-left:1.0pt solid windowtext;}
.xl72
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:1.0pt solid windowtext;
	border-left:.5pt solid windowtext;}
.xl73
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:1.0pt solid windowtext;
	border-bottom:1.0pt solid windowtext;
	border-left:.5pt solid windowtext;}
.xl74
	{mso-style-parent:style0;
	vertical-align:middle;
	border-top:1.0pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:1.0pt solid windowtext;}
.xl75
	{mso-style-parent:style0;
	vertical-align:top;
	border-top:1.0pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:1.0pt solid windowtext;}
.xl76
	{mso-style-parent:style0;
	vertical-align:top;
	border-top:1.0pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:.5pt solid windowtext;}
.xl77
	{mso-style-parent:style0;
	border-top:1.0pt solid windowtext;
	border-right:1.0pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:.5pt solid windowtext;
	white-space:normal;}
.xl78
	{mso-style-parent:style0;
	font-size:16.0pt;
	vertical-align:top;
	border-top:1.0pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:1.0pt solid windowtext;
	border-left:1.0pt solid windowtext;
	background:#F2F2F2;
	mso-pattern:black none;
	white-space:normal;}
.xl79
	{mso-style-parent:style0;
	font-size:16.0pt;
	vertical-align:top;
	border-top:1.0pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:1.0pt solid windowtext;
	border-left:.5pt solid windowtext;
	background:#F2F2F2;
	mso-pattern:black none;}
.xl80
	{mso-style-parent:style0;
	font-size:16.0pt;
	vertical-align:top;
	border-top:1.0pt solid windowtext;
	border-right:1.0pt solid windowtext;
	border-bottom:1.0pt solid windowtext;
	border-left:.5pt solid windowtext;
	background:#F2F2F2;
	mso-pattern:black none;}
.xl81
	{mso-style-parent:style0;
	border-top:1.0pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:1.0pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}
.xl82
	{mso-style-parent:style0;
	border-top:1.0pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:.5pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}
.xl83
	{mso-style-parent:style0;
	font-weight:700;
	border-top:1.0pt solid windowtext;
	border-right:1.0pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:.5pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}
.xl84
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:1.0pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}
.xl85
	{mso-style-parent:style0;
	border:.5pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}
.xl86
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:1.0pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:.5pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}
.xl87
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:1.0pt solid windowtext;
	border-left:1.0pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}
.xl88
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:.5pt solid windowtext;
	border-bottom:1.0pt solid windowtext;
	border-left:.5pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}
.xl89
	{mso-style-parent:style0;
	border-top:.5pt solid windowtext;
	border-right:1.0pt solid windowtext;
	border-bottom:1.0pt solid windowtext;
	border-left:.5pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}
.xl90
	{mso-style-parent:style0;
	font-weight:700;
	vertical-align:middle;
	border-top:1.0pt solid windowtext;
	border-right:1.0pt solid windowtext;
	border-bottom:.5pt solid windowtext;
	border-left:.5pt solid windowtext;
	background:#D9D9D9;
	mso-pattern:black none;}

&lt;/style&gt;
&lt;table border=0 cellpadding=0 cellspacing=0 width=738 style='border-collapse:
 collapse;table-layout:fixed;width:554pt'&gt;
 &lt;col width=116 style='mso-width-source:userset;mso-width-alt:4242;width:87pt'&gt;
 &lt;col width=115 style='mso-width-source:userset;mso-width-alt:4205;width:86pt'&gt;
 &lt;col width=145 style='mso-width-source:userset;mso-width-alt:5302;width:109pt'&gt;
 &lt;col width=362 style='mso-width-source:userset;mso-width-alt:13238;width:272pt'&gt;
 &lt;tr height=57 style='height:42.75pt'&gt;
  &lt;td height=57 class=xl78 width=116 style='height:42.75pt;width:87pt'&gt;Port /
  &lt;br&gt;
    connecteur&lt;/td&gt;
  &lt;td class=xl79 width=115 style='border-left:none;width:86pt'&gt;Nom signal&lt;/td&gt;
  &lt;td class=xl79 width=145 style='border-left:none;width:109pt'&gt;IO&lt;/td&gt;
  &lt;td class=xl80 width=362 style='border-left:none;width:272pt'&gt;Commentaire&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl81 style='height:15.0pt;border-top:none'&gt;Port I2S&lt;/td&gt;
  &lt;td class=xl82 style='border-top:none;border-left:none'&gt;I2S_WS&lt;/td&gt;
  &lt;td class=xl82 style='border-top:none;border-left:none'&gt;GPIO.17&lt;/td&gt;
  &lt;td class=xl83 style='border-top:none;border-left:none'&gt;Pour référence
  uniquement, ne pas utiliser.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl84 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl85 style='border-top:none;border-left:none'&gt;I2S_BCK&lt;/td&gt;
  &lt;td class=xl85 style='border-top:none;border-left:none'&gt;GPIO.16&lt;/td&gt;
  &lt;td class=xl86 style='border-top:none;border-left:none'&gt;Utilisé pour fournir
  8 sorties (I2SO.0 à 7).&lt;span style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl87 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl88 style='border-top:none;border-left:none'&gt;I2S_DATA&lt;/td&gt;
  &lt;td class=xl88 style='border-top:none;border-left:none'&gt;GPIO.21&lt;/td&gt;
  &lt;td class=xl89 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl81 style='height:15.0pt;border-top:none'&gt;Port SPI&lt;span
  style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/td&gt;
  &lt;td class=xl82 style='border-top:none;border-left:none'&gt;MISO_PIN&lt;/td&gt;
  &lt;td class=xl82 style='border-top:none;border-left:none'&gt;GPIO.12&lt;/td&gt;
  &lt;td class=xl90 style='border-top:none;border-left:none'&gt;Pour référence
  uniquement, ne pas utiliser.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl84 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl85 style='border-top:none;border-left:none'&gt;MOSI_PIN&lt;/td&gt;
  &lt;td class=xl85 style='border-top:none;border-left:none'&gt;GPIO.13&lt;/td&gt;
  &lt;td class=xl86 style='border-top:none;border-left:none'&gt;Port SPI déjà utilisé
  par la carte SD&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl84 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl85 style='border-top:none;border-left:none'&gt;SCK_PIN&lt;/td&gt;
  &lt;td class=xl85 style='border-top:none;border-left:none'&gt;GPIO.14&lt;/td&gt;
  &lt;td class=xl86 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl84 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl85 style='border-top:none;border-left:none'&gt;CS&lt;/td&gt;
  &lt;td class=xl85 style='border-top:none;border-left:none'&gt;GPIO.15&lt;/td&gt;
  &lt;td class=xl86 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl87 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl88 style='border-top:none;border-left:none'&gt;CARD_DETECT	&lt;/td&gt;
  &lt;td class=xl88 style='border-top:none;border-left:none'&gt;&lt;span lang=EN-US&gt;GPIO.39&lt;/span&gt;&lt;/td&gt;
  &lt;td class=xl89 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl74 style='height:15.0pt;border-top:none'&gt;Moteur X&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;Enable (shared)&lt;span
  style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;I2SO.0&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;1 sortie drv externe
  + 1 sortie moteur X1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl69 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;Step&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;I2SO.1&lt;/td&gt;
  &lt;td class=xl70 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;Dir&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;I2SO.2&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl74 style='height:15.0pt;border-top:none'&gt;Moteur Y&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;Enable (shared)&lt;span
  style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;I2SO.0&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;1 sortie drv externe
  + 2 sorties moteur Y1 Y2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl69 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;Step&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;I2SO.5&lt;/td&gt;
  &lt;td class=xl70 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;Dir&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;I2SO.6&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl74 style='height:15.0pt;border-top:none'&gt;Moteur Z&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;Enable (shared)&lt;span
  style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;I2SO.0&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;1 sortie drv externe
  + 1 sortie moteur Z1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl69 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;Step&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;I2SO.3&lt;/td&gt;
  &lt;td class=xl70 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;Dir&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;I2SO.4&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl66 style='height:15.0pt;border-top:none'&gt;Limites&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;X-&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;GPIO.36&lt;span
  style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;Sur connecteur [J9]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl69 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;Y-&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;GPIO.35&lt;span
  style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/td&gt;
  &lt;td class=xl70 style='border-top:none;border-left:none'&gt;Sur connecteur [J10]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;Z-&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;GPIO.34&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;Sur connecteur [J11]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl66 style='height:15.0pt;border-top:none'&gt;Probe&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;1&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;+5V&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;Sur connecteur [J12]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl69 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;2&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;GND&lt;/td&gt;
  &lt;td class=xl70 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;3&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;GPIO.22&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl66 style='height:15.0pt;border-top:none'&gt;Spindle&lt;span
  style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;1&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;+12V permanent&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;Sur connecteur [J7]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;2&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;GND (cmd par GPIO.32)&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;, coupure de masse
  par mosfet&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl74 style='height:15.0pt;border-top:none'&gt;Spindle TTL&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;1&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;+12V&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;Sur connecteur [J18]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl69 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;2&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;GND&lt;/td&gt;
  &lt;td class=xl70 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;3&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;GPIO.32 (TTL)&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=40 style='height:30.0pt'&gt;
  &lt;td height=40 class=xl75 style='height:30.0pt;border-top:none'&gt;Disable F1
  Fuse&lt;/td&gt;
  &lt;td class=xl76 style='border-top:none;border-left:none'&gt;1&lt;/td&gt;
  &lt;td class=xl76 style='border-top:none;border-left:none'&gt;In power&lt;/td&gt;
  &lt;td class=xl77 width=362 style='border-top:none;border-left:none;width:272pt'&gt;Sur
  connecteur [J3], &lt;br&gt;
    enlever le fuse et connecter un M/A&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;2&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;Ext power&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl66 style='height:15.0pt;border-top:none'&gt;Bus I2C&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;1&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;3V3&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;Sur connecteur [J2]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl69 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;2&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;GND&lt;/td&gt;
  &lt;td class=xl70 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl69 style='height:15.0pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;3 - I2C_SDA&lt;/td&gt;
  &lt;td class=xl65 style='border-top:none;border-left:none'&gt;GPIO.0&lt;/td&gt;
  &lt;td class=xl70 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;4 - I2C_SCL	&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;GPIO.4&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl66 style='height:15.0pt;border-top:none'&gt;Reset&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;1&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;GND&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;Sur connecteur [J5]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;2&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;RESET&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=20 style='height:15.0pt'&gt;
  &lt;td height=20 class=xl66 style='height:15.0pt;border-top:none'&gt;Beeper&lt;span
  style='mso-spacerun:yes'&gt; &lt;/span&gt;&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;1&lt;/td&gt;
  &lt;td class=xl67 style='border-top:none;border-left:none'&gt;GND (cmd&lt;span
  style='mso-spacerun:yes'&gt;  &lt;/span&gt;par I2SO.7)&lt;/td&gt;
  &lt;td class=xl68 style='border-top:none;border-left:none'&gt;Sur connecteur [J4]&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr height=21 style='height:15.75pt'&gt;
  &lt;td height=21 class=xl71 style='height:15.75pt;border-top:none'&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;2&lt;/td&gt;
  &lt;td class=xl72 style='border-top:none;border-left:none'&gt;+12V permanent&lt;/td&gt;
  &lt;td class=xl73 style='border-top:none;border-left:none'&gt;&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;C'est à partir de cette information que nous allons pouvoir batir le fichier texte de configuration &quot;config.yaml&quot; qui va être envoyé à la carte pour lui documenter comment sont utilisées les différente broches :&lt;/p&gt;

&lt;pre&gt;
board: MKS-DLC32 V2.1
name: Hybrid CNC/Laser JPC 335x275x53mm - 
meta: (24/09/2022) 09:00

kinematics:
  Cartesian:

stepping:
  engine: I2S_STATIC
  idle_ms: 0
  pulse_us: 4
  dir_delay_us: 1
  disable_delay_us: 0
axes:
  shared_stepper_disable_pin: I2SO.0
  x:
    steps_per_mm: 80
    max_rate_mm_per_min: 20000.000
    acceleration_mm_per_sec2: 1500.000
    max_travel_mm: 335.000
    soft_limits: true
    homing:
      cycle: 2
      positive_direction: false
      mpos_mm: 0.000
      feed_mm_per_min: 200.000
      seek_mm_per_min:2000.000
      settle_ms: 500
      seek_scaler: 1.100
      feed_scaler: 1.100

    motor0:
      limit_neg_pin: gpio.36:low
      hard_limits: false
      pulloff_mm: 2.000
      stepstick:
        step_pin: I2SO.5
        direction_pin: I2SO.6

  y:
    steps_per_mm: 80
    max_rate_mm_per_min: 20000.000
    acceleration_mm_per_sec2: 1500.000
    max_travel_mm: 275.000
    soft_limits: true
    homing:
      cycle: 2
      positive_direction: false
      mpos_mm: 0.000
      feed_mm_per_min: 200.000
      seek_mm_per_min: 2000.000
      settle_ms: 500
      seek_scaler: 1.100
      feed_scaler: 1.100

    motor0:
      limit_neg_pin: gpio.35:low
      hard_limits: false
      pulloff_mm: 2.000
      stepstick:
        step_pin: I2SO.1
        direction_pin: I2SO.2
       
  z:
    steps_per_mm: 1600.00
    max_rate_mm_per_min: 2000.000
    acceleration_mm_per_sec2: 100.000
    max_travel_mm: 53.000
    soft_limits: true
    homing:
      cycle: 1
      positive_direction: true
      mpos_mm: 0.000
      feed_mm_per_min: 200.000
      seek_mm_per_min: 500.000
      settle_ms: 500
      seek_scaler: 1.100
      feed_scaler: 1.100

    motor0:
      limit_neg_pin: gpio.34:low
      hard_limits: false
      pulloff_mm: 1.000
      stepstick:
        step_pin: I2SO.3
        direction_pin: I2SO.4

i2so:
  bck_pin: gpio.16
  data_pin: gpio.21
  ws_pin: gpio.17

spi:
  miso_pin: gpio.12
  mosi_pin: gpio.13
  sck_pin: gpio.14

sdcard:
  cs_pin: gpio.15
  card_detect_pin: NO_PIN

control:
  safety_door_pin: NO_PIN
  reset_pin: NO_PIN
  feed_hold_pin: NO_PIN
  cycle_start_pin: NO_PIN
  macro0_pin: NO_PIN
  # macro0_pin: gpio.33:low:pu
  macro1_pin: NO_PIN
  macro2_pin: NO_PIN
  macro3_pin: NO_PIN

macros:
  startup_line0:
  startup_line1:
  macro0: $SD/Run=lasertest.gcode
  macro1: $SD/Run=home.gcode
  macro2:
  macro3:

coolant:
  flood_pin: NO_PIN
  mist_pin: NO_PIN
  delay_ms: 0

probe:
# Sonde raccordée en J12
  pin: gpio.22
  check_mode_start: true

Laser:
# PWM à 1Khz.
  pwm_hz: 1000
# Laser raccordé sur connecteur J18
  output_pin: gpio.32
  enable_pin: NO_PIN
  disable_with_s0: false
  s0_with_disable: false
  tool_num: 0
  speed_map: 0=0.000% 1000=100.000%

pwm:
  pwm_hz: 5000
  direction_pin: NO_PIN
# Broche 12V (ou 24V) raccordée au connecteur J7.
# Attention à ne pas dépasser la puissance du  MOSFET.
  output_pin: gpio.32
  enable_pin: NO_PIN
  disable_with_s0: false
  s0_with_disable: true
  spinup_ms: 0
  spindown_ms: 0
  tool_num: 1
  speed_map: 0=0.000% 10000=100.000%

user_outputs:
  analog0_pin: NO_PIN
  analog1_pin: NO_PIN
  analog2_pin: NO_PIN
  analog3_pin: NO_PIN
  analog0_hz: 5000
  analog1_hz: 5000
  analog2_hz: 5000
  analog3_hz: 5000
  digital0_pin: NO_PIN
  digital1_pin: NO_PIN
  digital2_pin: NO_PIN
  digital3_pin: NO_PIN

start:
  must_home: true
&lt;/pre&gt;


&lt;p&gt;Cette implémentation fait appel à plsuieurs astuces :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L'axe X de la machine étant piloté par 2 moteurs, il sera drivé par la seule sortie ayant 2 connecteurs de sortie moteurs : Y&lt;/li&gt;
&lt;li&gt;De ce fait l'axe X machine est piloté par l'axe Y de la carte (permutation...).&lt;/li&gt;
&lt;li&gt;2 outils ont été définits, un laser (outil 0) et un moteur de broche (outil 1). Pour en sélectionner, il suffit d'envoyer un GCODE M6 Tx (ex : &quot;M6 T0&quot; pour le laser)&lt;/li&gt;
&lt;li&gt;La puissance de sortie du laser étant senseiblement linéaire lorsque l'on module sa puissance en PWM, speed_map définit une courbe de transfert droite. Il est tout à fait possible de spéciier autre chose.&lt;/li&gt;
&lt;li&gt;Les 2 outils sont racordés sur la même sortie. Il ne pourront donc pas fonctionner en même temps. Mais vous pourriez utiliser une autre sortie de la carte pour le moteur de broche en mettant un relais sstatique externe par exemple pour contourner cela.&lt;/li&gt;
&lt;li&gt;l&quot;outil &quot;Laser&quot; active automatiquement le &quot;Laser Mode&quot; de FluidNC, c'est à dire la capacité à changer la puissance du laser à la volée sans faire d'arrêt. Ceci n'est bien sur pas posisble sur une CNC (et donc sur l'outil broche &quot;PWM&quot;).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Je vous encourage à consulter le wiki sur la syntaxe de ce fichier YAML pour bien comprendre ce qui a été fait ci dessus :  &lt;a href=&quot;http://wiki.fluidnc.com/en/config/overview&quot;&gt;http://wiki.fluidnc.com/en/config/overview&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ce fichier config.yaml doit ensuite être envoyé à la carte, par l'interface web. La prodécure est documentée également dans le wiki (&quot;Overview&quot; / &quot;Uploading&quot;.
Des changements minimes à la volée pourront être faits directemnet par l'interface web, afin de tester des paramètres par exemple (&quot;Overview&quot; / &quot;Live changes&quot;). Bien que cela soit possible, je ne vous encorage pas à sauver ces changements dans l'interface car le formatage de votre fichier de config et ses commentaires seront perdus. Dès que vous avez trouvé les bons réglages, reportez les dans votre &quot;config.yaml&quot; et renvoyez le à la carte. Vous pouvez égalemetn mettre plusieurs fichier de configuration sur la carte, et les activer par &quot;$Config/Filename&quot; dans le réglages. Attention toutefois, la mémoire interne est très faible, vous ne pourrez pas stocker beaucoup de fichiers différents dessus.&lt;/p&gt;


&lt;h4&gt;Branchement d'un afficheur OLED&lt;/h4&gt;


&lt;p&gt;Les versions récentes de FluidNC permettent le raccordement d'un petit afficheur OLED basé sur un SSD1306 avec 128X64 pixels. Disponibles à 2€ en 0.96&lt;em&gt; et 4 euros en 1.3 &lt;/em&gt;, il vont permettent d'afficher l'adresse IP ainsi que les coordonnées machine en temps réel. Pratique.
Le raccordement est aisé puisqu'il suffit de se brancher sur le connecteur J2 et de raccorder les broches de même nom entre elles (SD &amp;gt; SDA, SCL &amp;gt; SCL, DND &amp;gt; GND, 3.3V &amp;gt; VCC).&lt;/p&gt;


&lt;p&gt;Quelques lignes ajoutées à la fin du fichier config.yaml vont faire le reste de la magie. Attention à l'adresse de l'afficheur, qui ne sera peut être pas la même pour le votre. Elle est généralement marquée sur la sérigraphie du circuit imprimée. Ici donnée pour un 0.96''.&lt;/p&gt;

&lt;pre&gt;
i2c0:
   sda_pin: gpio.0
   scl_pin: gpio.4


oled:
   i2c_num: 0
# 3C en hexa = 60
# 78 en hexa = 120
   i2c_address: 60
   width: 128
   height: 64
   radio_delay_ms: 1000
&lt;/pre&gt;



&lt;h3&gt;Logiciel de pilotage&lt;/h3&gt;


&lt;p&gt;J'ai testé la découpe laser avec succès sur Lightburn ( &lt;a href=&quot;https://lightburnsoftware.com/&quot;&gt;https://lightburnsoftware.com/&lt;/a&gt; ). Pour que la compatibilité soit parfaite il suffit de choir GRBL. Cerise sur le gateau, il sera ensuite possble de piloter la machine soit en USB (port sériie sur USB), et même en réseau en donnant l'adresse de la machine ( choisir &quot;Ethernet/TCP&quot; et donner l'adresse IP de la machine).&lt;/p&gt;


&lt;p&gt;A noter qu'en WIFI, le débit de transmission de commande vers la machine est beaucoup plus faible. Ce n'est pas un soucis lorsque l'on fait de la découpe, mais peut le devenir lorsque l'on fait de la gravure en mode &quot;raster&quot; d'un image par exemple. En effet, dans ce mode chaque changement de puissance du laser sur un trait continu donnera lieu à l'envoi de commandes... Du coup la machine peut s'arrêter brièvement, laser allumé ce qui est claiement un soucis. Pour faire du gravage sans niveau de gris c'est fonctionnel (ex: sérigraphie de textes sur une face avant d'appareil).&lt;/p&gt;


&lt;p&gt;Il est aussi possible dde sauver le fichie GCODE produit par l'outil et de l'envoyer par l'interface web sur la carte SD. La machine devient ainsi autonome, et cela coutourne la limitation du straming de commande via Wifi.&lt;/p&gt;


&lt;p&gt;En mode CNC, j'ai travaillé avec un logiciel écrit en Python qui se nomme BCNC:  (voir &lt;a href=&quot;https://github.com/vlachoudis/bCNC&quot;&gt;https://github.com/vlachoudis/bCNC&lt;/a&gt;)
C'est un peu pénible à installer dans les dernières versions mais marche plutot pas mal !&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installer Python 3.10 dernière version de https://www.python.org/downloads/&lt;/li&gt;
&lt;li&gt;Lancer un interpréteur de commande&lt;/li&gt;
&lt;li&gt;Taper la commadne suivante&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
	pip install --upgrade bCNC
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Le lanceur de bCNC se trouve dans  (copier coller le chimin dans la barre d'adresse de l'explorateur windows)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
	%LocalAppData%\Programs\Python\Python310\Lib\site-packages\bCNC\bCNC.bat
&lt;/pre&gt;


&lt;p&gt;A noter que :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BCNC permet la connexion part port série (classique) mais aussi par réseau (ex: socket://192.168.xx.yy:23) sur le port telnet.&lt;/li&gt;
&lt;li&gt;BCNC supporte l'auto level avec une sonde qui peut être raccordée à J12, ce qui permet de corriger des défauts de planéité de la machine / table. Voir procédure : https://github.com/vlachoudis/bCNC/wiki/AutoLevel&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Voila, j'espère vous avoir donné envie d'essayer, et les clés pour démarrer. Bonne bidouille!&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2023/04/22/Pilotage-de-CNC-et-de-d%C3%A9coupe-laser-avec-ESP32-et-FluidNC#comment-form</comments>
          <wfw:comment>https://civade.com/post/2023/04/22/Pilotage-de-CNC-et-de-d%C3%A9coupe-laser-avec-ESP32-et-FluidNC#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/123</wfw:commentRss>
              </item>
          <item>
        <title>Ajouter un pédalier pour changements de sons au multieffet Zoom MS70-CDR (ou MS50/MS60)</title>
        <link>https://civade.com/post/2023/02/18/Ajouter-un-p%C3%A9dalier-pour-changements-de-sons-au-multieffet-Zoom-MS-70CDR-%28ou-MS-50/MS-60B%29</link>
        <guid isPermaLink="false">urn:md5:068d9341d188f813b037625b75fcdc16</guid>
        <pubDate>Sat, 18 Feb 2023 08:10:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>Arduino</category>
                  <category>DIY</category>
                  <category>Embarqué</category>
                  <category>Firmware</category>
                  <category>Musique</category>
                <description>&lt;p&gt;Zoom fait une pédale multi effet très intéressante car pour une somme modique elle permet de disposer d'une palette d'effets pour guitare et basse. On peut d'ailleurs chainer plusieurs effets et stocket ses réglage dans l'un des 50 emplacements disponibles. Toutefois, bien que l'on puisse faire un marche arrêt au pied, soit d'un effet dans une chaine, soit de la chaine complète, on ne peut pas au pied changer de presets. Nous allons ici corriger ce défaut en ajoutant un pédalier avec afficheur.&lt;/p&gt;          &lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/IMG_3281.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/.IMG_3281_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En fait, dans ce post, je n'ai pas développé grand chose. C'est Mastrum, un toulousain qui a réalisé cette interface pour MS50/60/70 et qui permet de changer (Programme - / Programme +) et d'afficher le programme courant sur un afficheur OLED complémentaire. Simple et efficace ce projet contourne la principale limitation du Zoom MS-70CDR / MS-50 / MS-60B pour une utilisation sur scène en lui donnant la capacité de changer de programme au pied. Mon intervention ici, est donc plus pour documenter la réalisation (le GIT est assez sommaire sur ce sujet), faire quelques modifs de code suite à des évolutions dans les bibliothèques, et ajouter un plastron pour faciliter l'intégration de l'afficheur.&lt;/p&gt;


&lt;p&gt;Le projet initial est ICI: &lt;a href=&quot;https://github.com/maestun/zoom-multistomp-patch-changer&quot;&gt;https://github.com/maestun/zoom-multistomp-patch-changer&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Liste du Matériel :&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1 x Arduino pro mini 3.3V 8Mhz: &lt;a href=&quot;https://www.adafruit.com/product/2377&quot;&gt;https://www.adafruit.com/product/2377&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1 x Mini USB Host Shield 2.0 pour Arduino pro mini: &lt;a href=&quot;https://www.aliexpress.com/premium/%22mini-usb-host%22-shield.html&quot;&gt;https://www.aliexpress.com/premium/%22mini-usb-host%22-shield.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1 x Afficheur OLED 0.91 pouces 128x32: &lt;a href=&quot;https://www.aliexpress.com/premium/oled-0.91-12832.html&quot;&gt;https://www.aliexpress.com/premium/oled-0.91-12832.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2 X Interrupteur momentané au pied &lt;a href=&quot;https://www.aliexpress.com/premium/spst-footswitch.html&quot;&gt;https://www.aliexpress.com/premium/spst-footswitch.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1 x régulateur de tension ajustable 9v &amp;gt; 5V &lt;a href=&quot;https://fr.aliexpress.com/premium/Module-d&amp;#039;alimentation-abaisseur-3A-r%C3%A9glable-LM2596.html&quot;&gt;https://fr.aliexpress.com/premium/Module-d'alimentation-abaisseur-3A-r%C3%A9glable-LM2596.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1 x connecteur d'alimentation femelle 5.5x2.1mm DC022B &lt;a href=&quot;https://www.aliexpress.com/premium/dc022b-femelle.html&quot;&gt;https://www.aliexpress.com/premium/dc022b-femelle.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1 x plastron pour afficheur OLED 128x32 (impression 3D, sources dans l'article)&lt;/li&gt;
&lt;li&gt;1 x boitier à votre convenance&lt;/li&gt;
&lt;li&gt;1 x Câble USB &amp;gt; Mini USB&lt;/li&gt;
&lt;li&gt;1 x adaptateur FTDI 3.3V vers USB &lt;a href=&quot;https://www.aliexpress.com/premium/3.3v-usb-ftdi232.html&quot;&gt;https://www.aliexpress.com/premium/3.3v-usb-ftdi232.html&lt;/a&gt; . Il ne servira que durant la phase de programmation de la carte Arduino.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Câblage :&lt;/h3&gt;


&lt;p&gt;Avant de parler de câblage il faut un peu parler d'alimentation... En effet, il y a quelques petites contraintes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ce montage est basé sur une shield USB host 2.0 qui ne fonctionne qu'en 3.3V et n'est pas compatible 5V.&lt;/li&gt;
&lt;li&gt;Ce même montage doit fournir une alimentation 5V à la pédale Zoom faute de quoi l'USB ne sera pas reconnu.&lt;/li&gt;
&lt;li&gt;Enfin, nous souhaitons alimenter le tout en 9V avec une alimentation de pédale,&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Ceci va avoir pas mal de conséquences :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Il va falloir modifier la shield USB 2.0 pour qu'elle fournisse un 5V pour alimenter la pédale zoom. Nativement et sans modification, elle ne fournit qu'un 3.3v sous très faible puissance....&lt;/li&gt;
&lt;li&gt;Il va falloir utiliser une carte Arduino qui fonctionne en 3.3V (d’où le choix de la pro mini 3.3V), à défaut de quoi la shield USB serait détruite car il ne faut pas du tout dépasser les 3.3V dessus.&lt;/li&gt;
&lt;li&gt;La carte Arduino étant munie d'un régulateur 5V &amp;gt; 3.3V, il va également nous falloir un régulateur abaisseur de tension 9V &amp;gt; 5V pour s'adapter à l’alimentions standard de pédale d'effet vers l'entrée non régulée (RAW) de la carte Arduino .&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Pour que ce soit plus clair, voici un synoptique de la chaine d'alimentation :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/ChaineAlimentation.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/ChaineAlimentation.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Une fois ceci compris nous allons devoir d'abord modifier la Shield USB. Il va nous falloir couper une piste (3.3V &amp;gt; Power USB) et ajouter un fil (5V &amp;gt; power USB) comme ceci (a faire avec un petit scalpel et y aller très précautionneusement...) :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/couper-la-piste.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/.couper-la-piste_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La shield USB étant prévue pour une Arduino pro mini, le câblage va être simplifié, puisque les 2 s'empilent. il suffira de les monter tête bêche comme suit. Les broches verticales à droite doivent égalemnet être soudées. C'est sur ces broches que nous raccorderons l'interface de programmation.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/usb_shield.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/usb_shield.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Enfin, il fa falloir ajouter sous la shield USB un fil pour alimenter l'USB en 5V comme suit :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/filalimentation.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/.filalimentation_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Avant de raccorder l'alimentation, nous allons devoir la régler. Pour ce faire il nous fait câbler le jack femelle dessus (attention sur les alimentations de pédales d'effet, le point central est la masse, et l'extérieur est le +5V ce qui est l'inverse d'un câblage classique) et mesurer la sortie de façon à avoir exactement 5V. Le cas échéant retoucher le réglage avec le potentiomètre. Ne pas vous tromper sur la polarité des alimentations, c'est destructif!!!&lt;/p&gt;


&lt;p&gt;Une fois réglée, nous allons pouvoir raccorder la carte alimentation entre le GND et le RAW (+5V) de la carte Arduino.&lt;/p&gt;


&lt;p&gt;Les interrupteurs au pied se raccordent quand à eux entre GND et A1 pour le bouton précédent et GND et A2 pour le bouton suivant.&lt;/p&gt;


&lt;p&gt;L'afficheur OLED quand à lui se raccorde entre directement sur la carte Arduino, L’alimentation se raccorde entre les broches GND et 3.3V de l’Arduino, SCL se raccorde à la broche A5 de l’Arduino et SDA se raccorde à la broche A4.  Attention, ces 2 broches sont 2 pastilles à part sur la carte Arduino (cliquez pour agrandir...):&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/arduino-mini-pro-pinout.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/.arduino-mini-pro-pinout_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Chargement du code :&lt;/h3&gt;

&lt;p&gt;L'Arduino pro mini ne disposant pas de port USB il va nous falloir utiliser l'interface FTDI USB pour la programmer. Il faut tout d'abord configurer l'interface pour qu'elle fonctionne en 3.3V à l'aide du cavalier d'alimentation qui est dessus. Une sérigraphie en face de ce cavalier (5V/3.3V) vous permet d'identifier la bonne position (3.3V). &lt;strong&gt;Ceci est très important et si ce n'est pas fait vous allez cramer la shield USB...&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Ensuite le raccordement ne pose pas de problème. Il se fait sur le connecteur de programmation au bout de l’Arduino. Il ne nous faudra que 4 fils. Câbler le TX de l’Arduino sur le RX de la FTDI et vice versa. Raccorder ensuite les 2 broches d'alimentation. Les autres broches peuvent être laissées libres.&lt;/p&gt;


&lt;p&gt;Pour le moment ne pas raccorder l'alimentation externe. C'est l'interface USB FTDI qui va aliemnter l'arduino.&lt;/p&gt;


&lt;p&gt;Récupérer le code ICI: &lt;a href=&quot;https://civade.com/images/Zoom_ms70/zoom-multistomp-patch-changer.zip&quot;&gt;zoom-multistomp-patch-changer.zip&lt;/a&gt; et dézippez le dans votre répertoire arduino. Ouvrez le et n'oubliez pas de paramétrer votre carte en &quot;Arduino Pro Mini 3.3V / 8Mhz). Comme la carte ne se resette pas automatiquement pour la mettre en mode programmation, il vous faudra à la fin de la compilation appuyer sur le bouton reset de la carte pour la mettre en mode programmation; Comme elle ne reste dans cet état que 2/3 secondes, vous risquez de rater la fenêtre de programmation; Refaire l'opération (upload + reset) jusqu'à ce que cela fonctionne.&lt;/p&gt;


&lt;h3&gt;Tests :&lt;/h3&gt;


&lt;p&gt;Pour les premiers tests, nous allons restés alimentés par l'interface FTDI.&lt;/p&gt;


&lt;p&gt;Dès la carte programmée, l'afficheur OLED devrait vous indiquer &quot;USB RESET&quot;. Si ce n'est pas le cas, débranchez le câble USB et vérifiez votre câblage... Si c'est le cas, branchez votre pédale Zoom sur l'entrée USB de la USB Host Shield. Quelques secondes après l'afficheur devrait vous indiquer successivement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;USB INIT&quot;&lt;/li&gt;
&lt;li&gt;&quot;MS-70CDR&quot;&lt;/li&gt;
&lt;li&gt;Version du Ms70CDR&lt;/li&gt;
&lt;li&gt;Et enfin le nom du patch sélectionné sur le MS70&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Si il reste bloqué sur USB init, vous pouvez vous aider de la console série qui fournit quelques informations sur l'état de connexion USB (et vérifiez votre câblage et vos câbles USB!).&lt;/p&gt;


&lt;h3&gt;Mise en boite :&lt;/h3&gt;

&lt;p&gt;Pour faire la mise en boite, il sera plus pratique d'utiliser un plastron imprimé en 3D pour y intégrer l'afficheur. J'ai fait un modèle 3D que vous trouverez ici : &lt;a href=&quot;https://civade.com/images/Zoom_ms70/bezel.zip&quot;&gt;bezel.zip&lt;/a&gt; . Ce plastron venant recouvrir la découpe, cela sera joli même si la découpe n'est pas très propre.&lt;/p&gt;


&lt;p&gt;Voici ce a quoi cela ressemble :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/bezel1.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/bezel1.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/bezel2.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/bezel2.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Dans mon cas, j'ai intégré ce montage directement dans un pedal board qui fera l'objet d'un prochain article; un pièce de tôle pliée reçoit l'électronique et sert de repose pied.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/IMG_3279.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/.IMG_3279_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;l'électronique est montée à la colle chaude dans le barreau, en dessous. Simple, efficace et surtout démontable... (cliquez sur les photos pour zoomer)&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/IMG_3282.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/.IMG_3282_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/IMG_3284.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/.IMG_3284_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Je n'ai pas utilisé l'alimentation décrite dans l'article, mais une simple alimentation 5V bâtie autour d'un régulateur 7805 et de 2 condensateurs.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/IMG_3285.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/.IMG_3285_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Mais vous pourrez tout aussi bien l'intégrer dans un boitier 125B, qui vous permettra de mettre l'afficheur en face avant, les 2 switch, l'alimentation et la prise alimentation. Voici à quoi cela pourrait ressembler :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Zoom_ms70/hammond125b.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/Zoom_ms70/.hammond125b_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Bonne réalisation!&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2023/02/18/Ajouter-un-p%C3%A9dalier-pour-changements-de-sons-au-multieffet-Zoom-MS-70CDR-%28ou-MS-50/MS-60B%29#comment-form</comments>
          <wfw:comment>https://civade.com/post/2023/02/18/Ajouter-un-p%C3%A9dalier-pour-changements-de-sons-au-multieffet-Zoom-MS-70CDR-%28ou-MS-50/MS-60B%29#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/122</wfw:commentRss>
              </item>
          <item>
        <title>Enregistrement audio/vidéo avec carte son externe sur iphone / ipad</title>
        <link>https://civade.com/post/2023/01/23/Enregistrement-audio/vid%C3%A9o-avec-carte-son-externe-sur-iphone-ipad</link>
        <guid isPermaLink="false">urn:md5:38d4831dc5c04f537988891a1b03f596</guid>
        <pubDate>Sat, 21 Jan 2023 20:05:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>DIY</category>
                  <category>Musique</category>
                <description>&lt;p&gt;L'enregistrement video + audio ou audio seul sur iphone ou iPad peut vite devenir une galère dès lors que l'on désire une certaine souplesse de positionnement des micros, ou tout simplement avec un volume important (répétitions, concerts, etc..).  Le micro intégré ne supporte en effet pas très bien les volumes sonores du live, et sa directivité le rend très moyen pour des prises de son de conférences par exemple. Mais il y a des solutions...&lt;/p&gt;          &lt;h3&gt;Les Micros dédiés :&lt;/h3&gt;


&lt;p&gt;Certes il existe des micros dédiés, disposant d'une prise Lightning (Zoom IQ6, Zoom IQ7, Rode Vlogger, Rode VideoMic, etc..). Mais ce sont des accessoires dédiés, et qui ne permettront que de faire de la prise micro. Et à 100 ou 180 euros, cela fait réfléchir car ils ne seront utilisables que pour un usage.&lt;/p&gt;


&lt;p&gt;Exemple de micro dédié, le Zoom IQ6 :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/Zoom_IQ6.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.Zoom_IQ6_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Raccorder une carte son externe&lt;/h3&gt;


&lt;p&gt;Heureusement, le noyau d'IOS intègre des drivers qui permettent de raccorder une carte son USB &quot;Class compliant&quot;. Ceci veut dire qu'une carte son moderne, qui se branche sur PC/Mac/linux sans installer de drivers sera visible de l'iphone.&lt;/p&gt;


&lt;p&gt;Il y a 2 pré requis pour pouvoir raccorder une carte son externe :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disposer d'un adaptateur Lightning &amp;gt; USB&lt;/li&gt;
&lt;li&gt;Raccorder la carte son externe via un hub USB alimenté&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;L'adaptateur Lightning USB&lt;/h4&gt;


&lt;p&gt;Le premier pré requis pour effectuer une configuration de ce genre est de disposer d'une interface lightning &amp;lt;&amp;gt; USB. Chez Apple, cela se nomme &quot;Adaptateur pour appareil photo Lightning vers USB&quot;. il existe en 2 versions, l'une avec seulement une prise USB et une avec prise USB ET la prise de charge Lightning. Cette 2e version est préférable car elle permettra de charger le téléphone en même temps que l'on utilisera le périphérique USB. Intéressant si l'on doit filmer une conférence ou un concert de 2 heures.&lt;/p&gt;


&lt;p&gt;L'adaptateur Caméra USB d'Apple, avec port de charge Lightning&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/lightning-USB.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.lightning-USB_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;L'adaptateur Caméra USB d'Apple, sans port de charge Lightning :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/AdaptateurPhoto.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.AdaptateurPhoto_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;J'ai essayé avec succès un adaptateur Lightning USB sans port de charge de provenance chinoise.  Avec le mien, cela a fonctionné. Toutefois, il semblerait que certains ne soient pas correctement reconnus après des mises à jour d'IOS. Essayer avant d'acheter !&lt;/p&gt;


&lt;h4&gt;Hub USB alimenté&lt;/h4&gt;


&lt;p&gt;Warning!!!!! La plupart des soucis de détection de la carte son viennent de l'alimentation. En effet, un iphone ne peut délivrer sur l'USB que quelques centaines de milliampères. Si lors du branchement de la carte vous avez une mention &quot;Ce périphérique USB consomme trop&quot;, il va vous falloir utiliser un concentrateur (hub) usb alimenté. Ainsi votre carte son sera alimentée par le hub, et ne tirera plus sur la prise USB de l'adaptateur Lightning.&lt;/p&gt;


&lt;p&gt;Exemple de concentrateur USB avec alimentation externe:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/PoweredUsbHub.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.PoweredUsbHub_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Attention à ce que ce hub dispose d'une alimentation avec une puissance suffisante (5V, 1 ou 2 ampères) faute de quoi la carte son n'aura pas assez de puissance pour fonctionner correctement voir s'allumer. A noter qu'on peut la voir s'allumer sans pour autant qu'elle soit reconnue dans l'iphone / ipad si l'alim n'est pas assez puissante... On a l'impression que cela fonctionne, mais en fait non...  J'en ai fait l'expérience cuisante! Le simple changement d'alim sur le hub pour une plus puissante a suffit à régler le problème.&lt;/p&gt;


&lt;p&gt;Dans mes essais, j'ai vu que si le téléphone est complètement chargé, et qu'on utilise l'adaptateur Apple avec prise Lightning branchée à un chargeur Apple, la carte son peut fonctionner, seulement branchée à la prise usb (sans hub donc). J'ai fait une prise vidéo dans ces conditions pendant 2 heures, mais la batterie du téléphone s'est progressivement déchargée. Si l'on veut pouvoir tenir plus de 2 heures et dans toutes les conditions, il faut clairement envisager le hub USB alimenté.&lt;/p&gt;


&lt;h3&gt;Essais Audio&lt;/h3&gt;


&lt;p&gt;J'ai essayé avec plusieurs cartes sons ou périphériques audio en ma possession, avec succès :&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;MAudio Fast Trak pro&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/M_Audio_Fast_Track_PRO_USB_Audio_interface_2.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.M_Audio_Fast_Track_PRO_USB_Audio_interface_2_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/M_Audio_Fast_Track_PRO_USB_Audio_interface_1.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.M_Audio_Fast_Track_PRO_USB_Audio_interface_1_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 entrées XLR/Jack Mic/Line&lt;/li&gt;
&lt;li&gt;2 sorties ligne sur Jack 6.35&lt;/li&gt;
&lt;li&gt;4 sorties ligne sur Cinch&lt;/li&gt;
&lt;li&gt;E/S SPDIF&lt;/li&gt;
&lt;li&gt;2 inserts&lt;/li&gt;
&lt;li&gt;1 sortie casque avec potentiomètre de volume&lt;/li&gt;
&lt;li&gt;Mixeur entre le son provenant de la carte et le monitoring direct (pour le cas et le line out).&lt;/li&gt;
&lt;li&gt;Entrées/Sorties Midi&lt;/li&gt;
&lt;li&gt;Alimentation fantôme 48V débrayable&lt;/li&gt;
&lt;li&gt;Max 16 bits 48khz.&lt;/li&gt;
&lt;li&gt;Plus fabriquée. Se trouve d'occasion sur LBC à 20 euros... Imbattable pour débuter ou faire des essais!&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Çà fait le job sur l'enregistreur audio ou vidéo. Je n'ai pas trouvé comment passer l'enregistrement en 48Khz, il est par défaut en 44.1/16bits stéréo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une fois branché, les entrées et sorties prises en compte par l'iPhone sont celles de la carte.&lt;/li&gt;
&lt;li&gt;On peut avec le mixeur de monitoring doser le mix entre le monitoring direct et le retour de la carte.&lt;/li&gt;
&lt;li&gt;On gagne le midi, et la possibilité de brancher un clavier, mais c'est un autre sujet :).&lt;/li&gt;
&lt;li&gt;Les convertisseurs sont pas terribles, mais à 20 balles d'occasion faut pas demander la lune non plus....&lt;/li&gt;
&lt;li&gt;Sera galère à installer sur Mac, mais fonctionne sous Windows 10/11&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Behringer U-PHORIA UMC202HD&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/UMC202HD-frony.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.UMC202HD-frony_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/UMC202HD_Rear.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.UMC202HD_Rear_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 entrées XLR/Jack Mic/Line&lt;/li&gt;
&lt;li&gt;2 sorties ligne sur Jack 6.35&lt;/li&gt;
&lt;li&gt;1 sortie casque avec potentiomètre de volume&lt;/li&gt;
&lt;li&gt;Bouton &quot;Direct Monitor&quot; permettant de sélectionner le son provenant de la carte ou le monitoring direct de l'entrée.&lt;/li&gt;
&lt;li&gt;Alimentation fantôme 48V débrayable&lt;/li&gt;
&lt;li&gt;Max 24 bits / 192 kHz.&lt;/li&gt;
&lt;li&gt;Tarif indicatif 90€&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Détectée sans soucis. Je n'ai pas non plus trouvé comment passer l'enregistrement en 48Khz ou plus, il est par défaut en 44.1/16bits stéréo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une fois branché, les entrées et sorties prises en compte par l'iPhone sont celles de la carte.&lt;/li&gt;
&lt;li&gt;L'appui sur le bouton &quot;Direct Monitor&quot; permet d'entendre ce qui est capté par les entrées et sera enregistré.&lt;/li&gt;
&lt;li&gt;Très bon rapport qualité / prix et faible latence.&lt;/li&gt;
&lt;li&gt;Testée sur un enregistrement vidéo de 2 heures sur iPhone, sans hub USB alimenté... Ça a tenu!&lt;/li&gt;
&lt;li&gt;Devrait fonctionner de la même manière sur la UMC204HD (4 sorties, et midi en plus), qui est basée sur la même technologie.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Focusrite Scarlett 2i2&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/FocusriteScarlett2i2.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.FocusriteScarlett2i2_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 entrées XLR/Jack Mic/Line&lt;/li&gt;
&lt;li&gt;2 sorties ligne sur Jack 6.35&lt;/li&gt;
&lt;li&gt;1 sortie casque avec potentiomètre de volume&lt;/li&gt;
&lt;li&gt;Bouton &quot;Direct Monitor&quot; permettant de sélectionner le son provenant de la carte ou le monitoring direct de l'entrée.&lt;/li&gt;
&lt;li&gt;Alimentation fantôme 48V débrayable&lt;/li&gt;
&lt;li&gt;Max 24 bits / 192 kHz.&lt;/li&gt;
&lt;li&gt;Tarif indicatif 160/170€&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Détectée sans soucis.  Je n'ai pas non plus trouvé comment passer l'enregistrement en 48Khz ou plus, il est par défaut en 44.1/16bits stéréo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une fois branché, les entrées et sorties prises en compte par l'iPhone sont celles de la carte.&lt;/li&gt;
&lt;li&gt;L'appui sur le bouton &quot;Direct Monitor&quot; permet d'entendre ce qui est capté par les entrées et sera enregistré.&lt;/li&gt;
&lt;li&gt;Chouette qualité sonore, mais le prix l'est aussi.&lt;/li&gt;
&lt;li&gt;Un peu lourde.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Zoom H1n&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ios-external-audio/zoom-h1-n.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/ios-external-audio/.zoom-h1-n_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;__&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Micros stéréo X/Y intégrés&lt;/li&gt;
&lt;li&gt;Enregistrement 24 bits 96 kHz&lt;/li&gt;
&lt;li&gt;Entrée ligne externe&lt;/li&gt;
&lt;li&gt;Sortie ligne ou casque&lt;/li&gt;
&lt;li&gt;Tarif indicatif : 90€&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Le Zoom H1 est un enregistreur audio autonome. Toutefois, on peut le brancher sur un ordi en USB (ou l'iPhone) et dans ce cas, après avoir sélectionné le mode &quot;Sound card&quot; parmi les 2 modes disponibles (SD Card ou Sound card), il est correctement détecté par l'iPhone.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On peut choisir de passer en contrôle de gain automatique, ou manuel (et dans ce cas il faut régler le niveau d'entrée).&lt;/li&gt;
&lt;li&gt;On peut brancher un casque sur la sortie 3.5 stéréo, et ainsi disposer du monitoring.&lt;/li&gt;
&lt;li&gt;Détecté directement, et ne nécessite pas de hub USB alimenté (très faible consommation).&lt;/li&gt;
&lt;li&gt;Marche nickel.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;Conclusion :&lt;/h3&gt;


&lt;p&gt;Le choix de la solution dépend clairement du scénario d'usage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un micro avec connecteur lightning sera clairement la solution la plus compacte et transformera votre iphone... mais ne sera utilisable que sur iphone. Et quand Apple basculera l'USB 3 sur tous les téléphones, cet accessoire deviendra obsolète.&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;Brancher une carte son peut être intéressant pour récupérer un signal en sortie de table dans un concert, ou pour raccorder des micros spécifiques (ex: micros canons pour faire de la prise de sonore animalière ou sur une conférence lorsque l'on est loin). C'est plus adaptable, mais plus encombrant, et il faudra beaucoup de fils. L'alimentation de la carte son par hub USB est quasiment obligatoire. Mais la carte pourra servir à autre chose (dans son home studio par exemple).&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;Utiliser un micro enregistreur de type H1 peut s'avérer être plus pratique (config plus light). Le H1 est utilisable seul pour faire des prises de son de répétition, ou de conférences. Par contre il faudra le mettre en situation pour tirer parti du couple de micros à 90 degrés, qui ne sont pas très directif. De nombreux autres enregistreurs de ce type existent, mais il faudra prendre soin de valider qu'ils fonctionnent bien en USB &quot;Class Compliant&quot; (ex : Tascam DR-05x, Philips DVT6110, etc...).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;C'est à vous de voir !&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2023/01/23/Enregistrement-audio/vid%C3%A9o-avec-carte-son-externe-sur-iphone-ipad#comment-form</comments>
          <wfw:comment>https://civade.com/post/2023/01/23/Enregistrement-audio/vid%C3%A9o-avec-carte-son-externe-sur-iphone-ipad#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/121</wfw:commentRss>
              </item>
          <item>
        <title>Ampli guitare Boss Katana, CME WIDI UHost, BLE et transformation d'un pédalier Beringher FCB1010 en bluetooth avec un ESP32</title>
        <link>https://civade.com/post/2022/11/19/Ampli-guitare-Boss-Katana%2C-CME-WIDI-UHost%2C-BLE-et-transformation-d-un-p%C3%A9dalier-Beringher-FCB1010-en-bluetooth-avec-un-ESP32</link>
        <guid isPermaLink="false">urn:md5:867c98eba0df4881de48fabeaa8bea14</guid>
        <pubDate>Sat, 24 Dec 2022 08:00:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                          <category>Arduino</category>
                  <category>DIY</category>
                  <category>Embarqué</category>
                  <category>ESP32</category>
                  <category>Firmware</category>
                  <category>Musique</category>
                  <category>OpenSource</category>
                <description>&lt;p&gt;Certes le titre est long, mais c'est aussi pour teaser autour des possibilités offerts pour l'édition, le changement de son en live avec un pédalier midi et autres avec un Ampli Boss Katana (ici, MK2, mais cela fonctionnera de la même manière avec un MK1.&lt;/p&gt;          &lt;h3&gt;L'amplificateur Boss Katana:&lt;/h3&gt;

&lt;p&gt;L'amplificateur guitare Boss katana est un produit très intéressant. Si au premier abord cela s'apparente à un ampli guitare, dès qu'on y branche un PC sur la prise USB et que l'on charge l'éditeur de son Boss Tone Studio (BTS) &lt;a href=&quot;https://www.boss.info/fr/support/by_product/katana-100/updates_drivers/4f7cb65a-3d35-45ab-b051-bab5f29b722f/&quot;&gt;pour mk1&lt;/a&gt; ou &lt;a href=&quot;https://www.boss.info/fr/support/by_product/katana-100_mk2/updates_drivers/91dc2706-d5c6-4e94-bff9-ad60f13b2e6f/&quot;&gt;pour mk2&lt;/a&gt; ou même le logiciel libre &lt;a href=&quot;https://sourceforge.net/projects/fxfloorboard/files/KatanaFxFloorBoard/&quot;&gt;Katana FX Floorboard&lt;/a&gt; c'est une autre histoire.&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;media-link&quot; href=&quot;https://civade.com/images/bt-katana/katana-100-mkii.jpg&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/bt-katana/.katana-100-mkii_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On découvre un monde de possibilités permettant de programmer de nombreux effets simultanés et les modélisations d'amplis, et de les stocker dans l'un des 9 emplacements mémoires. Cela va bien au delç des possibilités de changements de sons offertes par le panneau avant, la plupart des réglages avancés n'étant disponibles que par éditeur. On peut brancher des équipements avancés soit sur la prise USB, qui expose non seulement une prise midi, mais aussi un port audio permettant des enregistrements, mais aussi sur une prise dédié aux accessoires Boss: GA/FC.&lt;/p&gt;

&lt;h3&gt;Le Pédalier Midi Boss&lt;/h3&gt;

&lt;p&gt;Boss commercialise un pédalier midi, qui se connecte par l'interface &quot;GA/FC&quot;, dédiée au pédalier du même nom. Toutefois, ce produit n'est pas donné non plus (160 €pour la version EX, qui permet d'exploiter presque pleinement le katana).&lt;/p&gt;

&lt;h3&gt;Le pédalier midi Xsonic&lt;/h3&gt;

&lt;p&gt;Xsonic commercialise un autre pédalier pour le Katana, le Aitrstep Kat Edition. Avec des fonctionnalités similaires à celui de boss, il ajoute une interface Bluetooth qui permet de connecter un téléphone avec le pédalier, lui même étant relié en USB à l'ampli. On a ainsi la possibilité d'éditer les sons par téléphone ou tablette ET de commuter les sons. C'est simpa, mais pas donné (175 € également). On le trouve beaucoup moins cher chez Aliexpress (autour de 100€). Par contre cela suppose de brancher un cable usb sur scène, et on sera forcément limité par la longeur de cable (2.5mètres max).&lt;/p&gt;

&lt;h3&gt;Et le bluetooth sur le Katana alors?&lt;/h3&gt;

&lt;p&gt;Mais seul un produit de la gamme Katana est doté d'une interface Bluetooth native.... Heureusement, le fabriquant CME a développé une interface nommée &quot;Widi Uhost&quot;. Elle se branche su rle port USB, est toute petite et ajoute à l'ampli la possibilité de communiquer en Bluetooth Midi.&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;media-link&quot; href=&quot;https://civade.com/images/bt-katana/CME_WIDI_UHOST_1.jpg&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/bt-katana/.CME_WIDI_UHOST_1_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cette interface est paramétrable par une application gratuite sur les stores. Elle lui permet de devenir host ou device Bluetooth 4 LE (BLE Midi!). Il devient ainsi raccordable à un PC équipé de BT 4.1 minimum (voir BT 5.0), à un téléphone mobile ou une tablette&amp;nbsp; équipé du logiciel Katana Librarian pour &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.appsforamps.katana&amp;amp;hl=en&amp;amp;gl=US&quot;&gt;Android&lt;/a&gt; ou &lt;a href=&quot;https://apps.apple.com/us/app/katana-librarian/id1616920240&quot;&gt;IOS&lt;/a&gt; . Ce dernier logiciel&amp;nbsp; est malheureusement payant (20 euros si mes souvenis sont exacts) mais fait le job.&lt;/p&gt;

&lt;p&gt;L'interface CME offre aussi la possibilité pour un périphérique (ex: pédalier Bluetooth) d'envoyer des program et control changes pour changer les sons. La fiche d’implémentation midi précise en effet qu'on peut changer les programmes en envoyant des programmes change (de 1 à 9), et mettre les effets on/off en envoyant des control change (CC 16 à 31), et même d'actionner 2 pédales d'expression sur les contrôles continus 80 et 81... et suivants.&lt;/p&gt;

&lt;p&gt;A ce stade, n'importe quel pédalier midi bluetooth programmable devient donc utilsiable pour piloter le Katana, dès lors qu'il a été programmé pour envoyer les program et control changes requis. Rien de bien sorcier...&lt;/p&gt;

&lt;h3&gt;Pédalier Midi Behringer FCB1010&lt;/h3&gt;

&lt;p&gt;Ayant remisé il y a quelques années un pédalier Behringer FCB1010, je me suis demandé si il n'y avait pas quelque chose à faire avec celui-ci. Pour mémoire, ce pédalier dispose de 10 boutons de changement de sons numérotés 1 à 10, de 2 pédales banque + et banque -, et de 2 pédales d'expression. Il permet aussi de piloter des relais ( x 2) pour allumer ou éteindre des effets externes par exemple.&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;media-link&quot; href=&quot;https://civade.com/images/bt-katana/fcb1010.jpg&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/bt-katana/.fcb1010_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;FCB UNO V1.0.4&lt;/h3&gt;

&lt;p&gt;Le firmware d'origine du pédalier et daté, assez buggé, et surtout ne permet pas de faire une chose qui va vite se révéler essentielle avec le KATANA : le mode &quot;Stomp Box&quot; ou la capacité d'actionner les effets indépendamment; Un développeur membre de la (RIP) communauté Yahoo avait développé un firmware qui corrigeait les bugs et ajoutait une fonctionnalité de stomp boxe: UNO. Avec Uno 1.0.4 et dans le mode stomp box, 5 des pédales sont dédiées au changement de sons et changent avec chaque banque, tandis que 5 autres permettent d'allumer et éteindre les effets et restent avec les mêmes contrôles quel que soit la banque. Cela tombe plutôt bien puisqu'il y a 5 effets simultanés sur le Katana MK2 (3 sur le katana MK1).&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;media-link&quot; href=&quot;https://civade.com/images/bt-katana/uno1.0.4.jpg&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/bt-katana/.uno1.0.4_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On peut programmer le pédalier équipé avec Uno de façon à ce que les 5 switch &quot;Stomp&quot; soient sur la rangée du haut ou du bas, les 5 autres étant dédiés aux changement de programme.&lt;/p&gt;

&lt;p&gt;La dernière version du firmware gratuit (UNO V1.0.4) est trouvable sur le forum dédié au FCB1010 qui a remplacé celui de yahoo : &lt;a href=&quot;https://fcb1010.groups.io/g/uno/files/UnO%20firmware%20information/FCB_V104_256.BIN&quot;&gt;https://fcb1010.groups.io/g/uno/files/UnO%20firmware%20information/FCB_V104_256.BIN&lt;/a&gt; . Ensuite l'auteur est passé sur un tout autre concept, bien plus puissant, mais qui ne nous servira à rien ici. L'eprom UNO 1.0.4 est achetable chez l'auteur au prix de 26 euros (&lt;a href=&quot;https://www.fcb1010.eu&quot;&gt;https://www.fcb1010.eu&lt;/a&gt;), ou sur ebay par exemple à partir de 10€. Vous pouvez la programmez vous même si vous disposez d'un programmateur d'Eprom. C'est l'option que j'ai choisie sur une mémoire (27C256) et remplacé le firmware d'origine par Uno 1.0.4. On peut aussi utiliser une 27C512, mais dans ce cas le firmware devra être chargé 2 fois dans la mémoire, une fois en 0x0000 et une fois en 0x8000.&lt;/p&gt;

&lt;p&gt;A la fin de ce port, vous trouverz une revue détaillée des différences entre le UNO et le firmware d'origine.&lt;/p&gt;

&lt;h3&gt;Éditeur pour FCB UNO 1.0.4&lt;/h3&gt;

&lt;p&gt;A noter qu'éditer les programmes avec le pédalier est très fastidieux, et pas aisé à comprendre. Une lecture attentive de la documentation (&amp;nbsp;&lt;a href=&quot;https://civade.com/images/bt-katana/FCB_UnO_v1_0_4_UserGuide.pdf&quot;&gt;FCB_UnO_v1_0_4_UserGuide.pdf&lt;/a&gt; ) n'y change malheuresemetn pas grand chose. C'est faisable mais pénible. J'ai rapidement testé divers éditeurs gratuits, pais anciens. Il buggent plus ou moins, et dans certains cas ne reconaissent pas la version 1.0.4, s'arrêtant à la version 1.0.3. Pour ceux qui souhaiteraient exploiter pleinement, je vous recommanderai d'utiliser l'éditeur écrit par l'auteur de Uno: &lt;a href=&quot;https://www.fcb1010.uno/&quot;&gt;FCB1010 Control Center&lt;/a&gt;. Certes il est payant (24 euros), mais est très bien écrit et sable et fonctionne à merveille y compris sous WIndows 11. Il se nomme &quot;FCB1010 Control Center&quot;.&lt;/p&gt;

&lt;p&gt;Note concernant la documentation : Le manuel de UNO ne reprend pas les manips standard, comme par exemple la calibration des pédales, ou le reset usine de la ram. Gardez donc le sous le coude...ca peut servir ! ( &lt;a href=&quot;https://mediadl.musictribe.com/media/PLM/data/docs/P0089/FCB1010_P0089_M_FR.pdf&quot;&gt;https://mediadl.musictribe.com/media/PLM/data/docs/P0089/FCB1010_P0089_M_FR.pdf&lt;/a&gt; )&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;u&gt;&lt;strong&gt;Vue du FCB1010 control center :&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;media-link&quot; href=&quot;https://civade.com/images/bt-katana/fcb1010ControlCenter.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/bt-katana/.fcb1010ControlCenter_m.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Du bluetooth dans le FCB1010?&lt;/h3&gt;

&lt;p&gt;Mais le FCB1010 ne gère que du MIDI filaire.... et il n'y a pas de prise Midi IN sur le Katana 100 MK2. A ce stade, 2 possibilités :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Equiper le Katana d'une interface &quot;CME Midi Master&quot;, qui parle en bluetooth directement avec le Midi UHost.&lt;/li&gt;
	&lt;li&gt;Développer sa propre interface Midi Bluetooth et l'intégrer dans le FCB1010&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C'est sur cette dernière piste que je suis parti, en utilisant un ESP32. En effet, l'ESP parle Bluetooth nativement, dispose de plusieurs ports série matériels et ne coute que 4 euros. Ne prenant que très peu de place, il est facile à intégrer à l'intérieur du FCB1010 et sa faible consommation le rend raccordable à l'alimentation interne 5V existante. Seul bémol, ses interfaces sont en 3.3V alors que le 8032 intégré au FCB1010 parle en 5V. Mais c'est assez facile à régler avec un simple pont diviseur.&lt;/p&gt;

&lt;p&gt;Voici le schéma d'interconnexion de l'ESP32 avec l’électronique intégrée du FCB1010. Sur J1, on va 'voler&quot; les signaux à partir de la carte midi du FCB1010, et notamment&amp;nbsp; la sortie série (TX du microcontrôleur 8031) avant qu'elle soit convertie en Midi, la masse et le +5v. L'interface Midi d'origine reste totalement cablée et fonctionnelle. Ainsi le pédalier est capable de sortie en Bluetooth, mais reste éditable en midi avec les prises DIN. Par contre seul le TX étant cablé en bluetooth, il ne sera pas posisble d'éditer le pédalier en bluetooth. Ce serait réalisable en intervenant sur le circuit Midi du FCB 1010 pour mettre en place un aiguillage (interrupteur, ou &quot;OU&quot; logique) sur l'entrée RX du 8032. Il faudra aussi réaliser une adaptation de nivreau (3.3V &amp;gt; 5V). Rien d'impossible mais je n'en voyais pas l'intérêt. Il serait également possible de totalement convertir en BT le FCB. Il suffirant de supprimer la carte midi et de reprendre TX,RX, GND et +5v pour les envoyer vers l'esp32.&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;media-link&quot; href=&quot;https://civade.com/images/bt-katana/schema-esp32-fcb1010.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/bt-katana/.schema-esp32-fcb1010_m.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voici un visuel de la carte MIDI du FCB 1010. C'est sur celle ci que nous allons prélever les signaux pour les diriger vers l'ESP32 (verrs le J1 du schéma).&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;media-link&quot; href=&quot;https://civade.com/images/bt-katana/midi1.jpg&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/bt-katana/.midi1_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et voici une vue détaillée cu câblage et du branchement du connecteur Midi / TTL. On voit notamment les 2 résistance qui servent au pont diviseur pour fabriquer le midi out en 3.3V (fil orange).&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;media-link&quot; href=&quot;https://civade.com/images/bt-katana/midi2.jpg&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/bt-katana/.midi2_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Note importante : Attention,vous faut&amp;nbsp; déconnecter le 5V qui va de la carte MIDI vers l'ESP32 lorsque vous brancherez l'USB ppour programmer l'ESP afin d'éviter tout conflit d'alimentation.&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;h3&gt; &lt;/h3&gt;

&lt;h3&gt;Le programme Bluetooth&lt;/h3&gt;

&lt;p&gt;Le programme nécessite plusieurs bibliothèques pour pouvoir fonctionner :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;BLE-MIDI ( https://github.com/lathoub/Arduino-BLE-MIDI ) et ses dépendances
	&lt;ul&gt;
		&lt;li&gt;MIDI Library&lt;/li&gt;
		&lt;li&gt;NimBLE-Arduino&lt;/li&gt;
		&lt;li&gt;ArduinoBLE&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En fait, BLE-Midi, qui est la bibliothèque constituant le coeur de ce programme, peut travailler avec plusieurs piles Bluetooth:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;La pile de protocole native de l'ESP32 (ESP32_BLE_Arduino)&lt;/li&gt;
	&lt;li&gt;La pile de protocole ArduinoBLE&lt;/li&gt;
	&lt;li&gt;La pile de protocole NimBLE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Après plusieurs essais je suis toutefois resté sur NimBLE, car a une empreinte mémoire plus faible et se reconnecte plus rapidement en cas de perte de connexion.&lt;/p&gt;

&lt;p&gt;Ce code est basé sur l'exemple MidiBle_Client de la bibliothèque BLE-MIDI&quot;. Après s'être connecté sur un &quot;WIDI Uhost&quot; (mais il peut se connecter sur n'importe quel périphérique midi, ou au contraire sur un périphérique Midi avec un SSID très&amp;nbsp; précis). A adapter en fonction de votre matériel...), il se met en lecture de la liaison série 2, connectée au midi out du pédalier. Il prend les messages de type &quot;Control change&quot; et &quot;program Change&quot; et les réexpédie sur BT Midi. Il ne traitera pas les autres messages (Sysex, notes, etc..) puisque inutiles pour nous. En cas de déconnexion les callbacks permettent la reconnexion automatique.&lt;/p&gt;

&lt;p&gt;Le code se connecte autotomatiquement à tout &quot;WMIDI Uhost&quot; grace à la ligne &quot;BLEMIDI_CREATE_INSTANCE(&quot;WIDI Uhost&quot;,MIDI)&quot;. Toutefois vous pouvez être encore plus spécifique en précisant l'adresse de VOTRE interface dans le constructeur en utilisant la ligne &quot;BLEMIDI_CREATE_INSTANCE(&quot;cd:38:9a:99:67:9f&quot;,MIDI)&quot; et en adaptant bien sur l'adresse. Vous pourrer la relever aisément dans la console série de l'ESP32 lors de la 1ere connexion.&lt;/p&gt;

&lt;h3&gt;Tests : Couplage du Katana+Midi UHost avec le FCB1010&lt;/h3&gt;

&lt;p&gt;Il faut tout d'abord bien avoir programmé l'interface CME à l'aide du logiciel sur mobile. &quot;BLE ROLE&quot; devra avoir été positionné à &quot;Auto - to all BLE MIDI Devices&quot;:&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;media-link&quot; href=&quot;https://civade.com/images/bt-katana/Settings-wmidi.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;media&quot; src=&quot;https://civade.com/images/bt-katana/.Settings-wmidi_m.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pensez à vous déconnecter du télphone/tablette après avoir paramétré le Wmidi Uhost. Le voyant bleu devrait repasser à clignotant.&lt;/p&gt;

&lt;p&gt;Ensuite vous pourrez allumer le pédalier et le code de connexion de l'ESP32 se connectera directement au Wmidi Uhost le plus proche..&lt;/p&gt;

&lt;p&gt;Dès allumage du pédalier midi, vous pourrez voir le voyant bluetooth du WMIDI passer de bleu clignotant à vert fixe.&lt;/p&gt;

&lt;p&gt;A noter que si vous voulez voir ce qu'il se passe, vous pourrez connecter momentanément l'esp32 au PC (en ayant bien déconnecté le +5v venant du pédalier), et ouvert la console série de l'environnement arduino à 115200 bauds. Vous verrez défiler les messages de connexion et éventuelles erreurs.&lt;/p&gt;

&lt;h3&gt;La programmation du FCB1010 pour le Katana&lt;/h3&gt;

&lt;p&gt;Seulement 2 banques de 5 sons vous seront utiles. La banque 1 sera assignée aux presets A, et la banque 2 aux presets B.&lt;/p&gt;

&lt;p&gt;Le 5e son pourra être assigné au &quot;PANEL&quot; sur les 2 banques, tandis que les sont 1 à 4 appelleront le son correspondant dans la banque.&lt;/p&gt;

&lt;p&gt;Les 2 pédales pourront être utilisées (cc 80 et 81). Ce sera dans l'édition de son du katana et dans la matrice de modulation que vous pourrez les router ou bon vous semble pour commander la Wah ou l'efficacité du booster par exemple. C'est à vous de choisir.&lt;/p&gt;

&lt;p&gt;Comme la communication avec le Katana ne sera qu'unidirectionnelle, vous ne pourrez pas lire l'état d'un effet (on/off) pour un effet/preset donné. Il vous appratiendra donc de mettre en conformité l'état initial des stomp après changement de programmes aux sons que vous aurrez programmés. Vous trouverez un exemple dans la colonne &quot;Stomp&quot; ci dessous.&lt;/p&gt;

&lt;pre&gt;
Index | Stompbox name    | PC1 PC2 PC3 PC4 PC5 | CC1: on/off CC2: on/off | Note| ExprA:min-max ExprB:min-max | SW | Stomps|
---------------------------------------------------------------------------------------------------------------------------
SB.01 | BOOSTER          | ... ... ... ... ... | 016 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. |       |                                                   
SB.02 | MODULARTION      | ... ... ... ... ... | 017 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. |       |                                                   
SB.03 | EFFECT           | ... ... ... ... ... | 018 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. |       |                                                   
SB.04 | DELAY            | ... ... ... ... ... | 019 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. |       |                                                   
SB.05 | REVERB           | ... ... ... ... ... | 020 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. |       |                                                   
---------------------------------------------------------------------------------------------------------------------------

Index | Preset name      | PC1 PC2 PC3 PC4 PC5 | CC1:val     CC2:val     | Note| ExprA:min-max ExprB:min-max | SW | Stomps|
---------------------------------------------------------------------------------------------------------------------------
00.01 | Bank A/1         | 001 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 00011 |                                                   
00.02 | Bank A/2         | 002 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 00011 |                                                   
00.03 | Bank A/3         | 003 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 00011 |                                                   
00.04 | Bank A/4         | 004 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 10011 |                                                   
00.05 | PANEL            | 005 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 00001 |                                                   
01.01 | Bank B/1         | 006 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 11011 |                                                   
01.02 | Bank B/2         | 007 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 01011 |                                                   
01.03 | Bank B/3         | 008 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 00000 |                                                   
01.04 | Bank B/4         | 009 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 11011 |                                                   
01.05 | PANEL            | 005 ... ... ... ... | ... ...     ... ...     | ... | 1 080 001 127 1 081 000 127 | .. | 00001 | 
&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;ANNEXE 1 le code Arduino pour ESP32&lt;/h3&gt;

&lt;pre&gt;
/*
 * Katana Midi to bluetooth interface
 * Uses a CME WIDI Host as interface on Katana, and an ESP32 integrated into FCB1010
 * Since Katana takes program changes to change program, and CC to enable disable effects
 * This is the only implemaentation needed.
 * ESP32 must be powered by stoling 5V on Midi interface cable (5 pins cable, 4 black &amp;amp; 1 red
 * coming from motherboard to midi interface).
 * The Midi TX have to be took on the same connector. 
 * Be careful, Midi TX is 5V. Should be adapted before connecting to RX on ESP32.
 * A simple divisor bridge is enough (3.3K/1.8K). Serial 2 is used, and RX assiged to D16.
 */

/* Katana Midi implementation (MK2)
 * -----------------------------------------
 *  Program Change0
 * -----------------------------------------
 *  1 (00h) Bank A ch 1
 *  2 (01h) Bank A ch 2
 *  3 (02h) Bank A ch 3
 *  4 (03h) Bank A ch 4
 *  5 (04h) Panel
 *  6 (05h) Bank B ch 1
 *  7 (06h) Bank B ch 2
 *  8 (07h) Bank B ch 3
 *  9 (08h) Bank B ch 4
 *  
 * -----------------------------------------
 *  Control changes :
 * -----------------------------------------
 *  #16 Booster SW (0&amp;gt;64 off, 64&amp;gt;127 on)
 *  #17 Mod SW (0&amp;gt;64 off, 64&amp;gt;127 on)
 *  #18 FX SW (0&amp;gt;64 off, 64&amp;gt;127 on)
 *  #19 Delay (0&amp;gt;64 off, 64&amp;gt;127 on)
 *  #20 Reverb (0&amp;gt;64 off, 64&amp;gt;127 on)
 *  #21 Effect loop (0&amp;gt;64 off, 64&amp;gt;127 on)
 *  #80 GA/FC exp pedal 1 (FX) (0&amp;gt;127)
 *  #81 GA/FC exp pedal 2 (VOLUME) (0&amp;gt;127)
 *  #82 Exp pedal (0&amp;gt;127)
 *  #83 GA/FC FS1 (0&amp;gt;64 off, 64&amp;gt;127 on)
 *  #84 GA/FC FS2 (0&amp;gt;64 off, 64&amp;gt;127 on)
 */


#include &amp;lt;Arduino.h&amp;gt;
#include &amp;lt;MIDI.h&amp;gt;
#include &amp;lt;BLEMIDI_Transport.h&amp;gt;
// Using NIMBLE library for transport.
#include &amp;lt;hardware/BLEMIDI_ESP32_NimBLE.h&amp;gt;

//Connect to any BLE server
//BLEMIDI_CREATE_DEFAULT_INSTANCE()
//Connect to a specific model (here CME Widi UHOST)
BLEMIDI_CREATE_INSTANCE(&quot;WIDI Uhost&quot;,MIDI)
//Connect to a specific BLE address server
//BLEMIDI_CREATE_INSTANCE(&quot;cd:38:9a:99:67:9f&quot;,MIDI) 

struct Serial2MIDISettings : public midi::DefaultSettings
{
  static const long BaudRate = 31250;
  static const int8_t RxPin  = 16;
  static const int8_t TxPin  = 17;
};

MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial2, MIDISerial, Serial2MIDISettings);

unsigned long t0 = millis();
bool isConnected = false;
unsigned char PC=0;
unsigned char CC=16;
unsigned char ONOFF=127;
midi::MidiType MidiType;
unsigned int MidiData1;
unsigned int MidiData2;
unsigned int MidiChannel;

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void setup()
{
  
  Serial.begin(115200);
  MIDISerial.turnThruOff();
  MIDISerial.begin(MIDI_CHANNEL_OMNI);

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  MIDI.turnThruOff();
  MIDI.begin(MIDI_CHANNEL_OMNI);
  BLEMIDI.setHandleConnected(OnConnected);
  BLEMIDI.setHandleDisconnected(OnDisconnected);

}

// -----------------------------------------------------------------------------
// Bridge BT &amp;lt;&amp;gt; Serial
// -----------------------------------------------------------------------------
void loop()
{
    // Midi received on midiserial, send it on BT and display it on serial for debug purpose. 
    if (MIDISerial.read())
    {
        MidiType=MIDISerial.getType();
        MidiData1=MIDISerial.getData1();
        MidiData2=MIDISerial.getData2();
        MidiChannel=MIDISerial.getChannel();  
        MIDI.send( MidiType,MidiData1,MidiData2,MidiChannel);
        printMidiMsg(MidiType, MidiData1, MidiData2, MidiChannel);
    }
        
    // Midi received over bluetooth? Send it on Midiserial, and Display it on serial for debug purpose.
    if (MIDI.read())
    {
        MidiType=MIDI.getType();
        MidiData1=MIDI.getData1();
        MidiData2=MIDI.getData2();
        MidiChannel=MIDI.getChannel();  
        printMidiMsg(MidiType, MidiData1, MidiData2, MidiChannel);
        MIDISerial.send( MidiType,MidiData1,MidiData2,MidiChannel);     
    }   
}

// ====================================================================================
// Event handlers for incoming MIDI messages
// ====================================================================================

// -----------------------------------------------------------------------------
// Device connected
// -----------------------------------------------------------------------------
void OnConnected() {
  isConnected = true;
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println(&quot;---------CONNECTED---------&quot;);
  isConnected = true;
}

// -----------------------------------------------------------------------------
// Device disconnected
// -----------------------------------------------------------------------------
void OnDisconnected() {
  isConnected = false;
  digitalWrite(LED_BUILTIN, LOW);
  Serial.println(&quot;---------NOT CONNECTED---------&quot;);
  isConnected = false;
}

void printMidiMsg (uint8_t cmd, uint8_t d1, uint8_t d2, uint8_t ch) {
  switch (cmd) {
    case midi::ActiveSensing:
      // Ignore
      return;
      break;
  }
  if (ch&amp;lt;10) Serial.print(&quot; &quot;);
  Serial.print(ch);
  Serial.print(&quot; 0x&quot;);
  Serial.print(cmd, HEX);
  Serial.print(&quot; 0x&quot;);
  Serial.print(d1, HEX);
  Serial.print(&quot; 0x&quot;);
  Serial.print(d2, HEX);
  Serial.print(&quot;\t&quot;);
  switch(cmd) {
    case midi::NoteOff:
      Serial.print(&quot;NoteOff\t&quot;);
      Serial.print(d1);
      Serial.print(&quot;\t&quot;);
      Serial.print(d2);
      break;
    case midi::NoteOn:
      Serial.print(&quot;NoteOn\t&quot;);
      Serial.print(d1);
      Serial.print(&quot;\t&quot;);
      Serial.print(d2);
      break;
    case midi::AfterTouchPoly:
      Serial.print(&quot;AfterTouchPoly\t&quot;);
      Serial.print(d1);
      Serial.print(&quot;\t&quot;);
      Serial.print(d2);
      break;
    case midi::ControlChange:
      Serial.print(&quot;ControlChange\t&quot;);
      Serial.print(d1);
      Serial.print(&quot;\t&quot;);
      Serial.print(d2);
      break;
    case midi::ProgramChange:
      Serial.print(&quot;ProgramChange\t&quot;);
      Serial.print(d1);
      break;
    case midi::AfterTouchChannel:
      Serial.print(&quot;AfterTouchChannel\t&quot;);
      Serial.print(d1);
      break;
    case midi::PitchBend:
      Serial.print(&quot;PitchBend\t&quot;);
      Serial.print(d1);
      Serial.print(&quot;\t&quot;);
      Serial.print(d2);
      break;
  }
  Serial.print(&quot;\n&quot;);
}
&lt;/pre&gt;

&lt;h3&gt;ANNEXE2: Différences entre le firmware d'origine Behringer v2.5.1.e et Uno 1.0.4&lt;/h3&gt;

&lt;p&gt; &lt;/p&gt;

&lt;table&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;Usine v2.5.1.e &lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;UNO V1.0.4 &lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;Merging MIDI IN with FCB-generated messages does not work correctly. This causes (for instance) hanging notes when simulatuously playing a keyboard, connected to MIDI IN, and moving the expression pedal(s).&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Problem solved&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;When powering the FCB while an instrument is connected to the MIDI IN port, the FCB display shows a flashing 88, and the unit does not work correctly (in case the connected instrument sends ActiveSense messages, as many keyboards do)&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Problem solved&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;When MIDI merge enabled, all messages are forwarded from MIDI IN to MIDI OUT port&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;ActiveSense messages are no longer forwarded in order to reduce amount of data traffic&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;The global setting for enabling/disabling Running Status does not work&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Problem solved&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;Part of the global setup is not sent along with a sysex dump, and therefore can not be edited using an external PC editor.&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Problem solved&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;While pressing a footswitch, expression pedals cannot be used&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;While pressing a footswitch (for instance used as keyboard damper pedal), expression pedals can still be used&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;Receiving a sysex dump is done by going into global setup, pressing a footswitch, and then starting the sysex dump from PC&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;A sysex dump can be received at all times without any action required on the FCB1010&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;“Stomp box behavior” : each patch can have 2 CC messages – if both are on the same MIDI channel (global setup) and have the same CC number, it is possible to send 2 toggling values alternately, instead of sending both messages simultaneously.&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Each patch can have 2 independent CC messages (each with its own MIDI channel). For each of these messages, 2 values can be programmed in order to implement toggling behavior – no more need to combine both CC messages for this.&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;“Stomp box behavior” : when clicking a patch or a stompbox, its corresponding LED is lighting up. Impossible to see the status of the stompbox (on or off) or to see the last selected patch after clicking a stompbox.&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;“Stomp box behavior”: when clicking a stomp- box, its status (on or off) is shown on its LED. Also, the LED of the last selected patch stays on. Apart from stompboxes, “momentary” (non-toggling) effects are introduced, which also leave the last patch LED on when clicked.&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;Possibility to program 10 banks of 10 presets &lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Choice between normal mode (10 banks of 10 presets) or “stompbox mode” : 19 banks of 5 presets (on 1 of the 2 footswitch rows) + 5 global stomp boxes (on the other row).&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Possibility for “momentary effects” to send the programmed CC number and value when depressing the footswitch, and same CC number with value 0 when releasing the footswitch.&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;Switches can be latched or momentary ( = normally-open, i.e. contact closed as long as a footswitch is depressed )&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Switches can be latched or momentary. When momentary, one can choose between “normally-open” or “normally-closed” behavior (global setting)&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;Each patch can be programmed to turn the 2 switches ON or OFF&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Apart from forcing a switch ON or OFF, a patch can also be programmed to leave a switch unchanged&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;Toggling the switches by pressing 1 key is possible only in DirectSelect mode (using UP/DOWN keys)&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Toggling the switches is possible using any of the stomp boxes&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;Each patch can turn the 2 expression pedals off or turn them on with corresponding CC number&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Apart from forcing an expression pedal ON or OFF, a patch can also be programmed to leave the expr.pedal CC unchanged&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;When moving an expression pedal, the CC value sent is shortly shown on the display&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Possibility to block repeating PC messages&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Possibility to disable Behringer taptempo message generation&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;&lt;code&gt;Possibility to change the NoteOn velocity as a global parameter&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt; &lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2022/11/19/Ampli-guitare-Boss-Katana%2C-CME-WIDI-UHost%2C-BLE-et-transformation-d-un-p%C3%A9dalier-Beringher-FCB1010-en-bluetooth-avec-un-ESP32#comment-form</comments>
          <wfw:comment>https://civade.com/post/2022/11/19/Ampli-guitare-Boss-Katana%2C-CME-WIDI-UHost%2C-BLE-et-transformation-d-un-p%C3%A9dalier-Beringher-FCB1010-en-bluetooth-avec-un-ESP32#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/120</wfw:commentRss>
              </item>
          <item>
        <title>Utilisation de multiples entrées physiques pour la détection de longueur d'outil (Probe) dans MACH3</title>
        <link>https://civade.com/post/2022/05/24/Utilisation-de-multiples-entr%C3%A9es-physiques-pour-la-d%C3%A9tection-de-longueur-d-outil-%28Probe%29-dans-MACH3</link>
        <guid isPermaLink="false">urn:md5:b7126215e5ef17503dfe3ba377f134b3</guid>
        <pubDate>Tue, 24 May 2022 20:30:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Machines à commande numériques</category>
                          <category>CNC</category>
                  <category>Mach3</category>
                <description>&lt;p&gt;Sur Mach 3, certaines fonctions sont raccordables à une entrée (ex:  Probe). Mais que se passe t'il si l'on a plusieurs dispositifs à raccorder sur la même entrée? Si ce sont des interrupteurs mécaniques, , pas de soucis. Cela peut se régler matériellement. Mais si l'on mixe des détecteurs actifs (délivrant une tension) et passifs (interrupteurs) les ennuis commencent.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Mach3/tld.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Mach3/.tld_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Capteur de longueur d'outil&lt;/p&gt;          &lt;h3&gt;Pourquoi plusieurs switches?&lt;/h3&gt;


&lt;p&gt;Il peut y avoir de multiples raisons. La plus évidente est de vouloir utiliser la détection de longueur d'outil sur plusieurs détecteurs, notamment quand le jeu d'écrans le nécessite comme le Screenset 2010 de Jerry qui utilise 2 capteurs de longueurs, d'outil, l'un fixé sur la table pour avoir une référence, et l'autre mobile pour détecter le zéro pièce. On peut aussi vouloir ajouter à ces 2 détecteurs un palpeur 3D par exemple.&lt;/p&gt;


&lt;h3&gt;Série ou parallèle&lt;/h3&gt;


&lt;p&gt;Pour des interrupteurs passifs, il n'y a pas de soucis.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si ils sont normalement ouverts au repose, il suffit de les câbler en parallèle.&lt;/li&gt;
&lt;li&gt;Si ils sont normalement fermés au repos, il suffit de les câbler en série.&lt;/li&gt;
&lt;li&gt;On ne pourra pas mixer des switches normalement ouverts et normalement fermés.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Actif/Actif ou Actif/Passif&lt;/h3&gt;


&lt;p&gt;Dans le cas ou l'on a un mixe de switches et de capteurs actifs, il va falloir trouver une solution. Il est tout à fait possible de faire une carte électronique qui conditionne les entrées et fasse un ou logique des différentes entrées sur une unique sortie. Je ne m'étendrai pas sur cette solution, car elle est dépendante du type de détecteurs utilisés (ouvert ou fermé au repos) et des capteurs actifs utilisés (sortie en tension, collecteur ouvert, 5v, 12v, optiques, inductifs, etc..)&lt;/p&gt;


&lt;p&gt;Si votre carte dispose de suffisamment d'entrées et que celles si supportent soit des interrupteurs (résistances de tirage au 5V ntégrées) ou des entrées délivrant un niveau logique 5V (les résistances de tirage au 5V sont de suffisamment grande valeur), cela ouvre des possibilités à une solution entièrement logicielle.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Mach3/InputPalpeur.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/Mach3/.InputPalpeur_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Mach3 ne prévoit qu'une entrée par fonction. Ainsi, lorsque l'on raccorde une sonde (probe), on l'associe dan Mach3 à une unique entrée. L'astuce consiste donc à reconfigurer Mach3 à la volée pour lui signifier le changement d'entrée. Une fonction spécifique permet ceci : SetInputData . Appelée dans Mach3, elle va permettre de changer l'entrée associée à une fonction.&lt;/p&gt;


&lt;p&gt;Usage :
SetInputData ( NuméroEntreeDansMach3, NumeroDeBrocheEntreePhysique, EntréeInverseeOuiNon)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NuméroEntreeDansMach3 : A relever dans le fichier XML de définition machine. L'entrée Probe est la 22 par exemple.&lt;/li&gt;
&lt;li&gt;NumeroDeBrocheEntreePhysique : Numéro de broche sur le port (ex 10 ou 11 ou 12...)&lt;/li&gt;
&lt;li&gt;EntréeInverseeOuiNon : Mettre 1 si la broche est inversée (active à l'état 0).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A noter que le numéro de port n'est pas programmable. Pour utiliser cette technique il va donc falloir utiliser le même port pour toutes les entrées à permuter. Dans ce cas de certaines cartes (Exemple: Ethernet Smooth Stepper) qui disposent de l’équivalent de plusieurs ports parallèles, c'est à prendre en compte à la conception.&lt;/p&gt;


&lt;p&gt;Avec cette fonction, on va donc pouvoir modifier une macro M1s pour ajouter la permutation d'entrée avant d'utiliser un capteur spécifique par exemple), en n'oubliant pas de remettre l'entrée précédente juste avant de quitter la macro.&lt;/p&gt;


&lt;h3&gt;Conclusion :&lt;/h3&gt;

&lt;p&gt;Pour conclure, voici les modifications à appliquer sur le screenset 2010 de Gerry, afin d'utiliser une autre entrée pour le capteur fixe sur la table. Le capteur mobile (mesure de la hauteur de la pièce par rapport à la fraise) sera celui qui sera configuré par défaut dans Mach 3. Dans cet exemple, le capteur mobile est sur l'entrée 12 (capteur actif, donne 5v si actif), et le fixe sur la 11 (détecteur normalement ouvert, câblé sur une entrée avec résistances de tirage au 5V). Dans la config par défaut de Mach3, c'est le 12 qui est sélectionné (non inversé)&lt;/p&gt;


&lt;p&gt;Pour M6end (changement d'outil)
Ligne138&lt;/p&gt;

&lt;pre&gt;SetInputData(22,11,1) ' Fixed switch&lt;/pre&gt;

&lt;p&gt;Ligne 162&lt;/p&gt;

&lt;pre&gt;SetInputData(22,12,0) ' Back to mobile Switch&lt;/pre&gt;


&lt;p&gt;Pour y m881.m1s ( mesue complete de longeur d'outil avec les 2 switches)
Ligne 181&lt;/p&gt;

&lt;pre&gt;SetInputData(22,11,1) ' Fixed switch&lt;/pre&gt;

&lt;p&gt;Ligne 201&lt;/p&gt;

&lt;pre&gt;SetInputData(22,12,0) ' Back to mobile Switch&lt;/pre&gt;



&lt;p&gt;Et un aperçu de la macro pour voir comment on substitue l'entrée juste avant la détection :&lt;/p&gt;
&lt;pre&gt;
 Code &amp;quot;(Probing for Reference Position.....)&amp;quot; &amp;#039; Puts this message in the status bar

 &amp;#039;**************************************
 SetInputData(22,11,1) &amp;#039; Fixed switch
 &amp;#039;**************************************

 ZPlate = (GetOEMDRO(802) - FirstProbeDist) 
 Code &amp;quot;G90 G31 Z&amp;quot; &amp;amp; Zplate &amp;#039; Probe move to current Z - 6 inches
 
 While IsMoving()
 Wend

 ZPlate = GetVar(2002) &amp;#039; Read the touch point
 Code &amp;quot;G0 Z&amp;quot; &amp;amp; ( ZPlate + FirstRetractDist ) &amp;#039; Move up .1 inch in case of overshoot

 While IsMoving()
 Wend

 Code &amp;quot;F&amp;quot; &amp;amp; SecondProbeFeed &amp;#039; Set feedrate to 1 ipm or 25mm/min

 ZPlate = (GetOEMDRO(802) - SecProbeDist)
 Code &amp;quot;G90 G31 Z&amp;quot; &amp;amp; Zplate &amp;#039; Probe move to current Z - .25 inches

 While IsMoving()
 Wend

 &amp;#039;**************************************
 SetInputData(22,12,0) &amp;#039; Back to mobile Switch
 &amp;#039;**************************************

 ZPlate = GetVar(2002) &amp;#039; Read the touch point
 Code &amp;quot;G1 Z&amp;quot; &amp;amp; ZPlate &amp;#039; Move back to hit point in case of overshoot

 While IsMoving()
 Wend
&lt;/pre&gt;</description>
        
                  <comments>https://civade.com/post/2022/05/24/Utilisation-de-multiples-entr%C3%A9es-physiques-pour-la-d%C3%A9tection-de-longueur-d-outil-%28Probe%29-dans-MACH3#comment-form</comments>
          <wfw:comment>https://civade.com/post/2022/05/24/Utilisation-de-multiples-entr%C3%A9es-physiques-pour-la-d%C3%A9tection-de-longueur-d-outil-%28Probe%29-dans-MACH3#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/119</wfw:commentRss>
              </item>
          <item>
        <title>Utilisation  d'une télécommande &quot;Electronic Handwheel cncdiy.org&quot; sur logiciel de pilotage CNC Mach3</title>
        <link>https://civade.com/post/2022/05/21/Utilisation-d-une-t%C3%A9l%C3%A9commande-Electronic-Handwheel-cncdiy.org-sur-logiciel-de-pilotage-CNC-Mach3</link>
        <guid isPermaLink="false">urn:md5:f3d403753691549489df6240a10f2a74</guid>
        <pubDate>Sat, 21 May 2022 14:55:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Machines à commande numériques</category>
                          <category>CNC</category>
                  <category>DIY</category>
                  <category>Mach3</category>
                <description>&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;On trouve sur ebay, Aliexpress ou Banggood des manettes de pilotage (handwheel) pour le logiciel Mach3 à peu de frais (moins de 35 euros livrées). Il n'y a pas beaucoup d'informations sur les sites concernant le fonctionnement avec Mach3. Ces manettes sont filaires, livrées avec un cordon type téléphone et sans pilote. Mais si cela fonctionne très bien avec le screenset livré avec Mach3 US, ce n'est pas du tout le cas avec d'autres...&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Mach3/jog1.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Mach3/.jog1_m.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;          &lt;h3&gt;Généralités&lt;/h3&gt;


&lt;p&gt;Ces manettes fournissent un jeu réduit de contrôles, mais bien suffisants pour le pilotage d'une machine :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arrêt d'urgence&lt;/li&gt;
&lt;li&gt;Contrôle des axes X,Y,Z,A,B,C à l'aide d'une petite manette de jeu &quot;PS&quot;.&lt;/li&gt;
&lt;li&gt;Contrôle de la vitesse de déplacement en positionnement (+/-)&lt;/li&gt;
&lt;li&gt;Modulation de la vitesse d'avance (Feed Override +/-)&lt;/li&gt;
&lt;li&gt;Modulation de la vitesse de broche (Speed Override +/-)&lt;/li&gt;
&lt;li&gt;Départ Cycle Usinage&lt;/li&gt;
&lt;li&gt;Arrêt Cycle usinage&lt;/li&gt;
&lt;li&gt;Marche / Arrêt broche&lt;/li&gt;
&lt;li&gt;Rembobinage du programme Gcode&lt;/li&gt;
&lt;li&gt;Avance d'un pas dans le programme Gcode&lt;/li&gt;
&lt;li&gt;Retour de la machine à l'origine des axes (0,X).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Mach3/Mapping.jpg&quot;&gt;&lt;img src=&quot;https://civade.com/images/Mach3/Mapping.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;A noter que le joystick ne pilotant que 2 axes à la fois, il est nécessaire de cliquer dessus (pression longue en poussant sur le levier du joy) pour changer d'axe entre XY et ZA. Pour changer vers AB, il faut maintenir enfoncées les 2 touches &lt;strong&gt;CycleStart&lt;/strong&gt; et &lt;strong&gt;STOP&lt;/strong&gt; pendant 2 secondes.
Les axes  concernés seront indiqués par une led (XY / ZA / BC). C'est simple, mais efficace et permet de piloter jusqu'à 6 axes.&lt;/p&gt;


&lt;p&gt;Ces manettes sont vues comme des périphérique HID (clavier) et envoient des raccourcis clavier tout faits à chaque appui de touche, correspondant à ceux implémentés dans Mach3, sur l'écran d'origine en anglais. Dans cette configuration, cela fonctionne dès déballage, et sans aucune configuration particulière et surtout sans drivers.&lt;/p&gt;


&lt;p&gt;Un petit outil en ligne du W3C va nous permettre de relever les codes de la manette : &lt;a href=&quot;https://w3c.github.io/uievents/tools/key-event-viewer.html&quot;&gt;https://w3c.github.io/uievents/tools/key-event-viewer.html&lt;/a&gt;. Je les mets ici pour référence :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arrêt d'urgence : &lt;strong&gt;'²'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Spindle On/Off: &lt;strong&gt;F5&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Rewind : &lt;strong&gt;CTRL + 'Z'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Single BLK : &lt;strong&gt;ALT + 'N'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Origin : &lt;strong&gt; CTRL + 'O'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Feed rate + : &lt;strong&gt;F11&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Feed rate - :  &lt;strong&gt;F10&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Cycle Start : &lt;strong&gt;ALT + 'R'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Stop : &lt;strong&gt;ESCAPE&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Spindle Speed up : &lt;strong&gt;NUMPAD +&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Spindle Speed down : &lt;strong&gt;NUMPAD -&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog speed + :  &lt;strong&gt;'$'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog Speed - : &lt;strong&gt; '^'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog X+: &lt;strong&gt;Flèche Droite&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog X- :  &lt;strong&gt;Flèche Gauche&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog Y+ :  &lt;strong&gt;Fleche Haute&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog Y- :  &lt;strong&gt;Fleche Basse&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog Z+ :  &lt;strong&gt;Page Up&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog Z- :  &lt;strong&gt;Page Down&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog A+ :  &lt;strong&gt;Insert&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog A- :  &lt;strong&gt;End&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog B+ :  &lt;strong&gt;'s'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog B- :  &lt;strong&gt;'q'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog C+ : &lt;strong&gt;'d'&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jog C- : &lt;strong&gt;'z'&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Mise en œuvre&lt;/h3&gt;

&lt;p&gt;Lorsque l'on utilise d'autres jeux d'écrans écrans (screenset) Mach3, comme l'écran de Mach3 fr, ou le jeu d'écrans 2010 développé par Gerry de CNCWoodworker et francisé par mes soins ( &lt;a href=&quot;http://www.thecncwoodworker.com/2010.html&quot;&gt;http://www.thecncwoodworker.com/2010.html&lt;/a&gt;) c'est beaucoup moins plug and play. En effet, une partie des touches de la télécommande ne pilotent rien, car les raccourcis dans le jeu d'écrans ont étés modifiés. On pourrait penser que c'est mort... En fait pas du tout.&lt;/p&gt;


&lt;p&gt;Sur le jeu d'écrans 2010 par exemple, les incompatibilités suivantes ont étés relevées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;F5 : va sur le 5e onglet sur le 2010, mais est censé lancer la broche par la télécommande.&lt;/li&gt;
&lt;li&gt;CTRL + O sur le 2010 ouvre un nouveau fichier, mais est censer amener la broche à l'origine par la téléccommande.&lt;/li&gt;
&lt;li&gt;Pas de boutons sur 2010 pour Feed +/-, Speed +/-, il va falloir les créer...&lt;/li&gt;
&lt;li&gt;D'autres raccourcis de 2010 entrent en conflit, comme celui sur le Wizard de Newfangle (à supprimer) et celui sur le homing par laser (à supprimer).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Il est possible de changer ces raccourcis dans le jeu d'écrans lui même. Pour ce faire, il va nous falloir le programme gratuit Screen4, à prendre sur la page de téléchargement officielle: &lt;a href=&quot;https://www.machsupport.com/downloads-updates/mach3-downloads/&quot;&gt;https://www.machsupport.com/downloads-updates/mach3-downloads/&lt;/a&gt; .&lt;/p&gt;


&lt;p&gt;Screen4 est un peu fragile, n'étant pas forcément très bien écrit et vieux. Cela reste néanmoins possible de faire des choses avec à trois conditions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le faire marcher dans un mode de compatibilité Windows XP service pack 2. Cela se fait avec bouton de droite dans l'explorateur, résoudre les problèmes de compatibilité et suivre les étapes de l’assistant en forçant le type à XP SP2. Je l'ai fait fonctionner sans soucis sur un Windows 11.&lt;/li&gt;
&lt;li&gt;Toujours travailler à partir d'une copie de l'écran que l'on modifie&lt;/li&gt;
&lt;li&gt;Ne pas cliquer partout et faire exactement les manips à faire... pas plus :).. Et si on se trompe refaire du début, car empiler les bêtises ne règle rien...&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Screen4, après téléchargement se comporte de quelques fichiers et d'un exécutable 'screen4.Exe'. Vous pouvez créer un sous dossier dans votre installation Mach3 pour y  placer l'ensemble. Pour ma part j'ai également copié le jeu d'écran que je voulais modifier, et l'ai renommé (de &quot;2010 (1920x1080).set&quot; a &quot;2010 (1920x1080)Jog.set&quot;).&lt;/p&gt;


&lt;p&gt;Nous sommes maintenant prêt à passer en édition. :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lancer Screen4.Exe&lt;/li&gt;
&lt;li&gt;Faire CTRL + O pour ouvrir votre jeu d'écrans.&lt;/li&gt;
&lt;li&gt;La taille d'écran du jeu d'écrans vous est demandée. Donner la taille réelle, en vous aidant si besoin est des réglages personnalisés.&lt;/li&gt;
&lt;li&gt;Si le jeu d'écrans ne tient pas dans l'écran d'édition, il va vous falloir vous débrouiller pour que cela passe, soit en changeant d'écran, ou si il ne manque pas grand chose (ex: édition d'un screenset FULL HD sur un écran full HD) en fermant les fenêtres de gauche (Workbar) , les icônes et la barre de status (en haut dans le menu view),&lt;/li&gt;
&lt;li&gt;Une fois en édition, et sans jouer avec l'ascenseur horizontal de Screen4 (sinon cela bugge ! ),&lt;ins&gt;&lt;strong&gt; cliquez avec le bouton de droit sur le bouton de fonction de Mach3&lt;/strong&gt;&lt;/ins&gt; que vous voulez programmer sur la télécommande (1, ici &lt;strong&gt;Départ&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Dans la fenêtre qui s'ouvre, cliquez 2 fois sur la case à cocher &quot;Use HotKey&quot;. Le programme vous demande de cliquez sur la touche concernée du clavier. Ici, appuyez sur le bouton de la télécommande ('Cycle Start&quot;). Le code de la touche concernée se renseigne automatiquement (en jaune)&lt;/li&gt;
&lt;li&gt;Enfin, faire OK (3)&lt;/li&gt;
&lt;li&gt;Pour désactiver un raccourci, il suffit de décocher le raccourci et faire ok.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/Mach3/2022-05-23_19_50_04-2010__1920x1080_Jog.set_-_Screen4.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/Mach3/2022-05-23_19_50_04-2010__1920x1080_Jog.set_-_Screen4.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refaire de même avec toutes les fonctions de la télécommande / boutons sur l'interface.&lt;/li&gt;
&lt;li&gt;A noter qu'en ce qui concerne les raccourcis associés au joystick, c'est pas là que cela se passe, mais dans mach3, mais les réglages par défaut font très bien...&lt;/li&gt;
&lt;li&gt;A noter également, que le raccourci de l'icone &quot;ouvrir&quot; (CTRL + O) entre en conflit avec le raccourci &quot;Origine&quot; de la télécommande. Il faut le désactiver (décocher la case raccourci) ou en mettre un autre (ex: Shift + ctrl + o?)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Je ne trouve pas la fonction de ma télécommande dans le jeu d'écrans!&lt;/strong&gt;
Et si, pour certaines fonctions de la télécommande, vous ne trouvez pas le bouton qui va bien dans le jeu d'écrans??? C'est exactement ce qui m'est arrivé sur le jeu d'écrans 2010, sur les boutons Feed rate +/- et Speed rate +/-. C'est Gerry, l'auteur du jeu d'écrans 2010 qui m'a donné la solution. Si les boutons manquent, il suffit de les ajouter! Comme il n'y a pas la place de le faire, il suffit de le faire hors écran, avec un bouton transparent (&quot;&lt;strong&gt;image button&lt;/strong&gt;&quot;):
&lt;a href=&quot;https://civade.com/images/Mach3/2022-05-24_06_06_36-2010xJog.set_-_Screen4.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/Mach3/.2022-05-24_06_06_36-2010xJog.set_-_Screen4_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il faut bien sur assigner non seulement la fonction que le bouton est censée commander (ie: OEM Code Function), cocher &quot;&lt;strong&gt;display on all screens&lt;/strong&gt;&quot; pour que la fonction soit active quel que soit l'onglet actif du jeu d'écrans 2010, et surtout le raccourci clavier associé, par apprentissage avec la télécommande comme précédemment.&lt;/p&gt;


&lt;p&gt;Pour récupérer les codes de fonction OEM associés à la fonction, le plus simple est d'ouvrir le jeu d'écrans d'origine de Mach3 (1024.set) et relever les codes des boutons qui nous manquent., puisque justement la télécommande a été conçue pour lui...&lt;/p&gt;


&lt;p&gt;Honnêtement j'ai du refaire la manipulation plusieurs fois lorsque j'ai modifié le jeu d'écrans de Gerry dans sa version Full HD, car Screen4.Exe n'est pas très à l'aise pour modifier un écran d'une taille supérieure ou égale à l'écran de votre ordinateur. Et quand on se rate, le jeu d'écran n'est tout simplement plus fonctionnel dans Mach3 (écran blanc).&lt;/p&gt;


&lt;p&gt;Voici les Fonctions et Code OEM correspondants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Feed rate - (F10) : HotKey 121, Oem Code 109&lt;/li&gt;
&lt;li&gt;Feed rate + (F11) : HotKey 122, Oem Code 108&lt;/li&gt;
&lt;li&gt;Speed rate - (NUMPAD -) : Hotkey  109, Oem Code 164&lt;/li&gt;
&lt;li&gt;Speed rate + (NUMPAD + ) :  Hotkey  107, Oem Code 163&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Un point intéressant, c'est que si au départ, je trouvais assez &quot;bidouille&quot; le fait d'utiliser une télécommande qui envoie des raccourcis clavier, c'est que cela ne nécessite aucun driver,et pourrait être utilisé sur d'autres logiciels, en adaptant les raccourcis dans celui-ci.&lt;/p&gt;


&lt;p&gt;Autre point intéressant et ouvrant les scénarios d'usage de la télécommande : la télémaintenance. Si comme moi vous pouvez être amenés à manipuler la machine qui a Mach3 à l'aide d'un logiciel de prise de main à distance pour pouvoir la déporter, sachez que la télécommande peut être raccordée en USB à la machine qui prend la main. En effet, comme c'est vu comme un clavier, il n'y a pas de drivers et les raccourcis transitent très bien dans un programme de prise en main à distance (ex : Teamviewer).&lt;/p&gt;


&lt;p&gt;Enfin, bien que non testé, il n'y aurait théoriquement pas de problèmes pour adapter certains écrans de Mach4 à cette télécommande.&lt;/p&gt;


&lt;p&gt;Un point négatif est que certains raccourcis claviers, sur certains jeu d'écrans, ne sont disponibles que sur certains écrans. Par exemple, sur le jeu d'écrans 2010, la touches départ cycle n'est disponible que dans l'écran &quot;Marche&quot; (F1) et les fonctions de modifications de la vitesse de Jog que dans l'écran de Jog (F3). Cela pourrait se contourner an ajoutant de nouveaux boutons cachés,visibles sur tous les écrans, avec les mêmes fonctions et raccourcis que les boutons tributaires des touches de fonction. C'est non testé, mais cela devrait marche.&lt;/p&gt;


&lt;p&gt;Sur le screenset 2010, le mode de Jog est sélectionnable avec le raccourci clavier &quot;&lt;strong&gt;End&lt;/strong&gt;&quot; (code touche 35). Cela pourrait être intéressant de changer ce raccourci pour y associer la touche &quot;Single BLKC&quot; de la télécommande, dont l'utilité m'échappe. J'ai testé et c'est effectivement plus pratique.&lt;/p&gt;


&lt;p&gt;Autre point négatif d'une télécommande fonctionnant en mode clavier par rapport à une fonctionnant avec un pilote, c'est quelle marche dans tous les logiciels justement.. Et donc écrira ou fera des choses dans ce logiciel. Sur un traitement de texte ou Cambam, c'est pas forcément génial. mais bon...&lt;/p&gt;


&lt;p&gt;Encore un autre point négatif est que sur la version française de Mach3, le raccourci clavier CTRL + O est associé à &quot;Fichier / Ouvrir&quot; via l'icone d'ouverture de fichier sur la barre d’icône de mach3.. Il suffit de supprimer le raccourci d'ouverture pour le remplacer par un autre (ex: Shift + ctrl +o) et de monter le raccourci d'origine machine du jeu d'écran 2010.&lt;/p&gt;


&lt;p&gt;Mais à 35 euros, et même si elle n'est que filaire, il me reste que l'apport de cette télécommande est non négligeable sur une config de pilotage de CNC.&lt;/p&gt;


&lt;p&gt;Il faudra pensez à appuyer sur F1 pour se mettre dans l'écran marche pour toutes les commandes liées à l'usinage, et F3 pour se mettre dans l'écran de Jog lors des manips de déplacement de fraise.&lt;/p&gt;


&lt;p&gt;Voici l'intégralité des écrans 2010 de Jerry, modifiés pour fonctionner avec la manette: &lt;a href=&quot;https://civade.com/images/Mach3/Jog2010.zip&quot;&gt;Jog2010.zip&lt;/a&gt;&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2022/05/21/Utilisation-d-une-t%C3%A9l%C3%A9commande-Electronic-Handwheel-cncdiy.org-sur-logiciel-de-pilotage-CNC-Mach3#comment-form</comments>
          <wfw:comment>https://civade.com/post/2022/05/21/Utilisation-d-une-t%C3%A9l%C3%A9commande-Electronic-Handwheel-cncdiy.org-sur-logiciel-de-pilotage-CNC-Mach3#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/118</wfw:commentRss>
              </item>
          <item>
        <title>Passerelle internet avec DD-WRT et iphone</title>
        <link>https://civade.com/post/2022/01/30/Passerelle-internet-avec-DD-WRT-et-iphone</link>
        <guid isPermaLink="false">urn:md5:b6527daee974f41f70d93bcd76b34864</guid>
        <pubDate>Sun, 30 Jan 2022 10:29:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Logiciels Libres</category>
                          <category>Embarqué</category>
                  <category>Firmware</category>
                  <category>Linux</category>
                  <category>OpenSource</category>
                  <category>Sysadmin</category>
                <description>&lt;p&gt;Un ami m'ayant donné un routeur Linksys WRT1200 'brické', je me suis attelé à lui redonner vie. Démontage, branchement de la liaison série, réinjection du firmware d'origine, et hop! Mais ce routeur supportant aussi le firmware alternatif DD-WRT, pourquoi pas lui faire une petite mise à jour? Ce fut rapidement fait et une découverte de taille m'attendait. Cela faisait un bail que je n'avais pas joué avec DD-WRT. Depuis, il a pas mal gonflé en fonctionnalité, et l'un d'entre elle est particulièrement intéressante en cas de panne d'ADSL/Fibre : l'utilisation d'un iphone sur la prise USB du routeur pour fournir une connexion Internet filaire ou Wifi via DD-WRT. Ce billet n'a d'autres ambition que de garder une trace de la config effectuée pour réemploi ultéreur. Si il peut vous servir tant mieux!&lt;/p&gt;          &lt;h3&gt;Débrickage du routeur WRT1200:&lt;/h3&gt;


&lt;p&gt;La méthode de débrickage d'un appareil Linksys commence souvent par la même chose, le démontage du boitier pour trouver le connecteur qui porte la liaison série. Ensuite, à l'aide d'un adaptateur USB &amp;lt;&amp;gt; série 3.3V, on connecte à l'ordinateur et on vérifie en se connectant à 115200 bauds avec un émulateur série (ex: putty..) que l'on a bien un affichage. La suite est souvent fonction de l'apareil Linsys à débricker.&lt;/p&gt;


&lt;p&gt;Ici nous allons d'abord faire sur un peu de réseau :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Télécharger la dernière version du firmware pour ce routeur chez linksys&lt;/li&gt;
&lt;li&gt;Créer un répertoire c:\ftp et y placer une copie de ce firmware que l'on aura préalablement renommée linksys.img&lt;/li&gt;
&lt;li&gt;Connecter un câble réseau de l'ordinateur à l'un des ports lan du routeur,&lt;/li&gt;
&lt;li&gt;Mettre une IP fixe sur ce port Ethernet sur l'ordinateur en 192.168.1.2.&lt;/li&gt;
&lt;li&gt;Télécharger et installer un serveur TFTPD open source (&lt;a href=&quot;https://bitbucket.org/phjounin/tftpd64/downloads/&quot;&gt;par exemple TFTPD&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;Le paramètrer pour servir ses fichiers de c:\ftp sur la liaison Ethernet qui porte l'adresse 192.168.1.2&lt;/li&gt;
&lt;li&gt;Et voial! L'ordinateur est prêt à envoyer le firmware en TFTP.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Revenirt sur le routeur que l'on reboote, et interrompre le boot en tapant un caractère quelconque sur la console série assez rapidement après reset. Taper ensuite es commandes suivantes :&lt;/p&gt;

&lt;pre&gt;
setenv ipaddr 192.168.1.1
setenv  serverip 192.168.1.2
setenv firmwareName linksys.img
run update_both_images
&lt;/pre&gt;


&lt;p&gt;Le routeur va lancer la procédure de mise à jour en s'adressant en serveur tftp pour télécharger l'image puis la flasher. A l'issue, le routeur reboote et devrait être accessible et fonctionnel.&lt;/p&gt;


&lt;p&gt;Pensez à la fin à démonter la config réseau faite précédemment (IP fixe, serveur TFTP..) pour revenir en DHCP.&lt;/p&gt;


&lt;p&gt;Pour voir la méthode en vidéo, &lt;a href=&quot;https://www.youtube.com/watch?v=PZYXKAkuJ5w&quot;&gt;c'est ici&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Installation de dd-wrt :&lt;/h3&gt;


&lt;p&gt;La procédure d'installation générique est simple :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On cherche son routeur dans la &lt;a href=&quot;https://dd-wrt.com/support/router-database/&quot;&gt;base de données DD-WRT&lt;/a&gt; et prenant bien soin de sélectionner la version du matériel concernée (dans mon cas un V2... l'étiquette signalétique vous le dira, c'est marqué dessous).&lt;/li&gt;
&lt;li&gt;Comme nous avons mis lors de l'étape précédente un firmware Linksys dont nous avons confirmé le fonctionnement, nous allons pouvoir flasher le notre avec la méthode &quot;Web&quot; en utilisant tout simplement l'interface de gestion linksys pour injecter notre firmware. Celui à télécharger dans ce cas est factory-to-ddwrt.bin&lt;/li&gt;
&lt;li&gt;Pour les plus téméraires, il est également possible d'aller chercher la dernière version compilée dans les betas ( &lt;a href=&quot;https://dd-wrt.com/support/other-downloads&quot;&gt;https://dd-wrt.com/support/other-downloads&lt;/a&gt; ). Pour ne rien vous cacher, c'est ce que j'ai fait :).&lt;/li&gt;
&lt;li&gt;Aller dans la page de mise à jour du firmware sur l'interface usine linksys et envoyez votre nouveau firmware.&lt;/li&gt;
&lt;li&gt;Quelques minutes plus tard votre routeur est à jour sur dd-wrt ! Vous pouvez vous y connecter en 192.168.1.1.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Paramétrage d l'iphone tethering (ou partage de connexion)&lt;/h3&gt;


&lt;p&gt;La première opération à faire va être de paramétrer l'Iphone Tethering dans le basic setup. Vous pourrez également paramétrer la passerelle (Gateway) et le serveur DNS local. &lt;strong&gt;(cliquez sur les images pour zoomer)&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ddwrt/ddwrt-wrt1200-1.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/ddwrt/.ddwrt-wrt1200-1_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Vérifier ensuite dans l'advanced routing que vous êtes bien en mode passerelle (Gateway). En routeur, cela ne semble pas fonctionner.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ddwrt/ddwrt-wrt1200-2.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/ddwrt/.ddwrt-wrt1200-2_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Aller ensuite dans services / usb pour activer l'USB et l'USB over IP&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ddwrt/ddwrt-wrt1200-3.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/ddwrt/.ddwrt-wrt1200-3_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Nous allons maintenant rebooter le routeur en allant dans Administration / Management&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ddwrt/ddwrt-wrt1200-4.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/ddwrt/.ddwrt-wrt1200-4_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Tout en bas de page, cliquer sur Rebot router. Brancher l'iphone sur la prise USB à l'arrière à l'aide d'un cordon &quot;DATA/Charge&quot;. Activez le partage de connexion internet dans &quot;Réglages&quot;.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ddwrt/ddwrt-wrt1200-5.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/ddwrt/.ddwrt-wrt1200-5_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le routeur va mettre 2 minutes à rebooter. Au bout d'un certain temps vous devriez entendre le signal sonore indiquant que l'iphone est en train de charger (bonne nouvelle, c'est que l'USB est bien activé).&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Une vingtaine de secondes plus tard, en déverrouillant l'Iphone, vous devriez voir une demande d'autorisation d'accès par l'ordinateur. Répondez oui et tapez votre code pour valider la demande. Encore une vingtaine de secondes plus tard, la barre verte en haut de l'iphone s'affiche, montrant que sa connexion est partagée.&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Le demande d'autorisation de l'iphone devra être redonnée à chaque reboot du routeur.&lt;/p&gt;


&lt;h3&gt;Tests:&lt;/h3&gt;


&lt;p&gt;Se connecter avec l'ordinateur sur le wifi du point d'accès (défaut dd-wrt sans mot de passe). Vérifiez que vous avez bien accès à l'internet. Faire le même test en filaire après avoir coupé le wifi.&lt;/p&gt;


&lt;p&gt;Vous pouvez également vérifier le status du routeur dans son interface de gestion (Status / Wan). La partie haute vous montre si vous êtes connecté :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ddwrt/ddwrt-wrt1200-6.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/ddwrt/.ddwrt-wrt1200-6_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La partie basse de cette même page vous permet même d'avoir un graphe de charge de la liaison internet :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ddwrt/ddwrt-wrt1200-7.png&quot;&gt;&lt;img src=&quot;https://civade.com/images/ddwrt/.ddwrt-wrt1200-7_m.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;A ne pas faire :&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ne jamais faire d'appui très long sur le bouton de reset après avoir débranché puis rebranché l'alimentation (reset hardware). Cela plante complètement le routeur. Un appui de plus de 5 secondes lors qu'il est déjà lancé suffit à le faire revenir sur une config par défaut.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Conclusion :&lt;/h3&gt;


&lt;p&gt;C'est une solution sympa, pour mettre en place une connexion partagée lors d'une séance de travail partagée dans une asso par exemple, ou lorsque la connexion personnelle ou professionnelle a plantée.. Il suffit de brancher son iphone sur le routeur, l'allumer, et hop un wifi de secours ! Et franchement cela fonctionne plutôt pas mal.&lt;/p&gt;


&lt;p&gt;Je n'ai pas pu tester sur Android, mais paradoxalement il semblerait que cela soit plus compliqué que sur IOS car il faut un pilote noyau Linux pour le téléphone.  Pour une fois qu'un truc de geek est plus simple sur IOS que sur Android..&lt;/p&gt;


&lt;p&gt;Il vous faudra encore mettre en place la sécurité sur le Wifi, etc.. mais vous verrez lors de la découverte des fonctionnalités de DD-WRT qu'il permet de faire beaucoup de choses. C'est un vrai couteau suisse :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Portail captif&lt;/li&gt;
&lt;li&gt;Client et Serveur OpenVPN&lt;/li&gt;
&lt;li&gt;Client et Serveur PPTP&lt;/li&gt;
&lt;li&gt;Serveur Radius&lt;/li&gt;
&lt;li&gt;Serveur NAS (d'autant qu'il reste encore une Prise SATA/USB2 pour brancher un disque externe) et gestion des utilisateurs&lt;/li&gt;
&lt;li&gt;Serveur NFS&lt;/li&gt;
&lt;li&gt;Serveur DLNA (multimedia)&lt;/li&gt;
&lt;li&gt;Serveur d'impression USB&lt;/li&gt;
&lt;li&gt;Paramétrage fin du Firewall, du routage SPI (stateful packet inspection avec Iptables), de la QOS (Qualité de Service)&lt;/li&gt;
&lt;li&gt;Support de l'Upnp (universal plug and play), d'une DMZ (zone démilitarisée pour mettre un serveur par exemple)&lt;/li&gt;
&lt;li&gt;... et bien d'autres trucs encore!&lt;/li&gt;
&lt;/ul&gt;</description>
        
                  <comments>https://civade.com/post/2022/01/30/Passerelle-internet-avec-DD-WRT-et-iphone#comment-form</comments>
          <wfw:comment>https://civade.com/post/2022/01/30/Passerelle-internet-avec-DD-WRT-et-iphone#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/117</wfw:commentRss>
              </item>
          <item>
        <title>Ballade autour des télécommandes infrarouge, linux, esp32 et node-red</title>
        <link>https://civade.com/post/2021/05/02/Ballade-autour-des-t%C3%A9l%C3%A9commandes-infrarouge%2C-linux%2C-esp32-et-node-red</link>
        <guid isPermaLink="false">urn:md5:b2b744825383551fd45931ff94d7aa5e</guid>
        <pubDate>Fri, 14 May 2021 07:00:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Technologies</category>
                          <category>Arduino</category>
                  <category>Embarqué</category>
                  <category>ESP32</category>
                  <category>ESP8266</category>
                  <category>Firmware</category>
                  <category>Linux</category>
                  <category>OpenSource</category>
                  <category>Sysadmin</category>
                <description>&lt;p&gt;On a tous de nombreux appareils qui fonctionnent avec des télécommandes infrarouge. Du coup, on a tous à un moment donné pensé à acheter ou acheté une télécommande dite &quot;universelle&quot; pour les remplacer toutes. Expérience utilisateur rarement réussie, car outre le fait qu'il suffisait de la perdre (comme les autres), la complexité de ces télécommande les rendait parfois inutilisables.&lt;/p&gt;


&lt;p&gt;A part quelques rares produit comme les lignes Pronto de Philips, qui arboraient un splendide afficheur LCD et une programmabilité à toute épreuvre, l'expérience était rarement transformée.&lt;/p&gt;


&lt;p&gt;A l'heure ou beaucoup de nouveaux équipements sont connectés, en Bluetooth, réseau filaire ou Wifi, a quoi cela sert t'il donc de se préoccuper de l'infra rouge? Et bien justement pour permettre à certains de ces anciens appareils de rester au sein de l’univers audio vidéo familial et de les doter d'une connectivité plus moderne.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/remotes.jpg&quot; title=&quot;remotes.jpg, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.remotes_m.jpg&quot; alt=&quot;remotes.jpg, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;          &lt;p&gt;Le sujet est assez vaste, donc j'ai plutôt choisi de faire une suite de 4 articles sur le même sujet :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un premier article pour faire le tour des télécommandes infrarouge. Mieux comprendre les codes, les moyens de capturer ceux ci et les analyser, voir émettre des codes à partir d'un logiciel sur PC et enfin constituer un fichier de configuration avec tous les codes d'une télécommande.&lt;/li&gt;
&lt;li&gt;Un second article pour apprendre à installer et configurer LIRC sur Raspberry PI ou Orange PI, afin de dealer avec la réception de codes infrarouge ou d'en émettre.&lt;/li&gt;
&lt;li&gt;Un troisième article pour développer  un petit périphérique embarqué à base d'ESP32 permettant d'émettre les codes IR, en recevant les ordres à partir du réseau Wifi&lt;/li&gt;
&lt;li&gt;Un dernier article pour réaliser sous NodeRed un centre de contrôle, permettant de recevoir des ordres aussi bien par un récepteur IR sur la Raspberry / Orange PI ou par une télécommande sur interface web (application mobile) pour relayer ces ordres vers un émetteur à base d'ESP32 susceptible d'émettre un code infrarouge n'importe ou dans le réseau Wifi.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;L'objectif final étant pour moi de pouvoir placer un récepteur infrarouge susceptible de comprendre mes télécommandes, mais aussi de pouvoir ajouter le pilotage par application mobile d'appareils qui peuvent être hors de portée, soit parce que dans un placard, soit parce que les télécommandes ne peuvent les accrocher correctement. Cerise sur le gâteau, il est évidemment possible d’interfacer le tout de node red vers Google Home ou Alexa, afin de rajouter un pilotage à la voix sur un périphérique... (OK Google Allume Ampli, OK Google ampli sur DVD, OK Google éteint Télé...).&lt;/p&gt;


&lt;p&gt;Au passage nous allons également voir comment utiliser la prise IR In des amplis NAD... ou de récupérer une vielle télécommande Infrarouge pour l'interfacer avec n'importe quoi.&lt;/p&gt;


&lt;p&gt;Sommaire :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-télécommande-infrarouge&quot;&gt;IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-réception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi&quot;&gt;IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32&quot;&gt;IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-Télécommande-Wifi-avec-Nodered-LIRC-ESP32&quot;&gt;IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Bonne lecture.&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2021/05/02/Ballade-autour-des-t%C3%A9l%C3%A9commandes-infrarouge%2C-linux%2C-esp32-et-node-red#comment-form</comments>
          <wfw:comment>https://civade.com/post/2021/05/02/Ballade-autour-des-t%C3%A9l%C3%A9commandes-infrarouge%2C-linux%2C-esp32-et-node-red#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/112</wfw:commentRss>
              </item>
          <item>
        <title>IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32</title>
        <link>https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-T%C3%A9l%C3%A9commande-Wifi-avec-Nodered-LIRC-ESP32</link>
        <guid isPermaLink="false">urn:md5:9c5f1a7d41b00da6607b67eac79e85d0</guid>
        <pubDate>Sun, 02 May 2021 06:47:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Technologies</category>
                          <category>Arduino</category>
                  <category>Domotique</category>
                  <category>Embarqué</category>
                  <category>ESP32</category>
                  <category>ESP8266</category>
                  <category>Firmware</category>
                  <category>OpenSource</category>
                  <category>Raspberry</category>
                  <category>Sysadmin</category>
                <description>&lt;p&gt;Dernier article de la série, nous allons maintenant utiliser toute ce qui a été appris dans les 3 articles précédents et l'intégrer ans Node-red.&lt;/p&gt;          &lt;h3&gt;Fonctionnement final souhaité&lt;/h3&gt;


&lt;p&gt;Mon ampli AV étant dans un placard généralement fermé, la télécommande infrarouge est donc inutilisable.&lt;/p&gt;


&lt;p&gt;Dans les scénarios d'usage de cet ampli, je souhaiterais pouvoir l'allumer et choisir les entrées sans ouvrir le placard. Accessoirement, comme je veux l'utiliser aussi bien en config A/V avec la télévision, ou en Air Play via un point d'accès Apple dont l'audio est raccordé sur une entrée auxiliaire de l'ampli, il me faut pouvoir changer l'entrée. Évidemment le réglage du volume sonore est aussi un point important, car en A/V il peut y avoir des variations importantes selon les films. Le mode de décodage 5.1 aussi, car en fonction de la source (Airplay ou Netflix par exemple), on  peut avoir à passer de 5.1 en stéréo ou vice versa.&lt;/p&gt;


&lt;p&gt;Une orange PI (qui ne fait pas que cela) implémente Node Red (voir &lt;a href=&quot;https://civade.com/?q=nodered&quot;&gt;les articles sur NodeRed&lt;/a&gt; sur ce blog..). Comme elle dispose d'une entrée infrarouge, je souhaiterais utiliser le capteur intégré pour comprendre les codes de la télécommande de mon ampli NAD. L'orange PI, vu sa petite taille, pourra rester exposée, derrière la télé (dans un petit boitier &lt;a href=&quot;https://civade.com/post/2021/03/07/Boitier-d%C3%A9coupe-laser-pour-orange-Pi-PC-plus&quot;&gt;réalisé à l a découpe laser&lt;/a&gt;), en profitant du petit espace laissé par le pied entre le dessus du meuble télé et le bas de l'écran (2/3 cm) pour recevoir les codes infrarouge. La configuration de LIRC pour gérer la réception de codes infrarouge a été vues dans le &lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-r%C3%A9ception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi&quot;&gt;2e article de cette série&lt;/a&gt;.  Évidemment, il faut avoir compris les codes infrarouges, ce qui est décrit dans le &lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge&quot;&gt;1er article de la série&lt;/a&gt;. Il va nous falloir doter notre réseau d'un périphérique d'émission infrarouge, qui sera connecté à l'ampli en filaire par l'entrée IR IN,  et avec une led infrarouge déportée qui sera collée sur la face avant du téléviseur. Ce périphérique est décrit dans &lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge&quot;&gt;le 3e article de la série&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;A avoir Node Red, je souhaite également utiliser l'interface utilisateur (UI) pour disposer d'une interface Web mobile sur les télécommandes des 2 appareils (télé + ampli). Pratique surtout pour l'ampli donc je pourrai contrôler le volume en soirée tant par le smartphone tant que celui-ci est dans le réseau Wifi, et même hors de portée des télécommandes IR.&lt;/p&gt;


&lt;p&gt;Enfin, dans node red, il sera facile d'interfacer des fonctions de base avec Google Home (ex : &quot;OK Google Allume NAD&quot;), et donc d'implémenter aussi des commandes vocales.&lt;/p&gt;


&lt;p&gt;Au final, l'ampli devra pouvoir être commandé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avec sa télécommande d'origine dessus  (normal quoi!)&lt;/li&gt;
&lt;li&gt;Avec sa télécommande d'origine pointée sur l'Orange PI&lt;/li&gt;
&lt;li&gt;Avec l'interface Utilisateur (Node-red UI) à partir d'un PC ou d'un Smartphone&lt;/li&gt;
&lt;li&gt;En commande vocale par Google Home.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Au final, pas si mal pour un ampli de 20 ans qui ne marchait qu'avec une télécommande Infrarouge!&lt;/p&gt;


&lt;h3&gt;Synoptique de fonctionnement&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/synopIR.png&quot; title=&quot;synopIR.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/synopIR.png&quot; alt=&quot;synopIR.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Plongée dans Node-Red&lt;/h3&gt;


&lt;h4&gt;Recevoir des codes infrarouges venant de LIRC&lt;/h4&gt;


&lt;p&gt;Voici la chaine de traitement complète :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/capture-irw.png&quot; title=&quot;capture-irw.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.capture-irw_m.png&quot; alt=&quot;capture-irw.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Bien qu'il existe des nodes spécifiques pour Lirc, ceux ci ne sont pas activement maintenus. Et il y a une raison, c'est que c'est tellement simple de faire cela sans...&lt;/p&gt;


&lt;p&gt;En effet, la commande unix '&lt;strong&gt;irw&lt;/strong&gt;' permet de lire le socket lirc, et d'afficher une ligne par une ligne les commandes reçues. Les différents champs sont séparés par un espace.
Il suffit donc de trouver un moyen de lancer une commande unix, ce que permet le node &quot;&lt;strong&gt;Exec&lt;/strong&gt;&quot;.  Ici, on utilise le mode &quot;respawn&quot; qui laisse la commande active et la relance si elle quitte.&lt;/p&gt;


&lt;p&gt;Paramètres du node exec:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/irw.png&quot; title=&quot;irw.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.irw_m.png&quot; alt=&quot;irw.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ensuite, il va nous falloir trouver un moyen de séparer les différents champs d'une ligne. Encore une fois nodered dispose d'un node qui permet de faire le job : &quot;&lt;strong&gt;CSV&lt;/strong&gt;&quot;.  La colonne 1 contiendra le code brut lu, la colonne 2 le nombre d'envoi du même code (0, premier envoi, 1, 1ère répétition, etc..), la colonne 3 le nom de la touche, et la colonne 4 le nom de l'appareil.&lt;/p&gt;


&lt;p&gt;Vue brute de ce qui est renvoyé par la commande &lt;strong&gt;irw&lt;/strong&gt; :&lt;/p&gt;


&lt;pre&gt;00000000e13e01fe 00 RCVR_POWER NAD_AVR2-RCVR   # Touche power sur le NAD, 1er appui (code = e13e 01fe)
00000000e13e01fe 01 RCVR_POWER NAD_AVR2-RCVR   # 1ere répétition de ce même code
00000000e13e04fb 00 KEY_SLEEP NAD_AVR2-RCVR       # 1er appui de la Touche Sleep sur le NAD (code = e13e 04fb)&lt;/pre&gt;


&lt;p&gt;L'espace est le séparateur, et il y a un code par ligne. Ceci induit le paramétrage suivant :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/csv.png&quot; title=&quot;csv.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.csv_l.png&quot; alt=&quot;csv.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il peut être judicieux de filter en ne récupérant que les 1ers appuis de touche, afin d'éviter les répétitions. Cela se fait avec le node &quot;&lt;strong&gt;Switch&lt;/strong&gt;&quot;, et en filtrant pour ne garder que les enregistrements dont la colonne 2 est égale à 0.&lt;/p&gt;


&lt;p&gt;Paramètres du node Switch :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/switch.png&quot; title=&quot;switch.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.switch_m.png&quot; alt=&quot;switch.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il ne nous reste plus qu'à aller chercher le code de la touche, dans la colonne 3 avec le node &quot;&lt;strong&gt;change&lt;/strong&gt;&quot;. A la sortie, nous avons dans le message &quot;&lt;strong&gt;query&lt;/strong&gt;&quot; le code de la touche infrarouge.&lt;/p&gt;


&lt;p&gt;Paramètres du node &quot;change&quot; :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/setquery.png&quot; title=&quot;setquery.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.setquery_m.png&quot; alt=&quot;setquery.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h4&gt;Recevoir des ordres de commande par l'interface Web (UI NodeRed)&lt;/h4&gt;


&lt;p&gt;Vue générale du traitement :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/ui-capture.png&quot; title=&quot;ui-capture.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.ui-capture_m.png&quot; alt=&quot;ui-capture.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ici, c'est beaucoup plus simple. Il nous faut avoir installé le complément  &lt;strong&gt;node-red-dashboard&lt;/strong&gt;avec le gestionnaire de palette  pour bénéficier des widgets de l'interface utilisateur.  Le premier node est extrait de ce package, il s'agit de &quot;&lt;strong&gt;button&lt;/strong&gt;&quot;.&lt;/p&gt;


&lt;p&gt;On peut préciser soit un nom (label) soit une icone ou les 2. On peut également préciser la couleur du texte ou du fond, ainsi que la taille (size). L'information la plus importante étant &quot;Payload&quot;, qui est le mesage exte qui sera renvoyé par le bouton. A choisir parmis les codes supportés par la télécommande. Si Label n'est pas précisé, il peut être intéresant de préciser &quot;Name&quot; pour que le bouton ait quand même un nom sur l'interface d'édition nodered. Cela facilitera sa localisation.&lt;/p&gt;


&lt;p&gt;Paramètres de &quot;button&quot; :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/button.png&quot; title=&quot;button.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.button_m.png&quot; alt=&quot;button.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;A noter qu'il est possible d'ajouter un node &quot;&lt;strong&gt;template&lt;/strong&gt;&quot; dans lequel on pourra mettre des éléments de style CSS pour affiner la présentation du Dashboard.&lt;/p&gt;


&lt;p&gt;Une fois les différents boutons mis en place, il ne reste comme pour l'étape précédente qu'à les raccorder à un objet &quot;&lt;strong&gt;Change&lt;/strong&gt;&quot;, pour récupérer dans msg.query le code de la télécommande infrarouge à envoyer.&lt;/p&gt;


&lt;h4&gt;Emettre des codes IR par le périphérique Wifi / infrarouge développé dans le 3e article&lt;/h4&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/http-request.png&quot; title=&quot;http-request.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/http-request.png&quot; alt=&quot;http-request.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Cette dernière étape prend en entrée les flux issus de chacune des 2 étapes précédentes (ou &quot;query&quot; contient le code à envoyer). Un node &quot;http request&quot; fait le job. A noter son paramétrage avec la syntaxe de double accolade permettant de récupérer le résultat d'une variable de node red pour l'ijectre dans la requete HTTP. Il faudra bien sur pensé à avoir mis l'adresse ip de votre périphérique d'envoi de code IR basé sur ESP 32 &lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32&quot;&gt;décrit dans le 3e volet&lt;/a&gt; :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/http-request2.png&quot; title=&quot;http-request2.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/http-request2.png&quot; alt=&quot;http-request2.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;Option : Émettre des codes infrarouges via LIRC&lt;/h4&gt;


&lt;p&gt;Cette solution ne fonctionne qu'avec le périphérique AGIRS (cf le premier article de la série) car en standard l'Orange PI n'est dotée que d'un récepteur.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/send-agirs.png&quot; title=&quot;send-agirs.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.send-agirs_m.png&quot; alt=&quot;send-agirs.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;A nouveau, un bouton est paramétré avec le nom du code à envoyer (déjà documenté). La sortie de ce bouton est dirigée vers un objet &quot;&lt;strong&gt;exec&lt;/strong&gt;&quot;, paramétré pour executer une fois une commande, qu iva prendre en paramètres &quot;SEND_ONCE&quot; pour n'envoyer qu'une fois le code, le nom du device, et le nom du code :&lt;/p&gt;


&lt;pre&gt;/usr/bin/irsend  SEND_ONCE NAD_AVR2-RCVR RCVR_POWER&lt;/pre&gt;


&lt;p&gt;Voici les paramètres de l'objet :
&lt;a href=&quot;https://civade.com/images/ir/irsend.png&quot; title=&quot;irsend.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.irsend_m.png&quot; alt=&quot;irsend.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;On peut bien sur rendre le tout paramétrable comme vu dans les exemples précédents.&lt;/p&gt;


&lt;h4&gt;L'ensemble finalisé&lt;/h4&gt;


&lt;p&gt;L'ensemble finalisé est un peu grand, car il y a beaucoup d'objets bouton... EN voici une vue d'ensemble :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/overall.png&quot; title=&quot;overall.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.overall_m.png&quot; alt=&quot;overall.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Vous pouvez importer le flow complet sur une feuille avec le code json ci dessous afin de l'étudier, ce sera certainement plus parlant que des copies d'écran... POur ce faire cliquer dans le champ ci dessous, puis &quot;ctrl +A&quot; (select all) , puis &quot;ctrl+c&quot; (copier). ILL ne vous retera plus qu'à coller le tout dans la zone d'import de node red.&lt;/p&gt;

&lt;pre&gt;
[{&amp;quot;id&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tab&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;Télécommandes NAD &amp;amp; PHILIPS&amp;quot;,&amp;quot;disabled&amp;quot;:false,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;cff35ffd.4088a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;¨Power&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:1,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;red&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-power-off&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_POWER&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:280,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a2a19817.ec0b6&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;cff35ffd.4088a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c6d07647.67164&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Sleep&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:3,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-bed&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;KEY_SLEEP&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:420,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7d2ddff5.32af8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:420,&amp;quot;wires&amp;quot;:[[&amp;quot;c6d07647.67164&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;aff303f2.3d689&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:4,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;DVD&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-compact-disc&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;KEY_DVD&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:460,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;dc2affef.6585b&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:460,&amp;quot;wires&amp;quot;:[[&amp;quot;aff303f2.3d689&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;67895b2f.5868f4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:5,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;SAT&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-satellite-dish&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;KEY_SAT&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:500,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;4c93954a.911dd4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:500,&amp;quot;wires&amp;quot;:[[&amp;quot;67895b2f.5868f4&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;bc800fa6.35276&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:6,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;VCR&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-voicemail&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;KEY_VCR&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:540,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1771cf24.9aed01&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:540,&amp;quot;wires&amp;quot;:[[&amp;quot;bc800fa6.35276&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d01b5d5.2a6d1a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:7,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Vid4&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;KEY_VIDEO_4&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:580,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;f78431c1.a4c86&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:580,&amp;quot;wires&amp;quot;:[[&amp;quot;d01b5d5.2a6d1a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;317dc3b3.ec5a24&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:8,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Vid5&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;KEY_VIDEO_5&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:620,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;29a38789.012178&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:620,&amp;quot;wires&amp;quot;:[[&amp;quot;317dc3b3.ec5a24&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;eeada1d1.1dac08&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:9,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;5.1&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;EXT._5.1&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:660,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;79e1c274.d34dcc&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:660,&amp;quot;wires&amp;quot;:[[&amp;quot;eeada1d1.1dac08&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b7da3e73.dd7818&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:10,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;CD&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;KEY_CD&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:700,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9dd3c582.24fbb8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:700,&amp;quot;wires&amp;quot;:[[&amp;quot;b7da3e73.dd7818&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;953cefd3.026f&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:11,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Tape&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;KEY_TAPE&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:740,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;fff8636c.aadda&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:740,&amp;quot;wires&amp;quot;:[[&amp;quot;953cefd3.026f&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;16dd81b0.a02ab6&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:12,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;FM&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;FM/AM&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:780,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;12f3e1a0.6aabbe&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:780,&amp;quot;wires&amp;quot;:[[&amp;quot;16dd81b0.a02ab6&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ee71a02.5706ee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:13,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_1&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:820,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;72b7fb3f.6ecd7c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:820,&amp;quot;wires&amp;quot;:[[&amp;quot;ee71a02.5706ee&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;91869a44.2c9278&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:14,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;2&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_2&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:860,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;76e1566f.2c4308&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:860,&amp;quot;wires&amp;quot;:[[&amp;quot;91869a44.2c9278&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a8c48084.769c98&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:15,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_3&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:900,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;6b16749e.1ca484&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:900,&amp;quot;wires&amp;quot;:[[&amp;quot;a8c48084.769c98&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;cc24bbea.9635e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:16,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_4&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:940,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;8c1753d8.c7f78&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:940,&amp;quot;wires&amp;quot;:[[&amp;quot;cc24bbea.9635e&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;45da5e4d.4668b8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:17,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_5&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:980,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9f233347.0662c8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:980,&amp;quot;wires&amp;quot;:[[&amp;quot;45da5e4d.4668b8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c7c3f5f9.a49af8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:18,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;6&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_6&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1020,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b2563862.a43bb8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1020,&amp;quot;wires&amp;quot;:[[&amp;quot;c7c3f5f9.a49af8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e854aeb9.0d891&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:19,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;7&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_7&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1060,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a1d7531f.a4364&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1060,&amp;quot;wires&amp;quot;:[[&amp;quot;e854aeb9.0d891&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2f757929.e84026&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:20,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;8&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_8&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1100,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;847e2ea1.d6bf7&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1100,&amp;quot;wires&amp;quot;:[[&amp;quot;2f757929.e84026&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;74dfda96.19d1ac&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:21,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;9&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_9&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1140,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;da5d870f.f649f8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1140,&amp;quot;wires&amp;quot;:[[&amp;quot;74dfda96.19d1ac&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;8f360f5b.f5dad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:22,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Setup&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_SURR&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1180,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7958a904.b939a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1180,&amp;quot;wires&amp;quot;:[[&amp;quot;8f360f5b.f5dad&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2e4c5763.3c08c8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:23,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_0&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1220,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b1feeb01.2b382&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1220,&amp;quot;wires&amp;quot;:[[&amp;quot;2e4c5763.3c08c8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;11727cc.6dcad03&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:24,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;DynR&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_DYN.R&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1260,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b6e9c5c4.86b248&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1260,&amp;quot;wires&amp;quot;:[[&amp;quot;11727cc.6dcad03&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;bbbbd531.d6bb68&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:25,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;TEST&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_TEST&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1300,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5eca3fbf.f68278&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1300,&amp;quot;wires&amp;quot;:[[&amp;quot;bbbbd531.d6bb68&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9e8aa8d.7c99e58&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Up&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:26,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-chevron-up&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_VOLUME_UP&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1340,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9420fcc2.8e3658&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1340,&amp;quot;wires&amp;quot;:[[&amp;quot;9e8aa8d.7c99e58&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;25a57ad5.00398e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:27,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;LEVEL&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_LEVEL&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1380,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;3fd30c0f.12f7cc&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1380,&amp;quot;wires&amp;quot;:[[&amp;quot;25a57ad5.00398e&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e80b7058.0352b8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Down&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:28,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-chevron-left&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_TUNE_DOWN&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1420,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5c5ece76.5b536&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1420,&amp;quot;wires&amp;quot;:[[&amp;quot;e80b7058.0352b8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b02b94f6.050208&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:29,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Mute&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_MUTE_ENTER&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1460,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;f08b802b.8f6a58&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1460,&amp;quot;wires&amp;quot;:[[&amp;quot;b02b94f6.050208&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;fe90a691.836dd8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Left&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:30,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-chevron-right&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_TUNE_UP&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1500,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a9465c5d.975fd8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1500,&amp;quot;wires&amp;quot;:[[&amp;quot;fe90a691.836dd8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;fc4aa106.9a1c58&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:31,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Display&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_DISPLAY&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:280,&amp;quot;y&amp;quot;:1540,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ec22085d.c98a68&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1540,&amp;quot;wires&amp;quot;:[[&amp;quot;fc4aa106.9a1c58&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b66c500f.0915b&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Right&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:32,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-chevron-down&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_VOLUME_DOWN&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1580,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a8a0dca6.a67f&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1580,&amp;quot;wires&amp;quot;:[[&amp;quot;b66c500f.0915b&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;86f84b6b.240c8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:33,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Tune&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_TUNE_MODE&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1620,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;57f4ac1a.3509f4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1620,&amp;quot;wires&amp;quot;:[[&amp;quot;86f84b6b.240c8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ed4c8fb.e68f1f&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;Eject&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:34,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-eject&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1660,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;f32ae1d5.35f548&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1660,&amp;quot;wires&amp;quot;:[[&amp;quot;ed4c8fb.e68f1f&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7e263909.71baf8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;Stop&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:35,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-stop&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1700,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d3a824f7.6ada98&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1700,&amp;quot;wires&amp;quot;:[[&amp;quot;7e263909.71baf8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;8fd070a9.75dd88&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;Play&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:36,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-play&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1740,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c55adfc.c9f6ea&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1740,&amp;quot;wires&amp;quot;:[[&amp;quot;8fd070a9.75dd88&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;41f8a9c.0b32758&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;Pause&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:37,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-pause&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:1780,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;3b92cee8.6f3142&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1780,&amp;quot;wires&amp;quot;:[[&amp;quot;41f8a9c.0b32758&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;792cf3f4.f4d3e4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;FBackward&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:38,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-fast-backward&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:290,&amp;quot;y&amp;quot;:1820,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7ea938d8.f49e4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1820,&amp;quot;wires&amp;quot;:[[&amp;quot;792cf3f4.f4d3e4&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5479057.098637c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;FForward&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:39,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-fast-forward&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:280,&amp;quot;y&amp;quot;:1860,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9f0465b3.995c5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1860,&amp;quot;wires&amp;quot;:[[&amp;quot;5479057.098637c&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5a669fa3.3032&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:40,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Repeat&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:280,&amp;quot;y&amp;quot;:1900,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ab88dc56.10c2f8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1900,&amp;quot;wires&amp;quot;:[[&amp;quot;5a669fa3.3032&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ab6e112e.1a1198&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;Backward&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:41,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-backward&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:290,&amp;quot;y&amp;quot;:1940,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;881adcc9.ecc808&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1940,&amp;quot;wires&amp;quot;:[[&amp;quot;ab6e112e.1a1198&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5b8798af.daa778&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;Forward&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:42,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-forward&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:280,&amp;quot;y&amp;quot;:1980,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9653af26.b69d3&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:1980,&amp;quot;wires&amp;quot;:[[&amp;quot;5b8798af.daa778&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5bf3e820.ba01f8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:43,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;PROGRAM&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:290,&amp;quot;y&amp;quot;:2020,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2c781786.f9e468&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:2020,&amp;quot;wires&amp;quot;:[[&amp;quot;5bf3e820.ba01f8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;f2096589.376d5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:44,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;AUDIO&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:2060,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;11a3ac47.41a4dc&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:2060,&amp;quot;wires&amp;quot;:[[&amp;quot;f2096589.376d5&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;86bf3820.bc62d&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:45,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;SUBTITLE&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:290,&amp;quot;y&amp;quot;:2100,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ddad71f1.12aaf&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:2100,&amp;quot;wires&amp;quot;:[[&amp;quot;86bf3820.bc62d&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7a5f8442.bc7714&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:46,&amp;quot;width&amp;quot;:4,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;CLEAR&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:280,&amp;quot;y&amp;quot;:2140,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7042da1a.e6a754&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:2140,&amp;quot;wires&amp;quot;:[[&amp;quot;7a5f8442.bc7714&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7eda4d33.407044&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:47,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;ZOOM&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:2180,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;cce49f5a.95fe08&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:2180,&amp;quot;wires&amp;quot;:[[&amp;quot;7eda4d33.407044&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;bab77c85.6bfbb8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;NAD REMOTE&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:480,&amp;quot;y&amp;quot;:20,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;92db84b2.9bbc3&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exec&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;command&amp;quot;:&amp;quot;/usr/bin/irw&amp;quot;,&amp;quot;addpay&amp;quot;:false,&amp;quot;append&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;useSpawn&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;timer&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;oldrc&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;lirc - irw&amp;quot;,&amp;quot;x&amp;quot;:280,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;16ba359d.900ac2&amp;quot;],[],[]]},{&amp;quot;id&amp;quot;:&amp;quot;9ef98366.aeeca8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:true,&amp;quot;onceDelay&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:130,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;92db84b2.9bbc3&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7ca5c7cb.e1038&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;debug&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;active&amp;quot;:false,&amp;quot;tosidebar&amp;quot;:true,&amp;quot;console&amp;quot;:false,&amp;quot;tostatus&amp;quot;:false,&amp;quot;complete&amp;quot;:&amp;quot;false&amp;quot;,&amp;quot;statusVal&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;statusType&amp;quot;:&amp;quot;auto&amp;quot;,&amp;quot;x&amp;quot;:1050,&amp;quot;y&amp;quot;:360,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;6bbb8c21.41ae54&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;http request&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;GET&amp;quot;,&amp;quot;ret&amp;quot;:&amp;quot;txt&amp;quot;,&amp;quot;paytoqs&amp;quot;:&amp;quot;ignore&amp;quot;,&amp;quot;url&amp;quot;:&amp;quot;http://192.168.20.176/ir?code={{{query}}}&amp;quot;,&amp;quot;tls&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;persist&amp;quot;:false,&amp;quot;proxy&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;authType&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:890,&amp;quot;y&amp;quot;:360,&amp;quot;wires&amp;quot;:[[&amp;quot;7ca5c7cb.e1038&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;f7b04fb1.cc3298&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;query&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;msg&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;6bbb8c21.41ae54&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;687e60ad.2b6e48&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Inject to ESP32&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:940,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;5528e089.94d018&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;debug&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;active&amp;quot;:false,&amp;quot;tosidebar&amp;quot;:true,&amp;quot;console&amp;quot;:false,&amp;quot;tostatus&amp;quot;:false,&amp;quot;complete&amp;quot;:&amp;quot;false&amp;quot;,&amp;quot;statusVal&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;statusType&amp;quot;:&amp;quot;auto&amp;quot;,&amp;quot;x&amp;quot;:1024,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;16ba359d.900ac2&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;csv&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;sep&amp;quot;:&amp;quot; &amp;quot;,&amp;quot;hdrin&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hdrout&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;multi&amp;quot;:&amp;quot;one&amp;quot;,&amp;quot;ret&amp;quot;:&amp;quot;\\n&amp;quot;,&amp;quot;temp&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;skip&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;strings&amp;quot;:true,&amp;quot;include_empty_strings&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;include_null_values&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:430,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;55a5584b.b14b88&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;55a5584b.b14b88&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;payload.col2&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;num&amp;quot;}],&amp;quot;checkall&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;repair&amp;quot;:false,&amp;quot;outputs&amp;quot;:1,&amp;quot;x&amp;quot;:590,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;225a58e4.56db5&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1f4e6452.b49024&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Que les premiers appuis&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:610,&amp;quot;y&amp;quot;:80,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;225a58e4.56db5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;query&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;payload.col3&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;msg&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:760,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;6bbb8c21.41ae54&amp;quot;,&amp;quot;5528e089.94d018&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d296a9f.61f4458&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Lecture IR via LIRC&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:210,&amp;quot;y&amp;quot;:80,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;95ba2365.2082f8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Dashboard avec télécommande virtuelle&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:200,&amp;quot;y&amp;quot;:200,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;16d43a86.d8f7a5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Code de la touche dans Query http.&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:640,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;1391e7aa.65dbd8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Code de la touche dans Query http&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:880,&amp;quot;y&amp;quot;:80,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;1431c5f.d1b74ba&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_template&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;order&amp;quot;:49,&amp;quot;width&amp;quot;:0,&amp;quot;height&amp;quot;:0,&amp;quot;format&amp;quot;:&amp;quot;&amp;lt;div ng-bind-html=&amp;quot;msg.payload&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;\n&amp;lt;style&amp;gt;\n.md-button {\n    font-size: 20px !important;\n    border-radius: 30px;\n}\n\n&amp;lt;/style&amp;gt;&amp;quot;,&amp;quot;storeOutMessages&amp;quot;:true,&amp;quot;fwdInMessages&amp;quot;:true,&amp;quot;resendOnRefresh&amp;quot;:true,&amp;quot;templateScope&amp;quot;:&amp;quot;local&amp;quot;,&amp;quot;x&amp;quot;:300,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;a3ddffe2.3856e8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:2,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;AM&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;AM&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:270,&amp;quot;y&amp;quot;:380,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1e519421.f9df8c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:380,&amp;quot;wires&amp;quot;:[[&amp;quot;a3ddffe2.3856e8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9d9e9e55.93bc38&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;order&amp;quot;:48,&amp;quot;width&amp;quot;:6,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Power via AGIRS&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;red&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-power-off&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RCVR_POWER&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:307,&amp;quot;y&amp;quot;:247,&amp;quot;wires&amp;quot;:[[&amp;quot;6cb53ccb.539b14&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d8e534ce.cde15&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:137,&amp;quot;y&amp;quot;:247,&amp;quot;wires&amp;quot;:[[&amp;quot;9d9e9e55.93bc38&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;6cb53ccb.539b14&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;exec&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;command&amp;quot;:&amp;quot;/usr/bin/irsend  SEND_ONCE NAD_AVR2-RCVR RCVR_POWER&amp;quot;,&amp;quot;addpay&amp;quot;:false,&amp;quot;append&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;useSpawn&amp;quot;:&amp;quot;false&amp;quot;,&amp;quot;timer&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;oldrc&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;IRsend&amp;quot;,&amp;quot;x&amp;quot;:517,&amp;quot;y&amp;quot;:247,&amp;quot;wires&amp;quot;:[[],[&amp;quot;f0d06a52.66f65&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;f0d06a52.66f65&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;debug&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;d&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;active&amp;quot;:true,&amp;quot;tosidebar&amp;quot;:true,&amp;quot;console&amp;quot;:false,&amp;quot;tostatus&amp;quot;:false,&amp;quot;complete&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;targetType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;statusVal&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;statusType&amp;quot;:&amp;quot;auto&amp;quot;,&amp;quot;x&amp;quot;:717,&amp;quot;y&amp;quot;:247,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;51e8aca0.156a2c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;NAD REMOTE&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;a41f135e.f9122&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Power&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:1,&amp;quot;width&amp;quot;:3,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;red&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-power-off&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_POWER&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;daf04a90.89d45&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;a41f135e.f9122&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1ea0ae1a.1d987a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:29,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_1&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:480,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;48a51d65.73a07c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:480,&amp;quot;wires&amp;quot;:[[&amp;quot;1ea0ae1a.1d987a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2c9b4a3c.2676fe&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:30,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;2&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_2&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:520,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;12ea9b9b.5da9e4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:520,&amp;quot;wires&amp;quot;:[[&amp;quot;2c9b4a3c.2676fe&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c40bc823.3d2fb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:31,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_3&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:560,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;dc60fbc4.57adc&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:560,&amp;quot;wires&amp;quot;:[[&amp;quot;c40bc823.3d2fb&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;470b9d2f.eed974&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:32,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_4&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:600,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;87b17fd4.35573&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:600,&amp;quot;wires&amp;quot;:[[&amp;quot;470b9d2f.eed974&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;995c2a3a.8907e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:33,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_5&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:640,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1760989f.61486f&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:640,&amp;quot;wires&amp;quot;:[[&amp;quot;995c2a3a.8907e&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9100f3d3.fcdb88&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:34,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;6&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_6&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:680,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2a5cf332.f0eb54&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:680,&amp;quot;wires&amp;quot;:[[&amp;quot;9100f3d3.fcdb88&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c4486dca.4736a8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:35,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;7&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_7&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:720,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;723fc1b0.db682&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:720,&amp;quot;wires&amp;quot;:[[&amp;quot;c4486dca.4736a8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;8812f68f.4eea1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:36,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;8&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_8&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:760,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;6e00af57.b162c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:760,&amp;quot;wires&amp;quot;:[[&amp;quot;8812f68f.4eea1&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a189f710.e1ec4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:37,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;9&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_9&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:800,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c4337671.c31d8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:800,&amp;quot;wires&amp;quot;:[[&amp;quot;a189f710.e1ec4&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1eac4803.2da31&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:39,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_0&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:840,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;65b3a829.e4f988&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:840,&amp;quot;wires&amp;quot;:[[&amp;quot;1eac4803.2da31&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5f534dae.7eb384&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Up&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:13,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-chevron-up&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_UP&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:880,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d1ae55df.b8786&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:880,&amp;quot;wires&amp;quot;:[[&amp;quot;5f534dae.7eb384&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;82b169e1.b79e18&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Down&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:19,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-chevron-down&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_DOWN&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:920,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b03aaf82.952da&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:920,&amp;quot;wires&amp;quot;:[[&amp;quot;82b169e1.b79e18&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;6c25b994.95c42&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Left&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:15,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-chevron-left&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_LEFT&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:960,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9302cf5e.8733f8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:960,&amp;quot;wires&amp;quot;:[[&amp;quot;6c25b994.95c42&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2caaa566.d9876a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Right&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:17,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-chevron-right&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_RIGHT&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1000,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b2737269.23b4a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1000,&amp;quot;wires&amp;quot;:[[&amp;quot;2caaa566.d9876a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a2301e72.81248&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Volume up&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:12,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;+&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-volume-up&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_VOLPLUS&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:730,&amp;quot;y&amp;quot;:1040,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;3f741fb3.d7d9b8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1040,&amp;quot;wires&amp;quot;:[[&amp;quot;a2301e72.81248&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b70331.c9d704d&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Volume down&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:18,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;-&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-volume-down&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_VOLMINUS&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:740,&amp;quot;y&amp;quot;:1080,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;810b53e1.c0da8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1080,&amp;quot;wires&amp;quot;:[[&amp;quot;b70331.c9d704d&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c872dd9a.df61c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Ambilight&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:3,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;lightbulb_outline&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_AMBILIGHT&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:720,&amp;quot;y&amp;quot;:1120,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;8b232cdd.b8a7d8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1120,&amp;quot;wires&amp;quot;:[[&amp;quot;c872dd9a.df61c&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;8c12494b.b496b&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Sources&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:4,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-arrow-circle-right&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_SOURCES&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:720,&amp;quot;y&amp;quot;:1160,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7023abd8.96bd84&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1160,&amp;quot;wires&amp;quot;:[[&amp;quot;8c12494b.b496b&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;3ee01fdf.2b8cf&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Settings&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:5,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-cog&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_SETTINGS&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:720,&amp;quot;y&amp;quot;:1200,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5b715b6e.629b34&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1200,&amp;quot;wires&amp;quot;:[[&amp;quot;3ee01fdf.2b8cf&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7123e0aa.e8b9&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;TopPicks&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:6,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-star&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_TOPPICKS&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:720,&amp;quot;y&amp;quot;:1240,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;82ddb75c.39318&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1240,&amp;quot;wires&amp;quot;:[[&amp;quot;7123e0aa.e8b9&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b6664dc6.fbd8d&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Search&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:7,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-search&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_SEARCH&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:720,&amp;quot;y&amp;quot;:1280,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;8940b88.21ad9c8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1280,&amp;quot;wires&amp;quot;:[[&amp;quot;b6664dc6.fbd8d&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;31e49f9e.e644e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Exit/tv&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:8,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-tv&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_EXIT&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1320,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e843b542.1001d&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1320,&amp;quot;wires&amp;quot;:[[&amp;quot;31e49f9e.e644e&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;240bb64a.5ab85a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;TV Guide&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:9,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-list&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_TVGUIDE&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:720,&amp;quot;y&amp;quot;:1360,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;de9d79dd.cf7f18&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1360,&amp;quot;wires&amp;quot;:[[&amp;quot;240bb64a.5ab85a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5ed14752.5f07b8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;RightMenu&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:10,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-window-restore&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_RIGHTMENU&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:730,&amp;quot;y&amp;quot;:1400,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;92369c77.16008&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1400,&amp;quot;wires&amp;quot;:[[&amp;quot;5ed14752.5f07b8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;8b6ebbe7.359a68&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;List&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:11,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-bars&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_LIST&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1440,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e2ad99fa.e6b9f&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1440,&amp;quot;wires&amp;quot;:[[&amp;quot;8b6ebbe7.359a68&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5a210c02.cd6114&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:16,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;OK&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_OK&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1480,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c0e2d7b6.07bc5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1480,&amp;quot;wires&amp;quot;:[[&amp;quot;5a210c02.cd6114&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2fb3d3bf.20ff24&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Philips Remote&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:640,&amp;quot;y&amp;quot;:400,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;92775fa5.41a8a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;lt;-&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:21,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-arrow-left&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_ANDROIDRETURN&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1520,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2eeeb271.fa122e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1520,&amp;quot;wires&amp;quot;:[[&amp;quot;92775fa5.41a8a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e81cd3f9.e8bb18&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Plus&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:22,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-plus&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_ANDROIDPLUS&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1560,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;edc57808.f973a8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1560,&amp;quot;wires&amp;quot;:[[&amp;quot;e81cd3f9.e8bb18&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1313210.173d25f&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Home&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:23,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-home&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_ANDROIDHOME&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1600,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;97ce2cb1.f97ff8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1600,&amp;quot;wires&amp;quot;:[[&amp;quot;1313210.173d25f&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a30b7192.20fd5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Red&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:24,&amp;quot;width&amp;quot;:1,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;red&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-circle&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_RED&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1640,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;f2fa173a.14a7f8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1640,&amp;quot;wires&amp;quot;:[[&amp;quot;a30b7192.20fd5&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;cab6ddf.7d6402&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Green&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:25,&amp;quot;width&amp;quot;:1,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;green&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-circle&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_GREEN&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1680,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;77881242.1ce514&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1680,&amp;quot;wires&amp;quot;:[[&amp;quot;cab6ddf.7d6402&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7aaff854.ea80c8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Yellow&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:27,&amp;quot;width&amp;quot;:1,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;yellow&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-circle&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_YELLOW&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1720,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e38c66b1.09eaf8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1720,&amp;quot;wires&amp;quot;:[[&amp;quot;7aaff854.ea80c8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;55a96b5c.34b704&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Blue&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:28,&amp;quot;width&amp;quot;:1,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;blue&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-circle&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_BLUE&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:1760,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;eb4dd3cc.3096b8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:580,&amp;quot;y&amp;quot;:1760,&amp;quot;wires&amp;quot;:[[&amp;quot;55a96b5c.34b704&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b3881d2b.3fb49&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:2,&amp;quot;width&amp;quot;:3,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;NETFLIX&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;red&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_NETFLIX&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1040,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ad6292.8f0c557&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;b3881d2b.3fb49&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c7c61bea.45a67&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Prog +&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:14,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;+&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-tv&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_PROGPLUS&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1030,&amp;quot;y&amp;quot;:480,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e28b310.c5dffd&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:480,&amp;quot;wires&amp;quot;:[[&amp;quot;c7c61bea.45a67&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d3fbd274.0b748&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Prog &amp;#039;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:20,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;-&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-tv&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_PROGMINUS&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1030,&amp;quot;y&amp;quot;:520,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;3c3a6da4.e20842&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:520,&amp;quot;wires&amp;quot;:[[&amp;quot;d3fbd274.0b748&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a088a588.611c8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Mute&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:26,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:1,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;volume_off&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_MUTE&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1030,&amp;quot;y&amp;quot;:560,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;3a171cce.01c0bc&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:560,&amp;quot;wires&amp;quot;:[[&amp;quot;a088a588.611c8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;4ab86af5.3fc2a4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Stop&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:41,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-stop&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_STOP&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1030,&amp;quot;y&amp;quot;:600,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;618d3812.fb9d88&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:600,&amp;quot;wires&amp;quot;:[[&amp;quot;4ab86af5.3fc2a4&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2398b72a.bb7e4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Pause&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:42,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-pause&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_PAUSE&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1030,&amp;quot;y&amp;quot;:640,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;db8bc32.45cfbc&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:640,&amp;quot;wires&amp;quot;:[[&amp;quot;2398b72a.bb7e4&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;abcc8ee6.b8594&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Record&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:43,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-circle&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_RECORD&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1040,&amp;quot;y&amp;quot;:680,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;441c59c0.826d78&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:680,&amp;quot;wires&amp;quot;:[[&amp;quot;abcc8ee6.b8594&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ada645a0.7a3f98&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Rewind&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:44,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-backward&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_REWIND&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1040,&amp;quot;y&amp;quot;:720,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;498d913a.0e668&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:720,&amp;quot;wires&amp;quot;:[[&amp;quot;ada645a0.7a3f98&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;4ca6b7d3.32a27&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Forward&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:46,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-forward&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_FORWARD&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1040,&amp;quot;y&amp;quot;:760,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7183f45f.a28d2c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:760,&amp;quot;wires&amp;quot;:[[&amp;quot;4ca6b7d3.32a27&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9d3513f9.62764&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Play&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:45,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-play&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_PLAY&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1030,&amp;quot;y&amp;quot;:800,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1c80e117.0c2c3f&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:800,&amp;quot;wires&amp;quot;:[[&amp;quot;9d3513f9.62764&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;bfe2e37c.df22d8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Subtitle&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:38,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;subtitles&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_SUBTITLE&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1040,&amp;quot;y&amp;quot;:840,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7c3eb118.c751c8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:840,&amp;quot;wires&amp;quot;:[[&amp;quot;bfe2e37c.df22d8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1cb6390.b75b0c7&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_button&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;order&amp;quot;:40,&amp;quot;width&amp;quot;:2,&amp;quot;height&amp;quot;:2,&amp;quot;passthru&amp;quot;:true,&amp;quot;label&amp;quot;:&amp;quot;Text&amp;quot;,&amp;quot;tooltip&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bgcolor&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;RC6_TEXT&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;topicType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:1030,&amp;quot;y&amp;quot;:880,&amp;quot;wires&amp;quot;:[[&amp;quot;f7b04fb1.cc3298&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;41ae80ed.bd67a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:900,&amp;quot;y&amp;quot;:880,&amp;quot;wires&amp;quot;:[[&amp;quot;1cb6390.b75b0c7&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e132e7a.5184818&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_template&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;7a472838.fcd788&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;order&amp;quot;:49,&amp;quot;width&amp;quot;:0,&amp;quot;height&amp;quot;:0,&amp;quot;format&amp;quot;:&amp;quot;&amp;lt;div ng-bind-html=&amp;quot;msg.payload&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;\n&amp;lt;style&amp;gt;\n.md-button {\n    font-size: 20px !important;\n    border-radius: 20px;\n}\n\n&amp;lt;/style&amp;gt;&amp;quot;,&amp;quot;storeOutMessages&amp;quot;:true,&amp;quot;fwdInMessages&amp;quot;:true,&amp;quot;resendOnRefresh&amp;quot;:true,&amp;quot;templateScope&amp;quot;:&amp;quot;local&amp;quot;,&amp;quot;x&amp;quot;:815,&amp;quot;y&amp;quot;:399,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;e84be541.072ae&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_group&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;NAD AVR2&amp;quot;,&amp;quot;tab&amp;quot;:&amp;quot;b704b2ac.dd10b8&amp;quot;,&amp;quot;order&amp;quot;:1,&amp;quot;disp&amp;quot;:false,&amp;quot;width&amp;quot;:&amp;quot;6&amp;quot;,&amp;quot;collapse&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;e48b1652.82182&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_group&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;PHILIPS&amp;quot;,&amp;quot;tab&amp;quot;:&amp;quot;d3aad50b.a480e&amp;quot;,&amp;quot;order&amp;quot;:2,&amp;quot;disp&amp;quot;:false,&amp;quot;width&amp;quot;:&amp;quot;6&amp;quot;,&amp;quot;collapse&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;b704b2ac.dd10b8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_tab&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AMPLI NAD&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-volume-up&amp;quot;,&amp;quot;order&amp;quot;:1,&amp;quot;disabled&amp;quot;:false,&amp;quot;hidden&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;d3aad50b.a480e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_tab&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;TV PHILIPS&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;fa-tv&amp;quot;,&amp;quot;order&amp;quot;:2,&amp;quot;disabled&amp;quot;:false,&amp;quot;hidden&amp;quot;:false}]
&lt;/pre&gt;


&lt;p&gt;Voici quelques copies d'écran de l'interface utilisateur, simulant les 2 télécommandes (NAD AVR2 et TV Philips OLED dernière génération. C'est particulièrement pratique sur mobile, car cela supporte le &quot;wipe&quot; ou balayage latéral pour passer d'une télécommande à une autre. Ici, vu sur ordinateur. La copie d'écran centrale montre le menu de sélection sur PC.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/nodered-UI-1.png&quot; title=&quot;nodered-UI-1.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.nodered-UI-1_m.png&quot; alt=&quot;nodered-UI-1.png, mai 2021&quot; class=&quot;media-left&quot; title=&quot;nodered-UI-1.png, mai 2021&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://civade.com/images/ir/nodered-UI-2.png&quot; title=&quot;nodered-UI-2.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.nodered-UI-2_m.png&quot; alt=&quot;nodered-UI-2.png, mai 2021&quot; class=&quot;media-left&quot; title=&quot;nodered-UI-2.png, mai 2021&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://civade.com/images/ir/nodered-UI-3.png&quot; title=&quot;nodered-UI-3.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.nodered-UI-3_m.png&quot; alt=&quot;nodered-UI-3.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Voici qui termine la suite des 4 articles. J'espère vous avoir donné l'envie d'aller plus loin car c'est vraimetn puisant et on peut faire plein de choses..  N'hésitez pas à me laisser un commentaire pour me décrire vos réalisations !&lt;/p&gt;



&lt;h3&gt;Sommaire des articles de la série:&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-télécommande-infrarouge&quot;&gt;IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-réception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi&quot;&gt;IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32&quot;&gt;IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32&lt;/li&gt;
&lt;/ul&gt;</description>
        
                  <comments>https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-T%C3%A9l%C3%A9commande-Wifi-avec-Nodered-LIRC-ESP32#comment-form</comments>
          <wfw:comment>https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-T%C3%A9l%C3%A9commande-Wifi-avec-Nodered-LIRC-ESP32#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/116</wfw:commentRss>
              </item>
          <item>
        <title>IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32</title>
        <link>https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32</link>
        <guid isPermaLink="false">urn:md5:4e182d0bff54bdb764f39d197fa93cf3</guid>
        <pubDate>Sun, 02 May 2021 06:45:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Technologies</category>
                          <category>Arduino</category>
                  <category>Domotique</category>
                  <category>Embarqué</category>
                  <category>ESP8266</category>
                  <category>Firmware</category>
                  <category>OpenSource</category>
                  <category>Raspberry</category>
                  <category>Sysadmin</category>
                <description>&lt;p&gt;Avec le premier volet, nous avons appris comment fonctionnent les codes infrarouges envoyés par les télécommandes, et fabriqué un petit périphérique qui associé au logiciel IRScrutinizer, permettent des les décoder. Le 2e volet était consacré à l'émission réception de codes infrarouge sur linux (raspberry PI, Orange PI ou tout autre système linux). Dans ce troisième volet, nous allons réaliser un petit périphérique WIfi basé sur un ESP 32, capable d'envoyer des codes infrarouge en substitution de votre télécommande, à partir du réseau.&lt;/p&gt;          &lt;h3&gt;Généralités et cahier des charges&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/m5stick.jpg&quot; title=&quot;m5stick.jpg, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.m5stick_m.jpg&quot; alt=&quot;m5stick.jpg, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;L'idée générale, avec ce périphérique est de permettre l'envoi de codes infrarouges, à partir d'une commande reçue du réseau local. Cela permet de déporter ce périphérique là ou il y en a besoin (et même de l'intégrer dans un appareil, comme un ampli audio vidéo par exemple), tout en gardant la capacité de l'interfacer avec un système de domotique ou basé sur Node Red.&lt;/p&gt;


&lt;p&gt;Ici, j'ai choisi d'utiliser un ESP32, bien qu'un ESP8266 puisse également faire le job. Une attention toute particulière a été portée sur l'émission infrarouge, afin de pouvoir piloter les leds avec un niveau de puissance suffisant pour permettre de 'tirer loin&quot;. En effet, certaines de ces leds sont pilotables avec des courants pouvant aller jusqu'à 100ma, ce qui permet d'augmenter substantiellement la portée.&lt;/p&gt;


&lt;p&gt;Les sorties de l'ESP32 étant en 3.3V et sous très faible puissance, il va donc nous falloir réaliser un booster pour permettre de sortie ces courants. Ceci va être fait avec un MOSFET.&lt;/p&gt;


&lt;p&gt;Par ailleurs, disposant d'un ampli NAD avec une entrée &quot;IR In&quot;, j'ai creusé la possibilité de connecter directement le signal IR directement sur l'ampli.&lt;/p&gt;


&lt;p&gt;Nad indique à propos de ce connecteur qu'il permet de raccorder un signal modulé à 38khz ou non, en logique positive, et d'une amplitude de 5v max. Il est disponible sur un connecteur 3.5mm, avec le plus sur la pointe, et le 0V sur l'anneau. Après avoir fait quelques essais,il est apparu que l'impédance de l'entrée est relativement basse et qu'on ne peut pas y mettre directement une sortie de micro contrôleur, sinon le signal s'effondre et l'ampli ne comprend qu'une commande sur 10. Il faut l'amplifier avec un transistor.&lt;/p&gt;


&lt;p&gt;Voici le synoptique résultant du dispositif souhaité :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/synoptic.png&quot; title=&quot;synoptic.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.synoptic_m.png&quot; alt=&quot;synoptic.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Réalisation matérielle&lt;/h3&gt;


&lt;p&gt;Les étages d'amplification (buffer) ont étés réalisés avec des N Channel FET 2N7000. En voici le schéma. La partie &quot;NAD&quot; peut être omise si vous n'en avez pas besoin.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/sch.png&quot; title=&quot;sch.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.sch_m.png&quot; alt=&quot;sch.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La réalisation ne pose pas de problème particulier à part le brochage du 2N7000 et les tests car les leds infrarouge n'émettent pas de lumière visible. Vous pouvez utiliser une webcam ou la caméra d'un smartphone  pour visualiser la lumière infrarouge. Attention, car les iphones sont munis de filtres IR qui ne permettent pas de visualiser les leds IR... Donc android ou webcam... Il suffit de mettre l'entrée à 3.3V pour que les leds s'allument. Si ce n'est pas le cas, c'est que vous avez un problème de câblage (leds à l'envers par exemple..). A noter que la résistance de R1peut être recalculée en fonction du courant souhaité avec la formule R = (5- (2x1.7) ) / I ou I est en courant souhaité. Sur certaines led IR on peut monter jusqu'à 0.1A (100ma). 0.05A peut être une valeur médiane acceptable.&lt;/p&gt;


&lt;h3&gt;Le logiciel&lt;/h3&gt;


&lt;p&gt;Le logiciel s'appuie en grande partie sur la bibliothèque IRremoteESP8266 qui fournit tout ce qu'il faut pour gérer de multiples formats infrarouge.&lt;/p&gt;


&lt;p&gt;Après avoir inclus la bibliothèque :&lt;/p&gt;

&lt;pre&gt;#include &amp;lt;IRremoteESP8266.h&amp;gt;
#include &amp;lt;IRsend.h&amp;gt;&lt;/pre&gt;


&lt;p&gt;Il faut initialiser l'objet irsend quelque par dans la fonction setup :&lt;/p&gt;

&lt;pre&gt;irsend.begin();&lt;/pre&gt;


&lt;p&gt;Ensuite on peut utiliser les fonctions d'envoi dédiées à chaque protocole. Par exemple pour envoyer une commande au format NEC&lt;/p&gt;

&lt;pre&gt;irsend.sendNEC (0xE13E01FE,32,3);&lt;/pre&gt;


&lt;p&gt;Ici, on envoie 3 fois le code NEC étendu (adresse sur 16 bits + données sur 8 bits + complément de données sur 8 bits) avec &lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/appareil = E1, sous fonction= 3E, touche=01, complément à 1 de touche =FE&quot; title=&quot;appareil = E1, sous fonction= 3E, touche=01, complément à 1 de touche =FE&quot;&gt;appareil = E1, sous fonction= 3E, t...&lt;/a&gt;. Le mot total fait donc 32 bits.&lt;/p&gt;


&lt;p&gt;N'oubliez pas que dans le format NEC, on envoie le LSB en premier pour chaque octet (voir article sur le décodage).&lt;/p&gt;


&lt;p&gt;Autre exemple  pour un format Philips RC6&lt;/p&gt;

&lt;pre&gt;irsend.sendRC6(0x000CU + 0x10000U*rc6Toggle, 20U);&lt;/pre&gt;


&lt;p&gt;A noter que pour le format RC6, un bit doit changer d'état à chaque transmission (0 ou 1), ce qui justifie le &quot;rc6Toggle&quot; sur la ligne.
La longueur de la trame fait 20 bits.&lt;/p&gt;


&lt;p&gt;Ce code est un exemple, adapté à mes périphérique et il faudra que vous l'adaptiez aux vôtres. Pour cela il vous faudra certainement consulter la documentation de IRremoteESP8266 ici: &lt;a href=&quot;https://github.com/crankyoldgit/IRremoteESP8266/blob/master/SupportedProtocols.md&quot;&gt;https://github.com/crankyoldgit/IRremoteESP8266/blob/master/SupportedProtocols.md&lt;/a&gt; car la bibliothèque inclut de nombreux protocoles .&lt;/p&gt;

&lt;pre&gt;
/* NADRemote32
 * (c) 05/2021 JP CIVADE. Licence GPL 3.
 * 
 * Pour ESP32, permet d&amp;#039;envoyer des codes de télécommande NAD AVR2 (par exemple pour ampli T742) sur appel réseau.
 * Nécessite la bibliothèque IRremoteESP8266 . Utilise le format pronto pour définir les codes de la télécommande.
 * 
 * Sur M5stick, nécessite aussi les bibliothèques M5stick et u8g2.
 * 
 * Il suffit de lui envoyer la commande http://nad-esp32.local/ir?code=MYCODE
 * MYCODE doit être remplacé par l&amp;#039;un des codes supportés :
 * 
 * POUR LE NAD:
 * ---------------------------------------------------------------------------------------------------------------------
 * RCVR_POWER, AM, FM/AM, KEY_SLEEP, KEY_DVD, KEY_SAT, KEY_VCR, KEY_VIDEO_4, KEY_VIDEO_5, EXT._5.1, KEY_CD, KEY_TAPE, FM,
 * RCVR_POWER, AM, FM/AM, KEY_SLEEP, KEY_DVD, KEY_SAT, KEY_VCR, KEY_VIDEO_4, KEY_VIDEO_5, EXT._5.1, KEY_CD, KEY_TAPE, FM, 
 * FM/AM, RCVR_1, RCVR_2, RCVR_3, RCVR_4, RCVR_5, RCVR_6, RCVR_7, RCVR_8, RCVR_9, RCVR_0, RCVR_SURR, RCVR_DYN.R, RCVR_TEST,
 * RCVR_LEVEL, RCVR_VOLUME_UP, RCVR_VOLUME_DOWN, RCVR_TUNE_DOWN, RCVR_TUNE_UP, RCVR_MUTE_ENTER, RCVR_DISPLAY, RCVR_TUNE_MODE 
 * 
 * POUR LA TV PHILIPS
 * ----------------------------------------------------------------------------------------------------------------------
 * RC6_POWER RC6_VOLPLUS RC6_VOLMINUS RC6_PROGPLUS RC6_PROGMINUS RC6_OK RC6_LEFT RC6_RIGHT RC6_UP RC6_DOWN RC6_ANDROIDRETURN 
 * RC6_NETFLIX RC6_ANDROIDPLUS RC6_ANDROIDHOME RC6_MUTE RC6_1 RC6_2 RC6_3 RC6_4 RC6_5 RC6_6 RC6_7 RC6_8 RC6_9 RC6_0 
 * RC6_RED RC6_GREEN RC6_YELLOW RC6_BLUE RC6_STOP RC6_PAUSE RC6_RECORD RC6_REWIND RC6_PLAY RC6_FORWARD RC6_SUBTITLE RC6_TEXT 
 * RC6_AMBILIGHT RC6_SOURCES RC6_SETTINGS RC6_TOPPICKS RC6_SEARCH RC6_EXIT RC6_TVGUIDE RC6_RIGHTMENU RC6_LIST 
 * 
 * A chaque réception de trame et envoi de code, la led intégrée à l&amp;#039;ESP clignote. Le code IR pour NAD est envoyé 3 fois pour plus de sureté.
 * 
 * Une LED IR doit être branchée sur la broce 4 (D2), idéalement pilotée par un ampli (FET).
 * Le courant dans la led peut aller de 40 ma à 100ma sur certaines LED.
 * Si mises en série et alimentées en 5V et commutées par un FET, le calcul de la résistance s&amp;#039;effectue comme suit ;
 * R = (5 - 1.7 - 1.7) / 0.04 = 40 ohms pour 40 ma.
 * R = (5 - 1.7 - 1.7) / 0.05 = 32 ohms pour 50 ma.
 * R = (5 - 1.7 - 1.7) / 0.10 = 16 ohms pour 100 ma.
 * 
 * Sur M5stick, les broches sont adaptées pour utiiser la led interne, l&amp;#039;émetteur IR interne, et le plus grand bouton (B1). 
 * Le bouton B1 permet d&amp;#039;envoyer la commande Power du NAD.
 * L&amp;#039;afficheur LCD  affiche l&amp;#039;adresse IP ainsi que chaque commande émise en IR.
 * 
 * Pour télécommander un ampli NAD, l&amp;#039;entrée IR IN peut également être utilisée. Dans ce cas, il faut
 * bufferiser la sortie (avec un 7407 en collecteur ouvert et pullup de 1K) avant de l&amp;#039;utiliser.
 * En effet, l&amp;#039;entrée IR du NAD consomme beaucoup de courant.
 * 
 * Peut être mis à jour à la volée soit en browsant la page http://nad-esp32.local et en sélectionnant le fichier à envoyer ou
 * par le terminal avec curl -F &amp;quot;image=@firmware.bin&amp;quot; nad-esp32.local/update
 *  
*/

#include &amp;lt;Arduino.h&amp;gt;
#include &amp;lt;IRremoteESP8266.h&amp;gt;
#include &amp;lt;IRsend.h&amp;gt;
#include &amp;lt;WiFi.h&amp;gt;
#include &amp;lt;WiFiClient.h&amp;gt;
#include &amp;lt;WebServer.h&amp;gt;
#include &amp;lt;ESPmDNS.h&amp;gt;
#include &amp;lt;Update.h&amp;gt;
#ifdef ARDUINO_M5Stick_C
#include &amp;lt;M5StickC.h&amp;gt;
#endif

// Configure Wifi and device name here
const char *ssid = &amp;quot;mon-ssid&amp;quot;;
const char *password = &amp;quot;mon_password&amp;quot;;
const char* host = &amp;quot;nad-esp32&amp;quot;;
static unsigned int rc6Toggle = 0;
// End config.

#ifdef ARDUINO_M5Stick_C
  #warning M5 Stick version
  // wiring here https://github.com/m5stack/M5StickC
  const uint16_t kIrLed = 9;  // M5stickC is 9
  #define LEDON 0
  #define LEDOFF 1
  const int led = GPIO_NUM_10; // 10 
#else // Standard arduino
  #warning Arduino version
  const uint16_t kIrLed = 4;  // ESP32 GPIO pin to use. Recommended: 4 (D2). 
  #define LEDON 1
  #define LEDOFF 0
  const int led = LED_BUILTIN; 

#endif

IRsend irsend(kIrLed);      // Set the GPIO to be used to sending the message.
WebServer server(80);

void handleRoot() {
  digitalWrite(led, LEDON);
  char temp[400];
  int sec = millis() / 1000;
  int min = sec / 60;
  int hr = min / 60;

// for automatic refresh, add on headers 
//     &amp;lt;meta http-equiv=&amp;#039;refresh&amp;#039; content=&amp;#039;5&amp;#039;/&amp;gt;\

  snprintf(temp, 400,
           &amp;quot;&amp;lt;html&amp;gt;\
  &amp;lt;head&amp;gt;\
    &amp;lt;title&amp;gt;ESP32 NAD Remote&amp;lt;/title&amp;gt;\
    &amp;lt;style&amp;gt;\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    &amp;lt;/style&amp;gt;\
  &amp;lt;/head&amp;gt;\
  &amp;lt;body&amp;gt;\
    &amp;lt;h1&amp;gt;Hello from ESP32!&amp;lt;/h1&amp;gt;\
    &amp;lt;p&amp;gt;Uptime: %02d:%02d:%02d&amp;lt;/p&amp;gt;\
    &amp;lt;form method=&amp;#039;POST&amp;#039; action=&amp;#039;/update&amp;#039; enctype=&amp;#039;multipart/form-data&amp;#039;&amp;gt;\
      &amp;lt;input type=&amp;#039;file&amp;#039; name=&amp;#039;update&amp;#039;&amp;gt;&amp;lt;input type=&amp;#039;submit&amp;#039; value=&amp;#039;Update&amp;#039;&amp;gt;\
    &amp;lt;/form&amp;gt;\
  &amp;lt;/body&amp;gt;\
&amp;lt;/html&amp;gt;&amp;quot;,
           hr, min % 60, sec % 60
          );
  server.send(200, &amp;quot;text/html&amp;quot;, temp);
  digitalWrite(led, LEDOFF);
}

void handleIR() {
  digitalWrite(led, LEDON);
  String message = &amp;quot;OK\n\n&amp;quot;;
  String command = &amp;quot;&amp;quot;;
  String displaymsg = &amp;quot;&amp;quot;;

  // Get params
  for (uint8_t i = 0; i &amp;lt; server.args(); i++) {
    if ( server.argName(i) == &amp;quot;code&amp;quot; ) {
      command = server.arg(i);
      message += &amp;quot; &amp;quot; + server.argName(i) + &amp;quot;: &amp;quot; + server.arg(i) + &amp;quot;\n&amp;quot;;
      }
  }
  if (command == &amp;quot;RCVR_POWER&amp;quot;) {
    irsend.sendNEC (0xE13E01FE,32,3);
    displaymsg = &amp;quot;RCVR_POWER&amp;quot;;
    }   

  if (command == &amp;quot;AM&amp;quot;) {
    irsend.sendNEC (0xE13EBB44,32,3);
    displaymsg = &amp;quot;AM&amp;quot;;
    }   
  if (command == &amp;quot;FM/AM&amp;quot;) {
    irsend.sendNEC (0xE13EBB44,32,3);
    displaymsg = &amp;quot;FM/AM&amp;quot;;
    }   
  if (command == &amp;quot;KEY_SLEEP&amp;quot;) {
    irsend.sendNEC (0xE13E04FB,32,3);
    displaymsg = &amp;quot;KEY_SLEEP&amp;quot;;
    }   
  if (command == &amp;quot;KEY_DVD&amp;quot;) {
    irsend.sendNEC (0xE13E43BC,32,3);
    displaymsg = &amp;quot;KEY_DVD&amp;quot;;
    }   
  if (command == &amp;quot;KEY_SAT&amp;quot;) {
    irsend.sendNEC (0xE13E03FC,32,3);
    displaymsg = &amp;quot;KEY_SAT&amp;quot;;
    }   
  if (command == &amp;quot;KEY_VCR&amp;quot;) {
    irsend.sendNEC (0xE13E837C,32,3);
    displaymsg = &amp;quot;KEY_VCR&amp;quot;;
    }   
  if (command == &amp;quot;KEY_VIDEO_4&amp;quot;) {
    irsend.sendNEC (0xE13E0CF3,32,3);
    displaymsg = &amp;quot;KEY_VIDEO_4&amp;quot;;
    }   
  if (command == &amp;quot;KEY_VIDEO_5&amp;quot;) {
    irsend.sendNEC (0xE13E8C73,32,3);
    displaymsg = &amp;quot;KEY_VIDEO_5&amp;quot;;
    }   
  if (command == &amp;quot;EXT._5.1&amp;quot;) {
    irsend.sendNEC (0xE13E748B,32,3);
    displaymsg = &amp;quot;EXT._5.1&amp;quot;;
    }   
  if (command == &amp;quot;KEY_CD&amp;quot;) {
    irsend.sendNEC (0xE13EA15E,32,3);
    displaymsg = &amp;quot;KEY_CD&amp;quot;;
    }   
  if (command == &amp;quot;KEY_TAPE&amp;quot;) { 
    irsend.sendNEC (0xE13EB14E,32,3);
    displaymsg = &amp;quot;KEY_TAPE&amp;quot;;
    }   
  if (command == &amp;quot;FM&amp;quot;) {
    irsend.sendNEC (0xE13EBB44,32,3);
    displaymsg = &amp;quot;FM&amp;quot;;
    }   
  if (command == &amp;quot;FM/AM&amp;quot;) { 
    irsend.sendNEC (0xE13EBB44,32,3);
    displaymsg = &amp;quot;FM/AM&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_1&amp;quot;) {
    irsend.sendNEC (0xE13E51AE,32,3);
    displaymsg = &amp;quot;&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_2&amp;quot;) {
    irsend.sendNEC (0xE13E718E,32,3);
    displaymsg = &amp;quot;RCVR_2&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_3&amp;quot;) {
    irsend.sendNEC (0xE13E49B6,32,3);
    displaymsg = &amp;quot;RCVR_3&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_4&amp;quot;) {
    irsend.sendNEC (0xE13E6996,32,3);
    displaymsg = &amp;quot;&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_5&amp;quot;) {
    irsend.sendNEC (0xE13ED12E,32,3);
    displaymsg = &amp;quot;RCVR_5&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_6&amp;quot;) {
    irsend.sendNEC (0xE13EF10E,32,3);
    displaymsg = &amp;quot;RCVR_6&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_7&amp;quot;) {
    irsend.sendNEC (0xE13EC936,32,3);
    displaymsg = &amp;quot;RCVR_7&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_8&amp;quot;) {
    irsend.sendNEC (0xE13EE916,32,3);
    displaymsg = &amp;quot;RCVR_8&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_9&amp;quot;) {
    irsend.sendNEC (0xE13E19E6,32,3);
    displaymsg = &amp;quot;RCVR_9&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_0&amp;quot;) {
    irsend.sendNEC (0xE13EE31C,32,3);
    displaymsg = &amp;quot;RCVR_0&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_SURR&amp;quot;) {
    irsend.sendNEC (0xE13E33CC,32,3);
    displaymsg = &amp;quot;RCVR_SURR&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_DYN.R&amp;quot;) {
    irsend.sendNEC (0xE13EF40B,32,3);
    displaymsg = &amp;quot;RCVR_DYN.R&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_TEST&amp;quot;) {
   irsend.sendNEC (0xE13EB34C,32,3);
    displaymsg = &amp;quot;RCVR_TEST&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_LEVEL&amp;quot;) {
    irsend.sendNEC (0xE13ED42B,32,3);
    displaymsg = &amp;quot;RCVR_LEVEL&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_VOLUME_UP&amp;quot;) {
    irsend.sendNEC (0xE13E11EE,32,3);
    displaymsg = &amp;quot;RCVR_VOLUME_UP&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_VOLUME_DOWN&amp;quot;) {
    irsend.sendNEC (0xE13E31CE,32,3);
    displaymsg = &amp;quot;RCVR_VOLUME_DOWN&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_TUNE_DOWN&amp;quot;) {
    irsend.sendNEC (0xE13E8B74,32,3);
    displaymsg = &amp;quot;RCVR_TUNE_DOWN&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_TUNE_UP&amp;quot;) {
    irsend.sendNEC (0xE13E4BB4,32,3);
    displaymsg = &amp;quot;RCVR_TUNE_UP&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_MUTE_ENTER&amp;quot;) { 
    irsend.sendNEC (0xE13E29D6,32,3);
    displaymsg = &amp;quot;RCVR_MUTE_ENTER&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_DISPLAY&amp;quot;) {
    irsend.sendNEC (0xE13E649B,32,3);
    displaymsg = &amp;quot;RCVR_DISPLAY&amp;quot;;
    }   
  if (command == &amp;quot;RCVR_TUNE_MODE&amp;quot;) { 
    irsend.sendNEC (0xE13ECC33,32,3);
    displaymsg = &amp;quot;RCVR_TUNE_MODE&amp;quot;;
    } 
  //*************************************************************
  //  Philips TV Commmands
  if (command == &amp;quot;RC6_POWER&amp;quot;) { 
    irsend.sendRC6(0x000CU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_POWER&amp;quot;;
    } 
  if (command == &amp;quot;RC6_VOLPLUS&amp;quot;) { 
    irsend.sendRC6(0x0010U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_VOLPLUS&amp;quot;;
    } 
  if (command == &amp;quot;RC6_VOLMINUS&amp;quot;) { 
    irsend.sendRC6(0x0011U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_VOLMINUS&amp;quot;;
    } 
  if (command == &amp;quot;RC6_PROGPLUS&amp;quot;) { 
    irsend.sendRC6(0x0020U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_PROGPLUS&amp;quot;;
    } 
  if (command == &amp;quot;RC6_PROGMINUS&amp;quot;) { 
    irsend.sendRC6(0x0021U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_PROGMINUS&amp;quot;;
    } 
  if (command == &amp;quot;RC6_OK&amp;quot;) { 
    irsend.sendRC6(0x005CU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_OK&amp;quot;;
    } 
  if (command == &amp;quot;RC6_LEFT&amp;quot;) { 
    irsend.sendRC6(0x005AU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_LEFT&amp;quot;;
    } 
  if (command == &amp;quot;RC6_RIGHT&amp;quot;) { 
    irsend.sendRC6(0x005BU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_RIGHT&amp;quot;;
    } 
  if (command == &amp;quot;RC6_UP&amp;quot;) { 
    irsend.sendRC6(0x0058U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_UP&amp;quot;;
    } 
  if (command == &amp;quot;RC6_DOWN&amp;quot;) { 
    irsend.sendRC6(0x0059U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_DOWN&amp;quot;;
    } 
  if (command == &amp;quot;RC6_ANDROIDRETURN&amp;quot;) { 
    irsend.sendRC6(0x000AU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_ANDROIDRETURN&amp;quot;;
    } 
  if (command == &amp;quot;RC6_NETFLIX&amp;quot;) { 
    irsend.sendRC6(0x0076U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_NETFLIX&amp;quot;;
    } 
  if (command == &amp;quot;RC6_ANDROIDPLUS&amp;quot;) { 
    irsend.sendRC6(0x0040U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_ANDROIDPLUS&amp;quot;;
    } 
  if (command == &amp;quot;RC6_ANDROIDHOME&amp;quot;) { 
    irsend.sendRC6(0x0054U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_ANDROIDHOME&amp;quot;;
    } 
  if (command == &amp;quot;RC6_MUTE&amp;quot;) { 
    irsend.sendRC6(0x000DU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_MUTE&amp;quot;;
    } 
  if (command == &amp;quot;RC6_1&amp;quot;) { 
    irsend.sendRC6(0x0001U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_1&amp;quot;;
    } 
  if (command == &amp;quot;RC6_2&amp;quot;) { 
    irsend.sendRC6(0x0002U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_2&amp;quot;;
    } 
  if (command == &amp;quot;RC6_3&amp;quot;) { 
    irsend.sendRC6(0x0003U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_3&amp;quot;;
    } 
  if (command == &amp;quot;RC6_4&amp;quot;) { 
    irsend.sendRC6(0x0004U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_4&amp;quot;;
    } 
  if (command == &amp;quot;RC6_5&amp;quot;) { 
    irsend.sendRC6(0x0005U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_5&amp;quot;;
    } 
  if (command == &amp;quot;RC6_6&amp;quot;) { 
    irsend.sendRC6(0x0006U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_6&amp;quot;;
    } 
  if (command == &amp;quot;RC6_7&amp;quot;) { 
    irsend.sendRC6(0x0007U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_7&amp;quot;;
    } 
  if (command == &amp;quot;RC6_8&amp;quot;) { 
    irsend.sendRC6(0x0008U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_8&amp;quot;;
    } 
  if (command == &amp;quot;RC6_9&amp;quot;) { 
    irsend.sendRC6(0x0009U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_9&amp;quot;;
    } 
  if (command == &amp;quot;RC6_0&amp;quot;) { 
    irsend.sendRC6(0x0000U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_0&amp;quot;;
    } 
  if (command == &amp;quot;RC6_RED&amp;quot;) { 
    irsend.sendRC6(0x006DU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_RED&amp;quot;;
    } 
  if (command == &amp;quot;RC6_GREEN&amp;quot;) { 
    irsend.sendRC6(0x006EU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_GREEN&amp;quot;;
    } 
  if (command == &amp;quot;RC6_YELLOW&amp;quot;) { 
    irsend.sendRC6(0x006FU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_YELLOW&amp;quot;;
    } 
  if (command == &amp;quot;RC6_BLUE&amp;quot;) { 
    irsend.sendRC6(0x0070U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_BLUE&amp;quot;;
    } 
  if (command == &amp;quot;RC6_STOP&amp;quot;) { 
    irsend.sendRC6(0x0031U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_STOP&amp;quot;;
    } 
  if (command == &amp;quot;RC6_PAUSE&amp;quot;) { 
    irsend.sendRC6(0x0030U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_PAUSE&amp;quot;;
    } 
  if (command == &amp;quot;RC6_RECORD&amp;quot;) { 
    irsend.sendRC6(0x0037U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_RECORD&amp;quot;;
    } 
  if (command == &amp;quot;RC6_REWIND&amp;quot;) { 
    irsend.sendRC6(0x002BU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_REWIND&amp;quot;;
    } 
  if (command == &amp;quot;RC6_PLAY&amp;quot;) { 
    irsend.sendRC6(0x002CU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_PLAY&amp;quot;;
    } 
  if (command == &amp;quot;RC6_FORWARD&amp;quot;) { 
    irsend.sendRC6(0x0028U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_FORWARD&amp;quot;;
    } 
  if (command == &amp;quot;RC6_SUBTITLE&amp;quot;) { 
    irsend.sendRC6(0x004BU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_SUBTITLE&amp;quot;;
    } 
  if (command == &amp;quot;RC6_TEXT&amp;quot;) { 
    irsend.sendRC6(0x003CU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_TEXT&amp;quot;;
    } 
  if (command == &amp;quot;RC6_AMBILIGHT&amp;quot;) { 
    irsend.sendRC6(0x008FU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_AMBILIGHT&amp;quot;;
    } 
  if (command == &amp;quot;RC6_SOURCES&amp;quot;) { 
    irsend.sendRC6(0x0038U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_SOURCES&amp;quot;;
    } 
  if (command == &amp;quot;RC6_SETTINGS&amp;quot;) { 
    irsend.sendRC6(0x00C0U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_SETTINGS&amp;quot;;
    } 
  if (command == &amp;quot;RC6_TOPPICKS&amp;quot;) { 
    irsend.sendRC6(0x0074U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_TOPPICKS&amp;quot;;
    } 
  if (command == &amp;quot;RC6_SEARCH&amp;quot;) { 
    irsend.sendRC6(0x00B4U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_SEARCH&amp;quot;;
    } 
  if (command == &amp;quot;RC6_EXIT&amp;quot;) { 
    irsend.sendRC6(0x009FU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_EXIT&amp;quot;;
    } 
   if (command == &amp;quot;RC6_TVGUIDE&amp;quot;) { 
    irsend.sendRC6(0x00CCU + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_TVGUIDE&amp;quot;;
    } 
   if (command == &amp;quot;RC6_RIGHTMENU&amp;quot;) { 
    irsend.sendRC6(0x0057U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_RC6_RIGHTMENU&amp;quot;;
    } 
   if (command == &amp;quot;RC6_LIST&amp;quot;) { 
    irsend.sendRC6(0x00D2U + 0x10000U*rc6Toggle, 20U);
    rc6Toggle = 1U - rc6Toggle;
    displaymsg = &amp;quot;RC6_LIST&amp;quot;;
    } 
  if (displaymsg!=&amp;quot;&amp;quot;){
    #ifdef ARDUINO_M5Stick_C
    M5.Lcd.println(displaymsg);
    #endif
    }
  else {
    // default message : unknown
    displaymsg=&amp;quot;Unknown command&amp;quot;;
    }

  server.send(200, &amp;quot;text/plain&amp;quot;, message);
  digitalWrite(led, LEDOFF);
}

void handleNotFound() {
  digitalWrite(led, LEDON);
  String message = &amp;quot;File Not Found\n\n&amp;quot;;
  message += &amp;quot;URI: &amp;quot;;
  message += server.uri();
  message += &amp;quot;\nMethod: &amp;quot;;
  message += (server.method() == HTTP_GET) ? &amp;quot;GET&amp;quot; : &amp;quot;POST&amp;quot;;
  message += &amp;quot;\nArguments: &amp;quot;;
  message += server.args();
  message += &amp;quot;\n&amp;quot;;

  for (uint8_t i = 0; i &amp;lt; server.args(); i++) {
    message += &amp;quot; &amp;quot; + server.argName(i) + &amp;quot;: &amp;quot; + server.arg(i) + &amp;quot;\n&amp;quot;;
  }

  server.send(404, &amp;quot;text/plain&amp;quot;, message);
  digitalWrite(led, LEDOFF);
}



void setup() {
  #ifdef ARDUINO_M5Stick_C
  M5.begin();
  M5.Lcd.fillScreen(BLACK);
  M5.Axp.ScreenBreath(12);
   
  #endif

  irsend.begin();
  Serial.begin(115200, SERIAL_8N1);
  
  pinMode(led, OUTPUT);
  digitalWrite(led, LEDOFF);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println(&amp;quot;&amp;quot;);

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(&amp;quot;.&amp;quot;);
  }

  Serial.println(&amp;quot;&amp;quot;);
  Serial.print(&amp;quot;Connected to &amp;quot;);
  Serial.println(ssid);
  Serial.print(&amp;quot;IP address: &amp;quot;);
  Serial.println(WiFi.localIP());

  #ifdef ARDUINO_M5Stick_C
  M5.Lcd.println(WiFi.localIP());
  #endif

  if (MDNS.begin(host)) {
    Serial.println(&amp;quot;MDNS responder started&amp;quot;);
  }

  // Home page
  server.on(&amp;quot;/&amp;quot;, handleRoot);

  // /inline for tests
  server.on(&amp;quot;/inline&amp;quot;, []() {
    server.send(200, &amp;quot;text/plain&amp;quot;, &amp;quot;this works as well&amp;quot;);
  });

  // manage IR codes
  server.on(&amp;quot;/ir&amp;quot;, handleIR);    

  // updater : /update
  server.on(&amp;quot;/update&amp;quot;, HTTP_POST, []() {
      server.sendHeader(&amp;quot;Connection&amp;quot;, &amp;quot;close&amp;quot;);
      server.send(200, &amp;quot;text/plain&amp;quot;, (Update.hasError()) ? &amp;quot;FAIL&amp;quot; : &amp;quot;OK&amp;quot;);
      ESP.restart();
    }, []() {
      HTTPUpload&amp;amp; upload = server.upload();
      if (upload.status == UPLOAD_FILE_START) {
        Serial.setDebugOutput(true);
        Serial.printf(&amp;quot;Update: %s\n&amp;quot;, upload.filename.c_str());
        if (!Update.begin()) { //start with max available size
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_WRITE) {
        if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_END) {
        if (Update.end(true)) { //true to set the size to the current progress
          Serial.printf(&amp;quot;Update Success: %u\nRebooting...\n&amp;quot;, upload.totalSize);
        } else {
          Update.printError(Serial);
        }
        Serial.setDebugOutput(false);
      } else {
        Serial.printf(&amp;quot;Update Failed Unexpectedly (likely broken connection): status=%d\n&amp;quot;, upload.status);
      }
    });

  server.onNotFound(handleNotFound);
  server.begin();
  
  MDNS.addService(&amp;quot;http&amp;quot;, &amp;quot;tcp&amp;quot;, 80);

  Serial.printf(&amp;quot;Ready! Open http://%s.local in your browser\n&amp;quot;, host);
}

void loop() {
  server.handleClient();
  #ifdef ARDUINO_M5Stick_C
  if ( M5.BtnA.wasPressed() ){
      // send power if bigest button pressed.
      digitalWrite(led, LEDON);
      irsend.sendPronto(NadPower, 76, 3);
      M5.Lcd.println(&amp;quot;RCVR_POWER&amp;quot;);  
      digitalWrite(led, LEDOFF);  
    }
  M5.update();
  #endif
  delay(1);
}
&lt;/pre&gt;


&lt;h3&gt;Alternative matérielle avec un M5StickC&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/m5stick.jpg&quot; title=&quot;m5stick.jpg, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.m5stick_m.jpg&quot; alt=&quot;m5stick.jpg, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il y a quelques mois, j'avais fait un petit article sur un tout petit périphérique sympa : le M5StickC (&lt;a href=&quot;https://civade.com/post/2019/12/08/M5Stick-C-Une-petite-plateforme-de-d%C3%A9veloppement-IOT-%C3%A0-10-USD&quot;&gt;cliquer pour voir l'article&lt;/a&gt;) . Comme celui-ci a le bon gout d'implémenter un émetteur infrarouge intégré, le programme ci dessous était facile à modifier pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser l'émetteur infrarouge intégré&lt;/li&gt;
&lt;li&gt;Utiliser a led intégrée pour acquitter une transmission infrarouge&lt;/li&gt;
&lt;li&gt;Utiliser l'afficheur intégré pour afficher l'adresse ip du périphérique et le code Infrarouge recu&lt;/li&gt;
&lt;li&gt;Gérer le bouton pour envoyer un code local (ici, NAD Power On/Off)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;La portée n'est vraiment pas terrible, il faut que cela soit à moins d'un mètre. En tout cas, cela permet de tester et débugger le code. Pratique !&lt;/p&gt;


&lt;h3&gt;Sommaire des articles de la série:&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-télécommande-infrarouge&quot;&gt;IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-réception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi&quot;&gt;IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-Télécommande-Wifi-avec-Nodered-LIRC-ESP32&quot;&gt;IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
        
                  <comments>https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32#comment-form</comments>
          <wfw:comment>https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/115</wfw:commentRss>
              </item>
          <item>
        <title>IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi</title>
        <link>https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-r%C3%A9ception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi</link>
        <guid isPermaLink="false">urn:md5:f439ee65e350ce1e2f88e92ff321570a</guid>
        <pubDate>Sun, 02 May 2021 06:42:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Technologies</category>
                          <category>Arduino</category>
                  <category>Domotique</category>
                  <category>Embarqué</category>
                  <category>ESP32</category>
                  <category>ESP8266</category>
                  <category>Firmware</category>
                  <category>OpenSource</category>
                  <category>Raspberry</category>
                  <category>Sysadmin</category>
                <description>&lt;p&gt;Deuxième article de la série, nous allons maintenant utiliser le périphérique réalisé lors du premier article pour doter un système Linux (y compris Raspberry Pi ou Orange Pi) de capacités d'émission réception de codes infrarouge. Nous verrons également comment activer le récepteur infrarouge intégré à certaines Orange PI et configurer LIRC.&lt;/p&gt;          &lt;h3&gt;Installer Lirc et les outils complémentaires&lt;/h3&gt;

&lt;p&gt;A noter qu'en marge de ce tuto, vous pouvez vous documenter sur LIRC et son installation, par exemple sur &lt;a href=&quot;https://wiki.archlinux.org/title/LIRC&quot;&gt;https://wiki.archlinux.org/title/LIRC&lt;/a&gt;  ou &lt;a href=&quot;https://www.sigmdel.ca/michel/ha/opi/ir_02_en.html&quot;&gt;https://www.sigmdel.ca/michel/ha/opi/ir_02_en.html&lt;/a&gt;.&lt;/p&gt;


&lt;h4&gt;Installation des paquets Debian&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Installation de lirc et des outils complémentaires&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;sudo apt install -y lirc setserial ir-keytable&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Vérification des services lirc installés et de leur état :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
root@debian10:~# sudo systemctl status lirc*
● lircd.socket
   Loaded: loaded (/lib/systemd/system/lircd.socket; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-04-29 08:27:09 CEST; 3 days ago
   Listen: /run/lirc/lircd (Stream)
   CGroup: /system.slice/lircd.socket

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

● lircd.service - Flexible IR remote input/output application support
   Loaded: loaded (/lib/systemd/system/lircd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-04-29 08:27:11 CEST; 3 days ago
     Docs: man:lircd(8)
           http://lirc.org/html/configure.html
 Main PID: 785 (lircd)
    Tasks: 2 (limit: 2065)
   Memory: 1.9M
   CGroup: /system.slice/lircd.service
           └─785 /usr/sbin/lircd --nodaemon
&lt;/pre&gt;


&lt;p&gt;Les fichiers de configuration de lirc sont dans /etc/lirc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/etc/lirc/lirc_options.conf : configuration générale du driver et du périphérique de capture&lt;/li&gt;
&lt;li&gt;/etc/lirc/lircd.conf.d/ : répertoire contenant les configurations des différentes télécommandes supportées.&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Première configuration de LIRC pour périphérique de capture Agirs&lt;/h4&gt;


&lt;p&gt;Il va donc nous falloir repérer la liaison série sur laquelle le périphérique Agirs est détecté, vérifier son bon fonctionnement puis l'intégrer dans les fichier de config. Il faut tout d'abord le brancher sur un port USB de disponible, puis :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Détection du périphérique sur lequel est vu Agirs&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;dmesg | egrep --color 'serial|ttyS|ttyA'&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Le périphérique détecté apparait comme suit :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
 [    5.015854] systemd[1]: Created slice system-serial\x2dgetty.slice.
 [338051.139147] cdc_acm 7-1:1.0: __ttyACM0__: USB ACM device
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ici il est donc détecté en /dev/ttyACM0&lt;/li&gt;
&lt;li&gt;Ouvrir le terminal via screen&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
 screen /dev/ttyACM0
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Vous devriez être accueilli par la bannière de Girs&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
 GirsLite 1.0.3
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Vérifier la liste des modules supportés sur Agirs&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;modules&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Agirs renvoie la liste des modules supportés&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
 Base Transmit Capture Receive Decoder Led Parameters Pronto
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Lancer une reconnaissance de code IR (et appuyer sur une touche de la télécommande pointée vers le dispositif de capture...)&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;Receive&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Agirs répond avec les timings de la touche. Un + correspond à un front montant et un - à un front descendant. Le chiffre correspond au temps en microsecondes.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
 +8900 -4500 +550 -1650 +550 -550 +550 -550 +600 -550 +550 -550 +550 -550 +550 -600 +500 -600 +550 -550 +550 -1700 +550 -1650 +550 -1650 +600 -1650 +550 -1700 +550 -1650 +550 -1700 +550 -550 +550 -550 +550 -600 +500 -600 +550 -550 +550 -550 +550 -550 +600 -1650 +550 -1700 +500 -1700 +550 -1700 +550 -1650 +550 -1650 +600 -1650 +550 -1700 +500 -600 +550 -39500 +8900 -2200 +600 -50100
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Quitter screen: Taper  &lt;strong&gt;Ctr]&lt;/strong&gt;+&lt;strong&gt;a&lt;/strong&gt; puis  &lt;strong&gt;:quit&lt;/strong&gt; et &lt;strong&gt;ENTREE&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tester la bonne réception avec le bon driver sur agirs&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
 mode2 --driver girs --device /dev/ttyACM0
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Doit renvoyer une liste de pulses au format LIRC:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
 ...
 space 39500
 pulse 8900
 space 2250
 pulse 500
 space 50100
 ...
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Quitter mode 2 avec &lt;strong&gt;CTRL&lt;/strong&gt; + &lt;strong&gt;C&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A ce stade, nous avons pu vérifier qu'Agirs fonctionne convenablement et est bien vu par le système et LIRC. Il nous reste à l'intégrer dans le fichier de config de LIRC. Pour ce faire, éditer /etc/lirc/lirc_options.conf et remplacer les 2 lignes suivantes (en adaptant avec votre propre port bien sur)&lt;/p&gt;

&lt;pre&gt;driver          = girs
device          = /dev/ttyACM0&lt;/pre&gt;


&lt;p&gt;Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :&lt;/p&gt;
&lt;pre&gt;
 systemctl stop lircd.service
 systemctl stop lircd.socket
 systemctl start lircd.socket
 systemctl start lircd.service
 systemctl restart lircd-uinput.service
&lt;/pre&gt;


&lt;h4&gt;OU première configuration de LIRC pour récepteur IR intégré (Orange PI)&lt;/h4&gt;

&lt;p&gt;Si vous disposez d'une Orange Pi avec récepteur infrarouge intégré, vous pouvez bien sur ajouter Agirs comme à l'étape précédent OU utiliser ce récepteur intégré. Vous y perdrez la capacité d'émission, mais par contre vous utiliserez un périphérique interne, donc sans ajouter de hardware...  A vous  de voir en fonction du scénario d'usage que vous envisagez.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/OrangePiPcPlus.jpg&quot; title=&quot;OrangePiPcPlus.jpg, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.OrangePiPcPlus_m.jpg&quot; alt=&quot;OrangePiPcPlus.jpg, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il faut tout d'abord activer le périphérique de capture LIRC dans le noyau. Pour ce faire, lancer la commande&lt;/p&gt;
&lt;pre&gt;
 armbian-config
&lt;/pre&gt;

&lt;p&gt;Puis aller dans &quot;System&quot; /  &quot;Hardware&quot; /  &quot;CIR&quot; et l'activer. Quitter et rebooter l'Orange PI&lt;/p&gt;


&lt;p&gt;L'activation dans la config se fait en éditant le fichier /etc/lirc/lirc_options.conf&lt;/p&gt;
&lt;pre&gt;
 driver          = default
 device          = /dev/lirc0
&lt;/pre&gt;


&lt;p&gt;Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :&lt;/p&gt;
&lt;pre&gt;
 systemctl stop lircd.service
 systemctl stop lircd.socket
 systemctl start lircd.socket
 systemctl start lircd.service
 systemctl restart lircd-uinput.service
&lt;/pre&gt;


&lt;h3&gt;Configuration de LIRC&lt;/h3&gt;

&lt;h4&gt;Intégration des configurations de vos télécommandes&lt;/h4&gt;


&lt;p&gt;C'est l'étape un peu critique dans LIRC. Nous avons vu dans l'article précédent comment utiliser Agirs pour reconnaitre les codes de votre télécommande.&lt;/p&gt;


&lt;h5&gt;A partir d'une télécommande recensée en base de données&lt;/h5&gt;


&lt;p&gt;LIRC dispose d'une base de données en ligne avec un certain nombre de télécommande. On ne va pas se mentir, la base de données n'est pas fabuleusement bien maintenue. Il n'y a pas toutes les télécommandes, et parfois les fichiers de config sont un peu fantaisistes. Nous avons vu que l'on peut générer des signaux soit en mode intelligent en précisant un protocole et les données, soit en mode 'raw' ou les signaux sont émis comme une suite de 0 et de 1, sans comprendre à quoi ils servent (comme lorsqu'une télécommande programmable fonctionne en mode apprentissage). Si vous avez la chance que votre télécommande soit supportée et que le contributeur ait fait l'effort de décrire le fichier de config de façon à utiliser le protocole, c'est clairement le mieux.&lt;/p&gt;


&lt;p&gt;Pour rechercher dans la base de données, c'est assez simple, il suffit de taper irdb-get find suivi d'une chaine à chercher. Ce peut être la marque ou le modèle. Supposons que je cherche le fichier pour une télécommande NAD AVR-2 :&lt;/p&gt;

&lt;pre&gt;
root@debian10:~# irdb-get find nad
morgan&amp;#039;s_daytona/Tornado.lircd.conf
nad/451.lircd.conf
nad/AVR2.lircd.conf
nad/AVR2.lircd.conf
nad/CDP-5425.lircd.conf
nad/RC512.lircd.conf
nad/SR6.lircd.conf
nad/SR712.lircd.conf
&lt;/pre&gt;


&lt;p&gt;ou&lt;/p&gt;

&lt;pre&gt;
root@debian10:~# irdb-get find AVR2
harman_kardon/AVR210.irman.lircd.conf
harman_kardon/AVR240.lircd.conf
harman_kardon/AVR25.lircd.conf
nad/AVR2.lircd.conf
nad/AVR2.lircd.conf
&lt;/pre&gt;


&lt;p&gt;J'ai de la chance, le modèle est supporté et est dans nad/AVR2.lircd.conf. Je vais donc pouvoir le récupérer :&lt;/p&gt;

&lt;pre&gt;
 irdb-get download  nad/AVR2.lircd.conf
 Downloaded https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/nad/AVR2.lircd.conf as AVR2.lircd.conf
&lt;/pre&gt;


&lt;p&gt;Je vous encourage à revoir le fichier de config, &lt;strong&gt;avant de le copier dans /etc/lirc/lircd.conf.d/&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Il existe d'autres bases de données de codes de télécommande en ligne, mais qui vont nécessiter un peu de travail pour créer le fichier de config LIRC. &lt;a href=&quot;https://github.com/probonopd/irdb&quot;&gt;https://github.com/probonopd/irdb&lt;/a&gt; par exemple. Si je reprend mon exemple de télécommande NAD, en parcourant les répertoires par marque je trouve le fichier https://github.com/probonopd/irdb/blob/master/codes/NAD/Surround%20Processor/135%2C124.csv . Il décrit effectivement la plupart des commandes de ma télécommande en protocole NEC. Comme c'est un tableur CSV, il faut utiliser IR Scrutinizer pour créer chacun des codes (onglet generate), les copier dans l'onglet de génération de configuration (&quot;To Param Remote&quot;), puis lorsque la description de la télécommande est complete, l'exporter au format LIRC (&quot;Export Param Remote&quot; format &quot;LIRC&quot;.&lt;/p&gt;


&lt;p&gt;Remote Central (http://www.remotecentral.com) a pas mal de codes également, mais au format &quot;pronto&quot;. IL faut ensuite les convertir dans IR Scrutinizer, puis les décoder avec Scrutinize pour en faire quelque chose...&lt;/p&gt;


&lt;h5&gt;à Partir de votre propre config&lt;/h5&gt;


&lt;p&gt;Vous pouvez également fabriquer votre propre fichier de configuration avec IR Scrutinizer (voir l&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge&quot;&gt;e premier article de la série&lt;/a&gt; pour les bases de l'usage).
Tout d'abord, il peut être de bon ton d'utiliser des noms de fonctions standard dans linux. L'interfaçage avec des fonctions du système en sera simplifié. Si vous ne souhaitze pas déclencher des actions dans linux par votre télécommande, ce n'est pas indispensable, vous pouvez les nommer comme bon vous semble.&lt;/p&gt;


&lt;p&gt;Pour obtenir la liste des codes standards dans LIRC, il vous suffit de faire :&lt;/p&gt;
&lt;pre&gt;
irrecord --list-namespace
&lt;/pre&gt;


&lt;p&gt;Une longue liste de noms s'en suivra.. Vous pouvez la copier coller dans un fichier texte pour référence lors de la constitution de votre fichier de configuration de télécommande.&lt;/p&gt;


&lt;p&gt;Une fois la configuration de toutes les touches décrite dans l'onglet Scrutinize Remote, soit dans l'onglet &quot;Parametric remote&quot; si le protocole est connu/supporté, soit dans l'onglet &quot;Raw remote&quot; si le protocole est inconnu, vous allez pouvoir aller dans l'onglet d'exportation et choisir le format LIRC Raw (pour une télécommande &quot;Raw&quot;, ou une sortie &quot;Raw&quot; sur une télécommande &quot;Parametric&quot;), soit le format LIRC (pour une télécommande &quot;Parametric&quot; uniquement ) puis cliquer sur le bouton correspondant à votre formar (&quot;Export Parametric Remote&quot; ou &quot;Export Raw remote&quot;). Une boite de dialogue va s'ouvrir pour vous demander de documenter votre format :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/export-name.png&quot; title=&quot;export-name.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/export-name.png&quot; alt=&quot;export-name.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;A l'issue de l'export, la fenêtre de status vous indique ou le fichier a été écrit et comment ils se nomme :&lt;/p&gt;

&lt;pre&gt;File C:\Users\jpcivade\Documents\IrScrutinizer\lirc_2021-05-06_07-20-01.lircd.conf was successfully written&lt;/pre&gt;


&lt;p&gt;Si l'on ouvre ce fichier avec un éditeur de texte, on va pouvoir voir plusieurs sections.  Le documentation est ici : https://www.lirc.org/html/lircd.conf.html . La première est une section de commentaires, basées sur les informations d’identification saisies précédemment :&lt;/p&gt;
&lt;pre&gt;
# IrScrutinizer parametric export
#
# Creating tool: IrScrutinizer version 2.3.0
# Creating user: jpcivade
# Creating date: Thu May 06 07:20:01 CEST 2021
# Encoding: WINDOWS-1252
#
# Manufacturer: NONAME
# Model: IR-005
# Displayname: LED-IR-005
# Device Class: 
# Remotename: 
#

# Protocol name: NEC1
&lt;/pre&gt;


&lt;p&gt;La seconde est une section de description du protocole. La voici agrémentée de commentaires pour vous aider à comprendre les différentes directives :&lt;/p&gt;

&lt;pre&gt;
# Début de la configuration d&amp;#039;une télécommande
begin remote
# Nom dans LIRC
	name		LED-IR-005-nec1
# Le format fait 32 bits
	bits		32
# L&amp;#039;encodage utilisé repose sur la longeur de l&amp;#039;espace après l&amp;#039;impulsion de bit. 
# La trame est de longeur constante quelle que soient les données. 
	flags		SPACE_ENC|CONST_LENGTH
# tolérance relative d&amp;#039;erreur en  %
	eps		30
# tolérance d&amp;#039;erreur absulue en  uS
	aeps		100
#  Longeur de l&amp;#039;impulsion et de l&amp;#039;espace qui définissent un zéro (en microsecondes)
	zero		564	564
#  Idem pour un 1
	one		564	1692
# Impulsion précédant les données utiles (longueur de l’impulsion puis de l&amp;#039;espace en microsecondes)
	header		9024	4512
# Impulsion de fin, qui suit les données (longueur en us).
	ptrail		564
# Format de l’impulsion qui code une répétition de code (longueur de l’impulsion puis de l&amp;#039;espace en microsecondes)
	repeat		9024	2256
# espacement minimum entre 2 codes
	gap		108000
# Fréquence d&amp;#039;émission.  Il peut pourrait être sage de le corrige et mettre 38000 (38Khz) qui est plus standard.
	frequency	38400
# Ici commencent les codes
	begin codes
# Pour chaque touche, le code à transmettre.
		KEY_POWER		0x00000000807F01FE
		KEY_MODE		0x00000000807F41BE
		KEY_VOLUMEUP		0x00000000807F21DE
		KEY_BRIGHTNESSUP	0x00000000807FA15E
		KEY_DELAY		0x00000000807F619E
		KEY_VOLUMEDOWN		0x00000000807F11EE
		KEY_BRIGHTNESSDOWN	0x00000000807F916E
		KEY_CLEARDELAY		0x00000000807F51AE
		KEY_REDPLUS		0x00000000807F31CE
		KEY_GREENPLUS		0x00000000807FB14E
		KEY_BLUEPLUS		0x00000000807F718E
		KEY_REDMINUS		0x00000000807F09F6
		KEY_GREENMINUS		0x00000000807F8976
		KEY_BLUEMINUS		0x00000000807F49B6
		KEY_CLEAR		0x00000000807F29D6
		KEY_COLOR		0x00000000807FA956
		KEY_SAVE		0x00000000807F6996
	end codes
end remote
&lt;/pre&gt;


&lt;p&gt;J'ai plusieurs remarques à faire sur le format. Ici, il s'agit d'une petite télécommande format carte de crédit qui était livrée avec des bandeaux de Led. C'est au format NEC1 (2 octets).
Chaque touche, est exprimée en 4 octets (les 2 octets et leur complément à 1, voir article précédent de la série pour un décodage NEC expliqué). Or, le code d'équipement est constant sur toutes les touches (807F). Il aurait probablement été plus simple de le matérialiser avec un entête constant de 16 bits (code équipement) pour ne garder que 16 bits sur les codes de touche.&lt;/p&gt;


&lt;p&gt;Voici la configuration (sans les commentaires) remaniée pour tenir compte de ces remarques. A noter le passage en 16 bits au lieu de 32, et l'ajout d'un &quot;pre_data&quot; de 16 bits avec le code de l'équipement. Les codes quand à eux sont exprimés sur 16 bits également au lieu des 64 bits vus précédemment. C'est quand même plus lisible non? :&lt;/p&gt;
&lt;pre&gt;
begin remote
	name		LED-IR-005
	bits		16
	flags		SPACE_ENC|CONST_LENGTH
	eps		30
	aeps		100
	zero		564	564
	one		564	1692
	header		9024	4512
	ptrail		564
	repeat		9024	2256
	gap		108000
#	Equipement code 0x80 0d128
	pre_data_bits   16
	pre_data       	0x807F

	frequency	38000
	begin codes
		KEY_POWER		0x01FE
		KEY_MODE		0x41BE
		KEY_VOLUMEUP		0x21DE
		KEY_BRIGHTNESSUP	0xA15E
		KEY_DELAY		0x619E
		KEY_VOLUMEDOWN		0x11EE
		KEY_BRIGHTNESSDOWN	0x916E
		KEY_CLEARDELAY		0x51AE
		KEY_REDPLUS		0x31CE
		KEY_GREENPLUS		0xB14E
		KEY_BLUEPLUS		0x718E
		KEY_REDMINUS		0x09F6
		KEY_GREENMINUS		0x8976
		KEY_BLUEMINUS		0x49B6
		KEY_CLEAR		0x29D6
		KEY_COLOR		0xA956
		KEY_SAVE		0x6996
	end codes
end remote
&lt;/pre&gt;


&lt;p&gt;Cela n'apporte rien d'un point de vue fonctionnel, à part la correction sur la fréquence de transmission que l'on a remise à 38Khz. Par contre, c'est plus facile à lire et maintenir.&lt;/p&gt;


&lt;p&gt;Cette télécommande étant sérigraphiée &quot;LED-IR-005&quot;, nous allons nommer ce fichier led-ir005.lircd.conf&lt;strong&gt; et le copier dans  /etc/lirc/lircd.conf.d/&lt;/strong&gt; pour l'intégrer à LIRC.&lt;/p&gt;


&lt;h4&gt;Vérification des codes supportés&lt;/h4&gt;


&lt;p&gt;A l'étape précédente, nous avons copié au moins un fichier dans le répertoire  /etc/lirc/lircd.conf.d/ qui contient les configurations des télécommandes. Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :&lt;/p&gt;
&lt;pre&gt;
 systemctl stop lircd.service
 systemctl stop lircd.socket
 systemctl start lircd.socket
 systemctl start lircd.service
 systemctl restart lircd-uinput.service
&lt;/pre&gt;


&lt;h4&gt;Tests&lt;/h4&gt;


&lt;p&gt;Tout d'abord, nous allons interroger la configuration mise en place pour savoir quels sont les télécommandes dont la configuration a été intégrée/comprise dans lirc aux étapes précédentes. Ici nous avons 4 télécommandes, dont 2 comprises dans un même fichier (NAD) car c'est une télécommande multifonction avec un petit interrupteur pour passer du mode DVD au mode AMPLI.&lt;/p&gt;
&lt;pre&gt;
root@debian10:/etc/lirc/lircd.conf.d# irsend LIST &amp;quot;&amp;quot; &amp;quot;&amp;quot;

DENON_RC920-denon
LED-IR-005
NAD_AVR2-RCVR
NAD_AVR2-DVD
&lt;/pre&gt;


&lt;p&gt;On peut descendre plus bas, en listant les codes supportés par une télécommande en particulier. Ici nous allons demander les codes de la petite télécommande format carte de crédit qui était utilisée sur le pilotage d'un bandeau de led :&lt;/p&gt;
&lt;pre&gt;
root@debian10:/etc/lirc/lircd.conf.d# irsend LIST &amp;quot;LED-IR-005&amp;quot; &amp;quot;&amp;quot;

00000000807f01fe KEY_POWER
00000000807f41be KEY_MODE
00000000807f21de KEY_VOLUMEUP
00000000807fa15e KEY_BRIGHTNESSUP
00000000807f619e KEY_DELAY
00000000807f11ee KEY_VOLUMEDOWN
00000000807f916e KEY_BRIGHTNESSDOWN
00000000807f51ae KEY_CLEARDELAY
00000000807f31ce KEY_REDPLUS
00000000807fb14e KEY_GREENPLUS
00000000807f718e KEY_BLUEPLUS
00000000807f09f6 KEY_REDMINUS
00000000807f8976 KEY_GREENMINUS
00000000807f49b6 KEY_BLUEMINUS
00000000807f29d6 KEY_CLEAR
00000000807fa956 KEY_COLOR
00000000807f6996 KEY_SAVE
&lt;/pre&gt;


&lt;p&gt;Si vous avez mis en périphérique réalisé dans le premier article du tuto (Agirs) et que celui-ci est bien configuré, vous pourez envoyer des codes infrarouge par la commande suivante. Cela ne sera bien sur pas supporté avec le récepteur intégré à l'orange pi, car il n'y a pas la fonction émission :&lt;/p&gt;

&lt;pre&gt;
irsend SEND_ONCE NAD_AVR2-RCVR RCVR_POWER
&lt;/pre&gt;


&lt;p&gt;Ici, nous allons envoyer une fois (SEND_ONCE ) un code d'allumage/extinction de l'appareil &quot;RCVR_POWER&quot; à l'ampli NAD &quot;NAD_AVR2&quot;. Toutes les constantes de nom de code ou de télécommande auront bien sur été relevées par les commandes précédentes.&lt;/p&gt;


&lt;p&gt;Il est également possible de tester la réception de codes infrarouge. Une commande spécifique permet de lire le socket et d'afficher les codes reçus. Il suffit de lancer &quot;irw&quot; et de pointer l'une des télécommandes configurées sur le récepteur. Le code est affiché à chaque réception ;&lt;/p&gt;

&lt;pre&gt;
root@debian10:~# irw
00000000e13e01fe 00 RCVR_POWER NAD_AVR2-RCVR
00000000e13e01fe 01 RCVR_POWER NAD_AVR2-RCVR
00000000e13e01fe 02 RCVR_POWER NAD_AVR2-RCVR
&lt;/pre&gt;


&lt;p&gt;Le premier nombre, nous donne le code recu sur la télécommande. Ici (protocole NEC2), le code Apareil est E1, le code fonction est 3E, et le code touche 01FE,.
L'octet seul ensuite, nous donne le nombre de répétition. COMme je me suis un peu endori sur la touche, il voit l'appui (00) initial et 2 répétitions (01 et 02).
Enfin, viennent en clair le nom la touche (RCVR_POWER ) et  de l'appareil (NAD_AVR2-RCVR).&lt;/p&gt;


&lt;p&gt;Notre LIRC recoit désormais les codes infrarouges émis par nos télécommandes!&lt;/p&gt;


&lt;h3&gt;Utilisation avancée&lt;/h3&gt;

&lt;h4&gt;Déclencher des actions dans l'OS par des codes infrarouges&lt;/h4&gt;

&lt;p&gt;Il est possible de déclencher des actions dans le système d'exploitation via la télécommande infrarouge.
Pour ce faire, il faut créer un fichier de configuration /etc/lirc/irexec.lircrc qui va contenir autant de bloc comme celui ci que de commandes souhaitées.&lt;/p&gt;

&lt;pre&gt;
begin
    prog = irexec
    remote = LED-IR-005
    button = KEY_MODE
    config = /usr/sbin/shutdown -h now
    repeat = 1
end

begin
    prog = irexec
    remote = LED-IR-005
    button = KEY_POWER
    config = /usr/sbin/shutdown -r now
    repeat = 1
end

&lt;/pre&gt;


&lt;p&gt;Ici, j'ai assigné le bouton Power à l'arrêt du système, et le bouton mode à un reboot. En adaptant 'button' et 'config' vous pouvez pratiquement faire n'importe quoi.
Peut être pour éviter de rebooter une commande &quot;echo KEY_POWER&quot; pourrait être une bonne idée...&lt;/p&gt;


&lt;p&gt;Pour que cela fonctione, il faut lancer irexec en mode daemon avec&lt;/p&gt;
&lt;pre&gt;
 irexec -d
&lt;/pre&gt;


&lt;p&gt;Si tout fonctionne il ne vous reste plus qu'à rendre permanent le démarrage du service avec&lt;/p&gt;
&lt;pre&gt;
systemctl inlircd-uinput.service
&lt;/pre&gt;


&lt;p&gt;Maintenant, votre télécommande contrôle certaines fonctions du système et notamment permet d'arrêter ou de redémarrer une raspberry sans se logger. Pratique !&lt;/p&gt;


&lt;p&gt;Cet tout pour ce 2e volet, mais vous pourrez encore creuser le sujet qui offre de nombreuses possibilités en consultant la &lt;a href=&quot;https://www.lirc.org/html/&quot;&gt;documentation de LIRC&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Sommaire des articles de la série:&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-télécommande-infrarouge&quot;&gt;IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32&quot;&gt;IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-Télécommande-Wifi-avec-Nodered-LIRC-ESP32&quot;&gt;IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
        
                  <comments>https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-r%C3%A9ception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi#comment-form</comments>
          <wfw:comment>https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-r%C3%A9ception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/114</wfw:commentRss>
              </item>
          <item>
        <title>IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge</title>
        <link>https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge</link>
        <guid isPermaLink="false">urn:md5:eef3a65c245693faf0beaef402d067f5</guid>
        <pubDate>Sun, 02 May 2021 06:38:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Technologies</category>
                          <category>Arduino</category>
                  <category>Domotique</category>
                  <category>Embarqué</category>
                  <category>ESP32</category>
                  <category>ESP8266</category>
                  <category>Firmware</category>
                  <category>OpenSource</category>
                  <category>Raspberry</category>
                  <category>Sysadmin</category>
                <description>&lt;p&gt;Avant de pouvoir décoder et émettre des signaux infrarouge qui soient compris de vos appareils, il va d'abord nous falloir comprendre comment ceux ci sont générés /  envoyés / décoder.&lt;/p&gt;          &lt;h3&gt;Un peu de théorie :&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/remotes.jpg&quot; title=&quot;remotes.jpg, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.remotes_m.jpg&quot; alt=&quot;remotes.jpg, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;L'objectif d'une télécommande Infrarouge, est de permettra la transmission de plusieurs octets vers un équipement. Sur les protocoles les plus simples, il y aura un octet d'adresse de périphérique, et un octet de données, mais certains protocoles codent l'adresse sur 2 octets, ou ajoutent un troisième octet de code de sous fonction dans l'équipement. Un octet peut prendre les valeurs 0 à 255.&lt;/p&gt;


&lt;p&gt;Pour permettre l'envoi de données avec de la simple lumière, ces données doivent être sérialisées, c'est à dire transmises bit à bit dans leur représentation binaire.
Ainsi le nombre  décimal 252 (0xAA en hexadécimal) se représentera 0b10101010 en binaire. En envoyant de la lumière pour un 1 et pas de lumière pour un zéro, et en transmettant les bits uns à uns, on a un moyen de faire de la transmission de données.&lt;/p&gt;


&lt;p&gt;C'est d'ailleurs ce procédé qui est utilisé dans le Lifi, ou réseau informatique par la lumière ( voir &lt;a href=&quot;https://en.wikipedia.org/wiki/Li-Fi&quot;&gt;https://en.wikipedia.org/wiki/Li-Fi&lt;/a&gt; ). Mais c'est une autre histoire...&lt;/p&gt;


&lt;h4&gt;Bits, Bytes, Octets, MSB et LSB :&lt;/h4&gt;


&lt;p&gt;Pour ceux qui ne maitrisent pas ces conversions, tous les systèmes d'exploitation modernes disposent d'une calculatrice intégrée, dont on peut changer le mode d'affichage pour faire ce type de conversions (ex sous Windows 10, en choisissant le mode &quot;Programmeur en haut à gauche). A noter que l'on adjoint souvent un préfixe permettant de savoir dans quelle base le nombre est écrit (0x = hexadécimal, 0d = décimal, 0o = Octal, et 0b = binaire). Il est ainsi plus facile de savoir à quelle représentation on a affaire.&lt;/p&gt;


&lt;p&gt;Lorsque nous notons des nombres, le chiffre qui a le plus de poids est à gauche. Il s'appelle le MSB (ou most significant Bit/Byte). Celui qui a le moins de poids s'appelle le LSB (ou Less Significant Bit/Byte). A noter que l'on peut parler de MSB pour des octets (Byte) lorsqu'il en a plusieurs, aussi bien que pour des Bits (valeur la plus élémentaire en binaire).&lt;/p&gt;


&lt;p&gt;Ainsi lorsque nous notons 0xABCD, le MSB (ou octet de poids fort) est 0xAB, et 0xCD correspond à l'octet de poids faible. De la même manière, lorsque l'on note 0b10000000 le 1 correspond au MSB et le zéro le plus à droite au LSB.&lt;/p&gt;


&lt;p&gt;Désolé pour ces notions, mais nous en aurons besoin plus tard...&lt;/p&gt;


&lt;h4&gt;Convertir des bits en lumière et introduction de la modulation:&lt;/h4&gt;


&lt;p&gt;Nous avons donc un moyen de convertir une valeur numérique en train d'impulsion lumineuses.  Effectivement, on pourrait se contenter d'émettre dans l'infrarouge avec un protocole simpliste (ex : 1 = de la lumière, 0 = pas de lumière) à la façon du morse. Malheureusement, c'est une fausse bonne idée. En effet, même si l’œil n'est pas capable de détecter l'infrarouge, nous baignons dedans... Lumière solaire, etc.. seraient autant de perturbations qui rendraient le code invalide.  C'est très précisément pour cela qu'a été introduite la notion de modulation.&lt;/p&gt;


&lt;p&gt;Une modulation à haute fréquence est introduite sur le signal. Celle ci peut être à  30  kHz,  33  kHz,  36  kHz,  38  kHz,  40  kHz, et 56 kHz. Les plus fréquentes sont à 36 ou 38Khz. Les récepteurs infrarouge intègrent un étage de démodulation, qui permet de disposer d'une bonne immunité au bruit (lumières environnantes parasites qui elles ne sont pas modulées..).&lt;/p&gt;


&lt;p&gt;Merci à SBProjects.com pour le gif et toutes les infos sur l'infrarouge :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/irmod.gif&quot; title=&quot;irmod.gif, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/irmod.gif&quot; alt=&quot;irmod.gif, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La chaine complète de traitement se comporte comme suit :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/Arduino-IR-Remote-Receiver-Tutorial-IR-Signal-Modulation.png&quot; title=&quot;Arduino-IR-Remote-Receiver-Tutorial-IR-Signal-Modulation.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.Arduino-IR-Remote-Receiver-Tutorial-IR-Signal-Modulation_m.png&quot; alt=&quot;Arduino-IR-Remote-Receiver-Tutorial-IR-Signal-Modulation.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Note importante :&lt;/strong&gt; Il va être important de savoir a quelle fréquence de modulation une télécommande émet, car il faudra choisir le récepteur avec démodulateur intégré de la même fréquence, sous peine d'avoir une portée très limitée.   A noter que même si la différence de fréquence de modulation semble faible (ex : 36 versus 38 Khz), l'étage de démodulation est suffisamment performant pour pratiquement exclure la modulation adjacente...&lt;/p&gt;


&lt;h4&gt;Encodage des uns et des zéros&lt;/h4&gt;


&lt;p&gt;Différents types d'encodage existent pour coder des uns et des zéros à partir d'un signal électrique ou lumineux :&lt;/p&gt;


&lt;p&gt;Distance d'impulsion : une impulsion de longueur fixe, est suivie d'un espace dont la longueur est représentative d'un un ou un zéro.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/pulse-distance.png&quot; title=&quot;pulse-distance.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.pulse-distance_m.png&quot; alt=&quot;pulse-distance.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Largeur d'impulsion : une impulsion de largeur variable est suivie d'un espace de longueur fixe. La largeur de l'impulsion représente un un ou un zéro.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/pulse-width.png&quot; title=&quot;pulse-width.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.pulse-width_m.png&quot; alt=&quot;pulse-width.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Encodage par position d'impulsion (NRZ) : le temps est divisé en espaces de longueur fixe. La présence d'une impulsion représente un 1, tandis que son absence représente un zéro.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/pulse-position.png&quot; title=&quot;pulse-position.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.pulse-position_m.png&quot; alt=&quot;pulse-position.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Encodage Manchester (Biphase) : Chaque bit est divisé en 2 demi bits. La transition d'un zéro à un un représente un 1 zéro logique, tandis que la transition d'un 1 à un zéro représente un 1 logique.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/manchester.png&quot; title=&quot;manchester.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.manchester_m.png&quot; alt=&quot;manchester.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Beaucoup de codages infrarouge reposent sur le codage par largeur d'impulsion. C'est par exemple le cas de Nec, RC6, et Denon sur lesquels j'ai pu investiguer&lt;/p&gt;


&lt;h4&gt;MSB et LSB dans une transmission IR&lt;/h4&gt;


&lt;p&gt;Le dernier point restant à voir est l'ordre de transmission des bits. En effet, selon les protocoles, ce n'est pas constant.... Le protocole Nec, par exemple, transmet les LSB (ou bits de poids faible) d'abord... Cela oblige à une petite gymnastique pour remettre les bits dans l'ordre.  C'est l'inverse pour les protocole RC6.&lt;/p&gt;


&lt;h3&gt;Exemple de décodage avec le protocole NEC&lt;/h3&gt;


&lt;p&gt;Le protocole de transmission Infrarouge de NEC utilise l'encodage de distance d'impulsion pour chaque bit. Chaque impulsion fait  562.5µs, à une fréquence de porteuse de 38kHz (26.3µs).  Les bits sont transmis comme suit :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;'0' logique – une impulsion de 562.5µs suivie par un espace de 562.5µs soit un temps total de transmission de 1.125ms&lt;/li&gt;
&lt;li&gt;'1' logique – une impulsion de 562.5µs suivie d'un espace de 1.6875ms soit un temps de transmission total de 2.25ms&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Lorsque une touche est appuyée sur la télécommande, un message est transmis avec dans l'ordre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Une impulsion de 9ms pour matérialiser le démarrage de la trame (16 X la longueur d'un bit de données)&lt;/li&gt;
&lt;li&gt;Un espace de 4.5ms&lt;/li&gt;
&lt;li&gt;Les 8 bits d'adresse du périphérique&lt;/li&gt;
&lt;li&gt;L'inverse bit à bit de l'adresse logique&lt;/li&gt;
&lt;li&gt;Les 8 bits de la commande&lt;/li&gt;
&lt;li&gt;L'inverse bit à bit de la commande&lt;/li&gt;
&lt;li&gt;Une impulsion finale de 562.5µs pour signifier la fin de la transmission&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Les 4 octets sont transmis avec le LSB (ou bit de poids le plus faible) d'abord. Le schéma ci dessous illustre le format d'une transmission  NEC avec une adresse de 00h (00000000b) et une commande 0xAD (0b10101101):&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/NECMessageFrame.png&quot; title=&quot;NECMessageFrame.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/NECMessageFrame.png&quot; alt=&quot;NECMessageFrame.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Les bits de la commande ou de l'adresse sont transmis dans l'ordre ( LSB ) 1 0 1 1 0 1 0 1 ( MSB ). Il faut dont les lire de droite à gauche pour reformer la commande originale ( MSB )  1 0 1 0 1 1 0 1 ( LSB ) , soit 0xAD ou 173 en décimal.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Code de répétition :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Si la touche de la télécommande reste appuyée, un code de répétition est envoyé, typiquement 40ms après l'impulsion de fin de message.. Ce code de répétitionn sera envoyé à des intervalles de 108ms jusqu'à ce que la touche soit relancée. Ce code de répétition est constitué, dans l'ordre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;D'une impulsion de départ de 9ms&lt;/li&gt;
&lt;li&gt;D'un espace de 2.25ms&lt;/li&gt;
&lt;li&gt;D'une impulsion de 562.5µs pour marquer la fin de la transmission&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Voici un exemple avec deux répétitions du code :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/NECRepeatCodes.png&quot; title=&quot;NECRepeatCodes.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/NECRepeatCodes.png&quot; alt=&quot;NECRepeatCodes.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Protocole NEC1 ou NEC2 ?&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Une particularité du protocole NEC est que la longueur des trames est constante puisque pour chaque un transmis il y a aussi un zéro.  Chaque octet étant transmis 2 fois (une fois normalement et une fois en complément à 1), cela permet de vérifier que la réception n'a pas été endommagée.&lt;/p&gt;


&lt;p&gt;Toutefois, ce protocole étant très utilisé sur de nombreux périphériques, il est apparu qu'un seul octet pour l'adresse devenait insuffisant. Le complément de commande a donc été remplacé dans une évolution du protocole par un 2e octet d'adresse, en sacrifiant la redondance et la transmission de longueur fixe. Cette 2e version est souvent appelée NEC2, et la première NEC1.&lt;/p&gt;


&lt;p&gt;Les 2 versions du protocole sont activement utilisées.&lt;/p&gt;


&lt;h3&gt;Réalisation d'un dispositif de capture et décodage de codes infrarouges&lt;/h3&gt;


&lt;p&gt;Il y a beaucoup de choses publiées sur internet concernant la capture, le décodage, l'émission de codes infrarouge. Je voulais un dispositif réutilisable avec un logiciel d'analyse qui permette de faire de l'analyse sur de multiples télécommandes. Le logiciel IR Scrutinizer (oui, non à chier..) associé au périphérique de capture DIY à base d'Arduino m'ont parus être un bon compromis. Fonctionnant en Java sur toutes les plateformes, il permet la capture, visualisation, fabrication de fichiers de config et même émission de codes.&lt;/p&gt;


&lt;p&gt;Le périphérique de capture quand à lui est facile à fabriquer, utilisables sur n'importe quel ordinateur et même en périphérique externe pour LIRC sous Linux...&lt;/p&gt;


&lt;h4&gt;Le matériel et le logiciel embarqué&lt;/h4&gt;


&lt;p&gt;Le matériel est très facile à fabriquer. Reposant sur une Arduino Nano, il permet la réception via 2 récepteurs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'un pour l'analyse de trames, sans démodulateur, ce qui permet d'analyser la fréquence de la porteuse.&lt;/li&gt;
&lt;li&gt;L'un pour la réception de codes, avec un démodulateur 38Khz&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Il dispose également de leds infrarouge pour émission de signaux infrarouge, soit les signaux capturés, et même des signaux générés à l'aide du générateur intégré.&lt;/p&gt;


&lt;p&gt;Enfin, plusieurs leds permettent de visualiser l'état du périphérique.&lt;/p&gt;


&lt;p&gt;Sa réalisation est détaillée ICI : &lt;a href=&quot;http://www.harctoolbox.org/arduino_nano.html&quot;&gt;http://www.harctoolbox.org/arduino_nano.html&lt;/a&gt;. J'ai trouvé le matériel sur le site TME.eu, à l'exception du récepteur démodulé &quot;TSOP34438&quot; que j'ai remplacé par un &quot;TSOP34338&quot; pratiquement équivalent.&lt;/p&gt;


&lt;p&gt;A noter qu'il repose sur le programme AGIRS  ( &lt;a href=&quot;https://github.com/bengtmartensson/AGirs&quot;&gt;https://github.com/bengtmartensson/AGirs&lt;/a&gt; ) qui supporte beaucoup plus de fonctionnalités, comme Arduino Leonardo ou Pro micro, Arduino Mega avec Shield ethernet, etc.. Donc pour ceux qui veulent aller plus loin, c'est possible... et c'est prévu.&lt;/p&gt;


&lt;p&gt;C'est d'ailleurs ce que j'ai fait sur arduino Pro Micro (compatible Leonardo) en ajoutant une led de status aux 3 déjà gérées, et un buffer sur les leds Infrarouge afin de leur faire cracher 100 ma. L'émetteur est désormais assez puissant pour taper à une distance de 6/7 mètres.&lt;/p&gt;


&lt;p&gt;Vue de l'émeteur / récepteur Agirs à base d'Arduino pro micro:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/agirs.jpg&quot; title=&quot;agirs.jpg, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.agirs_m.jpg&quot; alt=&quot;agirs.jpg, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Logiciel de capture de trames et décodage : IRScrutinizer&lt;/h4&gt;


&lt;h5&gt;Installation du logiciel et premiers pas&lt;/h5&gt;

&lt;p&gt;Il va tout d'abord télécharger et installer le logiciel à partir du site &lt;a href=&quot;http://www.harctoolbox.org/downloads/index.html&quot;&gt;http://www.harctoolbox.org/downloads/index.html&lt;/a&gt;  (exemple &quot;IrScrutinizer 1.1.3 setup.exe for Windows&quot; ).&lt;/p&gt;


&lt;p&gt;Ensuite à va vous falloir lancer le logiciel et configurer le périphérique de capture. Pour cela allez dans l'onglet &quot;Sending Hw&quot; (1),  le sous onglet &quot;Girs Client&quot; (2), sélectionnez le port série ou le dispositif Agirs est raccordé (3), et cliquez sur &quot;connect&quot; (4). Un message avec la version d'Agirs devrait apparaitre en (5).&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/irscrutinizer-config.png&quot; title=&quot;irscrutinizer-config.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.irscrutinizer-config_m.png&quot; alt=&quot;irscrutinizer-config.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Placez la télécommande à capturer devant les capteurs :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/positionnement-telecommande.jpg&quot; title=&quot;positionnement-telecommande.jpg, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.positionnement-telecommande_m.jpg&quot; alt=&quot;positionnement-telecommande.jpg, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il est maintenant temps de procéder à votre première capture. Allez dans l'onglet &quot;Scrutinize signal&quot;(1).  Appuyez ensuite sur &quot;record&quot; (2)  puis sur une touche de la télécommande. Après capture et décodage, 'lécran se présente comme suit :&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/irscrutinizer-capture.png&quot; title=&quot;irscrutinizer-capture.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.irscrutinizer-capture_m.png&quot; alt=&quot;irscrutinizer-capture.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le code reconnu est affiché en (3).. Ici, nous avons un protocole NEC1, avec 1 octet d'adresse et un octet de commande. Une fenêtre de visualisation montre ce qui a été reconnu (4).  On voit également en (5) les longueurs en microsecondes des impulsions, ainsi que la fréquence de modulation (ici 38.461Khz).&lt;/p&gt;


&lt;p&gt;Dans le graphe, on voir une impulsion à la fin qui est un &quot;repeat code&quot;, comme expliqué dan sle décodage Nec plus haut. On le retrouve indiqué dans la valeur décodée ( NEC1: {D=1,F=128}, beg=0, end=71,&lt;strong&gt; reps=1&lt;/strong&gt; )&lt;/p&gt;


&lt;p&gt;A noter que dans le menu &quot;Options&quot;, j'ai coché &quot;Verbose&quot;, ce qui me permet d'avoir dans le champ &quot;IRP&quot; une version un peu plus bavarde, notamment avec la version binaire de ce qui a été récupéré :&lt;/p&gt;


&lt;p&gt;{38.5k,543,msb}&amp;lt;1,-1|1,-3&amp;gt;(8901u,-8,A:32,1,-39.574m,8901u,-3,1,-65m){A=0b10000000011111110000000111111110}&lt;/p&gt;


&lt;p&gt;Si nous nous attachons à cette version binaire, et extrayons 8 par 8 les bits, puis les retournons (n'oubliez pas: NEC transmet les LSB en premier..) nous avons :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A=0b10000000011111110000000111111110&lt;/li&gt;
&lt;li&gt;Premier octet : 10000000 . Remis avec le LSB à droite : 00000001. &lt;strong&gt;Valeur d'adresse = 0x01 soit 1 en décimal.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Deuxième octet : 01111111 . C'est bien le strict complément à un du 1er octet. fin de traitement.&lt;/li&gt;
&lt;li&gt;Troisième octet : 00000001 . Remis avec le LSB à droite : 10000000. &lt;strong&gt;Valeur de touche appuyée = 0x80 soit 128 en décimal.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Quatrième octet : 11111110 . C'est bien le strict complément à un du 1er octet. fin de traitement.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Nous retrouvons donc bien ce qui nous est indiqué comme valeur décodée ( NEC1: {D=1,F=128}, beg=0, end=71, reps=1 )&lt;/p&gt;


&lt;p&gt;Voici un exemple de décodage réalisé avec le protocole NEC2, c'est à dire une une adresse d'équipement (D), une adresse de sous système (S) et un code de fonction (F), ici avec la touche Power d'une télécommande d'un Ampli AV NAD :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/nec1.png&quot; title=&quot;nec1.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.nec1_m.png&quot; alt=&quot;nec1.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h5&gt;Décodages complexes&lt;/h5&gt;


&lt;p&gt;Pour d'autres protocole, c'est parfois plus difficile de comprendre. J'ai par exemple mis un moment sur le protocole Denon (variante du protocole Sharp), qui est moins bien documenté sur internet :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/ir/denon.png&quot; title=&quot;denon.png, mai 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/ir/.denon_m.png&quot; alt=&quot;denon.png, mai 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;J'ai trouvé sur le net une doc qui n'est pas spécifique à mon appareil, mais donne des infos sur le protocole : &lt;a href=&quot;https://civade.com/images/ir/AVRX1000_E300_IR_CODE_V01.pdf&quot;&gt;AVRX1000_E300_IR_CODE_V01.pdf&lt;/a&gt; . Le MSB serait transmis en premier, et les 15 bits utiles seraient regroupés comme suit :&lt;/p&gt;


&lt;pre&gt;C1～C5 : SYSTEM ADDRESS= constante à 01000
C6～C11 : Data 
C12,C13 : Extension bit : constante à 1 1
C14: constante à  0  
C15 : constante à 0&lt;/pre&gt;


&lt;p&gt;Autre particularité, il semblerait que la transmission se fasse en 3 fois : la première et la troisième avec le code normal, et la 2e avec les bits C6 à C15 inversés. On peut aisément le vérifier dans le flot de données récupérées décodées (en gras les bits inversés )&lt;/p&gt;


&lt;p&gt;A=0b10000100011100,
B=0b1000&lt;strong&gt;1011100011&lt;/strong&gt;,
C=0b10000100011100&lt;/p&gt;


&lt;p&gt;Notre transmission semble ne faire que 14 bits alors que le document de décodage dit qu'il en fait 15... Si nous ajoutons un leading zero pour le décodage  et nous remettons en forme les bits pour mieux le comprendre, cela donne :&lt;/p&gt;


&lt;p&gt;C1 ~C5 : 01000 : System address = 8 en décimal pour un amplificateur... OK, ca tombe bien c'est la télécommande de mon ampli :).
C6 à C11 : 010001  : Power Off d'après le tableau dans le PDF (c'est bien la touche que j'ai appuyée)
C12,C13 : 11
C14 : 0
C15 : 0&lt;/p&gt;


&lt;p&gt;Il s'agit donc bien d'un protocole Denon, sur un ampli, et de l'appui sur la touche power off . On voir donc bien l'intérêt de disposer d'un logiciel de décodage...&lt;/p&gt;


&lt;h5&gt;Usage avancé :&lt;/h5&gt;


&lt;p&gt;Lorsque vous avez bien compris le fonctionnement de votre télécommande, vous pouvez effectuer la capture de chacune des touches dans l'onglet &quot;Scrutinize remote&quot;. Il suffit de se placer dans &quot;Paramétric remote&quot;, cliquer sur Capture, et appuyer sur chacune des touches puis taper un nom de fonction et un commentaire pour décrire la touche.&lt;/p&gt;


&lt;p&gt;A noter que l'arrêt de la capture se fait en rappuyant sur &quot;Capture&quot;, et en refaisant une capture en appuyant sur une touche de la télécommande. Vous pouvez avec bouton de droite éditer le contenu du tableau par exemple pour supprimer des lignes surnuméraires.&lt;/p&gt;


&lt;p&gt;Une fois cette capture faite, vous allez pouvoir aller dans l'onglet &quot;Export&quot;, Choisir &quot;L'export format&quot;, et faire &quot;export Param Remote&quot; pour créer un fichier de sauvegarde ou de config. Le logiciel supporte même la production directe de code Arduino... Sympa!.&lt;/p&gt;


&lt;p&gt;Si votre télécommande n'est pas décodée (c'est à dire pas reconnue par l'un des décodeurs intégrés), vous pouvez passer en mode &quot;Raw remote&quot; dans &quot;Scrutinize remote&quot;, et &quot;Export raw remote&quot; dans l'onglet export. Ceci aura pour effet de générer des timings d'impulsion au lieu du vrai protocole, mais c'est par contre très intéressant pour mimer des télécommandes inconnues.&lt;/p&gt;


&lt;p&gt;L'onglet &quot;Generate&quot; va vous permettre de générer des codes IR pour les protocoles connus ou inconnus (mode raw). Votre périphérique de capture Agirs étant également en capacité d'envoyer des codes, cela vous permettra de vérifier que votre équipement réagit bien à ce que vous avez capturé / généré.&lt;/p&gt;


&lt;p&gt;A noter que si vous désirez sauver des données capturées (par exemple dans l'onglet Scrutinize remote&quot;) il est souhaitable de choisir comme format d'export GIRR, qui vous permettra de réimporter lors d'une autre session de travail avec tous les paramètres.&lt;/p&gt;


&lt;h3&gt;Conclusion&lt;/h3&gt;


&lt;p&gt;C'est tout pour ce premier volet décodage et génération de codes IR. Tout n'est pas dit, mais le site de l'auteur de IR Scrutinizer fourmille d'infos que je vous recommande de consulter...&lt;/p&gt;


&lt;h3&gt;Sommaire des articles de la série:&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-réception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi&quot;&gt;IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32&quot;&gt;IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-Télécommande-Wifi-avec-Nodered-LIRC-ESP32&quot;&gt;IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
        
                  <comments>https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge#comment-form</comments>
          <wfw:comment>https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/113</wfw:commentRss>
              </item>
          <item>
        <title>Nouveau repository avec près de 10 000 sons pour synthés collector</title>
        <link>https://civade.com/post/2021/04/29/Nouveau-repository-avec-pr%C3%A8s-de-10-000-sons-pour-synth%C3%A9s-collector</link>
        <guid isPermaLink="false">urn:md5:7f16a6905f3859f2cd5dd7c868dd4b63</guid>
        <pubDate>Thu, 29 Apr 2021 21:56:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                        <description>          &lt;p&gt;Après 20 ans de bons et loyaux services, j'ai fermé le site Zicweb.com. Il a été l'un des premiers sites en Français sur l'informatique musicale sur PC et a eu des audiences de plusieurs centaines de milliers de visiteurs par mois.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/312974657_8529f1181e.jpg&quot; title=&quot;312974657_8529f1181e.jpg, avr. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/.312974657_8529f1181e_m.jpg&quot; alt=&quot;312974657_8529f1181e.jpg, avr. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il y restait des ressources pour un certain nombre de synthés, depuis devenus collector. Comme beaucoup de site hébergeant les patches pour ces machines ont fermés, j'ai ouvert un repository Git pour y placer ces sons : &lt;a href=&quot;https://gitlab.civade.com/pub/music-patches&quot;&gt;https://gitlab.civade.com/pub/music-patches&lt;/a&gt; .&lt;/p&gt;


&lt;p&gt;Une forme de mémoire qui j'espère servira à certains.. En tout cas mon vieux DX7 est très content :)...&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2021/04/29/Nouveau-repository-avec-pr%C3%A8s-de-10-000-sons-pour-synth%C3%A9s-collector#comment-form</comments>
          <wfw:comment>https://civade.com/post/2021/04/29/Nouveau-repository-avec-pr%C3%A8s-de-10-000-sons-pour-synth%C3%A9s-collector#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/111</wfw:commentRss>
              </item>
          <item>
        <title>Boitier découpe laser pour orange Pi PC plus</title>
        <link>https://civade.com/post/2021/03/07/Boitier-d%C3%A9coupe-laser-pour-orange-Pi-PC-plus</link>
        <guid isPermaLink="false">urn:md5:44888e1d870a6d6184d7f7cf5da4d4c6</guid>
        <pubDate>Sun, 07 Mar 2021 16:14:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Domotique</category>
                        <description>&lt;p&gt;Un petit boitier réalisé rapidement pour héberger un projet domotique avec une Orange Pi PC plus..&lt;/p&gt;          &lt;p&gt;C'est un petit projet réalisé rapidement sous Sketchup, exporté en DXF avec le plugin de Guitar List  ( &lt;a href=&quot;https://www.guitar-list.com/download-software/convert-sketchup-skp-files-dxf-or-stl&quot;&gt;https://www.guitar-list.com/download-software/convert-sketchup-skp-files-dxf-or-stl&lt;/a&gt; ).&lt;/p&gt;


&lt;p&gt;Le boitier dispose d'une ventilation active avec un ventilateur 12V / 50mm sous alimenté en 5V pour des raisons de bruit.&lt;/p&gt;


&lt;p&gt;Un espace est aménagé pour permettre d'embarquer une petite extension à côté de l'orange PI.&lt;/p&gt;


&lt;p&gt;Il est possible de laisser l'antenne wifi dans le boitier, ou la faire dépasser en perçant un trou de 6mm et en l'emanchant en force.&lt;/p&gt;


&lt;p&gt;Voici quelques visuels de la CAO :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/orangepi/OrangePI-PC-plus1.png&quot; title=&quot;OrangePI-PC-plus1.png, mar. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/orangepi/.OrangePI-PC-plus1_m.png&quot; alt=&quot;OrangePI-PC-plus1.png, mar. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/orangepi/OrangePI-PC-plus2.png&quot; title=&quot;OrangePI-PC-plus2.png, mar. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/orangepi/.OrangePI-PC-plus2_m.png&quot; alt=&quot;OrangePI-PC-plus2.png, mar. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/orangepi/OrangePI-PC-plus3.png&quot; title=&quot;OrangePI-PC-plus3.png, mar. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/orangepi/.OrangePI-PC-plus3_m.png&quot; alt=&quot;OrangePI-PC-plus3.png, mar. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Vous trouverez l'intégralité des fichiers sur mon Gitlab: &lt;a href=&quot;https://gitlab.civade.com/pub/small-lasercut-projects/-/tree/master/OrangePI-PC-plus&quot;&gt;https://gitlab.civade.com/pub/small-lasercut-projects/-/tree/master/OrangePI-PC-plus&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Bonne réalisation !&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2021/03/07/Boitier-d%C3%A9coupe-laser-pour-orange-Pi-PC-plus#comment-form</comments>
          <wfw:comment>https://civade.com/post/2021/03/07/Boitier-d%C3%A9coupe-laser-pour-orange-Pi-PC-plus#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/110</wfw:commentRss>
              </item>
          <item>
        <title>Google home + Node Red + Orange Pi PC Plus</title>
        <link>https://civade.com/post/2021/02/21/Google-home-Node-Red-Orange-Pi-PC-Plus</link>
        <guid isPermaLink="false">urn:md5:e94a97da0a8eb1816c2c797d2d26d8f5</guid>
        <pubDate>Sun, 21 Feb 2021 10:22:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Domotique</category>
                          <category>Embarqué</category>
                  <category>Firmware</category>
                  <category>OpenSource</category>
                  <category>Raspberry</category>
                  <category>Sysadmin</category>
                <description>&lt;p&gt;Cet article fait suite à celui &lt;a href=&quot;https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique&quot;&gt;sur NodeRed sur Raspberry&lt;/a&gt; et est plus une prise de notes partage pour adapter la méthodologie d'installation sur une Orange Pi PC plus. Il est à lire en complément de l'article original.&lt;/p&gt;          &lt;h3&gt;La carte Orange PI PC plus&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/orangepi/orangepipcplus.jpg&quot; title=&quot;orangepipcplus.jpg, fév. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/orangepi/.orangepipcplus_m.jpg&quot; alt=&quot;orangepipcplus.jpg, fév. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Cette carte a cela de bien par rapport à une raspberry qu'elle permet pour 25 euros de disposer d'un système assez performant avec pas mal d'entrées sorties :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Processeur H3 &lt;strong&gt;4 cœurs&lt;/strong&gt; jusqu'à &lt;strong&gt;1.37 Ghz&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;1 go de ram&lt;/li&gt;
&lt;li&gt;3 ports USB 2 standard + un port micro OSB OTG&lt;/li&gt;
&lt;li&gt;Alimentation sur connecteur spécifique 3mm (plus de micro USB!)&lt;/li&gt;
&lt;li&gt;Port HDMI sur connecteur standard&lt;/li&gt;
&lt;li&gt;Sortie audio et vidéo composite intégrée sur un jack 3.5mm&lt;/li&gt;
&lt;li&gt;Port Ethernet intégré&lt;/li&gt;
&lt;li&gt;Interface Wifi intégrée, avec antenne externe, et possibilité d'adapter des antennes à fort gain grâce au connecteur d'antenne standard.&lt;/li&gt;
&lt;li&gt;Micro intégré sur la carte mère&lt;/li&gt;
&lt;li&gt;Bouton intégré permettant de faire un shutdown &quot;propre&quot; avant de débrancher&lt;/li&gt;
&lt;li&gt;Récepteur infrarouge intégré&lt;/li&gt;
&lt;li&gt;Interface caméra (spécifique à Orange Pi)&lt;/li&gt;
&lt;li&gt;Connecteur d'entrées sorties à  40 broches largement compatible avec celui d'une Raspberry PI&lt;/li&gt;
&lt;li&gt;Interface pour UART TTL intégrée (pour debug de la carte) sur connecteur 3 broches dédié&lt;/li&gt;
&lt;li&gt;Socket pour  mettre des cartes TF (carte miro SD)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Mais surtout, son principal atout réside dans le fait qu'elle intègre &lt;ins&gt;&lt;strong&gt;8 Go de mémoire eMMC&lt;/strong&gt;&lt;/ins&gt; (c'est le &quot;plus&quot; dans la référence Orange Pi PC) sur laquelle nous pourrons mettre notre système d'exploitation. Outre le fait que cela soit bien plus fiable que la classique carte SD, c'est aussi beaucoup plus rapide. La carte SD reste disponible par exemple pour booter sur un autre OS, ou pour tester d'autre configurations sans altérer la mémoire interne eMMC.&lt;/p&gt;


&lt;h3&gt;Installation du système d'exploitation&lt;/h3&gt;


&lt;h4&gt;Préparation de l'image&lt;/h4&gt;


&lt;p&gt;J'attire votre attention sur le choix de la carte SD qui est crucial. Il faut une carte rapide (Classe A1 ou A2), de marque (Sandisk!) et méfiez vous des contrefaçon qui sont légion sur Aliexpress... Tout autre choix prendra au minimum un temps infini(carte peu performante), voir ne marchera carrément pas (carte avec des erreurs de lecture / écriture). Bien souvent si ce n'est pas stable, lent ou que le processus d'installation ne fonctionne pas comme il devrait, c'est la faute de la carte SD!&lt;/p&gt;


&lt;p&gt;Nous allons ici nous baser sur la distribution Armbian ( &lt;a href=&quot;https://www.armbian.com/&quot;&gt;https://www.armbian.com/&lt;/a&gt; ), ou Debian pour ARM, qui est plutôt bien supportée, et motorise un grand nombre de carte chinoises à base de processeurs divers dont notre H3. La carte Orange Pi PC plus y est bien supportée (voir &lt;a href=&quot;https://www.armbian.com/orange-pi-pc-plus/&quot;&gt;https://www.armbian.com/orange-pi-pc-plus/&lt;/a&gt; ) que ce soit sous Focal (debian 11) ou Buster (Debian 10). Nous allons prendre une Buster pour l'installation.&lt;/p&gt;


&lt;p&gt;Après avoir téléchargé l'image 'Desktop' ( &lt;a href=&quot;https://redirect.armbian.com/region/EU/orangepipcplus/Buster_current_desktop&quot;&gt;https://redirect.armbian.com/region/EU/orangepipcplus/Buster_current_desktop&lt;/a&gt; ), l'avoir décompressée avec &lt;a href=&quot;https://www.7-zip.org/&quot;&gt;7Zip&lt;/a&gt; , il va nous falloir se munir d'une carte SD de 8 Go mini, d'un logiciel pour écrire cette image sur la carte SD ( Armbian recommande  &lt;a href=&quot;https://gitlab.com/bztsrc/usbimager/&quot;&gt;https://gitlab.com/bztsrc/usbimager/&lt;/a&gt; ). Le process est décrit dans la doc ( &lt;a href=&quot;https://docs.armbian.com/User-Guide_Getting-Started/#how-to-prepare-a-sd-card&quot;&gt;https://docs.armbian.com/User-Guide_Getting-Started/#how-to-prepare-a-sd-card&lt;/a&gt; ) et ne devrait pas vous poser de problème.&lt;/p&gt;


&lt;h4&gt;First boot&lt;/h4&gt;


&lt;p&gt;Après avoir inséré la carte SD fraichement installée, raccordé un écran et un clavier souris USB, et éventuellement un câble réseau, il est temps d'allumer la carte.&lt;/p&gt;


&lt;p&gt;Au premier démarrage, la carte déroule le boot linux, puis affiche un message disant qu'elle est en train d'agrandir le file system pour utiliser toute la carte SD. La laisser faire.
Elle va rebooter toute seule à l'issue.&lt;/p&gt;


&lt;p&gt;Lors du second boot, plusieurs questions vont vous être posées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mot de passe pour le compte root. Attention, car à ce stade, vous avez un clavier Querty.... Donc choisir un mot de passe assez simple et idéalement n’utilisant pas les lettre M, A, Q qui ne sont pas à la même place en querty et en azerty.&lt;/li&gt;
&lt;li&gt;vous souhaiter utiliser bash (choix 1) ou zsh (choix 2). J'ai choisi bash, mais c'est une affaire de convenance...&lt;/li&gt;
&lt;li&gt;donner le nom d'un compte utilisateur à créer. Il n'est en effet pas bon de travailler en root. Ce sera votre compte de travail.&lt;/li&gt;
&lt;li&gt;Le mot de passe du compte à créer  (même remarque que pour le compte root!!!)&lt;/li&gt;
&lt;li&gt;Le nom réel de l'utilisateur&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;La création du compte et les opérations qui s'ensuivent prennent plusieurs dizaines de secondes. Le système démarre ensuite dans l'environnement graphique.&lt;/p&gt;


&lt;h4&gt;Paramétrage wifi&lt;/h4&gt;

&lt;p&gt;Si vous avez branché un câble réseau, cette étape n'est probablement pas nécessaire.&lt;/p&gt;


&lt;p&gt;Pour mémo et comme sur n'importe quelle distribution linux, il est passible de disposer de plusieurs consoles virtuelles. CTRL + ALT + F1 à F6 sont des consoles texte, tandis que CTRL + ALT + F7 revient dans l'environnement graphique.&lt;/p&gt;


&lt;p&gt;Dans l'environnement graphique, en haut à droite, cliquez sur l'icone WIfi, choisissez le réseau auquel vous voulez vous connecter et introduisez le mot de passe. Attention, le clavier à ce stade est encore en Querty..
Une fois la connexion établie, le système devrait vous l'indiquer dans la zone wifi avec un splendide &quot;connection established&quot;.&lt;/p&gt;


&lt;p&gt;A noter que dans certains environnements (points d'accès) l'orange pi peut perdre le wifi.  Si en lançant la commande &quot;sudo systemctl network-manager restart&quot;, c'est réglable de façon définitive avec un petit service.&lt;/p&gt;


&lt;p&gt;Créer le ficichier &quot;/usr/local/bin/nm-watcher&quot;&lt;/p&gt;

&lt;pre&gt;
#!/bin/bash

while true; do #create a infinite loop to keep looking at your connection
        NET=$(ifconfig wlan0 | grep &amp;quot;inet&amp;quot;) # verify if the interface has an assigned IP
        ROUTE=$(fping google.com 2&amp;gt;&amp;amp;1 | grep &amp;quot;alive&amp;quot;) # try to ping google.com and verify if we have any response
        WEB=$(wget --tries=10 --timeout=20 --spider http://google.com 2&amp;gt;&amp;amp;1 | grep &amp;quot;OK&amp;quot;) # spiders google.com to verify if the page exists. returns error if a connections is not possible

        if [ ! &amp;quot;$NET&amp;quot; != &amp;quot;&amp;quot; ] || [ ! &amp;quot;$ROUTE&amp;quot; != &amp;quot;&amp;quot; ] || [ ! &amp;quot;$WEB&amp;quot; != &amp;quot;&amp;quot; ]; then # verify if any of the above conditions aren&amp;#039;t OK
                service network-manager restart
        fi
        sleep 5
    done
&lt;/pre&gt;


&lt;p&gt;Créer et éditier le fichier nm-watcher.service&lt;/p&gt;

&lt;pre&gt; 
$ sudo touch /etc/systemd/system/nm-watcher.service &amp;amp;&amp;amp; sudo nano /etc/systemd/system/nm-watcher.service
&lt;/pre&gt;


&lt;p&gt;Placer dedans la conf suivante :&lt;/p&gt;

&lt;pre&gt;
[Unit]
Description=NetworkManager Watcher
Wants=NetworkManager.service
Before=NetworkManager.service

[Service]
ExecStart=/usr/local/bin/nm-watcher

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;


&lt;p&gt;Démarrer le service automatiquement :&lt;/p&gt;
&lt;pre&gt;
$ sudo systemctl enable nm-watcher.service
&lt;/pre&gt;


&lt;p&gt;Et le lancer :&lt;/p&gt;
&lt;pre&gt;
$ sudo systemctl start nm-watcher.service
&lt;/pre&gt;


&lt;p&gt;Ce script va vérifier toutes les 5 seocndes la connectivité réseau et relancer si nécessaire. Il a peu d'impact en terme de CPU consommé.&lt;/p&gt;


&lt;h4&gt;Configuration&lt;/h4&gt;


&lt;p&gt;Dans le menu Applications, lancer un &quot;Terminal Emulator&quot;.  Attention tout ce que vous aller taper à ce stade est encore via le clavier Querty... Avec la commande &quot;ip a&quot; vous pouvez vérifier votre adresse ip.&lt;/p&gt;


&lt;p&gt;Lancez ensuite la commande &quot;sudo armbian-config&quot;. Les touches fleches nous permettront de changer de menu (ou page up page down pour aller plus vite), espace pour activer une case à cocher, tabulation pour changer de champ, escape pour annuler et entrée pour valider.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&quot;&lt;strong&gt;Personal&lt;/strong&gt;&quot; &amp;gt;&quot;&lt;strong&gt;Timezone&lt;/strong&gt;&quot; &amp;gt;&quot;&lt;strong&gt;Europe&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;Paris&lt;/strong&gt;&quot;&lt;/li&gt;
&lt;li&gt;&quot;&lt;strong&gt;Personal&lt;/strong&gt;&quot; &amp;gt;&quot;&lt;strong&gt;locales&lt;/strong&gt;&quot; et choisir &quot;&lt;strong&gt;fr_FR.UTF8 UTF8&lt;/strong&gt;&quot; puis faire suivant et choisir fr_FR.UTF8 comme langue par défaut. Cela prend un peu de temps.&lt;/li&gt;
&lt;li&gt;&quot;&lt;strong&gt;Personal&lt;/strong&gt;&quot; &amp;gt;&quot;&lt;strong&gt;Keyboard&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;Generic 105 Keys PC Intl&lt;/strong&gt;&quot; &amp;gt;&quot;&lt;strong&gt;Autre&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;French&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;French&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;Disposition par défaut pour le clavier&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;Pas de touche compose&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;Faut il utiliser control + alt + backspace pour arrêter le serveur X&lt;/strong&gt;&quot; &amp;gt; &quot;Oui .&lt;/li&gt;
&lt;li&gt;&quot;&lt;strong&gt;Personal&lt;/strong&gt;&quot; &amp;gt;&quot;&lt;strong&gt;Hostname&lt;/strong&gt;&quot; &amp;gt; puiss indiquez le nom que vous voulez donner à votre carte (ex : debian10)&lt;/li&gt;
&lt;li&gt;&quot;&lt;strong&gt;System&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;CPU&lt;/strong&gt;&quot; &amp;gt; Min speed =&lt;strong&gt;480mHz&lt;/strong&gt;, Max Speed = &lt;strong&gt;1368mHz&lt;/strong&gt;, profil &quot;&lt;strong&gt;Performance&lt;/strong&gt;&quot;&lt;/li&gt;
&lt;li&gt;&quot;&lt;strong&gt;System&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;Avahi&lt;/strong&gt;&quot;&lt;/li&gt;
&lt;li&gt;&quot;&lt;strong&gt;System&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;Hardware&lt;/strong&gt;&quot; puis activer avec la barre d'espace &quot;I2C0&quot;,&quot;Uart3&quot;. Vous pouvez également ajouter &quot;Analog Codec&quot; si vous désirez utiliser la sortie audio sur le Jack 3.5mm. Ce sera via l'HDMI sinon. Ne pas accepter le reboot, nous rebooterons une fois l'ensemble terminé.&lt;/li&gt;
&lt;li&gt;&quot;&lt;strong&gt;System&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;SSH&lt;/strong&gt;&quot; puis &quot;&lt;strong&gt;Save&lt;/strong&gt;&quot;. Dans un premier temps, vous pouvez laisser &quot;permit root login&quot; (à désactiver plus tard pour des raisons de sécu) et &quot;Password Authentication&quot; (à désactiver plus tard quand vous aurez mise une clé).&lt;/li&gt;
&lt;li&gt;&quot;&lt;strong&gt;System&lt;/strong&gt;&quot; &amp;gt; &quot;&lt;strong&gt;Firmware&lt;/strong&gt;&quot; (ceci va faire les mises à jour). Cette opération prend du temps.. (30 minutes à 1 heure)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A l'issue, l'updater va demander de redémarrer. Accepter.&lt;/p&gt;


&lt;p&gt;Après redémarrage, vous allez arriver sur un écran de login, avec le nom d'utilisateur pré rempli sur le compte que vous avez créé à l'étape précédente. Plus qu'à mettre le mot de passe associé pour se logger. A noter qu'à ce stade, nous avons un clavier en français, une connexion réseau, un système à jour, et la possibilité de se connecter en SSH.&lt;/p&gt;


&lt;p&gt;Pour en connaitre l'adresse ip, il suffit de taper la commande &quot;ip a&quot; dans un terminal:&lt;/p&gt;
&lt;pre&gt;
jpcivade@debian10:~$ ip a
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 02:81:35:b7:24:b0 brd ff:ff:ff:ff:ff:ff
3: wlan0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 12:81:35:b7:24:b0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.127/24 brd 192.168.20.255 scope global dynamic noprefixroute wlan0
       valid_lft 39844sec preferred_lft 39844sec
    inet6 fe80::7848:fe3b:e11c:ca5e/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
&lt;/pre&gt;


&lt;p&gt;Ici, étant en WIfi, c'est l'interface WLAN0 qui porte le réseau, en 192.168.20.127. Si vous êtes connecté en internet filaire, ce sera sur l'interface &quot;ETH0&quot;.&lt;/p&gt;


&lt;p&gt;Nous allons relancer &quot;sudo armbian-config&quot; d'un terminal  afin de désactiver le lancement automatique de l'environnement graphique:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;&lt;strong&gt;System&lt;/strong&gt;&quot; &amp;gt;&quot;&lt;strong&gt;Desktop&lt;/strong&gt;&quot;  &amp;gt; &quot;&lt;strong&gt;Stop&lt;/strong&gt;&quot;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Cette configuration sera activée immédiatement. L'objectif est d'éviter de consommer la mémoire nécessaire pour le lancement systématique d'un environnement graphique . L'environnement graphique est arrêté, et un petit bug vous laisse sur un écran noir... Pas de soucis, repasser sur une console (avec CTRL + ALT + F1), et loggez vous avec votre compte utilisateur...&lt;/p&gt;


&lt;h4&gt;Installation des compléments&lt;/h4&gt;


&lt;p&gt;Nous allons maintenant installer le compilateur C, xrdp et ses dépendances (pour jouer avec l'interface graphique directement avec le bureau à distance de windows) et quelques utilitaires (screen neofetch, etc..)
C'est un petit peu long ca il y a un peu de dépendances (15 minutes)&lt;/p&gt;
&lt;pre&gt;
sudo apt -y install xrdp xorgxrdp neofetch libavahi-compat-libdnssd-dev python-pip python3-pip mc i2c-tools python-smbus python-psutil  python-dev iftop telnet ncftp
&lt;/pre&gt;


&lt;p&gt;A ce stade, nous avons la possibilité de nous connecter à notre système :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Localement, via la console texte, sur écran/Clavier/souris connecté au système&lt;/li&gt;
&lt;li&gt;Localement en mode graphique, en passant par la console texte, puis en lancant &quot;startx&quot;&lt;/li&gt;
&lt;li&gt;Avec le bureau à distance de windows, en mode graphique,  en précisant comme adresse de connexion, l'adresse ip de notre carte, soit celle précédemment relevée avec &quot;ip a&quot; en mode console.&lt;/li&gt;
&lt;li&gt;Avec un terminal SSH (ex: le programme &lt;a href=&quot;https://www.putty.org/&quot;&gt;Putty&lt;/a&gt; ) sur le port 22 et sur l'adresse ip&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;C'est déjà pas mal, non?&lt;/p&gt;


&lt;h4&gt;Transfert sur la mémoire interne &quot;EMMC&quot;&lt;/h4&gt;

&lt;p&gt;A partir de ce stade, vous pouvez soit continuer sur la carte SD, soit transférer l'installation sur la mémoire interne eMMC de 8Go.  Pour transférer c'est assez simple, il suffit de lancer &quot;sudo armbian-config&quot;, et dans le menu &quot;System&quot; &amp;gt; &quot;Install&quot;, de choisir &quot;2 boot from emmc / system on emmc&quot;.&lt;/p&gt;


&lt;p&gt;L'utilitaire faire le transfert et à l'issue vous demande de rebooter. Il suffira de virer la carte SD juste avant le reboot et vous devriez  pouvoir booter normalement.&lt;/p&gt;


&lt;p&gt;A noter que vous pouvez faire ceci à n'importe quel endroit de ce script d'installation, et ainsi disposer d'une carte SD de référence vous servant à réinstaller votre système sur eMMC rapidement, avec leniveau d'avancement que vous aurez choisi. Ca peut aussi service de sauvegarde pour réinstaller rapidement le système avec une carte SD complètemetn configurée... A vous de choisir.&lt;/p&gt;


&lt;h4&gt;Installation de Nodered&lt;/h4&gt;


&lt;p&gt;Faites ceci en mode console, mais pas identifié en root. Vous vous connecterez donc sur le compte utilisateur créé lors de l'installation.&lt;/p&gt;

&lt;pre&gt;
bash &amp;lt;(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
&lt;/pre&gt;


&lt;p&gt;Accepter l'installation des noeuds spécifiques Raspberry et lancer l'installation. Cela va prendre une trentaine de minutes.&lt;/p&gt;


&lt;p&gt;A l'issue de l'installation, rendre le service node red rémanent et le démarrer&lt;/p&gt;

&lt;pre&gt;
sudo systemctl enable nodered.service
sudo systemctl start nodered.service
&lt;/pre&gt;


&lt;p&gt;Enfin nous allons installer quelques paquets complémentaires pour node-red :&lt;/p&gt;

&lt;pre&gt;
cd  .node-red
npm install node-red-contrib-googlehome
npm install node-red-node-email 
npm install node-red-dashboard
npm install node-red-contrib-ui-artless-gauge
npm install node-red-contrib-ewelink
npm install node-red-contrib-opi-gpio
npm install node-red-contrib-modbus

sudo systemctl restart nodered.service
&lt;/pre&gt;


&lt;p&gt;Nous pouvons maintenant connecter un navigateur à notre fraiche installation de node red sur l'adresse IP relevée avec la commande &quot;ip a&quot; à la place de MON_IP. Vous pouvez le faire de n'importe quel poste connecté au même réseau que votre Orange PI.&lt;/p&gt;


&lt;p&gt;http://MON_IP:1880&lt;/p&gt;


&lt;h4&gt;Paramétrage de vi&lt;/h4&gt;


&lt;p&gt;editer .vimrc de root et de l'utilisateur que vous avez créé et ajouter la ligne&lt;/p&gt;

&lt;pre&gt;set mouse-=a&lt;/pre&gt;

&lt;p&gt;editer /etc/vim/vimrc et décommenter&lt;/p&gt;

&lt;pre&gt;syntax on&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;


&lt;h4&gt;Interfaçage avec un LCD I2C&lt;/h4&gt;


&lt;p&gt;A noter que cette partie est légèrement différente de l'article original afin d'être adaptée au fonctionnalités de l'Orange PI.&lt;/p&gt;


&lt;p&gt;Le cablage est identique et vous le retrouverez dans l'article original ( &lt;a href=&quot;https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique&quot;&gt;https://www.civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique&lt;/a&gt; )
Nous allons passer en root pour installer ces éléments :&lt;/p&gt;
&lt;pre&gt;
su -
&lt;/pre&gt;


&lt;p&gt;Tour d'abord il nous faut quelques librairies&lt;/p&gt;
&lt;pre&gt;
pip install wheel 
pip install setuptools
pip install psutil
pip install RPLCD
&lt;/pre&gt;


&lt;p&gt;Vérifier qu'il y a bien un LCD en I2C à l'adresse 0X20 (sur orange pi, c'est sur le port 0)&lt;/p&gt;
&lt;pre&gt;
i2cdetect -y 0
	 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
&lt;/pre&gt;


&lt;p&gt;Ensuite nous allons pouvoir tester l'afficheur :&lt;/p&gt;
&lt;pre&gt;
rplcd-tests i2c testsuite  expander=MCP23008 addr=0x20 port=0 cols=20 rows=4 charmap=A00 gpio_bank=A
&lt;/pre&gt;


&lt;p&gt;Enfin nous allons tester avec un petit script en Python :&lt;/p&gt;

&lt;pre&gt;
#!/usr/bin/python
# -*- coding: utf8 -*-
# Parce que les accents le valent bien...

&amp;quot;&amp;quot;&amp;quot;
Bibliotheques à installer :
 - pip install rplcd  https://github.com/dbrgn/RPLCD (Doc sur https://rplcd.readthedocs.io/en/latest/ )
 - pip install gpiozero
 - pip install psutil

Et bien sur l&amp;#039;i2c doit avoir été activé sur la Rasoberry avec raspi-config.

Pour le lancer toutes le minutes, l&amp;#039;installer dans un crontab en root, faire crontab  -e
* * * * * /root/lcd.py &amp;gt;&amp;gt; /root/log.txt 2&amp;gt;&amp;amp;1

Un journal (log.txt) portera les erreurs... si il y en a.
&amp;quot;&amp;quot;&amp;quot;

# Affichages sur lcd
from RPLCD.i2c import CharLCD
# température processeur
def CPUTemperature():
        with io.open(&amp;#039;/sys/devices/virtual/thermal/thermal_zone0/temp&amp;#039;, &amp;#039;r&amp;#039;) as f:
                return float(f.readline().strip()) / 1000
# Pour afficher l&amp;#039;heure
import time
# Pour recuperer l&amp;#039;adresse IP
import socket
# Pour capacité disque
import psutil
# Entrées sorties
import io

# Recuprere l&amp;#039;adresse IP
def get_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        # n&amp;#039;a pas besoin d&amp;#039;être joignable
        s.connect((&amp;#039;10.255.255.255&amp;#039;, 1))
        IP = s.getsockname()[0]
    except Exception:
        IP = &amp;#039;127.0.0.1&amp;#039;
    finally:
        s.close()
    return IP

# Définit des caractères personnalisés
def lcd_chars():
    smiley = (
        0b00000,
        0b01010,
        0b01010,
        0b00000,
        0b10001,
        0b10001,
        0b01110,
        0b00000,
    )
    degre = (
        0b01000,
        0b10100,
        0b01000,
        0b00011,
        0b00100,
        0b00100,
        0b00011,
        0b00000,
    )
    lcd.create_char(0, smiley)
    lcd.create_char(1, degre)
    return

# Init
# Init LCD
lcd = CharLCD(i2c_expander=&amp;#039;MCP23008&amp;#039;, address=0x20, port=0,
            cols=20, rows=4, dotsize=8,
            charmap=&amp;#039;A00&amp;#039;,
            auto_linebreaks=True)
lcd_chars()
IP = get_ip()
cpu = CPUTemperature()
hdd = psutil.disk_usage(&amp;#039;/&amp;#039;)
ram = psutil.virtual_memory()

#192.168.100.100 25.9
#
#
#

lcd.clear();
# Ligne 1
lcd.cursor_pos = (0, 0)
lcd.write_string(time.strftime(&amp;quot;%d/%m/%Y  %H:%M:%S&amp;quot;))
#print time.strftime(&amp;quot;%d/%m/%Y  %H:%M:%S&amp;quot;)

# Ligne 2
lcd.cursor_pos = (1, 0)
#line1 = &amp;quot;%s %s&amp;quot; % (IP, cpu)
lcd.write_string(IP)
lcd.cursor_pos = (1,14)
lcd.write_string(&amp;quot;|%2.1f\x01&amp;quot; % (cpu))
#print &amp;quot;%s|%2.1f&amp;quot; % (IP, cpu)

# Ligne 3
lcd.cursor_pos = (2, 0)
lcd.write_string(&amp;quot;T:%3.1fG U:%3.1fG F:%3.1fG&amp;quot; % (float(hdd.total) / (2.0**30), float(hdd.used) / (2.0**30),float(hdd.free) / (2.**30) ))
#print &amp;quot;T:%3.1fG U:%3.1fG F:%3.1fG&amp;quot; % (float(hdd.total) / (2.0**30), float(hdd.used) / (2.0**30),float(hdd.free) / (2.**30) )

# Ligne 4:w
lcd.cursor_pos = (3, 0)
lcd.write_string(&amp;quot;T:%3.0fM U:%3.0fM F:%3.0fM&amp;quot; % (float(ram.total) / (2.0**20), float(ram.used) / (2.0**20),float(ram.free) / (2.**20) ))
#print &amp;quot;iT:%3.0fM U:%3.0fM F:%3.0fM&amp;quot; % (float(ram.total) / (2.0**20), float(ram.used) / (2.0**20),float(ram.free) / (2.**20) )

# Si on veut préserver le backlight et ne l&amp;#039;allumer que quelques secondes toutes les minutes
# décommenter les lignes suivantes
#time.sleep(5)
#lcd.backlight_enabled = False
lcd.close()
&lt;/pre&gt;


&lt;h3&gt;Et la suite?&lt;/h3&gt;


&lt;p&gt;La suite peut être retrouvée sur l'article initial basé sur une Raspberry Pi, mais tout le volet tutoriel pour poursuivre sur node red est totalement d'actualité, même si il est installé sur une Orange Pi.
Il est ici : &lt;a href=&quot;https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique&quot;&gt;https://www.civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique&lt;/a&gt; .&lt;/p&gt;


&lt;p&gt;Bonne lecture !&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2021/02/21/Google-home-Node-Red-Orange-Pi-PC-Plus#comment-form</comments>
          <wfw:comment>https://civade.com/post/2021/02/21/Google-home-Node-Red-Orange-Pi-PC-Plus#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/109</wfw:commentRss>
              </item>
          <item>
        <title>Google home + Node Red + Raspberry pi : un intéressant cocktail pour la domotique</title>
        <link>https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique</link>
        <guid isPermaLink="false">urn:md5:b754134f6b158a8bd7a9a38668c7c4b0</guid>
        <pubDate>Sun, 13 Dec 2020 19:51:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Domotique</category>
                        <description>&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/intro.png&quot; title=&quot;intro.png, janv. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.intro_m.png&quot; alt=&quot;intro.png, janv. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;J'avais déjà joué il y a près de 4 ans avec Node Red. A l'époque, j'avais monté des démos simple utilisant des ESP8266, une raspberry équipée de Node Red et de Mosquitto (serveur MQTT) afin d'enseigner au Fablab de Montpellier les possibilités de ces technologies pour développer des objets connectés.&lt;/p&gt;


&lt;p&gt;Le démonstrateur était une cafetière connectée qui prenait ses ordres sur Twitter.  La gestion des états et des messages était confiée à un serveur MQTT. Toute l'intelligence et la logique était confiée quand à elle à NodeRed. La cafetière était rendue intelligente avec un ESP8266 qui dialoguait avec le serveur MQTT pour prendre ses ordres. NodeRed lisait un compte Twitter et si un message particulier était posté (&quot;Je veux un café&quot;), il envoyait au serveur MQTT l'ordre l'allumage. La cafetière s'allumait et lançait un café. La cafetière était au Fablab, la Raspberry avec NodeRed et MQTT chez moi, et le téléphone utilisait la 3/4G pour envoyer ses messages sur Twitter. L'objectif de cette démonstration était de montrer que ce type d'architecture peut fédérer des objets qui ne sont nécessairement pas tous situés sur un réseau  local, et qu'il est très simple de développer un capteur ou un actionneur intelligent qui discute une MQTT et se met à disposition de NodeRED.&lt;/p&gt;


&lt;p&gt;Un ami m'a branché sur le sujet d'un panneau de supervision d'une pompe à chaleur (et plus si affinité) en Modbus. En cherchant des technologies adaptées, je suis retombé sur NodeRed. Et là grosse surprise. L'outil a évolué d'une façon spectaculaire... Plus de 2000 modules et scripts sont disponibles sur leur espace 'Flows', facilitant l'intégration de technologies variées. Le changement de licence (anciennement atypique IBM interdisant les modifications, désormais Apache) n'y est peut être pas pour rien.&lt;/p&gt;


&lt;p&gt;Cet article a pour objectif de faire partager un journal d'installation de NodeRed sur Raspberry, pour vous permettre de mettre en œuvre des solutions similaires. A y être nous allons également voir comment interfacer le tout avec Google Home.&lt;/p&gt;          &lt;h3&gt;Une Raspberry?&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/pizero.png&quot; title=&quot;pizero.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.pizero_m.png&quot; alt=&quot;pizero.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Si l'on dispose déjà d'un appareil sous Linux (ex un NAS), qui est toujours allumé ce peut aussi un bon candidat. Il suffit donc de faire l'installation de node red dessus si celui-ci le supporte (ex : Synology ou Netgear).&lt;/p&gt;


&lt;p&gt;Mais si on n'a pas cette possibilité, le choix d'une Raspberry par rapport à un ordinateur, est guidé par la consommation. En effet, une Raspberry consomme au maximum 5V X 2A = 10W. Un ordinateur portable consomme de 50 à 100W, et un fixe de 250 W à 600W (PC gamer, serveur). Avec le kw/h à  0.1557 euros,  1 Watt à l'année coute  1.364 euros.... L’hébergent annuel d'une Raspberry va donc couter 13.64 euros / an, contre 477 euros / an pour un petit serveur de 350W... No comment! La Raspberry va être vite payée par les économies d'énergie...&lt;/p&gt;


&lt;p&gt;Le choix du modèle Pi Zero est un compromis coût/performances. En effet, dans la mesure ou ne fonctionneront que des services réseaux dessus, il n'est pas nécessaire de disposer d'une grande quantité de ram ou d'un processeur surpuissant avec accélération graphique. A cet titre, elle est intéressante car peu chère, et toute petite.&lt;/p&gt;



&lt;p&gt;La Raspberry Pi Zero ne sera connectée à un écran que durant la phase d'installation. Ensuite, tout se fera en ligne de commande ou par interface web. Il est bien sur possible d'utiliser une Raspberry plus puissante que la zero, mais cette dernière avec un processeur à 1 Ghz et 512Mo de ram est déjà très suffisante pour faire tourner notre application.&lt;/p&gt;


&lt;h3&gt;Liste de courses&lt;/h3&gt;


&lt;p&gt;Nos  besoins seront les suivants :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L'application Google assistant ou un Google home mini (d'occasion sur le bon coin, à partir de 10 euros)&lt;/li&gt;
&lt;li&gt;Une Raspberry PI Zero w (20 euros, à partir de 12 euros d'occasion sur le bon coin) ou zéro avec un dongle wifi (15 euros neuf+ le dongle)&lt;/li&gt;
&lt;li&gt;Une alimentation 5V 2.5A&lt;/li&gt;
&lt;li&gt;Carte micro SD,  SDHC classe 10 /  8 Go mini.&lt;/li&gt;
&lt;li&gt;Un adaptateur Micro HDMI pour connecter l'écran, le câble HDMI et bien sur un écran HDMI&lt;/li&gt;
&lt;li&gt;Un adaptateur USB OTG (micro USB vers USB femelle)&lt;/li&gt;
&lt;li&gt;Un clavier souris sans fil (à brancher sur l'unique prise de l'adaptateur OTG)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OU&lt;/strong&gt; un hub USB + Clavier et souris filaire.&lt;/li&gt;
&lt;li&gt;Éventuellement si vous préférez connecter la Raspberry en filaire, une interface USB &amp;lt;&amp;gt; Ethernet compatible. En effet, la Zero n'est pas équipée de port Ethernet.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A noter que l'on trouve des kits Raspberry Pi Zero  sur Aliexpress, qui pour 25 euros fournissent une carte SD de 16 Go, l'adaptateur secteur, un boitier acrylique, l'adaptateur et le câble HDMI, le câble USB OTG et un radiateur de refroidissement pour le processeur. Il s'agit de carte officielles, fabriquées dans les lignes chinoises de la marque.&lt;/p&gt;


&lt;p&gt;Exemple de kit:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/kitzero.jpg&quot; title=&quot;kitzero.jpg, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.kitzero_m.jpg&quot; alt=&quot;kitzero.jpg, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Installation&lt;/h3&gt;

&lt;h4&gt;Pré requis :&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Google  home aura été installé et paramétré&lt;/li&gt;
&lt;li&gt;Plusieurs capteurs ou actionneurs connectés à Google Home auront pu être ajoutées en piochant par exemple dans la gamme Ewelink, qui dispose d'une version &quot;Sonoff DIY&quot; disponible à partir de 4 euros pour commander un appareil à distance.&lt;/li&gt;
&lt;li&gt;Télécharger le logiciel Raspberry Pi Imager à partir de &lt;a href=&quot;https://www.raspberrypi.org/software/&quot;&gt;https://www.raspberrypi.org/software/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Télécharger l'image &quot;&lt;strong&gt;Raspberry Pi OS with desktop&lt;/strong&gt;&quot; : &lt;a href=&quot;https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2020-12-04/2020-12-02-raspios-buster-armhf.zip&quot;&gt;https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2020-12-04/2020-12-02-raspios-buster-armhf.zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Préparation :&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Décompressez le fichier ZIP de l'image téléchargée&lt;/li&gt;
&lt;li&gt;Lancer l'imager, Dans &quot;&lt;strong&gt;Choose OS&lt;/strong&gt;&quot;, sélectionnez &quot;&lt;strong&gt;Use Custom&lt;/strong&gt;&quot;, et sélectionnez le fichier &quot;.img&quot; précédemment décompressé&lt;/li&gt;
&lt;li&gt;Introduisez la carte SD dans le PC et sélectionnez là dans le PI Imager à l'aide du bouton &quot;&lt;strong&gt;Choose SD Card&lt;/strong&gt;&quot;&lt;/li&gt;
&lt;li&gt;Cliquez ensuite sur &quot;&lt;strong&gt;Write&lt;/strong&gt;&quot;. Ça prend un peu de temps... (dépend de la vitesse / performance de votre lecteur de carte SD)&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Branchement de la Raspberry&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Insérer la carte SD dans la Raspberry&lt;/li&gt;
&lt;li&gt;La prise USB de gauche reçoit l'adaptateur OTG.&lt;/li&gt;
&lt;li&gt;Si vous êtes en clavier souris sans fil, il suffit de mettre le dongle sur la prise femelle de l'USB OTG.&lt;/li&gt;
&lt;li&gt;Sinon, brancher le hub USB dessus, et brancher le clavier et la souris sur le HUB. Si le hub dispose d'une alimentation c'est mieux.... Cela évitera de &quot;tirer&quot; sur les alimentations de la Raspberry.&lt;/li&gt;
&lt;li&gt;Si vous préférez vous connecter en réseau filaire et disposez d'un kit chinois intégrant l'adaptateur USB &amp;lt;&amp;gt; Ethernet compatible, c'est le moment de le brancher sur le hub USB.&lt;/li&gt;
&lt;li&gt;Brancher le câble HDMI et l’adaptateur HDMI&lt;/li&gt;
&lt;li&gt;Et enfin, brancher l’alimentation sur la prise USB de droite&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Premier démarrage&lt;/h4&gt;

&lt;p&gt;Juste après branchement, la Raspberry indique qu'elle va étendre la taille du système de fichier et redémarrer. C'est d'ailleurs ce qu'elle fait :)..  pour nous amener ensuite dans l'interface graphique.&lt;/p&gt;


&lt;h4&gt;Wifi&lt;/h4&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/wifi.png&quot; title=&quot;wifi.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/wifi.png&quot; alt=&quot;wifi.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Nous allons tout de suite nous connecter au réseau Wifi. Pour ce faire, cliquer en haut à droite sur l'icône réseau (à côté du haut parleur) et suivre les instructions pour sélectionner votre réseau et associer la clé Wifi. Si vous avez saisi vos informations sans erreurs, au bout d'une dizaine de secondes vous allez être raccordé à votre réseau.  Cette étape n'est pas nécessaire si vous êtes connectés en réseau filaire.&lt;/p&gt;


&lt;h4&gt;Assistant d'installation&lt;/h4&gt;

&lt;p&gt;L'assistant se lance pour nous permettre de personnaliser l'installation.  Renseigner avec les informations suivantes :&lt;/p&gt;
&lt;pre&gt;
- Country = France
- Langage = French
- Timezone = Paris
- Valider
&lt;/pre&gt;


&lt;p&gt;Vous allez également devoir mettre un nouveau mot de passe En choisir un suffisamment fort (10 caractères mini, panachage de majuscules, minuscules, chiffres et symboles), car nous allons activer l'accès à distance par SSH...&lt;/p&gt;


&lt;h4&gt;Et ensuite ?&lt;/h4&gt;


&lt;h5&gt;Mises à jour et paquets complémentaires&lt;/h5&gt;

&lt;p&gt;Il va ensuite falloir mettre à jour le système avec les derniers correctifs et faire quelques installations complémentaires.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Pour ce faire, il va vous falloir lancer un terminal (icône noire à gauche) et lancer les commandes suivantes :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/terminal.png&quot; title=&quot;terminal.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/terminal.png&quot; alt=&quot;terminal.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;- Pour les mises à jour du système :&lt;/p&gt;
&lt;pre&gt;
sudo apt-get update
sudo apt-get upgrade
&lt;/pre&gt;


&lt;p&gt;- Pour l'installation du bureau à distance&lt;/p&gt;
&lt;pre&gt;
sudo apt-get install xrdp
&lt;/pre&gt;


&lt;p&gt;- Pour les prérequis afin de compiler certains paquets de node :&lt;/p&gt;
&lt;pre&gt;
sudo apt-get install -y libavahi-compat-libdnssd-dev
&lt;/pre&gt;


&lt;p&gt;- Et pour l'installation quelques utilitaires complémentaires&lt;/p&gt;
&lt;pre&gt;
sudo apt-get install -y mc telnet git iftop vim screen neofetch
&lt;/pre&gt;



&lt;h5&gt;Configuration de Vi (optionnel)&lt;/h5&gt;

&lt;p&gt;Une petite configuration de l'éditeur Vi peut s'avérer nécessaire pour ceux qui l'utilisent afin de supprimer le mode visuel qui empêche les copier coller classiques. Editer .vimrc dans /root et /home/pi et ajouter la ligne&lt;/p&gt;
&lt;pre&gt;
set mouse-=a
&lt;/pre&gt;


&lt;p&gt;Editer également /etc/vim/vimrc et dé-commenter :&lt;/p&gt;
&lt;pre&gt;
syntax on
&lt;/pre&gt;


&lt;h5&gt;Paramétrage profond de la Raspberry&lt;/h5&gt;

&lt;p&gt;La Raspberry nécessite un paramétrage système. Ceci a pour effet d'activer les interfaces intégrées à la Raspberry (SPI, I2C, etc..), l'accès Shell distant, et surtout de paramétrer le nom du système de façon à éviter tout conflit avec une éventuelle autre Raspberry PI existante sur votre réseau. Nous allons également reparamétrer la Raspberry pour que par défaut elle ne lance plus un environnement graphique afin d'économiser la ram. C'est assez facile à réaliser sous shell avec le programme spécifique fourni :&lt;/p&gt;

&lt;pre&gt;
sudo raspi-config
&lt;/pre&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/raspi-config.png&quot; title=&quot;raspi-config.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.raspi-config_m.png&quot; alt=&quot;raspi-config.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Puis en utilisant les flèches de déplacement curseur et entrée, naviguez dans le menu et paramétrez :&lt;/p&gt;


&lt;p&gt;Dans &quot;&lt;strong&gt;System Options&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;pre&gt;
	 S4 - hostname :  choisir un nom d&amp;#039;hôte unique sur votre réseau local (exemple &amp;quot;ma-raspberry&amp;quot;)
	 S5 - Boot / auto login
		Choisir B1 - Console
&lt;/pre&gt;


&lt;p&gt;Dans &quot;&lt;strong&gt;Interface Options&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;pre&gt;
	P2 ssh  &amp;gt; enable
	P4 spi &amp;gt; enable
	P5 i2c &amp;gt; enable
	P7 1wire &amp;gt;  enable
&lt;/pre&gt;


&lt;p&gt;Quitter raspi-config et ne pas accepter le reboot. Nous allons d'abord terminer le paramétrage...&lt;/p&gt;


&lt;h5&gt;Geekerie : Neofetch (optionnel)&lt;/h5&gt;

&lt;p&gt;Cette étape n'est pas indispensable, mais il est pratique de disposer d'une bannière en ligne de commande qui nous indique quelques paramètres vitaux sur le système (système, processeur, mémoire, température, uptime, etc..):&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/Neofetch.png&quot; title=&quot;Neofetch.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.Neofetch_m.png&quot; alt=&quot;Neofetch.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;L'installation est simple :&lt;/p&gt;

&lt;pre&gt;
sudo nano /etc/profile.d/motd.sh
&lt;/pre&gt;


&lt;p&gt;Coller les lignes suivantes dans le fichier en cours d'édition :&lt;/p&gt;
&lt;pre&gt;
#!/bin/bash
echo
neofetch --cpu_temp C
&lt;/pre&gt;


&lt;p&gt;Il y a  un petit bug sur neofetch sur Raspberry, nous empêchant d'afficher la température de la carte.  Il est aisément corrigeable en éditant le fichier  /usr/bin/neofetch (sudo nano  /usr/bin/neofetch) pour remplacer :&lt;/p&gt;
&lt;pre&gt;
[[ &amp;quot;$(&amp;lt; &amp;quot;${temp_dir}/name&amp;quot;)&amp;quot; =~ (ccoretemp|fam15h_power|k10temp) ]] &amp;amp;&amp;amp; \
&lt;/pre&gt;

&lt;p&gt;par&lt;/p&gt;
&lt;pre&gt;
[[ &amp;quot;$(&amp;lt; &amp;quot;${temp_dir}/name&amp;quot;)&amp;quot; =~ (cpu_thermal|ccoretemp|fam15h_power|k10temp) ]] &amp;amp;&amp;amp; \
&lt;/pre&gt;


&lt;h5&gt;Installation de NodeRed&lt;/h5&gt;

&lt;p&gt;Suivre les instructions d'installation à partir de la page officielle de NodeRed: &lt;a href=&quot;https://nodered.org/docs/getting-started/raspberrypi&quot;&gt;https://nodered.org/docs/getting-started/raspberrypi&lt;/a&gt;. Dans un shell, (déjà ouvert au chapitre précédent), lancer la commande :&lt;/p&gt;
&lt;pre&gt;
bash &amp;lt;(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
&lt;/pre&gt;


&lt;p&gt;L'opération prend un temps non négligeable (de l'ordre de la demi heure..). A l'issue de l'installation, un message indique que vous pouvez vous connecter sur http://ma-raspberry.local:1880 (ou le nom que vous avez choisi à l'étape précédente). Ce peut être une bonne idée de vous y connecter pour vérifier que tout va bien....&lt;/p&gt;


&lt;p&gt;Nous allons ensuite lancer automatiquement node-red au démarrage :&lt;/p&gt;
&lt;pre&gt;
sudo systemctl enable nodered.service
&lt;/pre&gt;


&lt;p&gt;Il existe une très grosse bibliothèque de compléments pour NodeRed, la communauté étant très active. Le site dispose d'une rubrique dédiée au partage de flux (&quot;Flows&quot;) et de bibliothèques (&quot;Nodes&quot;) : https://flows.nodered.org/ .  Certains proposent même des solutions complètes (&quot;Collections&quot;), combinant les flux et bibliothèques nécessaires pour un projet complet. Chaque module dispose de sa page d'aide. Tout ceci est bien sur open source. Nous allons lancer l'installation de quelque uns des paquets complémentaires pour Node Red.&lt;/p&gt;


&lt;p&gt;Pour installer des modules en ligne de commande, il faut d'abord se placer dans le bon répertoire :&lt;/p&gt;
&lt;pre&gt;
cd /home/pi/.node-red/
&lt;/pre&gt;


&lt;p&gt;Pour Google Home :&lt;/p&gt;
&lt;pre&gt;
npm install node-red-contrib-googlehome
&lt;/pre&gt;


&lt;p&gt;Pour l'interfaçage des périphériques Ewelink (https://flows.nodered.org/node/node-red-contrib-ewelink):&lt;/p&gt;
&lt;pre&gt;
npm install node-red-contrib-ewelink 
&lt;/pre&gt;


&lt;p&gt;Pour le support ds emails sous NodeRed (https://flows.nodered.org/node/node-red-node-email) (cela nous servira pour mettre en place une sauvegarde automatique) :&lt;/p&gt;
&lt;pre&gt;
npm install node-red-node-email 
&lt;/pre&gt;


&lt;p&gt;Pour le support de Modbus (https://flows.nodered.org/node/node-red-contrib-modbus) (nous l'utiliserons ici pour supporter un compteur d'énergie)&lt;/p&gt;
&lt;pre&gt;
npm install node-red-contrib-modbus 
&lt;/pre&gt;


&lt;p&gt;Et enfin pour disposer d'un panneau d'affichage graphique dans NodeRed (https://flows.nodered.org/node/node-red-dashboard) :&lt;/p&gt;
&lt;pre&gt;
npm install node-red-dashboard 
&lt;/pre&gt;


&lt;p&gt;A noter que l'installation en ligne de commande des compléments pour Node Red n'est pas la seule méthode. Nous verrons qu'il existe aussi dans l'interface graphique de node-red de quoi le faire. Les deux méthodes sont équivalentes.&lt;/p&gt;


&lt;p&gt;Il est maintenant temps de rebooter..&lt;/p&gt;
&lt;pre&gt;
sudo shutdown -r now
&lt;/pre&gt;


&lt;h5&gt;Se connecter à la Raspberry&lt;/h5&gt;


&lt;p&gt;Après reboot, vérifiez que tout va bien et que vous pouvez vous connecter :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En http sur l'interface de node-red à l'adresse http://ma-raspberry.local:1880&lt;/li&gt;
&lt;li&gt;En SSH, en utilisant le programme Putty (Windows), avec l'utilisateur &quot;pi&quot; et le mot de passe que vous avez fixé à l'étape précédente.&lt;/li&gt;
&lt;li&gt;A distance sur l'interface graphique avec le bureau à distance intégré à WIndows. Sur mac, vous pourrez installer le client Microsoft à partir d'ici: &lt;a href=&quot;https://apps.apple.com/fr/app/microsoft-remote-desktop/id1295203466?mt=12&quot;&gt;https://apps.apple.com/fr/app/microsoft-remote-desktop/id1295203466?mt=12&lt;/a&gt; .&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Si tout va bien, vous pouvez à ce stade déconnecter clavier, souris, écran, etc.. Nous allons à partir de maintenant uniquement accéder à la Raspberry en réseau.&lt;/p&gt;


&lt;h5&gt;Dépannage&lt;/h5&gt;

&lt;p&gt;Si vous ne pouvez pas vous connecter (y compris par l'adresse IP), c'est que quelque chose ne va pas sur la config réseau. Vous disposez toujours de la possibilité en local (écran + clavier+souris) sur un terminal simple sans environnement graphique afin de rechercher l'origine du problème. Vous pouvez vous y logger par l'utilisateur &quot;pi&quot; et le mot de passe choisi à l'étape précédente.&lt;/p&gt;


&lt;p&gt;De ce  terminal, vous pouvez ensuite lancer un environnement graphique afin de reconfigurer le réseau avec la commande  :&lt;/p&gt;

&lt;pre&gt;
startx
&lt;/pre&gt;



&lt;h3&gt;Premiers pas sous node-red&lt;/h3&gt;

&lt;h4&gt;Découverte de l'environnement&lt;/h4&gt;


&lt;p&gt;La connexion à node-red se fait via un navigateur web sur le port 1880 ( http://ma-raspberry.local:1880 ou le nom que vous avez attribué aux étapes précédentes ).&lt;/p&gt;


&lt;p&gt;Vue de l'écran principal de node-red (cliquer pour zoomer) :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/Node-RED1.png&quot; title=&quot;Node-RED1.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.Node-RED1_m.png&quot; alt=&quot;Node-RED1.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La zone centrale est l'espace de travail dans lequel on dépose et l'on câble les nodes, qui sont les fonctions élémentaires de node-red.&lt;/p&gt;


&lt;p&gt;Un panneau à gauche contient les différents nodes disponibles. Les nodes sont filtrables à l'aide d'un moteur de recherche au dessus. En dessous, les différents nodes sont regroupés par catégorie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Common : Nodes utilitaires (injection, debug) , et liens interfeuilles&lt;/li&gt;
&lt;li&gt;Function : Toutes les fonctions agissant sur un flux.&lt;/li&gt;
&lt;li&gt;Network : Toutes les fonctions agissant sur le réseau, MQTT, http, websockets, sockets et autres..&lt;/li&gt;
&lt;li&gt;Output : Sortie audio uniquement par défaut.&lt;/li&gt;
&lt;li&gt;Sequence : Agit sur les séquences de messages produits par les nodes.&lt;/li&gt;
&lt;li&gt;Parser : Interpréteur de pages html, fichiers csv, json, xml, etc..&lt;/li&gt;
&lt;li&gt;Storage : Tout ce qui concerne le stockage ou la lecture de fichiers.&lt;/li&gt;
&lt;li&gt;Social : Tout ce qui concerne la messagerie et les réseaux sociaux si les extensions ont été installées.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;D'autres ensembles de nodes ont été installées dans la procédure ci dessus, et notamment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eWelink : dialogue avec les périphériques Ewelink (Sonoff)&lt;/li&gt;
&lt;li&gt;Google Assistant :  interactions avec Google Home&lt;/li&gt;
&lt;li&gt;Modbus : Entrées sorties Modbus, que ce soit en IP ou en RS485&lt;/li&gt;
&lt;li&gt;Dashboard :  Panneau de contrôle et d'affichage pour Nodered.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;La zone de droite contient les fonctions d'édition des propriétés. En haut de celle-ci, différentes icônes permettent l'accès aux infos (propriétés), aide, l'onglet de debug, et bien d'autres fonctions. Tout au dessus, à droite, le bouton &quot;Deploy&quot; permet de déployer toute modification faite sur l'espace de travail. C'est impératif de le faire après chaque modification à tester, sinon elles ne seront pas publiées et vous fonctionnerez sur la version précédente.&lt;/p&gt;


&lt;p&gt;Je ne vais pas me lancer dans un tutoriel sur nodered, d'une part car la doc officielle en est farcie ( &lt;a href=&quot;https://nodered.org/docs/tutorials/&quot;&gt;https://nodered.org/docs/tutorials/&lt;/a&gt; ) mais aussi parce que le web en fourmille...&lt;/p&gt;


&lt;h4&gt;Nodered et Google Home&lt;/h4&gt;


&lt;p&gt;Tout d'abord, il peut paraitre inintéressant de coupler node-red et Google Home. En effet, avec Google home et des périphériques supportés, il n'y a besoin de rien d'autre pour allumer ou éteindre des appareils à la voix..  Node Red va nous permettre de faire des choses qui ne sont pas prévus par Google Home comme :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faire des scénarios plus ou moins complexes, comme par exemple allumer un périphérique à la voix, qui s'éteindra automatiquement au bout d'un certain temps. Ceci peut permettre par exemple d'éteindre automatiquement ampli de chaine hifi ou une imprimante, que l'on pourrait oublier d'éteindre manuellement.&lt;/li&gt;
&lt;li&gt;Par le même procédé, on peut aussi réaliser une commande de portail qui allume un relais uniquement 3 secondes par exemple.&lt;/li&gt;
&lt;li&gt;Remplacer IFTTT, devenu payant (3 commandes max dans la version gratuite), afin de lier une commande vocale à un appel à une URL avec des paramètres. Ceci ouvre des possibilités de pilotage avec Google Home de périphériques DIY qui ne sont pas interfacables avec Google Home. Je l'utilise par exemple pour commander un émetteur infrarouge qui pilote mes clims / pompe à chaleur en commande vocale.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A noter que sur ce dernier scénario d'usage, contrairement à IFTTT nous n'aurons pas la possibilité de définir un nouveau vocabulaire. Il faudra s'appuyer sur celui existant  ( &quot;OK Google, &lt;strong&gt;Allume&lt;/strong&gt;  le Chauffage à 19 &lt;strong&gt;Degrés&lt;/strong&gt;&quot;, ou &quot;OK Google &lt;strong&gt;Allume&lt;/strong&gt; l'imprimante&quot; ). C'est une limitation, mais c'est aussi un bénéfice, car avec IFTT à contrario, il n'était pas possible d'utiliser &quot;allume&quot; ou &quot;éteint&quot; comme mots clés, réservés pour les périphériques standards.. Ici, nous n'utiliserons donc que des commandes intégrées, évitant à l'utilisateur d'apprendre de nouvelles commandes.&lt;/p&gt;


&lt;p&gt;Afin de tester nous allons créer un switch, nommé ampli, qui allumera ou éteindra l'ampli home cinema avec la commande vocale &quot;allume/éteint l'ampli&quot;, mais en plus l'éteindra automatiquemetn au bout de 3 heures si il n'y a pas eu de commande d'extinction de prononcée dans l'intervalle. 3 heures, ca fait déjà un beau film :)..&lt;/p&gt;


&lt;p&gt;Pour utiliser les nodes Google Home de Node Red( https://flows.nodered.org/search?term=node-red-contrib-googlehome ), nous allons devoir créer un compte sur &lt;a href=&quot;https://googlehome.hardill.me.uk/register&quot;&gt;https://googlehome.hardill.me.uk/register&lt;/a&gt;.  Une fois le compte créé et que nous sommes identifiés, il nous faut créer un périphérique dans https://googlehome.hardill.me.uk/user/devices .&lt;/p&gt;


&lt;p&gt;Ici, nous allons créer un périphérique simple nommé &quot;Ampli&quot;. A noter que lors de la création, il est possible de donner des caractéristiques (&quot;Traits&quot;) au périphérique, qui vont déterminer quelles sont les commandes auxquelles le périphérique va répondre et les statuts qu'il est susceptible de nous retourner. Pour info, ces &quot;traits&quot;, sont renseignés automatiquement lorsque l'on sélectionne un type, mais on peut les compléter à la demande. Pour notre ampli, nous allons sélectionner un &quot;Switch&quot;. Par défaut le type Switch n'a que le &quot;trait&quot; On/Off d'activé, ce qui nous suffit.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/create-ampli.png&quot; title=&quot;create-ampli.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.create-ampli_m.png&quot; alt=&quot;create-ampli.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Vous pouvez ou pas l'associer à une pièce en fonction de ce que vous voulez faire. Si par exemple, vous souhaitez que lorsque vous sortez vous puissez dire &quot;OK Google, éteint Salon&quot;, cela coupe toutes les lumières et l'ampli, cela peut avoir du sens. Il faut malgré tout penser que si l'on allume le salon de la même manière, l'ampli sera aussi allumé ... pour 3 heures. Dans mon cas, j'ai choisi de le dissocier du salon.&lt;/p&gt;


&lt;p&gt;A partir de ce stade, Google Home sera en mesure de comprendre les commandes d'allumage ou d'extinction d'un &quot;switch&quot; nommé &quot;Ampli&quot;. Mais comme il n'est pas encore câblé, cela ne fera physiquement rien.&lt;/p&gt;


&lt;p&gt;Nous allons ensuire enregistrer dans l'application Google Assistant, sur mobile, un périphérique physique, capable d'allumer ou d'éteindre l'ampli. Il va nous falloir lui donner un nom différent de &quot;ampli&quot;, par exemple amplificateur (ou rhododendron, si ca vous amuse). Dans la mesure ou nous le piloterons jamais en direct, on se fout un peu du nom dès lors qu'il n'est pas susceptible d'entrer en conflit avec le nom que vous voulez utiliser et qu'il ne risque pas d'être actité par inadvertance.  Dans mon cas, j'ai pris un Sonoff DIY à 4 euros, que j'ai d'abord enregistré dans l'application mobile Ewelink, puis je l'ai ajouté dans Google Assistant.  Je l'ai nommé &quot;Amplificateur&quot;, n'étant pas particulièrement fan de rhododendron.&lt;/p&gt;


&lt;p&gt;La dernière étape consiste à &quot;brancher&quot; les 2 dans node red, et mettre l'intelligence pour l'extinction automatique. Comme je suis avec des produits Sonoff, il va tout d'abord falloir identifier le switch que je viens d'ajouter. Malheureusement, on doit dialoguer avec celui-ci par un numéro unique d'identification, qu'il faut d'abord relever.&lt;/p&gt;


&lt;p&gt;Pour ce faire nous allons batir un premier Flow qui va permettre d'interroger la liste des périphériques supportés :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/lister-sonoff.png&quot; title=&quot;lister-sonoff.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.lister-sonoff_m.png&quot; alt=&quot;lister-sonoff.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En voici le source qui pourra être importé dans Nodered par le menu tout en haut à droite, &quot;Import&quot; / &quot;Clipboard&quot; et en collant le code Json ci dessous.&lt;/p&gt;
&lt;pre&gt;
[{&amp;quot;id&amp;quot;:&amp;quot;3dbccd96.909d22&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tab&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;Lister les périphériques Sonoff&amp;quot;,&amp;quot;disabled&amp;quot;:false,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;1023c8cb.31d547&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;debug&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;3dbccd96.909d22&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;active&amp;quot;:true,&amp;quot;tosidebar&amp;quot;:true,&amp;quot;console&amp;quot;:false,&amp;quot;tostatus&amp;quot;:false,&amp;quot;complete&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;targetType&amp;quot;:&amp;quot;full&amp;quot;,&amp;quot;statusVal&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;statusType&amp;quot;:&amp;quot;auto&amp;quot;,&amp;quot;x&amp;quot;:650,&amp;quot;y&amp;quot;:60,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;1f4535fb.fe42d2&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ewelink-devices&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;3dbccd96.909d22&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Compte perso&amp;quot;,&amp;quot;auth&amp;quot;:&amp;quot;d2328f67.881f68&amp;quot;,&amp;quot;x&amp;quot;:460,&amp;quot;y&amp;quot;:60,&amp;quot;wires&amp;quot;:[[&amp;quot;1023c8cb.31d547&amp;quot;]],&amp;quot;info&amp;quot;:&amp;quot;Ca ne se connecte pas à tout les coups.&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;6a8c47e3.62ed9&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;3dbccd96.909d22&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:280,&amp;quot;y&amp;quot;:60,&amp;quot;wires&amp;quot;:[[&amp;quot;1f4535fb.fe42d2&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;465b619b.dfc7f8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;3dbccd96.909d22&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Lister les ewelink&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:100,&amp;quot;y&amp;quot;:60,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;d2328f67.881f68&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ewelink-credentials&amp;quot;}]
&lt;/pre&gt;


&lt;p&gt;&lt;q&gt;A noter que le code json ci dessus est assez moche et difficile car optimizé. Si vous désirez le visualiser sous forme lisible, il suffit de le copier coller dans notepad++ et d'installer le plugin &quot;JSON Viewer&quot;.  Dans &quot;Modules d'extension&quot; / &quot;JSON Viewer&quot;, vous trouverez ensuite une option &quot;Format JSON&quot; qui mettra les directives une par ligne et les tabulations associées pour en faciliter la lecture. &lt;/q&gt;&lt;/p&gt;


&lt;p&gt;Pour des raisons de sécurité, les nodes exportés ne contiennent pas les informations de configuration (comptes, mots de passes, etc...). Il va donc vos falloir reparamétrer le node d'interrogation (en bleu) avec vos identifiants de compte Ewelink (les mêmes que ceux que vous mettez dans l'application mobile Ewelink).&lt;/p&gt;


&lt;p&gt;Après publication (cliquer &quot;Deploy&quot;), vous allez pouvoir le déclencher en cliquant sur le bouton à gauche de &quot;Timestamp&quot;. Si tout s'est bien passé (notamment au niveau de l'authentification), vous devriez, en cliquant sur &quot;Debug&quot; (1), Payload (2) et en sélectionnant le bon objet (3), trouver votre switch nommé &quot;Amplificateur&quot;. Juste au dessus, se trouve le &quot;deviceid&quot; qu'il va nous falloir garder pour la suite du paramétrage.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/amplificateur.png&quot; title=&quot;amplificateur.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.amplificateur_m.png&quot; alt=&quot;amplificateur.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Nous allons maintenant que 'id est connu pouvoir mettre en place la programmation pour l'allumage extinction du switch. Importez la feuille ci dessous avec la même méthode que celle vue précédemment :&lt;/p&gt;

&lt;pre&gt;
[{&amp;quot;id&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tab&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;Ampli&amp;quot;,&amp;quot;disabled&amp;quot;:false,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;32be4281.a23356&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Gestion de l&amp;#039;ampli avec Google Home et un Sonof DIY à 4 USD, timer 3 heures&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:300,&amp;quot;y&amp;quot;:40,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;af140768.365f9&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;google-home&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;conf&amp;quot;:&amp;quot;144ed61b.13aaca&amp;quot;,&amp;quot;device&amp;quot;:&amp;quot;6640&amp;quot;,&amp;quot;acknowledge&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;Ampli&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:245,&amp;quot;y&amp;quot;:80,&amp;quot;wires&amp;quot;:[[&amp;quot;e32913a7.610908&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;bd24774d.045e88&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;google-home-response&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;conf&amp;quot;:&amp;quot;144ed61b.13aaca&amp;quot;,&amp;quot;device&amp;quot;:&amp;quot;6640&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Ampli&amp;quot;,&amp;quot;x&amp;quot;:685,&amp;quot;y&amp;quot;:180,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;e32913a7.610908&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;if (msg.payload.command == &amp;quot;action.devices.commands.OnOff&amp;quot;) {\n    if (msg.payload.params.on) {\n        msg.payload = &amp;quot;on&amp;quot;;\n    } else {\n        msg.payload = &amp;quot;off&amp;quot;;\n    }\n} \n  return [msg,null];&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:395,&amp;quot;y&amp;quot;:80,&amp;quot;wires&amp;quot;:[[&amp;quot;bf337f24.a6f4d&amp;quot;,&amp;quot;a1e5f2fc.66eb68&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;bf337f24.a6f4d&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;trigger&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;op1&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;op2&amp;quot;:&amp;quot;off&amp;quot;,&amp;quot;op1type&amp;quot;:&amp;quot;nul&amp;quot;,&amp;quot;op2type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;duration&amp;quot;:&amp;quot;360&amp;quot;,&amp;quot;extend&amp;quot;:true,&amp;quot;overrideDelay&amp;quot;:false,&amp;quot;units&amp;quot;:&amp;quot;min&amp;quot;,&amp;quot;reset&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bytopic&amp;quot;:&amp;quot;all&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;x&amp;quot;:475,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;bc06065.8cf8ef8&amp;quot;,&amp;quot;a1e5f2fc.66eb68&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;bc06065.8cf8ef8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;msg.payload = {\n    command: &amp;quot;action.devices.commands.OnOff&amp;quot;,\n    params: {\n        on: false ,\n        online: true\n    }\n};\nreturn msg;\n&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:555,&amp;quot;y&amp;quot;:180,&amp;quot;wires&amp;quot;:[[&amp;quot;bd24774d.045e88&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a1e5f2fc.66eb68&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ewelink-power-state-write&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Ampli&amp;quot;,&amp;quot;deviceId&amp;quot;:&amp;quot;1000f0d61a&amp;quot;,&amp;quot;channel&amp;quot;:1,&amp;quot;auth&amp;quot;:&amp;quot;d2328f67.881f68&amp;quot;,&amp;quot;x&amp;quot;:625,&amp;quot;y&amp;quot;:80,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;60e6f006.ab3b7&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Update Google Homegraph state&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:895,&amp;quot;y&amp;quot;:180,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;4231e968.4973d&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Allume immédiatement&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:855,&amp;quot;y&amp;quot;:80,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;dbfa2871.66531&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;On&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;onceDelay&amp;quot;:0.1,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;x&amp;quot;:245,&amp;quot;y&amp;quot;:180,&amp;quot;wires&amp;quot;:[[&amp;quot;bf337f24.a6f4d&amp;quot;,&amp;quot;a1e5f2fc.66eb68&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;f029e3af.19ac88&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;54677a23.6603c4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Eteint au bout de 3 heures ou sur ordre&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:915,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;144ed61b.13aaca&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;google-home-conf&amp;quot;,&amp;quot;username&amp;quot;:&amp;quot;moncompte&amp;quot;,&amp;quot;localControl&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;d2328f67.881f68&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ewelink-credentials&amp;quot;}]
&lt;/pre&gt;


&lt;p&gt;Ce sketch va nécessiter un peu de paramétrage. Double cliquez sur le node bleu (Ampli) et sélectionnez dans la liste déroulante les identifiants précédemment créés pour le compte Ewelink. Puis double cliquez sur les 2 nodes gris &quot;Ampli&quot;, et y mettre les identifiants du compte créé sur le site  &lt;a href=&quot;https://googlehome.hardill.me.uk&quot;&gt;https://googlehome.hardill.me.uk&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/node-red-ampli.png&quot; title=&quot;node-red-ampli.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.node-red-ampli_m.png&quot; alt=&quot;node-red-ampli.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Après publication, vous pourrez vérifier le bon fonctionnement de Nodered &amp;gt; Ewelink en cliquant sur &quot;On&quot;. Il vous restera à terser les commandes vocales sous Google Home: &quot;Allume&quot; Ampli&quot;, &quot;Eteint Ampli&quot;
A noter que lorsque le trigger est bien déclenché (par la commande vocale ou l'appui manuel sur &quot;on&quot;), un petit point bleu s'affiche à côté. Il 'éteindra ici tout seul au bout de 3 heures. Le temps peut être ajusté dans le trigger (double cliquez sur le node violet..).&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/trigger-declenche.png&quot; title=&quot;trigger-declenche.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.trigger-declenche_m.png&quot; alt=&quot;trigger-declenche.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Nous venons donc d'ajouter un nouveau périphérique nommé ampli, qui s'éteint tout seul au bout de 3 heures..&lt;/p&gt;


&lt;h4&gt;Nodered et Modbus&lt;/h4&gt;


&lt;h5&gt;Modbus&lt;/h5&gt;


&lt;p&gt;Modbus est un protocole de 1979, qui permet de discuter avec des périphériques en les adressant individuellement. Initialement développé pour des automates programmables et avec une couche transport reposant sur une liaison série RS485, permettant de raccorder plusieurs périphériques sur une même ligne de transmission, il est aujourd'hui très répandu car il est royalty-free et relativement facile à mettre en oeuvre.&lt;/p&gt;


&lt;p&gt;Aujourd'hui, le protocole modbus existe en 2 variantes majeures : RTU (sur liaison série RS232, RS422, RS485) et TCP (réseau filaire et wifi).  En mode RTU, nous sommes en maitre / esclave. C'est le maitre qui pose les questions aux esclaves qui répondent tour à tour si leur adresse est visée. C'est grace à cette astuce qu'il ne peut pas y avoir de collision, puisqu'un et un seul élève peut répondre à la fois à un maitre, et uniquement lorsqu'il est interrogé.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/modbus-serial-query.png&quot; title=&quot;modbus-serial-query.png, janv. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.modbus-serial-query_m.png&quot; alt=&quot;modbus-serial-query.png, janv. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En mode TCP, nous sommes en client serveur, et le serveur est passif. Il attend les connexions des clients qui doivent écrire dans le serveur.&lt;/p&gt;


&lt;p&gt;Nous allons plus particulièrement nous intéresser modbus RTU sur liaison RS485. En effet, de nombreux périphériques sont désormais disponibles à prix abordables pour le grand publix à ce format : micro automates programmables, modules d'entrées sorties, capteurs de pression, de température, pilotage de moteurs à fréquence variables,  compteurs d'énergie, etc.. Il suffit de 2 fils pour les raccorder, de leur attribuer une adresse différente et bien sur de disposer de la documentation de référence Modbus de l'appareil pour savoir quels sont les registre disponibles. Les périphériques sont mis en parallèle sur une ligne de transmission comme suit :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/modbus-serial.png&quot; title=&quot;modbus-serial.png, janv. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.modbus-serial_m.png&quot; alt=&quot;modbus-serial.png, janv. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En principe, il ne faut pas dépasser 32 périphériques modbus sur une même ligne de transmission. Au delà il faudra mettre un répéteur. Il faut également qu'une ligne de transmission modbus soit chargeé à ses 2 extrémités avec une résistance de 100 ou 120 ohms, qui soit accordée à l'impédance caractéristique du câble pour limiter les pertes de transmission. Sur de très petites distances, et avec un seul périphérique, c'est beaucoup moins critique, et nous allons pouvoir l'oublier, mais il faudra y penser si vous envisagez de placer un câble de plusieurs dizaines de mètres entre la raspberry et le module modbus. Le choix du cable devient alors important.&lt;/p&gt;


&lt;p&gt;Pour l'exemple nous alllons interfacer un SDM230 (100A max) ou SDM 120 (50A max), compteur d'énergie de EASTRON. Disponible à 25 euros, ce module se met dans le tableau électrique, en tête de réseau, pour comptabiliser l'énergie consommée dans la maison. Il est capable de fournir la tension, le courant et la puissance instantanée, ainsi que le comptage d'énergie totale consommée en KW/H.&lt;/p&gt;


&lt;p&gt;La Raspberry fournissant une simple liaison série 3.3V, il va nous falloir un adaptateur série &amp;lt;&amp;gt; Modbus série pour pouvoir dialoguer avec nos périphériques Modbus. On en trouve de nombreux sur Aliexpress à partir de 2 euros : https://fr.aliexpress.com/wholesale?SearchText=module+TTL+RS485&lt;/p&gt;


&lt;p&gt;Voici celui que j'ai acheté, car il dispose d'une bonne protection contre les décharges électrostatiques et les surtensions ainsi que 2 leds d'activité TX/RX:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/RS485-adapter.jpg&quot; title=&quot;RS485-adapter.jpg, janv. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.RS485-adapter_m.jpg&quot; alt=&quot;RS485-adapter.jpg, janv. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Côté branchements, un côté se raccorde à une alimentation (3.3V/GND) de la Raspberry et à la liaison série (TX = GPIO14, RX=GPIO15). Le TXd de la raspberry se branche sur le TXd de la carte RS485 et vice/versa.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/Raspberry-PI-Zero-Pinout-schema.webp&quot; title=&quot;Raspberry-PI-Zero-Pinout-schema.webp, janv. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.Raspberry-PI-Zero-Pinout-schema_m.webp&quot; alt=&quot;Raspberry-PI-Zero-Pinout-schema.webp, janv. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;L'aute côté (RS485) se raccorde en branchant le A+ de l'adaptateur sur le A+ du SDM230, et même chose pour le B-.&lt;/p&gt;


&lt;h5&gt;Protocole Modbus&lt;/h5&gt;


&lt;p&gt;Pour plus d'explication sur le protocole Modbus et notamment avoir les adresses des registres disponibles, vous pouvez consulter la &lt;a href=&quot;https://civade.com/images/nodered/SDM230-PROTOCOL.pdf&quot;&gt;Documentation du protocole SDM230&lt;/a&gt;. J'ai également trouvée une &lt;a href=&quot;https://civade.com/images/nodered/SDM230-MODBUS_Protocol.pdf&quot;&gt;doc détaillée sur les registres disponibles sur le SDM230&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;A la lecure de la doc, on a l'impression que c'est compliqué mais vous allez voir que via Nodered et les modules additionnels c'est finalement assez simple.&lt;/p&gt;


&lt;p&gt;Les valeurs à lire sont dans les &quot;Input Registers&quot;. Il est dit dans la doc du SDM230 que les valeurs sont contenues dans 2 registres consécutifs de 16 bits (soit 4 octets) et qu'ils sont encodés en virgule flottante IEEE754.&lt;/p&gt;


&lt;p&gt;Si nous souhaitons lire le courant (1), nous allons donc devoir lire 2 registre consécutifs à l'adresse 6 (2) comme l'indique la doc :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/InputRegisters.png&quot; title=&quot;InputRegisters.png, janv. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.InputRegisters_m.png&quot; alt=&quot;InputRegisters.png, janv. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Attention, l'adresse du regitre (2) est en hexadécimal.&lt;/p&gt;


&lt;p&gt;Il va également nous falloir connaitre l'adresse Modbus du périphérique. Par défaut, elle est à 1 mais je l'ai changée à 30 par le panneau avant du SDM340. Enfin, j'ai conservé la vitesse par défaut de Modbus (9600 bauds), ainsi que le format (n,8,1). Ca y es tnous avons tout ce qu'il faut pour questionner notre périphérique Modbus:&lt;/p&gt;


&lt;p&gt;Nous allons donc poser la question au périphérique d'adresse 30 (1),  pour lire les Inpupt Registers (2), en lui demandant 2 registres de 16 bits (4) commençant à l'adresse 6 (3), et allons dialoguer sur la liaison série /dev/serial0 paramétrée en 9600 bauds, 8 bits, no parity, 1 stop bit :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/ModbusQuestion.png&quot; title=&quot;ModbusQuestion.png, janv. 2021&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.ModbusQuestion_m.png&quot; alt=&quot;ModbusQuestion.png, janv. 2021&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Nous savons maintenant comment mettre en corrélation une table décrivant les registres modbus, avec une vraie demande faite par Node-Red. Nous allons voir plus loin comment l'implémenter.&lt;/p&gt;


&lt;p&gt;Le dernier point restant à régler est que ces 4 octets représentant les valeurs en virgule flottante ne sont pas faciles à comprendre.  Vous trouverez en ligne bon nombre de convertisseurs susceptibles de vous aider comme par exemple  &lt;a href=&quot;https://www.h-schmidt.net/FloatConverter/IEEE754.html&quot;&gt;https://www.h-schmidt.net/FloatConverter/IEEE754.html&lt;/a&gt; .&lt;/p&gt;


&lt;p&gt;Dans NodeRed, nous disposerons d'une fonction nommée &quot;parsefloat&quot; qui permettra d'effectuer cette conversion.&lt;/p&gt;


&lt;h5&gt;Modbus dans Nodered&lt;/h5&gt;


&lt;p&gt;Ici pour faciliter les choses, je suis parti d'un Flow venant de la bibliothèque NodeRed pour SDM120 (&lt;a href=&quot;https://flows.nodered.org/flow/75a4715fb6a3595057343a92abc493e4&quot;&gt;https://flows.nodered.org/flow/75a4715fb6a3595057343a92abc493e4&lt;/a&gt; ) . Il a été à peine adapté le SDM230 étant compatible en terme de protocole.&lt;/p&gt;


&lt;p&gt;En plus de node-red-contrib-modbus, ce flow utilise node-red-dashboard pour ajouter une page de supervision avec des widgets graphiques. Ceux ci seront visibles sur http://ma-raspberry.local:1880/ui&lt;/p&gt;


&lt;p&gt;Voici le code modifié pour SDM230 du Flow à importer  (triple cliquer pour sélectionner tout le bloc):&lt;/p&gt;

&lt;pre&gt;
[{&amp;quot;id&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tab&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;SDM230&amp;quot;,&amp;quot;disabled&amp;quot;:false,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;ebbc4482.1edd58&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;SDM230 Energy Meter&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:40,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;75c0e766.f23c68&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;modbus-read&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;SDM 230 Tension&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;showStatusActivities&amp;quot;:true,&amp;quot;logIOActivities&amp;quot;:false,&amp;quot;showErrors&amp;quot;:true,&amp;quot;unitid&amp;quot;:&amp;quot;30&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;InputRegister&amp;quot;,&amp;quot;adr&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;quantity&amp;quot;:&amp;quot;2&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;10&amp;quot;,&amp;quot;rateUnit&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;delayOnStart&amp;quot;:false,&amp;quot;startDelayTime&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;40f20c7f.13a934&amp;quot;,&amp;quot;useIOFile&amp;quot;:false,&amp;quot;ioFile&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;useIOForPayload&amp;quot;:false,&amp;quot;emptyMsgOnFail&amp;quot;:false,&amp;quot;x&amp;quot;:146.00001525878906,&amp;quot;y&amp;quot;:156,&amp;quot;wires&amp;quot;:[[&amp;quot;49b8d724.64fea&amp;quot;,&amp;quot;1b079b9e.95ab2c&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;49b8d724.64fea&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Tension&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = &amp;quot;voltage&amp;quot;;\n\nnode.status({fill:&amp;quot;blue&amp;quot;,shape:&amp;quot;ring&amp;quot;,text:msg.topic + &amp;quot;:&amp;quot; + msg.payload});    \n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:390,&amp;quot;y&amp;quot;:148,&amp;quot;wires&amp;quot;:[[&amp;quot;1495c496.dd7023&amp;quot;,&amp;quot;36fe9de8.3ed38a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;62bde4e.246551c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;modbus-queue-info&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;SDM230_file_attente&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;unitid&amp;quot;:&amp;quot;30&amp;quot;,&amp;quot;queueReadIntervalTime&amp;quot;:&amp;quot;1000&amp;quot;,&amp;quot;lowLowLevel&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;lowLevel&amp;quot;:75,&amp;quot;highLevel&amp;quot;:150,&amp;quot;highHighLevel&amp;quot;:300,&amp;quot;server&amp;quot;:&amp;quot;40f20c7f.13a934&amp;quot;,&amp;quot;errorOnHighLevel&amp;quot;:false,&amp;quot;showStatusActivities&amp;quot;:false,&amp;quot;updateOnAllQueueChanges&amp;quot;:false,&amp;quot;updateOnAllUnitQueues&amp;quot;:false,&amp;quot;x&amp;quot;:540,&amp;quot;y&amp;quot;:520,&amp;quot;wires&amp;quot;:[[&amp;quot;5531e192.8a2948&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;44db4c34.a23e2c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;repeat&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:160,&amp;quot;y&amp;quot;:520,&amp;quot;wires&amp;quot;:[[&amp;quot;e736a009.8a33a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e736a009.8a33a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Reset queue&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;resetQueue&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:330,&amp;quot;y&amp;quot;:520,&amp;quot;wires&amp;quot;:[[&amp;quot;62bde4e.246551c&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;86caa608.7adf88&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Courant&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = &amp;quot;current&amp;quot;;\n\nnode.status({fill:&amp;quot;blue&amp;quot;,shape:&amp;quot;ring&amp;quot;,text:msg.topic + &amp;quot;:&amp;quot; + msg.payload});    \n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:389,&amp;quot;y&amp;quot;:206,&amp;quot;wires&amp;quot;:[[&amp;quot;a7e4a3d5.23f35&amp;quot;,&amp;quot;36fe9de8.3ed38a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;900e06b4.93eca8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Puissance&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = &amp;quot;power&amp;quot;;\n\nnode.status({fill:&amp;quot;blue&amp;quot;,shape:&amp;quot;ring&amp;quot;,text:msg.topic + &amp;quot;:&amp;quot; + msg.payload});    \n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:400,&amp;quot;y&amp;quot;:259,&amp;quot;wires&amp;quot;:[[&amp;quot;d92d71c3.167b9&amp;quot;,&amp;quot;36fe9de8.3ed38a&amp;quot;,&amp;quot;9837f252.bb0e&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;6179779.d820a08&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Fréquence&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = &amp;quot;frequency&amp;quot;;\n\nnode.status({fill:&amp;quot;blue&amp;quot;,shape:&amp;quot;ring&amp;quot;,text:msg.topic + &amp;quot;:&amp;quot; + msg.payload});    \n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:400,&amp;quot;y&amp;quot;:315,&amp;quot;wires&amp;quot;:[[&amp;quot;d76382a3.74ea78&amp;quot;,&amp;quot;36fe9de8.3ed38a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1c155c0e.286224&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Consommation&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(2));\nmsg.topic = &amp;quot;energy&amp;quot;;\n\nnode.status({fill:&amp;quot;blue&amp;quot;,shape:&amp;quot;ring&amp;quot;,text:msg.topic + &amp;quot;:&amp;quot; + msg.payload});    \n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:410,&amp;quot;y&amp;quot;:375,&amp;quot;wires&amp;quot;:[[&amp;quot;9cd2baf1.c3108&amp;quot;,&amp;quot;36fe9de8.3ed38a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ce99604f.7fd198&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;modbus-read&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;SDM 230 Courant&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;showStatusActivities&amp;quot;:true,&amp;quot;logIOActivities&amp;quot;:false,&amp;quot;showErrors&amp;quot;:true,&amp;quot;unitid&amp;quot;:&amp;quot;30&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;InputRegister&amp;quot;,&amp;quot;adr&amp;quot;:&amp;quot;6&amp;quot;,&amp;quot;quantity&amp;quot;:&amp;quot;2&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;10&amp;quot;,&amp;quot;rateUnit&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;delayOnStart&amp;quot;:false,&amp;quot;startDelayTime&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;40f20c7f.13a934&amp;quot;,&amp;quot;useIOFile&amp;quot;:false,&amp;quot;ioFile&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;useIOForPayload&amp;quot;:false,&amp;quot;emptyMsgOnFail&amp;quot;:false,&amp;quot;x&amp;quot;:154.00001525878906,&amp;quot;y&amp;quot;:212,&amp;quot;wires&amp;quot;:[[&amp;quot;86caa608.7adf88&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;ac524aef.e3dc3&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;modbus-read&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;SDM 230 Puissance&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;showStatusActivities&amp;quot;:true,&amp;quot;logIOActivities&amp;quot;:false,&amp;quot;showErrors&amp;quot;:true,&amp;quot;unitid&amp;quot;:&amp;quot;30&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;InputRegister&amp;quot;,&amp;quot;adr&amp;quot;:&amp;quot;12&amp;quot;,&amp;quot;quantity&amp;quot;:&amp;quot;2&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;10&amp;quot;,&amp;quot;rateUnit&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;delayOnStart&amp;quot;:false,&amp;quot;startDelayTime&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;40f20c7f.13a934&amp;quot;,&amp;quot;useIOFile&amp;quot;:false,&amp;quot;ioFile&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;useIOForPayload&amp;quot;:false,&amp;quot;emptyMsgOnFail&amp;quot;:false,&amp;quot;x&amp;quot;:156.00001525878906,&amp;quot;y&amp;quot;:265,&amp;quot;wires&amp;quot;:[[&amp;quot;900e06b4.93eca8&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;bae1c9a1.1ea118&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;modbus-read&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;SDM 230 Fréquence&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;showStatusActivities&amp;quot;:true,&amp;quot;logIOActivities&amp;quot;:false,&amp;quot;showErrors&amp;quot;:true,&amp;quot;unitid&amp;quot;:&amp;quot;30&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;InputRegister&amp;quot;,&amp;quot;adr&amp;quot;:&amp;quot;70&amp;quot;,&amp;quot;quantity&amp;quot;:&amp;quot;2&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;10&amp;quot;,&amp;quot;rateUnit&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;delayOnStart&amp;quot;:false,&amp;quot;startDelayTime&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;40f20c7f.13a934&amp;quot;,&amp;quot;useIOFile&amp;quot;:false,&amp;quot;ioFile&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;useIOForPayload&amp;quot;:false,&amp;quot;emptyMsgOnFail&amp;quot;:false,&amp;quot;x&amp;quot;:155.00001525878906,&amp;quot;y&amp;quot;:322,&amp;quot;wires&amp;quot;:[[&amp;quot;6179779.d820a08&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;20c62d66.26be7a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;modbus-read&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;SDM 230 Consommation&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;showStatusActivities&amp;quot;:true,&amp;quot;logIOActivities&amp;quot;:false,&amp;quot;showErrors&amp;quot;:true,&amp;quot;unitid&amp;quot;:&amp;quot;30&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;InputRegister&amp;quot;,&amp;quot;adr&amp;quot;:&amp;quot;342&amp;quot;,&amp;quot;quantity&amp;quot;:&amp;quot;2&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;10&amp;quot;,&amp;quot;rateUnit&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;delayOnStart&amp;quot;:false,&amp;quot;startDelayTime&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;40f20c7f.13a934&amp;quot;,&amp;quot;useIOFile&amp;quot;:false,&amp;quot;ioFile&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;useIOForPayload&amp;quot;:false,&amp;quot;emptyMsgOnFail&amp;quot;:false,&amp;quot;x&amp;quot;:175.00001525878906,&amp;quot;y&amp;quot;:381,&amp;quot;wires&amp;quot;:[[&amp;quot;1c155c0e.286224&amp;quot;,&amp;quot;e77afdf2.850098&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;1495c496.dd7023&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_text&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;2c2fdfeb.fe41e&amp;quot;,&amp;quot;order&amp;quot;:1,&amp;quot;width&amp;quot;:0,&amp;quot;height&amp;quot;:0,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;Tension&amp;quot;,&amp;quot;format&amp;quot;:&amp;quot;{{msg.payload}} V&amp;quot;,&amp;quot;layout&amp;quot;:&amp;quot;row-spread&amp;quot;,&amp;quot;x&amp;quot;:576,&amp;quot;y&amp;quot;:150,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;a7e4a3d5.23f35&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_text&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;2c2fdfeb.fe41e&amp;quot;,&amp;quot;order&amp;quot;:2,&amp;quot;width&amp;quot;:0,&amp;quot;height&amp;quot;:0,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;Courant&amp;quot;,&amp;quot;format&amp;quot;:&amp;quot;{{msg.payload}} A&amp;quot;,&amp;quot;layout&amp;quot;:&amp;quot;row-spread&amp;quot;,&amp;quot;x&amp;quot;:577,&amp;quot;y&amp;quot;:205,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;d92d71c3.167b9&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_text&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;d9aabaeb.cf26&amp;quot;,&amp;quot;order&amp;quot;:1,&amp;quot;width&amp;quot;:0,&amp;quot;height&amp;quot;:0,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;Puissance&amp;quot;,&amp;quot;format&amp;quot;:&amp;quot;{{msg.payload}} W&amp;quot;,&amp;quot;layout&amp;quot;:&amp;quot;row-spread&amp;quot;,&amp;quot;x&amp;quot;:593,&amp;quot;y&amp;quot;:260,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;d76382a3.74ea78&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_text&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;2c2fdfeb.fe41e&amp;quot;,&amp;quot;order&amp;quot;:3,&amp;quot;width&amp;quot;:0,&amp;quot;height&amp;quot;:0,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;Fréquence&amp;quot;,&amp;quot;format&amp;quot;:&amp;quot;{{msg.payload}} Hz&amp;quot;,&amp;quot;layout&amp;quot;:&amp;quot;row-spread&amp;quot;,&amp;quot;x&amp;quot;:593,&amp;quot;y&amp;quot;:316,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;9cd2baf1.c3108&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_text&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;d9aabaeb.cf26&amp;quot;,&amp;quot;order&amp;quot;:2,&amp;quot;width&amp;quot;:0,&amp;quot;height&amp;quot;:0,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;Consommation&amp;quot;,&amp;quot;format&amp;quot;:&amp;quot;{{msg.payload}} kWh&amp;quot;,&amp;quot;layout&amp;quot;:&amp;quot;row-spread&amp;quot;,&amp;quot;x&amp;quot;:605,&amp;quot;y&amp;quot;:376,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;36fe9de8.3ed38a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Build object&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;watch_topic = &amp;quot;energy&amp;quot;;\nvar output = {};\n\ncontext.set(msg.topic,msg.payload);\n\nif (context.get(&amp;quot;voltage&amp;quot;)!==undefined) {\n    output.voltage = context.get(&amp;quot;voltage&amp;quot;);\n}\nif (context.get(&amp;quot;current&amp;quot;)!==undefined) {\n    output.current = context.get(&amp;quot;current&amp;quot;);\n}\nif (context.get(&amp;quot;power&amp;quot;)!==undefined) {\n    output.power = context.get(&amp;quot;power&amp;quot;);\n}\nif (context.get(&amp;quot;frequency&amp;quot;)!==undefined) {\n    output.frequency = context.get(&amp;quot;frequency&amp;quot;);\n}\nif (context.get(&amp;quot;energy&amp;quot;)!==undefined) {\n    output.energy = context.get(&amp;quot;energy&amp;quot;);\n}\nmsg.payload = output;\n\nif (msg.topic===watch_topic) {\n    msg.topic = &amp;quot;sdm230&amp;quot;;\n    return msg;\n}&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:766,&amp;quot;y&amp;quot;:233,&amp;quot;wires&amp;quot;:[[&amp;quot;34123b57.819dec&amp;quot;,&amp;quot;a1b03462.1d9bf&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;34123b57.819dec&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;debug&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;active&amp;quot;:false,&amp;quot;console&amp;quot;:&amp;quot;false&amp;quot;,&amp;quot;complete&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;x&amp;quot;:930,&amp;quot;y&amp;quot;:233,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;e0b31d56.021408&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Diagnostic input message structure&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;// setting a global flag that the solar system is down\n\nmsg.payload = &amp;quot;High voltage warning: &amp;quot; + msg.payload.voltage +&amp;quot; V&amp;quot;;\nmsg.system = 1; // System id, use 1 for Dummy\n//msg.state = 1; // specify if the message is to change system status\nmsg.severity = 1; // 0: information, 1: warning, 2: error\nmsg.email = false; // if separate email should be sent\n//msg.emailtext = &amp;quot;Clean up step of the SAIA log backup has failed&amp;quot;;\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;x&amp;quot;:1481,&amp;quot;y&amp;quot;:121,&amp;quot;wires&amp;quot;:[[&amp;quot;802fdccc.5b6de8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;802fdccc.5b6de8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;link out&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;links&amp;quot;:[&amp;quot;13e089a7.73cb46&amp;quot;],&amp;quot;x&amp;quot;:1688,&amp;quot;y&amp;quot;:143,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;f511148e.b4aec&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Voltage check&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;payload.voltage_check&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;high&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;},{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;low&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;checkall&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;outputs&amp;quot;:2,&amp;quot;x&amp;quot;:1189,&amp;quot;y&amp;quot;:145,&amp;quot;wires&amp;quot;:[[&amp;quot;e0b31d56.021408&amp;quot;],[&amp;quot;4e2e71eb.c57fd&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;4e2e71eb.c57fd&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Diagnostic input message structure&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;// setting a global flag that the solar system is down\n\nmsg.payload = &amp;quot;Low voltage warning: &amp;quot; + msg.payload.voltage +&amp;quot; V&amp;quot;;\nmsg.system = 1; // System id, use 1 for Dummy\n//msg.state = 1; // specify if the message is to change system status\nmsg.severity = 1; // 0: information, 1: warning, 2: error\nmsg.email = false; // if separate email should be sent\n//msg.emailtext = &amp;quot;Clean up step of the SAIA log backup has failed&amp;quot;;\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;x&amp;quot;:1481,&amp;quot;y&amp;quot;:166,&amp;quot;wires&amp;quot;:[[&amp;quot;802fdccc.5b6de8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;a1b03462.1d9bf&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Voltage check&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;var high = 250.0;\nvar low = 220.0;\n\nif (msg.payload.voltage &amp;gt; high) {\n    msg.payload.voltage_check = &amp;quot;high&amp;quot;;\n}\nif (msg.payload.voltage &amp;lt; low) {\n    msg.payload.voltage_check = &amp;quot;low&amp;quot;;\n}\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:976,&amp;quot;y&amp;quot;:146,&amp;quot;wires&amp;quot;:[[&amp;quot;f511148e.b4aec&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5fc9ee63.923f1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;reset on HighHigh&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;if(&amp;quot;high high level reached&amp;quot; === msg.state) {\n    msg.resetQueue = true;\n    return msg;\n}\n&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;x&amp;quot;:416.00000762939453,&amp;quot;y&amp;quot;:651.2500247955322,&amp;quot;wires&amp;quot;:[[&amp;quot;62bde4e.246551c&amp;quot;,&amp;quot;4edc5371.db5b5c&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;e91de07.8cdba2&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;catch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Catch queue errors&amp;quot;,&amp;quot;scope&amp;quot;:[&amp;quot;62bde4e.246551c&amp;quot;],&amp;quot;x&amp;quot;:178.00000762939453,&amp;quot;y&amp;quot;:651.2500247955322,&amp;quot;wires&amp;quot;:[[&amp;quot;5fc9ee63.923f1&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;5c3bd69d.46156&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;comment&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Error handling&amp;quot;,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;:144.00000762939453,&amp;quot;y&amp;quot;:606.2500247955322,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;4edc5371.db5b5c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Diagnostic input message structure&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;// setting a global flag that the solar system is down\n\nmsg.payload = &amp;quot;SDM230 modbus queue reached high level, resetting. (&amp;quot; + msg.state + &amp;quot;)&amp;quot;;\nmsg.system = 4; // System id, use 1 for Dummy\n//msg.state = 1; // specify if the message is to change system status\nmsg.severity = 1; // 0: information, 1: warning, 2: error\nmsg.email = false; // if separate email should be sent\n//msg.emailtext = &amp;quot;Clean up step of the SAIA log backup has failed&amp;quot;;\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;x&amp;quot;:716.0000076293945,&amp;quot;y&amp;quot;:650.2500247955322,&amp;quot;wires&amp;quot;:[[&amp;quot;c50380ac.51ffb8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c50380ac.51ffb8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;link out&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;links&amp;quot;:[&amp;quot;13e089a7.73cb46&amp;quot;],&amp;quot;x&amp;quot;:902.0000076293945,&amp;quot;y&amp;quot;:650.2500247955322,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;30e686ee.3e8a42&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;catch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Modbus read errors&amp;quot;,&amp;quot;scope&amp;quot;:[&amp;quot;ce99604f.7fd198&amp;quot;,&amp;quot;20c62d66.26be7a&amp;quot;,&amp;quot;bae1c9a1.1ea118&amp;quot;,&amp;quot;ac524aef.e3dc3&amp;quot;,&amp;quot;75c0e766.f23c68&amp;quot;,&amp;quot;ebbc4482.1edd58&amp;quot;],&amp;quot;x&amp;quot;:178.00000762939453,&amp;quot;y&amp;quot;:694.2500247955322,&amp;quot;wires&amp;quot;:[[&amp;quot;d0359fe9.a43e88&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d0359fe9.a43e88&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Diagnostic input message structure&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;// setting a global flag that the solar system is down\n\nmsg.payload = &amp;quot;SDM230 modbus error: &amp;quot; + msg.error.message;\nmsg.system = 4; // System id, use 1 for Dummy\n//msg.state = 1; // specify if the message is to change system status\nmsg.severity = 1; // 0: information, 1: warning, 2: error\nmsg.email = false; // if separate email should be sent\n//msg.emailtext = &amp;quot;Clean up step of the SAIA log backup has failed&amp;quot;;\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;x&amp;quot;:467.00000762939453,&amp;quot;y&amp;quot;:694.2500247955322,&amp;quot;wires&amp;quot;:[[&amp;quot;2742f67e.2c0132&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2742f67e.2c0132&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;link out&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;links&amp;quot;:[],&amp;quot;x&amp;quot;:653.0000076293945,&amp;quot;y&amp;quot;:694.2500247955322,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;5531e192.8a2948&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;debug&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;active&amp;quot;:false,&amp;quot;tosidebar&amp;quot;:true,&amp;quot;console&amp;quot;:false,&amp;quot;tostatus&amp;quot;:false,&amp;quot;complete&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;targetType&amp;quot;:&amp;quot;full&amp;quot;,&amp;quot;statusVal&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;statusType&amp;quot;:&amp;quot;auto&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:520,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;da547ef3.a86e98&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;inject&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Check&amp;quot;,&amp;quot;props&amp;quot;:[{&amp;quot;p&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;date&amp;quot;},{&amp;quot;p&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;timecheck&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;repeat&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;crontab&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;once&amp;quot;:false,&amp;quot;topic&amp;quot;:&amp;quot;timecheck&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;payloadType&amp;quot;:&amp;quot;date&amp;quot;,&amp;quot;x&amp;quot;:160,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;e77afdf2.850098&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;bd6193e4.61b32&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Update diag?&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;warning&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;true&amp;quot;}],&amp;quot;checkall&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;x&amp;quot;:609,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;6765dc93.bbff4c&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;6765dc93.bbff4c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;link out&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;links&amp;quot;:[&amp;quot;13e089a7.73cb46&amp;quot;],&amp;quot;x&amp;quot;:728.3015727996826,&amp;quot;y&amp;quot;:439.57140350341797,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;9837f252.bb0e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_gauge&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Puissance&amp;quot;,&amp;quot;group&amp;quot;:&amp;quot;ab711794.074a9&amp;quot;,&amp;quot;order&amp;quot;:1,&amp;quot;width&amp;quot;:0,&amp;quot;height&amp;quot;:0,&amp;quot;gtype&amp;quot;:&amp;quot;gage&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;Puissance&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;W&amp;quot;,&amp;quot;format&amp;quot;:&amp;quot;{{value}}&amp;quot;,&amp;quot;min&amp;quot;:0,&amp;quot;max&amp;quot;:&amp;quot;13000&amp;quot;,&amp;quot;colors&amp;quot;:[&amp;quot;#00b500&amp;quot;,&amp;quot;#e6b100&amp;quot;,&amp;quot;#ca3838&amp;quot;],&amp;quot;seg1&amp;quot;:&amp;quot;7000&amp;quot;,&amp;quot;seg2&amp;quot;:&amp;quot;10000&amp;quot;,&amp;quot;x&amp;quot;:590,&amp;quot;y&amp;quot;:80,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;e77afdf2.850098&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Health check&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;var devicename = &amp;quot;sdm230&amp;quot;; // Device name used for context variable\nvar system_id = 4; // System id number for diagnostic update\nvar online_threshold = 10; // Seconds between updates under which the device is considered online\nvar offline_threshold = 30; // Seconds between updates above which the device is considered offline\n\nvar temp = context.get(devicename+&amp;quot;_update&amp;quot;);\nvar current = new Date();\nmsg.payload = &amp;quot;No data&amp;quot;;\nmsg.warning = false;\nif (msg.topic!==&amp;quot;timecheck&amp;quot;) {\n    // Do not update the context if it is triggered by the check inject node\n    context.set(devicename+&amp;quot;_update&amp;quot;,current);\n}\nif (temp===undefined) {\n    // this will be the case when node-red is booting up or redeployed\n    context.set(devicename+&amp;quot;_update&amp;quot;,current);\n}\n\nif (temp!==undefined) {\n    current = current - temp;\n    current = Math.floor(current/1000);\n    var minute = Math.floor(current/60);\n    var hour = Math.floor(minute/60);\n    var day = Math.floor(hour/24);\n    if (current&amp;gt;24*60*60) {\n        msg.payload = &amp;quot;Last update &amp;quot; + day + &amp;quot; days, &amp;quot; + hour%24 + &amp;quot; hours, &amp;quot; + minute%60 + &amp;quot; minutes, &amp;quot; + current%60 + &amp;quot; seconds ago&amp;quot;;\n    } else if (current&amp;gt;60*60) {\n        msg.payload = &amp;quot;Last update &amp;quot; + hour%24 + &amp;quot; hours, &amp;quot; + minute%60 + &amp;quot; minutes, &amp;quot; + current%60 + &amp;quot; seconds ago&amp;quot;;\n    } else if (current&amp;gt;60) {\n        msg.payload = &amp;quot;Last update &amp;quot; + minute%60 + &amp;quot; minutes, &amp;quot; + current%60 + &amp;quot; seconds ago&amp;quot;;\n    } else {\n        msg.payload = &amp;quot;Last update &amp;quot; + current%60 + &amp;quot; seconds ago&amp;quot;;\n    }\n\n    if (context.get(devicename+&amp;quot;_state&amp;quot;)!==1) {\n        if (current&amp;lt;online_threshold) {\n            msg.payload = &amp;quot;SDM230 is now online&amp;quot;;\n            msg.system = system_id; // System id, use 1 for Dummy\n            msg.state = 1; // specify if the message is to change system status\n            msg.severity = 0; // 0: information, 1: warning, 2: error\n            //msg.email = true; // if separate email should be sent\n            //msg.emailtext = &amp;quot;&amp;quot;; this a long text which goes into the email  \n            msg.warning = true;\n            context.set(devicename+&amp;quot;_state&amp;quot;,1);\n        }\n    } else {\n        if (current&amp;gt;offline_threshold) {\n            msg.payload = &amp;quot;SDM230 is not transmitting&amp;quot;;\n            msg.system = system_id; // System id, use 1 for Dummy\n            msg.state = 99; // specify if the message is to change system status\n            msg.severity = 2; // 0: information, 1: warning, 2: error\n            //msg.email = true; // if separate email should be sent\n            //msg.emailtext = &amp;quot;&amp;quot;; this a long text which goes into the email            \n            msg.warning = true;\n            context.set(devicename+&amp;quot;_state&amp;quot;,99);\n        }\n    }\n    \n    \n}\n\nnode.status({fill:&amp;quot;blue&amp;quot;,shape:&amp;quot;ring&amp;quot;,text:msg.payload});\n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;x&amp;quot;:414,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;bd6193e4.61b32&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1b079b9e.95ab2c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;debug&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;f89db908.ccfc58&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;active&amp;quot;:true,&amp;quot;tosidebar&amp;quot;:true,&amp;quot;console&amp;quot;:false,&amp;quot;tostatus&amp;quot;:false,&amp;quot;complete&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;targetType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;statusVal&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;statusType&amp;quot;:&amp;quot;auto&amp;quot;,&amp;quot;x&amp;quot;:400,&amp;quot;y&amp;quot;:100,&amp;quot;wires&amp;quot;:[]},{&amp;quot;id&amp;quot;:&amp;quot;40f20c7f.13a934&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;modbus-client&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Serial_9600_8_N_1&amp;quot;,&amp;quot;clienttype&amp;quot;:&amp;quot;serial&amp;quot;,&amp;quot;bufferCommands&amp;quot;:true,&amp;quot;stateLogEnabled&amp;quot;:false,&amp;quot;queueLogEnabled&amp;quot;:false,&amp;quot;tcpHost&amp;quot;:&amp;quot;127.0.0.1&amp;quot;,&amp;quot;tcpPort&amp;quot;:&amp;quot;502&amp;quot;,&amp;quot;tcpType&amp;quot;:&amp;quot;DEFAULT&amp;quot;,&amp;quot;serialPort&amp;quot;:&amp;quot;/dev/serial0&amp;quot;,&amp;quot;serialType&amp;quot;:&amp;quot;RTU-BUFFERD&amp;quot;,&amp;quot;serialBaudrate&amp;quot;:&amp;quot;9600&amp;quot;,&amp;quot;serialDatabits&amp;quot;:&amp;quot;8&amp;quot;,&amp;quot;serialStopbits&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;serialParity&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;serialConnectionDelay&amp;quot;:&amp;quot;100&amp;quot;,&amp;quot;unit_id&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;commandDelay&amp;quot;:&amp;quot;30&amp;quot;,&amp;quot;clientTimeout&amp;quot;:&amp;quot;2000&amp;quot;,&amp;quot;reconnectOnTimeout&amp;quot;:false,&amp;quot;reconnectTimeout&amp;quot;:&amp;quot;5000&amp;quot;,&amp;quot;parallelUnitIdsAllowed&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;2c2fdfeb.fe41e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_group&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;UIF&amp;quot;,&amp;quot;tab&amp;quot;:&amp;quot;72b1a4dc.4f488c&amp;quot;,&amp;quot;order&amp;quot;:2,&amp;quot;disp&amp;quot;:true,&amp;quot;width&amp;quot;:6,&amp;quot;collapse&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;d9aabaeb.cf26&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_group&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;PC&amp;quot;,&amp;quot;tab&amp;quot;:&amp;quot;72b1a4dc.4f488c&amp;quot;,&amp;quot;order&amp;quot;:3,&amp;quot;disp&amp;quot;:true,&amp;quot;width&amp;quot;:6,&amp;quot;collapse&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;ab711794.074a9&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_group&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Graphes&amp;quot;,&amp;quot;tab&amp;quot;:&amp;quot;72b1a4dc.4f488c&amp;quot;,&amp;quot;order&amp;quot;:1,&amp;quot;disp&amp;quot;:true,&amp;quot;width&amp;quot;:6,&amp;quot;collapse&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;72b1a4dc.4f488c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ui_tab&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Modbus&amp;quot;,&amp;quot;icon&amp;quot;:&amp;quot;memory&amp;quot;,&amp;quot;order&amp;quot;:15,&amp;quot;disabled&amp;quot;:false,&amp;quot;hidden&amp;quot;:false}]
&lt;/pre&gt;


&lt;p&gt;Je vous encourage à double cliquer sur les noeuds pour voir comment ceux ci sont configurés, et notamment les noeuds de fonction juste derrière les noeuds d'acquisition, ceux ci contenant les fonctions de conversion des 4 octets récupérés vers un nombre flottant.&lt;/p&gt;


&lt;p&gt;Ces valeurs sont ensuites affichées dans le Dashboard grâce aux noeuds en bleu, mais aussi traitées pour générer une exception si la tension d'entrée n'est pas dans une plage définie (Voltage Check).&lt;/p&gt;


&lt;p&gt;Il y a encore d'autres fonctions comme une vérification de bonne santé (health Check), ou un traitement d'erreur sur la fle d'attente que je vous laisse découvrir en double cliquant sur les noeuds pour en analyser le fonctionnement.&lt;/p&gt;


&lt;h4&gt;Simulation Modbus&lt;/h4&gt;


&lt;p&gt;Si vous ne disposez pas du SDM 230, il est possible de simuler une communication modbus avec un logiciel adequat. Pour sa mise en oeuvre il va nous falloir relier la liason série de la Raspberry avec lePC. Pour faire ces tests j'ai utilisé le convertisseur modbus ajouté sur la Raspberry à l'étape précédente, et un convertisseur USB &amp;lt;&amp;gt; 485 à 2/3 euros. Il est aussi possible de relier le PC à la Raspberry via un convertisseur USB / Série 3.3V. A noter que si on veut faire une configuration hybride avec la Raspberry, au moins un vrai périphérique et un  périphérique simulé par le PC, on ne pourra utiliser que le RS485, car seul ce protocole de transport permet de mettre plusieurs prériphériques sur la même ligne de transmission.&lt;/p&gt;


&lt;p&gt;Côté PC, il va nous falloir un logiciel. On trouve sur Sourceforge ModRsim2, qui fait très bien le boulot : &lt;a href=&quot;https://sourceforge.net/projects/modrssim2/&quot;&gt;https://sourceforge.net/projects/modrssim2/&lt;/a&gt;. Il est largement paramétrable et permet de fonctionner en RTU (série) ou TCP. Ici, c'est le mode RTU qui va nous intéresser. Afin que le logiciel retourne des valeurs valides à notre Raspberry, j'ai préparé un fichier de configuration qui va remonter des valeurs typiques de courant / tension, etc. pour un périquérique configuré à l'adresse 30.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/MODDATA.zip&quot;&gt;Vous le trouverez en téléchargement ici&lt;/a&gt;. Après décompression et en le plaçant dans le même répertoire que le logiciel, il sera automatiquement chargé au démarrage du simulateur.&lt;/p&gt;


&lt;p&gt;Vous noterez dans la fenetre principale du logiciel :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'affichage de l'adresse du registre en hexadécimal ou en décimal (1)&lt;/li&gt;
&lt;li&gt;Le format d'affichage de la donnée contenu dans le registre (2)&lt;/li&gt;
&lt;li&gt;Le protocole (mettre RS232) (3)&lt;/li&gt;
&lt;li&gt;L'affichage des valeurs de registre qui vont être envoyées à la Raspberry (4)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/modbus1.png&quot; title=&quot;modbus1.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.modbus1_m.png&quot; alt=&quot;modbus1.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Pour rappel, les données que j'ai insérées dedans sont des nombres flottants encodés sur 4 octets.  Voici par exemple la convestion réalisée pour une valeur de 230.1 Volts dans un convertisseur el ligne.  La valeur hexadécimale résultante est 43 66 19 9A. Vous la retrouverez encodée dans le tableau précédent à l'adresse 3000000 (tension en volts).&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/modbus2.png&quot; title=&quot;modbus2.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.modbus2_m.png&quot; alt=&quot;modbus2.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;A noter que j'ai ouvert un ticket auprès de l'auteur pour voir comment entrer directement des valeurs en fottant dans le simulateur. Ceclui-ci a répondu ici : &lt;a href=&quot;https://sourceforge.net/p/modrssim2/tickets/15/&quot;&gt;https://sourceforge.net/p/modrssim2/tickets/15/&lt;/a&gt;, et c'est possible... Par contre, il est imératif de cocher la case &quot;Clone&quot; à droite pour que l'interprétation du flottant se fasse correctement. Il faut aussi que l'adresse du flottant soit un multiple de 4 ce qui n'est pas toujours le cas avec le SDM230... Du coup, sila première valeur est bien interprétée (tension), les autres ne le sont pas nécessairement, n'étant pas alignées sur un multiples de 4.&lt;/p&gt;


&lt;h4&gt;Authentification sous node red&lt;/h4&gt;


&lt;p&gt;L'authentification repose sur la section &quot;adminAuth&quot; du fichier de configuration (/home/pi/.node-red/settings.js). Elle est normalement commentée (// devant), et donc inactive. On voir ci dessous qu'on dispose d'un identfiant, d'un mot de passe chiffré, et de la définition d'un niveau de permissions. Ceci peut par exemple permettre de mettre un utilisateur en lecture seule (ici, george).&lt;/p&gt;

&lt;pre&gt;
//adminAuth: {
//    type: &amp;quot;credentials&amp;quot;,
//    users: [
//        {
//            username: &amp;quot;admin&amp;quot;,
//            password: &amp;quot;$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.&amp;quot;,
//            permissions: &amp;quot;*&amp;quot;
//        },
//        {
//            username: &amp;quot;george&amp;quot;,
//            password: &amp;quot;$2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y&amp;quot;,
//            permissions: &amp;quot;read&amp;quot;
//        }
//    ]
//}
&lt;/pre&gt;


&lt;p&gt;Pour activer cette section, il nous faut d'abord générer un mot de passe. Node Red dispose d'une commande pour cela, qui va vous demander un mot de passe et vous générer le hash :&lt;/p&gt;

&lt;pre&gt;
pi@pizero:~/.node-red $ node-red admin hash-pw
Password:
$2b$08$PW2YaBxUoyGEi5CQ8Wef/OsUMYjukOyMGy1xbA.hX0QjsWNqE03wK
//

Il va ensuite nous suffire de décommenter la section, et d&amp;#039;injecter le mot de passe ainsi généré :

&lt;/pre&gt;

&lt;pre&gt;   adminAuth: {
       type: &quot;credentials&quot;,
       users: [{
           username: &quot;admin&quot;,
           password: &quot;$2b$08$PW2YaBxUoyGEi5CQ8Wef/OsUMYjukOyMGy1xbA.hX0QjsWNqE03wK&quot;,
           permissions: &quot;*&quot;
       }]
   },&lt;/pre&gt;
&lt;pre&gt;

Pour activer la configuration, il suffit de redémarrer node red :
/// 
systemctl restart nodered.service
&lt;/pre&gt;


&lt;p&gt;Ensuite, tester la configuration en se connectant sur node-red. Un bannière de login devrait apparaitre au lieu de la page d'accueil. Si cela ne fonctionne pas, il peut être intéressant de consulter les journaux de node-red à l'aide de la commande node-red-log
A noter que NodeRed dispose d'autres méthodes d'authentification  comme OAUTH (Twitter, Github). Se référer à la documentation (
&lt;a href=&quot;https://nodered.org/docs/user-guide/runtime/securing-node-red&quot;&gt;https://nodered.org/docs/user-guide/runtime/securing-node-red&lt;/a&gt; pour plus d'informations.  Il est même possible de mettre en place ses propres méthodes d'authentification (par exemple pou rse coupler sur un annuaire LDAP... Mais c'est un bien autre sujet....&lt;/p&gt;


&lt;h4&gt;Https sur node red&lt;/h4&gt;


&lt;p&gt;Bien que nous disposions d'une authentification, notre installation n'est pas sécurités pour autant. En effet, il est assez facile de piéger les échanges entre un navigateur et un serveur en http, qui ont le mauvais gout d'échanger &lt;strong&gt;en clair&lt;/strong&gt; le login et le mot de passe. Pas bon du tout... C'est d'ailleurs pour cela que les acteurs de l'internet, Google en tête,  exigent maintenant que les sites soient sécurisés en SSL.  Ceci n'a d'intérêt que si vous voulez rendre accessible votre installation NodeRed de l'extérieur de votre réseau local.&lt;/p&gt;


&lt;p&gt;Il convient donc de mettre en œuvre le chiffrement SSL pour éviter que ces échanges ne soient espionnés. A ce stade, nous avons 3 possibilités :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser un certificat auto signé. Gratuit, mais va générer une alerte au niveau du navigateur (que l'on peut acquitter). Cela peut être suffisant. C'est d'ailleurs la seule solution possible lorsque l'on est sur un réseau local et que le serveur node-red n'est pas joignable de l'extérieur.&lt;/li&gt;
&lt;li&gt;Utiliser un certificat SSL payant, émanant d'une autorité de certification. C'est payant, avec des tarifs très variables (à partir de 70 euros par an). Plus facile à entretenir, c'est le cout qui est problématique. Il faut aussi que l'installation node-red soit associée à un nom de domaine qui portera ce certificat.&lt;/li&gt;
&lt;li&gt;Utiliser un certificat SSL gratuit &quot;Lets Encrypt&quot;. C'est aussi gratuit, mais pas très simple à installer et à tester. Il nous faudra également un nom de domaine pour porter ce certificat.  Bien que ceux ci disposent d'une procédure de renouvellement qui peut être automatisée, le certificat ne durant que 3 mois.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Nous allons utiliser la 3e technique. Cela suppose que vous ayez paramétré votre routeur domestique pour rediriger le port 443 (https) et le port 80 sur votre Raspberry dans l'interface de gestion de votre routeur. Ceci se trouve généralement dans la section &quot;NAT&quot; ou &quot;Redirections&quot;.&lt;/p&gt;


&lt;p&gt;Par ailleurs, la plupart des routeurs disposent de fonctionnalités qui permettent de rendre permanent les baux DHCP pour une adresse mac donnée. Ce sera indispensable car sinon votre Raspberry pi risque de changer d'adresse ip sur le réseau local, et donc de ne plus correspondre aux règles de redirectionsque vous aurez mises en place. Je vous recommande de suivre les tutos ou la doc correspondants à votre routeur.&lt;/p&gt;


&lt;p&gt;Chez Free, par exemple, tout ceci passe par l'interface de gestion sur http://mafreebox.freebox.fr :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paramètres de la freebox /  Gestion des ports  pour gérer les redirections des ports 80 et 443&lt;/li&gt;
&lt;li&gt;Paramètres de la freebox / DHCP / Baux statique pour gérer l'affectation permanente de l'adresse ip à la raspberry.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;https://discourse.nodered.org/t/node-red-ssl-using-letsencrypt-certbot/17606&lt;/p&gt;



&lt;h3&gt;Bonus: installer un LCD texte (2ligne ou 4 lignes de 20 caractères) en I2C sur Raspberry&lt;/h3&gt;


&lt;h4&gt;Idée générale&lt;/h4&gt;


&lt;p&gt;L'intérêt de le raccorder en I2C est de limiter le nombre de broches de raccordement. En i2C, seules 2 broches (en plus des alimentations) sont nécessaires : I2C Clock et i2C Data. Il faut par conte disposer d'un adaptateur LCD &amp;lt;&amp;gt; I2C, souvent nommé &quot;LCD I2C Backpack&quot;, comme celui d'Adafruit ( &lt;a href=&quot;https://www.adafruit.com/product/292&quot;&gt;https://www.adafruit.com/product/292&lt;/a&gt; ). Sur Aliexpress (&lt;a href=&quot;https://fr.aliexpress.com/af/i2c-lcd&lt;/del&gt;adapter.html&quot;&gt;https://fr.aliexpress.com/af/i2c-lcd&lt;del&gt;adapter.html&lt;/a&gt;)  ou Banggood ( &lt;a href=&quot;https://www.banggood.com/fr/search/adapter-i2c.html&quot;&gt;https://www.banggood.com/fr/search/adapter-i2c.html&lt;/a&gt; ) on trouver ces adaptateurs en version MCP23017 ou PCF8574 pour 2/3 euros.&lt;/p&gt;


&lt;p&gt;Tous reposent sur la même idée mais n'utilisent pas nécessairement le même composant pour la mise en œuvre. Il s'agit d'ajouter une extension de ports I2C, permettant d'ajouter des entrées sorties, dont celles ci sont raccordées au LCD afin d'économiser les i/o internes de la Raspberry. Trois composants différents sont fréquemment utilisés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MCP23008 (Adafruit)&lt;/li&gt;
&lt;li&gt;MCP230017 (certains chinois)&lt;/li&gt;
&lt;li&gt;PCF8574 (la plupart des chinois)&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Câblage&lt;/h4&gt;

&lt;p&gt;Pour les tests suivants, j'ai utilisé l'adaptateur d'Adafruit, basé sur un MCP 23008. Mais le programme est aisément adaptable aux autres solutions. Le raccordement de l'adaptateur I2C/LCD s'effectue comme suit :&lt;/p&gt;

&lt;pre&gt;
|---------------------------------|
| LCD Adapter | PI ZERO           |
|---------------------------------|
| GND         | Broche 2 (5V)     |
| 5V          | Broche 6 (Ground) |
| DAT         | Broche 3 (SDA1)   |
| CLK         | Broche 5 (SCL1)   |
|---------------------------------|
&lt;/pre&gt;


&lt;p&gt;A titre indicatif, voici les brochages du connecteur d'extension de la Raspberry :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/pi_zero_pinout_zoom.png&quot; title=&quot;pi_zero_pinout_zoom.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.pi_zero_pinout_zoom_m.png&quot; alt=&quot;pi_zero_pinout_zoom.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Nous allons ensuite pouvoir vérifier que notre adaptateur LCD est bien détecté sur le Bus I2C à l'aide de la commande i2cdetect :&lt;/p&gt;

&lt;pre&gt;
pi@pizero:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
&lt;/pre&gt;


&lt;p&gt;Ici, nous voyons bien le contrôleur MCP23008 en 0X20.&lt;/p&gt;


&lt;h4&gt;Logiciel&lt;/h4&gt;


&lt;p&gt;Vient le temps d'installer des éléments logiciels pour nous faciliter la vie dans la mise en œuvre du LCD en ligne de commande. Nous allons utiliser une bibliothèque Python 3/2 qui permet le pilotage de LCD textes basés sur des contrôleurs Hitachi HD44780 (c'est le contrôleur utilisé sur ces afficheurs texte). Cette bibliothèque support à la fois le pilotage parallèle (consommant un grand nombre d'entrées sorties de la Raspberry) et aussi bien que via une extension de port I²C port (comme le PCF857, le MCP23008 ou le MCP230017 ).&lt;/p&gt;


&lt;p&gt;L'installation est simple et se fait en ligne de commande:&lt;/p&gt;

&lt;pre&gt;
# Voir https://github.com/dbrgn/RPLCD#documentation
sudo apt install python-smbus
sudo pip install gpiozero
sudo pip install RPLCD
sudo pip install psutil
&lt;/pre&gt;


&lt;p&gt;Nous allons maintenant pouvoir tester. On doit préciser sur la lige de commande l'adresse précédemment détectée, ainsi que le type du port expander utilisé (MCP23008 / MCP23017 / PCF8574 ) :&lt;/p&gt;

&lt;pre&gt;
rplcd-tests i2c testsuite  expander=MCP23008 addr=0x20 port=1 cols=20 rows=4 charmap=A00 gpio_bank=A
&lt;/pre&gt;


&lt;p&gt;Plusieurs message devraient d'afficher sur l'écran. Une fois le dialogue entre la pi et le LCD vérifié, il est temps de développer un programme. Pour ce faire la doc est d'un grand secours : &lt;a href=&quot;https://rplcd.readthedocs.io/en/latest/&quot;&gt;https://rplcd.readthedocs.io/en/latest/&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Voici un petit programme de test que j'a réalisé, qui va nous afficher :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La date et l'heure&lt;/li&gt;
&lt;li&gt;La température du processeur&lt;/li&gt;
&lt;li&gt;L'adresse ip de la carte&lt;/li&gt;
&lt;li&gt;La quantité de ram totale (T), Utiisée (U) et Libre (L)&lt;/li&gt;
&lt;li&gt;Même chose pour l'espace de stockage sur la carte SD&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Le résultat :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/nodered/lcd.png&quot; title=&quot;lcd.png, déc. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/nodered/.lcd_m.png&quot; alt=&quot;lcd.png, déc. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et le source du programme de test :&lt;/p&gt;

&lt;pre&gt;
#!/usr/bin/python
# -*- coding: utf8 -*-

&amp;quot;&amp;quot;&amp;quot;
Bibliothèques à installer :
 - pip install rplcd  https://github.com/dbrgn/RPLCD (Doc sur https://rplcd.readthedocs.io/en/latest/ )
 - pip install gpiozero
 - pip install psutil
&amp;quot;&amp;quot;&amp;quot;

# Affichages sur lcd
from RPLCD.i2c import CharLCD
# température processeur
from gpiozero import CPUTemperature
# Pour afficher l&amp;#039;heure
import time
# Pour recuperer l&amp;#039;adresse IP
import socket
# Pour capacité disque
import psutil

# Recuprere l&amp;#039;adresse IP
def get_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        # n&amp;#039;a pas besoin d&amp;#039;être joignable
        s.connect((&amp;#039;10.255.255.255&amp;#039;, 1))
        IP = s.getsockname()[0]
    except Exception:
        IP = &amp;#039;127.0.0.1&amp;#039;
    finally:
        s.close()
    return IP

# Définit des caractères personnalisés
def lcd_chars():
    smiley = (
        0b00000,
        0b01010,
        0b01010,
        0b00000,
        0b10001,
        0b10001,
        0b01110,
        0b00000,
    )
    degre = (
        0b01000,
        0b10100,
        0b01000,
        0b00011,
        0b00100,
        0b00100,
        0b00011,
        0b00000,
    )
    lcd.create_char(0, smiley)
    lcd.create_char(1, degre)
    return

# Init
# Init LCD
lcd = CharLCD(i2c_expander=&amp;#039;MCP23008&amp;#039;, address=0x20, port=1,
            cols=20, rows=4, dotsize=8,
            charmap=&amp;#039;A00&amp;#039;,
            auto_linebreaks=True)
lcd_chars()
IP = get_ip()
cpu = CPUTemperature()
hdd = psutil.disk_usage(&amp;#039;/&amp;#039;)
ram = psutil.virtual_memory()

lcd.clear();
# Ligne 1
lcd.cursor_pos = (0, 0)
lcd.write_string(time.strftime(&amp;quot;%d/%m/%Y  %H:%M:%S&amp;quot;))

# Ligne 2
lcd.cursor_pos = (1, 0)
lcd.write_string(IP)
lcd.cursor_pos = (1,14)
lcd.write_string(&amp;quot;|%2.1f\x01&amp;quot; % (cpu.temperature))

# Ligne 3
lcd.cursor_pos = (2, 0)
lcd.write_string(&amp;quot;T:%3.1fG U:%3.1fG F:%3.1fG&amp;quot; % (float(hdd.total) / (2.0**30), float(hdd.used) / (2.0**30),float(hdd.free) / (2.**30) ))

# Ligne 4:w
lcd.cursor_pos = (3, 0)
lcd.write_string(&amp;quot;T:%3.0fM U:%3.0fM F:%3.0fM&amp;quot; % (float(ram.total) / (2.0**20), float(ram.used) / (2.0**20),float(ram.free) / (2.**20) ))

# Si on veut préserver le backlight et ne l&amp;#039;allumer que quelques secondes toutes les minutes
# décommenter les lignes suivantes
#time.sleep(5)
#lcd.backlight_enabled = False
lcd.close()
&lt;/pre&gt;



&lt;h3&gt;Quelques commandes utilises sous SSH&lt;/h3&gt;


&lt;p&gt;Arrêter le système (ne jamais débrancher!!!! arrêter proprement.) :&lt;/p&gt;
&lt;pre&gt;
sudo shutdown -h now
&lt;/pre&gt;


&lt;p&gt;Redémarrer le système&lt;/p&gt;
&lt;pre&gt;
sudo shutdown -r now
&lt;/pre&gt;


&lt;p&gt;Afficher les journaux de node-red (quitter avec CTRL+ C) :&lt;/p&gt;
&lt;pre&gt;
node-red-log
&lt;/pre&gt;


&lt;p&gt;Mettre à jour le système :&lt;/p&gt;
&lt;pre&gt;
sudo apt-get update
sudo apt-get upgrade
&lt;/pre&gt;


&lt;p&gt;Quitter ssh :&lt;/p&gt;
&lt;pre&gt; 
exit
&lt;/pre&gt;



&lt;p&gt;Il pourra être aisément appelé toutes les minutes en l'installant dans une tache planfiée (cron) à l'aide d'un &quot;crontab -e&quot;, et en ajoutant la ligne :&lt;/p&gt;

&lt;pre&gt;
* * * * * /home/pi/lcd.py &amp;gt;&amp;gt; /home/pi/log.txt 2&amp;gt;&amp;amp;1
&lt;/pre&gt;</description>
        
                  <comments>https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique#comment-form</comments>
          <wfw:comment>https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/108</wfw:commentRss>
              </item>
          <item>
        <title>Bigtreetech SKR V1.4 Turbo sur une découpe laser K40 avec Smoothieware</title>
        <link>https://civade.com/post/2020/10/20/Bigtreetech-SKR-V1.4-Turbo-sur-une-d%C3%A9coupe-laser-K40-avec-Smoothieware</link>
        <guid isPermaLink="false">urn:md5:d38662253ace8062f7e33754829f8754</guid>
        <pubDate>Sun, 01 Nov 2020 16:48:00 +0100</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>Machines à commande numériques</category>
                          <category>CNC</category>
                  <category>DIY</category>
                  <category>Embarqué</category>
                  <category>K40</category>
                  <category>OpenSource</category>
                <description>&lt;p&gt;Après un article sur la carte SKR V1.3 qui à débouché sur une &lt;a href=&quot;https://civade.com/post/2019/07/10/Mise-%C3%A0-jour-d-un-clone-d-Ultimaker-1-avec-Marlin-2-SKR-1.3-TMC2130&quot;&gt;mise à jour de mon imprimante 3D&lt;/a&gt; j'ai acheté une SKR V1.4 Turbo de façon à profiter de la fréquence max du processeur LPC1769 (120 mhz) et voir les possibilités d'adaptation sur une découpe laser K40. Mais si le support sous Marlin est tout simplement parfait, c'est pas tout à fait la même histoire sur Smoothieware... Mais tout ceci se contourne, voyons comment...&lt;/p&gt;          &lt;h3&gt;Découverte de la carte :&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/skr1.4.jpg&quot; title=&quot;skr1.4.jpg, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.skr1.4_m.jpg&quot; alt=&quot;skr1.4.jpg, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En plus de la carte SKR 1.4 Turbo,  j'ai fait l'acquisition d'un LCD &lt;strong&gt;TFT24 V1.1&lt;/strong&gt;, du  booster  d'alimentation &lt;strong&gt;DCDC Mode V1.0&lt;/strong&gt; et de l’extension Wifi &lt;strong&gt;ESP01s&lt;/strong&gt; pour environ 35 euros. Mais qu'est ce qu'on peut en attendre? Une petite visite s'impose...&lt;/p&gt;


&lt;p&gt;En comparant les schémas et implantations, la version 1.4 n'apporte que peu de changements par rapport à la version 1.3:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Processeur jusqu'à 120Mhz (version turbo)&lt;/li&gt;
&lt;li&gt;support d'un booster d'alimentation additionnel pour générer du 5V pour les périphériques qui le nécessitent (Neopixel, Bltouch, TFT), et ainsi éviter de 'tirer' trop sur le convertisseur intégré.&lt;/li&gt;
&lt;li&gt;Support d'un module wifi ESP01&lt;/li&gt;
&lt;li&gt;Support de 2 ventilateurs fixes supplémentaires (en 24V)&lt;/li&gt;
&lt;li&gt;Support de la carte UPS (protection coupures d'alimentation)&lt;/li&gt;
&lt;li&gt;Support d'un BL Touch (implantation connecteur servo revu + nouveau connecteur Probe juste à côté)&lt;/li&gt;
&lt;li&gt;Suppression de la diode de protection en série sur l'alimentation USB qui consommait quelques dixièmes de volts...&lt;/li&gt;
&lt;li&gt;Reroutage partiel de la carte&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Tout d'abord, sur le plan alimentation, la carte est plutôt bien équipée :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alimentation unique jusqu'à 24V (360W max), avec une LED rouge de témoin d'alimentation. 24V c'est top pour maximiser la vitesse de déplacement des moteurs, et sur une imprimante 3D permet de limiter le courant dans le lit chauffant. Donc un bon point....&lt;/li&gt;
&lt;li&gt;Protection en tête de carte, par 2 fusibles à lame 'automobile', l'un de 20A pour le lit chauffant et l'autre de 10A pour les têtes et le reste de l'électronique.&lt;/li&gt;
&lt;li&gt;Multiples sous protections par fusibles sur les différents étages (sous le 10A)&lt;/li&gt;
&lt;li&gt;Alimentation à découpage intégrée pour générer du 5V, avec fusible réarmable de 2.5A (T250) intégrés  à la carte. Pas besoin d'une double alimentation, ou d'une alim via l'USB, la seule tension primaire suffit...&lt;/li&gt;
&lt;li&gt;Alimentation linéaire intégrée pour générer du 3.3V à partir du 5V avec fusible de 750ma.&lt;/li&gt;
&lt;li&gt;Alimentation à découpage optionnelle (&lt;a href=&quot;https://www.biqu.equipment/products/bigtreetech-dcdc-mode-v1-0-power-module3d-printer-parts&quot;&gt;DCDC Mode V1.0&lt;/a&gt;) pour générer du 5V sous 'forte puissance' à partir du 24V. Elle complémente celle déjà présente en interne et lorsque présente  alimente le port LEDS neopixels, l'écran TFT et le servo/BL Touch. Une LED verte s'allume sur le convertisseur lorsqu'il est alimenté. Un cavalier permet de configurer ces 3 alimentation sur le convertisseur si présent, ou en prélevant sur le rail 5V interne.  Cette carte ne serait nécessaire que si l'on compte consommer de façon significative ( &amp;gt;500 mA) sur le LCD/Servo/Leds externes.&lt;/li&gt;
&lt;li&gt;Cavalier pour alimenter la carte par l'USB (pour la mise au point logicielle, sans alim 24V branchée) ou par le convertisseur 24v&amp;gt;5V (nécessite de brancher l'alimentation de la carte)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;La SKR 1.4 possède un grand nombre d'entrées sorties :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Processeur à 100 mhz (SKR 1.4) ou 120 mhz (SKR 1.4 Turbo)&lt;/li&gt;
&lt;li&gt;Bouton de reset intégré&lt;/li&gt;
&lt;li&gt;Port USB natif, avec support en tant que disque (pour les mises à jour et la config) et liaison série (pour l'envoi de gcode)&lt;/li&gt;
&lt;li&gt;Carte SD intégrée, permettant de faire les mises à jour et le stockage de fichiers (c'est le disque visible de l'USB). Un LED verte s'allume lorsque la carte SD est présente.&lt;/li&gt;
&lt;li&gt;2 connecteurs HE10 à 10 broches (EXP1 et EXP2) pour raccorder un afficheur LCD de type &quot;Reprap Discount Smart LCD Controler&quot;, avec carte SD et encodeur de panneau, on un afficheur de type&lt;/li&gt;
&lt;li&gt;Connecteur série dédié au support d'un afficheur TFT et son alimentation (sur le port série 0)&lt;/li&gt;
&lt;li&gt;Commande de 5 moteurs pas à pas, dont l'un (le Z) en double sortie (pour les imprimantes 3D le nécessitant, comme les type Prusa I3)&lt;/li&gt;
&lt;li&gt;Nombreuses options de pilotage des moteurs: Step/Dir, SPI, série, avec support contrôleurs de type &quot;Pollolu&quot;&lt;/li&gt;
&lt;li&gt;Support des fins de course logiques  &quot;sensorless&quot; avec les contrôleurs de moteur pas à pas adaptés (ex: TMC2130) ou matériels sur les 3 à 6 entrées prévues&lt;/li&gt;
&lt;li&gt;1 sortie de puissance 20A sur MOSFET en PWM pour le lit chauffant, avec LED témoin verte.&lt;/li&gt;
&lt;li&gt;2 sorties de puissances jusqu'à 10A sur MOSFET en PWM pour les deux chauffage de tête, avec LED témoin verte.&lt;/li&gt;
&lt;li&gt;1 sortie ventilateur jusqu'à 1A, commandé en PWM par MOSFET (pour le refroidissement de la pièce sur une imprimante 3D), avec LED témoin verte.&lt;/li&gt;
&lt;li&gt;3 sorties ventilateurs à tension fixe de 12 ou 24V (ex : pour le refroidissement des têtes sur une imprimante 3D)&lt;/li&gt;
&lt;li&gt;1 sortie Servo (3 broches) commandée en PWM pour palpeur de lit chauffant, avec optionnellement alimentation boostée.&lt;/li&gt;
&lt;li&gt;1 sortie pour commander une rampe de LED en Neo-pixel (3 couleurs) avec optionnellement alimentation boostée.&lt;/li&gt;
&lt;li&gt;3 entrées analogiques pour thermistances de mesure de température, avec filtrage intégré&lt;/li&gt;
&lt;li&gt;6 entrées digitales pour les fins de course ( sur 5 axes) et l'entrée détection de présence de tension d'alimentation (pour l'onduleur optionnel)&lt;/li&gt;
&lt;li&gt;1 entrée &quot;probe&quot; pour capteur de longueur d'outil ou palpeur de lit chauffant.&lt;/li&gt;
&lt;li&gt;Connecteur HE10 à 8 broches pour raccorder directement un ESP01S et ajouter le support du Wifi&lt;/li&gt;
&lt;li&gt;Connecteurs Dupont pour port SPI, I2C, Software debugger&lt;/li&gt;
&lt;li&gt;Connecteurs Dupont sur chaque axe (X-CLS, Y-CLS, etc..) pour connecter un driver pas à pas externe (avec tous les signaux y compris le 24V). Ils sont directement compatibles avec les &quot;Closed Loop Stepper&quot; (contrôle en boucle fermée) de la marque, mais on peut y raccorder n’importe quel contrôleur externe.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A l'exception des connecteurs mentionnés ci dessus comme étant des &quot;Dupont&quot;, tous les autres sont des connecteurs &quot;JST&quot;. Les broches étant un peu plus petites, il n'est pas recommandé de mettre des connecteurs Dupont femelle dessus sous peine de gros faux contacts..  Mais on peut trouver des kits JST-XH sur Aliexpress avec une centaine de connecteurs mâle et femelle et les broches à sertir pour quelques euros. Ce n'est donc pas un gros soucis. Autre intérêt, les connecteurs JST ont un verrouillage, ce qui empêchera un arrachement intempestif... Par contre, si vous prévoyez d'acheter des connecteurs JST en kit, la pince à sertir n'est pas un luxe...&lt;/p&gt;


&lt;p&gt;Le schéma de la SKR 1.4  est disponible &lt;a href=&quot;https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.4/Hardware/BTT%20SKR%20V1.4-SCH.pdf&quot;&gt;ICI&lt;/a&gt;  ce qui fait qu'on peut lever toute ambiguïté lorsque l'on adapte un logiciel dessus. C'est nouveau chez Bigtreetech.&lt;/p&gt;


&lt;p&gt;Sur le papier, il ne manque donc pas grand chose. J'ai noté :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ce serait bien d'avoir la possiblilité de commuter les ventilateurs en 12/24V ou 5V&lt;/li&gt;
&lt;li&gt;Entrées température uniquement prévues pour mettre des thermistances (résistance de tirage de 4.7K et entrée 3.3V). Ceci empêche de brancher des thermocouples, qui délivrent directement une tension et n'ont pas besoin de la résistance de tirage, mais d'une adaptation de niveau 5V&amp;gt;3.3V.  C'est contournable, mail il fait bidouille (dessouder la résistance et mettre un pont diviseur).&lt;/li&gt;
&lt;li&gt;Sorties Step ne sont pas toutes sur le même port, ce qui empêche la compilation de GRBL pour LPC1769&lt;/li&gt;
&lt;li&gt;Même remarque pour les sorties Dir.&lt;/li&gt;
&lt;li&gt;Pas de SPI matériel routé sur le LCD. Impossible de l'utiliser sur Smoothieware sans adaptateur à faire soi même ou modification de Smoothieware pour ajouter le support d'un SPI &quot;logiciel&quot;. Nous verrons plus loin qu ec'est contournable.&lt;/li&gt;
&lt;li&gt;Liaison série 0 sur le LCD et 3 sur le Wifi. Impossible d'utiliser la liaison série 0 sur le Wifi. Une configuration par cavalier aurait pu permettre de l'utiliser sur Smoothieware. C'est aussi contournable avec une petite bidouille.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Fonctionnement sous Marlin:&lt;/h3&gt;


&lt;p&gt;J'ai fait les tests d'intégration avec succès sur la dernière version de Marlin 2 disponible sur le Git :  &lt;a href=&quot;https://github.com/MarlinFirmware/Marlin&quot;&gt;https://github.com/MarlinFirmware/Marlin&lt;/a&gt;. Elle intègre directement une configuration pour la SKR 1.4 / Turbo ( MOTHERBOARD BOARD_BTT_SKR_V1_4_TURBO ) . Tout fonctionne sans soucis. L'intégration du Wifi est assez facile (voir &lt;a href=&quot;https://civade.com/post/2020/09/22/Ajouter-le-support-du-Wifi-sur-une-imprimante-3D-fonctionnant-avec-Marlin-2&quot;&gt;https://www.civade.com/post/2020/09/22/Ajouter-le-support-du-Wifi-sur-une-imprimante-3D-fonctionnant-avec-Marlin-2&lt;/a&gt; ).&lt;/p&gt;


&lt;p&gt;L'écran fonctionne aussi bien en mode &quot;touch&quot; qu'en mode émulé Reprap Discount Graphic LCD Controler, ainsi que la carte SD externe. Idem avec les Neopixel ou le BL touch qui peut être raccordé sur l'entrée sonde + la sortie servo. C'est juste quand on veut le Wifi ET l'écran TFT et la liaison série USB que c'est plus sport.&lt;/p&gt;


&lt;p&gt;Malheureusement, Marlin n'est pas le meilleur candidat pour une découpe laser, c'est même le pire. Il n'est en effet pas très performant en terme de vitesse de traitement de gcode, et ne gère pas la modulation de la puissance du laser pendant les accélérations / décélérations, ce qui a une fâcheuse tendance à brûler les angles lors d'une découpe. Enfin il est incapable de générer  un PWM a 25Khz, ce qui est indispensable pour un K40. Ce dernier point peut encore se contourner avec un filtrage sur le PWM en vue de produire une tension analogique.&lt;/p&gt;


&lt;p&gt;L'auteur du logiciel de pilotage laser Lightburn écrivait au sujet de Marlin en 2019 :&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I’ve tested with Marlin 1.9, I believe, and other users have reported using 2.0 without issues, but I’ll warn you that I’m not strong with Marlin and much of the Marlin support in LightBurn is a direct result of user suggestions.&lt;/p&gt;
&lt;p&gt;
Most people use the first fan output for the PWM of the laser, though that can be changed in the device options in LightBurn if you need to use a different PWM index, and the baud rate is configurable as well (250,000 is favored because it’s nicely divisible by the clock rate, where 230,400 is not).&lt;/p&gt;
&lt;p&gt;
If you find the configuration daunting, I’m not going to be much help there as Marlin is not my forte - I have a good amount of experience with Grbl and Smoothieware (even having delved into the code for both of those), but no real experience with Marlin.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Il indique aussi  :&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;When I say “ramped power output” I mean velocity-modulated PWM, ramping the PWM up and down as the velocity increases, then decreases for corners. Smoothieware and GRBL another support this, but none of the others as far as I’m aware.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;C'est donc plié pour Marlin si on veut ce support de la modulation de puissance pendant les accélérations... Next!&lt;/p&gt;


&lt;h3&gt;Fonctionnement sous grbl-lpc:&lt;/h3&gt;


&lt;p&gt;Sur GRBL adapté pour LPC par Claudio Prezzi ( &lt;a href=&quot;https://github.com/cprezzi/grbl-LPC/releases&quot;&gt;https://github.com/cprezzi/grbl-LPC/releases&lt;/a&gt; ) cela va être encore plus rapide. Les cartes SKR ne sont tout simplement pas supportées. En effet, seules sont supportées ( Smoothieboard, Cohesion3D, Azteeg X5, MKS SBASE) les cartes dont les signaux step et sont sur le même port d'entrée sortie. C'est d'ailleurs grâce à cette contrainte et à des manipulations de bits sur un même port que GRBL est si rapide...&lt;/p&gt;


&lt;p&gt;Le  brochage de la SKR 1.4 ne respectant pas ce standard, c'est donc aussi plié.. Next!&lt;/p&gt;


&lt;h3&gt;Smoothieware :&lt;/h3&gt;


&lt;h4&gt;Un petit mot sur la communauté et l'écosystème Smoothie&lt;/h4&gt;


&lt;p&gt;Les concepteurs de Smoothieware on fait un choix, celui de ne pas utiliser de liaison émulée (à l'exception de celle qui pilote une broche de CNC en RS485), principalement car il n'y en a pas besoin sur une carte Smoothieware, mais peut être aussi pour des raisons de performance. Du coup, ce qui pourrait marcher avec un SPI 'software' ou un port série 'software' ne fonctionne pas :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Écran LCD Reprap discount Smart LCD controler (SKR 1.3 et 1.4).&lt;/li&gt;
&lt;li&gt;Contrôleurs pas à pas en mode 'SPI' (SKR 1.3 et 1.4)&lt;/li&gt;
&lt;li&gt;Contrôleurs pas à pas en mode 'série' (SKR 1.3 et 1.4)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;En fait, tout est prévu pour supporter les Smoothieboard. Si ça marche pour d'autre cartes, tant mieux pour vous... mais si il faut supporter des cartes avec des fonctionnalités spécifiques (ex : SKR et le support d'un grand nombre de drivers de moteurs pas à pas), on se heurte à un quasi mur de la part des 2 mainteneurs principaux.&lt;/p&gt;


&lt;p&gt;Ils argumentent sur le fait qu'il n'y ait plus de place dans la mémoire du micro contrôleur (admettons.. mais les compilations conditionnelles ça existe.. et sont déjà utilisées pour distinguer la version CNC de la version imprimante 3D) et qu'ils ne veulent pas faire de support pour des cartes chinoises... Sous entendu vous n'avez qu'à acheter une Smoothieware.  C'est déjà limite limite de coupler le hard au soft...&lt;/p&gt;


&lt;p&gt;Cette haine des autres cartes (chinoises notamment) en est au point ou ils les appellent 'contrefaçons', n'intègrent pas les patch request que les gentils développeurs leurs proposent, ou alors dans des branches annexes. C'est dommage et ce n'est clairement pas l'esprit du logiciel libre, dont il s'agit plus de fabriquer un bien commun avec des contribution communes que de servir des intérêts particuliers, tout en respectant a propriété intellectuelle.&lt;/p&gt;


&lt;p&gt;Cette notion de contrefaçon est d'ailleurs très discutable, car si au départ elle était alimentée par le fait que les premières cartes conçues pour faire fonctionner Smoothieware (MKS) ne publiaient pas les schémas, cela a un peu changé, et certaines - comme les SKR - publient les leurs et amènent des innovations (ex : support de pléthore de contrôleurs moteur pas à pas, d'afficheurs supplémentaires, leds, etc..) sur un reroutage complet du circuit imprimé (optimisations??). Est on encore face à une contrefaçon dans ce cas? Il me semble que non, c'est d'ailleurs l'esprit du libre que d'améliorer à chaque itération.&lt;/p&gt;


&lt;p&gt;Si Smoothie considère comme contrefaçon une carte comme la SKR 1.4 (dont le schéma est publié...) on peut aussi considérer que Smoothieware est une contrefaçon :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;de LAOS, qui a utilisé pour la première fois de processeurs LPC176x et Mbed sur une carte de pilotage de machine à commande numérique (dédiée laser). C'était en 2010.&lt;/li&gt;
&lt;li&gt;de RAMPS (Reprap Arduino Mega Pollolu Shield) pour l'architecture, tous les étages de puissance, les méthodes de mesure de température&lt;/li&gt;
&lt;li&gt;de Pollolu, pour choix de contrôleurs pas à pas basés sur des composants d'Allegro Semiconductors&lt;/li&gt;
&lt;li&gt;etc...&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Et sur le fond, l'open hardware et les logiciels libres n'inventent que très rarement tout, mais procèdent par itérations successives, dont Smoothie (et spécialement Smoothieware) n'est qu'une itération. Je me demande si il n'y a pas un sérieux manque de culture Libre de la part des développeurs. En effet, s'arque-bouter sur un développement fait il y a près de 7 ans, qui n'a pratiquement pas bougé depuis, et qui n'annonce rien de révolutionnaire, c'est presque le début de la fin.&lt;/p&gt;


&lt;p&gt;OK, c'est un troll, mais pour vous faire réfléchir sur le sujet, quand Arthur Wolf, son concepteur, écrit lui:  &lt;a href=&quot;http://smoothieware.org/troubleshooting#what-is-wrong-with-mks&quot;&gt;http://smoothieware.org/troubleshooting#what-is-wrong-with-mks&lt;/a&gt;, en mettant tout le monde dans le même panier, on peut légitimement se demander si il n'est pas à côté de la plaque, même avec sa licence GPL V3 et son logo OSHW. Qu'est ce qui empêche de fabriquer une carte OSHW à l'identique? Ou de prendre le schéma et le rerouter? D'un point de vue légal, pas grand chose....&lt;/p&gt;


&lt;p&gt;De plus il y a quelques incohérences dans le modèle. Par exemple,  le fait que Cohesion3D ne publie pas ses schémas n'a pas l'air de le déranger. Contribuent t'ils financièrement à Smoothie? C'est donc de l'open source à 2 vitesse, ceux qui payent une licence et les autres? D'ou ça sort cette licence? Dans ce cas, les contributeurs sont ils rémunérés et comment? Je vous laisse méditer là dessus, mais il est clair qu'on est dans les limites du modèle. Si les cartes Smoothieware ne valaient pas 200 euros, cela ne laisserait pas un boulevard aux solutions alternatives... Autant directement mettre le tout sous licence MIT  ou creative common CCBYSA (partage à l'identique, mais pas d'exploitation commerciale), cela serait plus clair...&lt;/p&gt;


&lt;p&gt;J'ai creusé par exemple l'amélioration proposée par Cohésion3D/LightBurn sur Smoothieware, visant à intégrer des commandes Gcode spéciales pour traiter les variations rapides de puissance d'un laser pour faire de la gravure en nuance de gris avec le logiciel Lightburn. Leurs modifications sur le code sont assez difficile à trouver ( chercher &quot;SmooChanges.zip&quot; dans https://forum.cohesion3d.com/t/improved-raster-speed-firmware-update-for-cohesion3d-boards/850/12 ). Ceci a été publié le 16 Juillet 2019 .&lt;/p&gt;


&lt;p&gt;Le développeur (LightBurn) a tenté de réinjecter les modifications sur Smoothieware, ce que l'on retrouve  dans un échange  sur le  Github de Smoothieware ( &lt;a href=&quot;https://github.com/Smoothieware/Smoothieware/issues/1446&quot;&gt;https://github.com/Smoothieware/Smoothieware/issues/1446&lt;/a&gt;  ). Je  vous la fait courte et en français, mais en gros les développeurs de Smoothie disent qu'il ne l'intégreront pas car cela viole les standards du Gcode. Plus loin ils disent aussi que pour demander l'intégration du code il faut faire un Pull Request (NDLR: méthode pour proposer une amélioration de code dans Git), ce à quoi l'auteur de la modification répond &quot;pourquoi faire Pull Request si vous ne l'intégrerez pas?&quot;... Dialogue de sourds... Du coup, pas de pull request, et du code source uniquement disponible sous forme de quelques fichiers modifiés sur une Dropbox, sans savoir à partir de quelle version cela part. Pas très simple à manipuler. Mais je ne jetterai pas la pierre au concepteur de Lightburn, il s'est fait jeter avant même de pouvoir proposer quoi que ce soit...&lt;/p&gt;


&lt;p&gt;Partant du principe que la méthode de demande d'une amélioration conditionnera le fait qu'elle soit considérée, je me fade la doc pour voir comment intégrer un PR et j'en propose un avec une amélioration  visant à ajouter le support d'un SPI logiciel pour les LCD ( &lt;a href=&quot;https://github.com/Smoothieware/Smoothieware/pull/1494&quot;&gt;https://github.com/Smoothieware/Smoothieware/pull/1494&lt;/a&gt; ).  En tout la totalité de a manip m'a pris 3 heures.&lt;/p&gt;


&lt;p&gt;Le PR a été totalement clos en moins de 15 minutes (et le tout à 23h00...) , sans laisser la possibilité de poser par exemple des questions sur comment contourner la contrainte exprimée, probablement très légitime (no wait() ). C'est très violent, et très loin du &quot;Code of conduct&quot;  ( &lt;a href=&quot;https://github.com/Smoothieware/Smoothieware/blob/edge/CODE_OF_CONDUCT.md&quot;&gt;https://github.com/Smoothieware/Smoothieware/blob/edge/CODE_OF_CONDUCT.md&lt;/a&gt; ) fixé par les deux développeurs eux même.  Ou se trouve la bienveillance et le respect attendus?&lt;/p&gt;


&lt;p&gt;Arthur (Wolf), une solution aurait pu être de laisser ouvert le PR, d'exprimer vos désidératas et pourquoi pas des pistes pour les modifs de code de façon à ne plus avoir ces &lt;em&gt;wait()&lt;/em&gt; qui vous gênent tant, et attendre que je propose un PR modifié tenant compte de vos remarques... De la même manière, la modif &quot;Smoothie Clustering&quot; aurait pu être intégrée avec une compilation conditionnelle.. (CNC=1 CLUSTERING=1), avec les réserves sur son usage? Ca donne pas très envie de faire des efforts pour vous. Heureusement que Linus et les contributeurs historiques de Linux ou de la FSF n'étaient pas aussi sévères, on n'aurait surement pas le GNU/Linux que l'on connait aujourd'hui et qui a juste changé le monde de l'informatique...&lt;/p&gt;


&lt;p&gt;Peut être que le fait que ce PR soit pour les cartes SKR/Bigtreetech, rappelle que les schémas soient dispos (c'est pas closed source...) les a énervés??? Chatouilleux les types. Voila ce a quoi peut  mener l'open source quand managé par des intégristes, les intérêts personnels ou une combinaison des 2 . C'est lamentable. Et sur le sujet, j'en connais un rayon, puisque j'ai opéré une SSLL (Société de Services en Logiciels Libres) pendant près de 20 ans, monté un Fablab, et fait un paquet de contributions en hard et en soft, sous différentes licences..&lt;/p&gt;


&lt;p&gt;Donc bien qu'un assez beau logiciel, je ne parierai pas sur le fait que Smoothie soit la solution pour les 10 ans à venir.  Alors que pour Marlin, qui a su passer en 32 bits, adapter on support à des dizaines de processeurs différents (contre 1 sur Smoothie), et près d'une centaine de cartes, oui...  Et même si la Smoothie V2 arrive, il n'est pas sur qu'elle remporte le succès attendu. Entre son prix, et le fait que le processeur ne tourne qu'à 200Mhz, il n'est pas sur que la présence d'un FPGA suffise à elle seule à justifier un emploi généralisé de la version pro. Une erreur de casting?&lt;/p&gt;


&lt;p&gt;Néanmoins, je vais poursuivre, car une fois l'intégration réalisée sur ma découpe laser K40, je ne vais pas y toucher pendant un moment.. et il sera toujours temps de revenir sur marlin ou un autre firmware si d'ici là la situation change. De plus, le cout et la notoriété des cartes SKR fait que d'autres pourraient être intéressés par ma modification.&lt;/p&gt;


&lt;h4&gt;Mise en œuvre&lt;/h4&gt;


&lt;p&gt;C'était ma première expérience de Smoothieware, et j'ai pas forcément trouvé le démarrage simple. Après avoir flashé le firmware, on ne sait pas du tout si cela fonctionne ou pas.. En effet, même les éventuels messages d'erreur liés à la lecture / compréhension du fichier de config ne s'affichent que sur le port série matériel 0 (UART0).  De plus, certains configuration font carrément planter le firmware, comme par exemple de laisser activé l’Ethernet sur une carte qui n'en dispose pas.. Mais nous allons voir que rien de tout ceci n'est insurmontable..&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Programmation de la carte&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;La programmation de la carte est assez simple puisqu'il suffit de copier le fichier &quot;firmware.bin&quot; sur le lecteur disque ou est monté la carte SD. Un simple reboot provoque le flashage. Des version pré-compilées sont disponibles &lt;a href=&quot;https://github.com/Smoothieware/Smoothieware/tree/edge/FirmwareBin&quot;&gt;ICI&lt;/a&gt;. Pour une découpe laser, et pour les premiers essais, il faut prendre la version firmware-cnc.bin ou firmware-cnc-latest.bin , et  la renommer en firmware.bin avant de la copier sur le disque USB et d'appuyer sur le bouton reset. Le boot du processeur se charge du reste, en détectant la présence du fichier et en flashant la mise à jour. Il sauve également l'ancien firmware sur la carte SD au cas ou l'on ait besoin de revenir en arrière.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Configuration du firmware&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Sur Smoothiware, une caractéristique unique est que la configuration du firmware se fait par un simple fichier texte, nommé config ou config.txt et placé dans la racine de la carte SD. Les modifications sont donc possible par le PC en éditant le fichier directement sur le lecteur monté par la carte et en redémarrant  la carte pour qu'elles soient prises en compte. On peut aussi tout à fait extraire la carte SD et la lire directement sur un ordinateur.&lt;/p&gt;


&lt;p&gt;Lors des éditions sur le fichier de config, il faut faire très attention à ce que les lignes dépassent pas 132 caractères, et on y est vite avec des commentaires.. J'en ai fais les frais lors des premiers essais, mon fichier de config n'était pas pris en compte... Une astuce consiste à utiliser un éditeur de texte moderne (ex notepad++) et à utiliser les tabulations pour aligner les commentaires sans exploser le nombre de caractères. (une tabulation = 4 espace...).  Pour plus de clarté, les tabulations peuvent être affichées avec &quot;Affichage / Symboles Spéciaux / Afficher les blancs et les tabulations&quot;. Cela aide pour nettoyer le fichier et donne ceci  (cliquer pour zoomer):&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/visualtabs.png&quot; title=&quot;visualtabs.png, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.visualtabs_m.png&quot; alt=&quot;visualtabs.png, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La fabrication du fichier de configuration est une opération longue et fastidieuse. Il faut en effet reprendre les entrées / sorties du schéma et reconfigurer chaque fonction supportée par Smoothie.&lt;/p&gt;


&lt;p&gt;Cliquez sur le schéma pour l'agrandir :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/pinout1.4.png&quot; title=&quot;pinout1.4.png, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.pinout1.4_m.png&quot; alt=&quot;pinout1.4.png, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La première chose à faire dans le fichier de config est de désactiver l'ethernet pour éviter le plantage de la carte :&lt;/p&gt;
&lt;pre&gt;
network.enable   	false		# Enable the ethernet network services
&lt;/pre&gt;


&lt;p&gt;Ensuite on peut commencer à configurer....&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/configV1.4pourK40.txt&quot;&gt;Voici le fichier config.txt&lt;/a&gt; résultant pour une K40. Il est abondamment commenté pour permettre de comprendre ce qui a été fait. Il faudra bien sur le renommer en config.txt avant de le copier sur la carte SD. A noter qu'il ne se présentera pas bien dans un navigateur web, car les tabulations sont traitées comme faisant 8 caractères, contre 4 dans un éditeur de code moderne (ex: notepad++).&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Une liaison série additionnelle pour comprendre ce qui se passe&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Mettre un adaptateur USB / Série 3.3V sur la sortie écran (UART0) peut être une très bonne idée, car ce port résistera au reboot, et permettra d'afficher les éventuelles erreurs détectées dans le fichier de config dès le tout début du démarrage, contrairement au port série émulé sur USB de la carte .&lt;/p&gt;


&lt;p&gt;Comme indiqué ci dessus,  L'uart 0 (TX0, RX0) sort sur le port destiné au branchement du TFT. Un simple adaptateur FTDI232 ( ex : https://fr.banggood.com/3pcs-FT232RL-FTDI-3_3V-5_5V-USB-to-TTL-Serial-Adapter-Module-Converter-Geekcreit-for-Arduino-products-that-work-with-official-Arduino-boards-p-1633685.html ) suffit pour disposer de cette liaison de debug. Penser à le mettre en 3.3V à l'aide du cavalier, avant de le raccorder à la SKR... Tx sur RX et RX sur TX, et un fil de masse et le tour est joué.&lt;/p&gt;


&lt;p&gt;L'autre solution est de mettre en place un module wifi. Cette solution est détaillée ci dessous.&lt;/p&gt;


&lt;h3&gt;Ce qui marche en standard, et ce qui ne marche pas.&lt;/h3&gt;


&lt;p&gt;Nous avons vu précédemment pourquoi Smoothieware est à la traine pour supporter des cartes comme la SKR 1.4. Le bilan à priori ne sera pas très bon :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bien que le hardware supporte pléthore de drivers, il n'est possible de mettre que ceux qui sont en Step/Dir (A4988, DRV8825, LV8729, ST820, etc..)&lt;/li&gt;
&lt;li&gt;Aucun afficheur LCD ne fonctionnera sans recâblage ou logiciel modifié. Le broches du SPI de l'écran ne sont en effet pas câblées sur un SPI matériel du LPC176x.&lt;/li&gt;
&lt;li&gt;Le connecteur Neopixel ne servira à rien, ou en tout cas pas pour des leds neopixel (pas de driver).&lt;/li&gt;
&lt;li&gt;Toutes les autres entrées sorties sont fonctionnelles.&lt;/li&gt;
&lt;li&gt;Et bonne nouvelle, la carte SD externe, peut marcher en même temps que celle interne, n'étant pas sur le même port SPI.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Pas d'écran: on est dans le noir...&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Comme vu précédemment, l'écran avec Smoothieware ne peut fonctionner que lorsqu'il est câblé à un SPI matériel. Or sur la SKR 1.4, les broches MOSI et SCK  de l'écran sont branchée à des entrées sorties générales.&lt;/p&gt;


&lt;p&gt;Il y a 2 solutions pour le faire fonctionner :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faire un adaptateur qui va utiliser le même SPI que la carte SD. Cela sera compatible avec un firmware standard. La différentiation entre l'écran et la carte SD se fera pas le Chip Select, câblé à une broche différente.&lt;/li&gt;
&lt;li&gt;Modifier smoothie pour ajouter le support d'un SPI logiciel. Dans ce cas pas de recâblage, toute l’adaptation est faite par logiciel, qu'il faudra modifier.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;En ce qui concerne la première solution, en voici le schéma  (cliquer pour agrandir). Cela consiste à utiliser le SPI0 (utilisé par la SD) aussi pour le LCD. C'est grâce au chip select (LCD_CS / SD_CSEL) que smoothie pourra écrire sur l'un ou l'autre des périphériques.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/adaptateurLCD.png&quot; title=&quot;adaptateurLCD.png, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.adaptateurLCD_m.png&quot; alt=&quot;adaptateurLCD.png, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Une fois câblé cela donne ceci:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/adaptateurLCDsmoothie.jpg&quot; title=&quot;adaptateurLCDsmoothie.jpg, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.adaptateurLCDsmoothie_m.jpg&quot; alt=&quot;adaptateurLCDsmoothie.jpg, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et l'adaptateur en situation, avec la carte, et l'écran fonctionnel (ainsi que la carte SD, le buzzer et l'encodeur de panneau) sur une version officielle de Smoothieware :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/SKR1.4-adaptateur.jpg&quot; title=&quot;SKR1.4-adaptateur.jpg, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.SKR1.4-adaptateur_m.jpg&quot; alt=&quot;SKR1.4-adaptateur.jpg, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Bien sur il faut adapter la configuration (dans config.txt), pour refléter le câblage de l'adaptateur. A noter que sur mon écran j'ai du réduire la fréquence de pilotage du LCD (panel.spi_frequency) à 100 khz au lieu de 1 mhz, sinon il y avait des erreurs de transmission. C'est probablement lié à la longeur des nappes 10 broches qui relient la carte au LCD.&lt;/p&gt;

&lt;pre&gt;
############################################
# For SPI0 hardwired to lcd via a custom adapter
panel.spi_channel                     0      # Spi on Hardware channel 0
panel.spi_cs_pin                   1.19      # SPI chip select     ; GLCD EXP1 Pin 4
panel.spi_frequency              100000      # Needs to reduce spi frequency for emulated rrdglcd
                                             # default : 1 000 000 Hz

panel.encoder_a_pin                3.25!^    # Encoder pin         ; GLCD EXP2 Pin 3
panel.encoder_b_pin                3.26!^    # Encoder pin         ; GLCD EXP2 Pin 5
panel.click_button_pin             0.28!^    # Click button        ; GLCD EXP1 Pin 2
panel.buzz_pin                     1.30      # Pin for buzzer      ; GLCD EXP1 Pin 1
#panel.back_button_pin             0.28!^    # Back button         ; GLCD EXP2 Pin 8
panel.encoder_resolution              4
panel.external_sd                  true      # set to true if there is an extrernal sdcard on the panel
panel.external_sd.spi_channel         0      # On SKR 1.4, wired to spi0 (free).
panel.external_sd.spi_cs_pin       0.16      # set spi chip select for the sdcard (or any spare pin)
panel.external_sd.sdcd_pin         1.31!^    # sd detect signal (set to nc if no sdcard detect)
panel.menu_offset                     1      # Some panels will need 1 here
panel.alpha_jog_feedrate           6000      # X jogging feedrate in mm/min
panel.beta_jog_feedrate            6000      # Y jogging feedrate in mm/min
panel.gamma_jog_feedrate           3000      # Z jogging feedrate in mm/min
panel.hotend_temperature            185      # Temp to set hotend when preheat is selected
panel.bed_temperature                60      # Temp to set bed when preheat is selected
&lt;/pre&gt;


&lt;p&gt;La seconde solution est de faire une modification dans Smoothieware afin d'ajouter le support d'un SPI logiciel. C'est certes moins performant qu'un SPI matériel, mais suffit amplement pour l'affichage.
Voici la modification, basée sur les sources du 23/10/2020 (dernier commit = &quot;Added support for ABC (and E) axis for G2 and G3 &quot;): &lt;a href=&quot;https://civade.com/images/skr1.4/rrdglcd.zip&quot;&gt;rrdglcd.zip&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Il suffit de décompresser ce fichier et le placer dans Smoothieware\src\modules\utils\panel\panels\rrdglcd. Il ajoute une bibliothèque logicielle &quot;SWSPI.cpp/h&quot; , fork de celle de Ella Robotics (https://os.mbed.com/teams/ELLA-Robotics-Inc/code/SWSPI/ ) et modifie les fichiers RrdGlcd.cpp/.h pour ajouter le support du SPI logiciel.&lt;/p&gt;


&lt;p&gt;Les broches de configuration du SPI logiciel sont encodées en dur ligne 155 de RRDGlcd.cpp (mosi = P1_18; miso = P1_21; sclk = P1_20;). Cette configuration est celle convenant à une SKR 1.3 ou 1.4. Ici aussi, réduction de la fréquence du SPI pour éviter les erreurs d'affichage.&lt;/p&gt;


&lt;p&gt;Voici la solution en fonctionnement avec le logiciel modifié :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/SKR1.4-sans-adaptateur.jpg&quot; title=&quot;SKR1.4-sans-adaptateur.jpg, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.SKR1.4-sans-adaptateur_m.jpg&quot; alt=&quot;SKR1.4-sans-adaptateur.jpg, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;L'appel du SPI logiciel dans le fichier de configuration, se fait tout simplement en nommant le numéro de canal SPI &quot;-1&quot; (SPI logiciel) au lieu de &quot;0&quot; ou &quot;1&quot; (Numéro de canal spi matériel) :&lt;/p&gt;

&lt;pre&gt;
############################################
# For Software SPI (unsupported hack on smoothieware)
panel.spi_channel                    -1      # Software spi mosi = P1_18; miso = P1_21; sclk = P1_20;
panel.spi_cs_pin                   1.19      # CS on SKR 1.4
panel.spi_frequency              100000      # Needs to reduce spi frequency for emulated rrdglcd
                                             # default : 1 000 000 Hz

panel.encoder_a_pin                3.25!^    # Encoder pin         ; GLCD EXP2 Pin 3
panel.encoder_b_pin                3.26!^    # Encoder pin         ; GLCD EXP2 Pin 5
panel.click_button_pin             0.28!^    # Click button        ; GLCD EXP1 Pin 2
panel.buzz_pin                     1.30      # Pin for buzzer      ; GLCD EXP1 Pin 1
#panel.back_button_pin             0.28!^    # Back button         ; GLCD EXP2 Pin 8
panel.encoder_resolution              4
panel.external_sd                  true      # set to true if there is an extrernal sdcard on the panel
panel.external_sd.spi_channel         0      # On SKR 1.4, wired to spi0 (free).
panel.external_sd.spi_cs_pin       0.16      # set spi chip select for the sdcard (or any spare pin)
panel.external_sd.sdcd_pin         1.31!^    # sd detect signal (set to nc if no sdcard detect)
panel.menu_offset                     1      # Some panels will need 1 here
panel.alpha_jog_feedrate           6000      # X jogging feedrate in mm/min
panel.beta_jog_feedrate            6000      # Y jogging feedrate in mm/min
panel.gamma_jog_feedrate           3000      # Z jogging feedrate in mm/min
panel.hotend_temperature            185      # Temp to set hotend when preheat is selected
panel.bed_temperature                60      # Temp to set bed when preheat is selected
&lt;/pre&gt;


&lt;p&gt;Ce micro logiciel reste bien sur compatible avec le support du SPI matériel, et pourra aussi faire fonctionnner le LCD avec l'adaptateur décrit ci dessus. Pour recompiler le logiciel, le plus simple est de suivre le tuto : &lt;a href=&quot;http://smoothieware.org/compiling-smoothie&quot;&gt;http://smoothieware.org/compiling-smoothie&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La support de la carte SD, du buzzer, de l'encodeur de panneau est ok pour les 2 configurations, que j'ai testées.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Le module wifi ne fonctionne pas...&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Le connecteur du module wifi utilise la liaison UART 3, et il nous faut l'UART 0... Ça peut se régler avec un petit hack matériel simple à réaliser. Il faut dessouder les broches TX et RX du module (les retirer complètement), et souder 2 fils se terminant par une boche femelle Dupont ou un connecteur JST 6 broches qui seront à brancher sur le connecteur du TFT.&lt;/p&gt;


&lt;p&gt;Voici ce que cela donne :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/wifi-module.jpg&quot; title=&quot;wifi-module.jpg, nov. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.wifi-module_m.jpg&quot; alt=&quot;wifi-module.jpg, nov. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Sur la programmation du module Wifi et sa configuration se reporter à mon post sur l'&lt;a href=&quot;https://civade.com/post/2020/09/22/Ajouter-le-support-du-Wifi-sur-une-imprimante-3D-fonctionnant-avec-Marlin-2&quot;&gt;ajout de wifi sur une imprimante 3D&lt;/a&gt;. Il faut bien sur penser à choisir le bon protocole (Smoothieware au lieu de Marlin) dans le module wifi et la vitesse adaptée (d'après le fichier de config. Dans le mien, 250 000 bauds)  pour que la communication se fasse avec le module wifi.&lt;/p&gt;


&lt;p&gt;A noter que la broche Reset n'est pas cablée sur le support du module Wifi. C'est pas mal, car cela nous permettra de voir les messages de boot de la carte après un reset, dans l'interface web, le wifi n'étant lui pas rebooté. Voici ce que l'on voir après un reboot de Smoothieware dans l'interface web du module wifi. On voit notamment très bien la console avec les premiers messages envoyés par Smoothieware :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/bootwifi.png&quot; title=&quot;bootwifi.png, nov. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.bootwifi_m.png&quot; alt=&quot;bootwifi.png, nov. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;Smoothieware et une découpe laser K40&lt;/h3&gt;


&lt;h4&gt;D'un point de vue logiciel&lt;/h4&gt;


&lt;p&gt;&lt;strong&gt;Logiciel de pilotage :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Le logiciel idéal pour piloter une découpe laser est LightBurn. Il est très complet et fonctionne avec Marlin, Smoothie et GRBL. Il n'est pas libre, et est commercialisé 40USD (35 euros), ce qui en fait une dépense acceptable.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Smoothieware&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Il y a 3 options possibles pour Smoothieware  :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser la version CNC standard de Smoothieware&lt;/li&gt;
&lt;li&gt;Utiliser une version spécifique &quot;Smoothie Clustering&quot; adaptée à la découpe laser (développée par Cohesion3D / LightBurn)&lt;/li&gt;
&lt;li&gt;Utiliser ma version avec support du Smoothie Clustering ET software SPI.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;La version standard est tout à fait adaptée à la découpe, et peut faire de la gravure, mais relativement lentement. En effet il faut beaucoup de commandes GCODE pour moduler la puissance du laser pendant la découpe, ce qui 'plombe' un peu la vitesse.  &quot;Enable Smoothie Clustering&quot; doit être impérativement désactivé dans Lightburn pour utiliser ce firmware.&lt;/p&gt;


&lt;p&gt;La version  &quot;Smoothie Clustering&quot; ( téléchargeable ici: &lt;a href=&quot;https://forum.cohesion3d.com/t/improved-raster-speed-firmware-update-for-cohesion3d-boards/850&quot;&gt;https://forum.cohesion3d.com/t/improved-raster-speed-firmware-update-for-cohesion3d-boards/850&lt;/a&gt; ) qui ajoute une optimisation pour la gravure à haute vitesse.  &lt;strong&gt;&quot;Enable Smoothie Clustering&quot; doit être activé dans Lightburn pour utiliser ce firmware.&lt;/strong&gt;
Elle a une petite particularité: La carte SD n'est pas montée automatiquement sur le PC. Je n'ai pas tenté, mais il est probable qu'en mettant &quot;msd_disable false&quot; cela rétablisse l'accès.&lt;/p&gt;


&lt;p&gt;Enfin sur ma version j'ai repris celle de Smoothie, et à défaut d'avoir une contribution acceptée, j'ai intégré le correctif pour supporter le software SPI (support du LCD graphique de Reprap Discount) et celui de Cohesion3D/LightBurn en ce qui concerne le Smoothie Clustering.  Ici, pas besoin d'adaptateur matériel pour le LCD,  &lt;strong&gt;&quot;Enable Smoothie Clustering&quot; doit être activé dans Lightburn pour utiliser ce firmware.&lt;/strong&gt; Il est disponible sur &lt;a href=&quot;https://gitlab.civade.com/pub/Smoothieware&quot;&gt;https://gitlab.civade.com/pub/Smoothieware&lt;/a&gt; sous forme de source. Une version précompilée est disponible ICI : &lt;a href=&quot;https://gitlab.civade.com/pub/Smoothieware/-/tree/edge/FirmwareBin&quot;&gt;https://gitlab.civade.com/pub/Smoothieware/-/tree/edge/FirmwareBin&lt;/a&gt;.&lt;/p&gt;


&lt;h4&gt;D'un point de vue matériel&lt;/h4&gt;


&lt;p&gt;D'un point de vue matériel, le pilotage d'une K40 nécessite 2 signaux :
- Un signal PWM (modulation de largeur d'impulsion) pour régler la puissance du laser par logiciel. Avec 0V, le laser est à puisance 0, à 5V/100% de PWM il est allumé au maximum.
- Un signal LO (Laser On) pour allumer ou éteindre le laser. Ce signal doit être à zéro pour allumer le laser, et 5V pour l'éteindre.&lt;/p&gt;


&lt;p&gt;Comme la SKR 1.4 ne délivre que du 3.3V sur ses sorties, il va nous falloir adapter les signaux pour sortir en 5V. Ici j'ai fait ceci avec le &quot;Level Translator&quot;. Cela s'alimente d'un coté en 3.3V (d'ou le régulateur), de l'autre coté en 5V. L'alimentation 5V est prélevée du connecteur &quot;servo&quot; sur lequel il y a l'une des rares sorties PWM disponibles sur la SKR 1.4. En ce qui concerne l'autre sortie, j'ai utilisé le connecteur adjacent, c'est à dire le &quot;Probe&quot;.&lt;/p&gt;


&lt;p&gt;Level translator unidirectionnel à 4 voies (&lt;a href=&quot;https://fr.aliexpress.com/premium/5V-level-translator.html?d=y&amp;amp;origin=y&amp;amp;catId=0&amp;amp;SearchText=5V%20level%20translator&quot;&gt;provenance aliexpress&lt;/a&gt;) :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/leveltranslator1.jpg&quot; title=&quot;leveltranslator1.jpg, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.leveltranslator1_m.jpg&quot; alt=&quot;leveltranslator1.jpg, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Par ailleurs, nous allons aussi avoir besoin de l'alimentation 24V fournie par l'alimentation du Laser. Cette alimentation étant à peine assez dimentionnée, la prudence recommanderait de mettre une alimentation 24V externe et ne pas utiliser celle fournie par l'alimentation du laser. C'est comme vous voulez...&lt;/p&gt;


&lt;p&gt;Afin de récupérer la nappe d'origine de la K40 qui amène les fins de courses et le moteur du X, j'ai intercalé une carte &quot;K40 Middle Man&quot; qui fait l'adaptation de la connectique. Je n'ai utilisé que les sorties fin de course, moteur pas à pas et l'entrée alimentation 24V qui sert à alimenter les fins de course optique. Le connecteur qui se branche sur la nape venant du moteur X et des fins de courses (&lt;a href=&quot;https://www.digikey.fr/product-detail/fr/te-connectivity-amp-connectors/1-84534-2/A100331-ND/1893453&quot;&gt;CONN FFC VERT 12POS 1.25MM&lt;/a&gt; ) n'est pas super simple à trouver à l'unité et pas cher.&lt;/p&gt;


&lt;p&gt;Voici une vue de la carte Middle Man K40 (trouvée sur Ebay à 10 euros):&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/k40middle.png&quot; title=&quot;k40middle.png, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.k40middle_m.png&quot; alt=&quot;k40middle.png, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;A noter que cette carte peut être parfois un peu dure à trouver.  On peut bien sur aussi acheter juste le connecteur  et faire &lt;a href=&quot;https://oshpark.com/shared_projects/3W1BpcNl&quot;&gt;fabriquer les circuits imprimés chez OSHPark&lt;/a&gt;, mais ceci n'est rentable que pour faire un lot de 10 cartes minimum.&lt;/p&gt;


&lt;p&gt;Avec ce cablage, les commandes du panneau avant resteront fonctionnelles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Potentiomètre de réglage du courant&lt;/li&gt;
&lt;li&gt;Bouton de test laser&lt;/li&gt;
&lt;li&gt;Bouton de M/A laser&lt;/li&gt;
&lt;li&gt;Vumètre de mesure de puissance du laser.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Ceci permettra notamment de régler le potentiomètre de façon presque définitive à la valeur max de pilotage du laser (14 à 18 ma sur le vu mètre de mesure de puissance, en appuyant sur le bouton test), et moduler ensuite  la puissance par logiciel de 0 à 100% en PWM. Je trouve cette solution de limitation matérielle plus sécurisante pour le laser que de le faire par logiciel.&lt;/p&gt;


&lt;p&gt;Voici le schéma de la modification :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/export.png&quot; title=&quot;export.png, oct. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.export_m.png&quot; alt=&quot;export.png, oct. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Afin de faciliter le cablage, j'ai fait une petite carte qui prend toutes les commandes, héberge la Middle Man et sort sur des connecteurs JST. Le bornier à vis noir en haut de la carte héberge les sorties PWM, Laser On et une masse qui vont aller vers la carte alimentation. Un fois raccordé la nappe enlevée dans l'ancienne carte sur la K40 middle man et l'alimentation, la solution est opérationnelle.  Voici l'ensemble câblé sur table :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/ensemble.jpg&quot; title=&quot;&lt;mark&gt;Mettre ici photo de la carte d&amp;#039;adaptation en situation&lt;/mark&gt;&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.ensemble_m.jpg&quot; alt=&quot;&amp;quot;&amp;quot;Mettre ici photo de la carte d&amp;#039;adaptation en situation&amp;quot;&amp;quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Mise en oeuvre avec une découpe laser K40&lt;/h3&gt;


&lt;h4&gt;Avant toute chose ...&lt;/h4&gt;


&lt;p&gt;Manipuler une carte électronique avec des &quot;fils volants&quot; est souvent dangereux (pour la carte). Aussi il est préférable de sécuriser le tout pour éviter qu'un fil se promène et ne fasse de court-circuit intempesif. Qu'à cela ne tienne, un petit coup de découpe laser et hop, une platine pour fixer le tout! J'ai au passage adjoint une alimentation externe et un voltmètre pour surveiler la tension d'alimentation.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/prototype.jpg&quot; title=&quot;prototype.jpg, nov. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.prototype_m.jpg&quot; alt=&quot;prototype.jpg, nov. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Avant de monter la carte, il va falloir régler le courant sur les drivers moteurs. La méthode dépend bien sur des drivers choisis. Les moteurs nécessitent 800mA. Pour info, dans un premier temps j'avais mis des DRV8825. Malheureusement, sur ces moteurs beaucoup de sifflements étaient à déplorer, même au courant nominal. Je suis donc revenu sur des classiques Pollolu A4988, un peu moins bruyants. Je les ais configurés en 1/16e de pas (les 4 cavaliers de configuration sous le driver moteur positionnés à droite). J'ai commandé deux TMC2130 pour essayer. Je pense y gagner en bruit et en souplesse, et ceux ci se pilotent possiblement en Step/Dir (prendre la version 'DIY' et la configurer). Je rajouterai une note là dessus plus tard.&lt;/p&gt;


&lt;h4&gt;Installation et configuration de LightBurn&lt;/h4&gt;


&lt;p&gt;Il faut ensuite installer Lightburn ( &lt;a href=&quot;https://lightburnsoftware.com/&quot;&gt;https://lightburnsoftware.com/&lt;/a&gt; ) . Le logiciel est payant (35 euros), mais bien développé et supporté. Lorsqu'il est installé pour la première fois, il est en version d'évaluation complète, pendant 30 jours. Ceci vous permettra de faire tous les essais avant de décider si c'est l'outil pour vous ou pas.&lt;/p&gt;


&lt;p&gt;Une fois installé, il faut le configurer pour une K40. Pour cela utiliser l'assistant de nouvel appareil (il se lance tout seul au premier lancement, ou sinon en bas à droite, appuyer sur &quot;Appareils&quot;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choisissez Smoothieware dans la liste des contrôleurs, puis Next&lt;/li&gt;
&lt;li&gt;Choisissez Serial  / USB puis Next&lt;/li&gt;
&lt;li&gt;Nommer la machine (ex : &quot;Smoothieware K40&quot; ) et préciser ses dimentions (pour moi, X=330, Y=210, mais cela peut être plus petit pour vous si vous n'avez pas modifié le cadre pour augmenter les courses).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Ces réglages de base vont permettre d'exploiter Smoothie, mais sans le firmware &quot;Cluster&quot;, ou le mien modifier pour supporter le &quot;Cluster mode&quot;.&lt;/p&gt;


&lt;p&gt;Pour accéder aux réglages avancés, Allez sur l'icone &quot;clé à molette+tournevis&quot; sur la barre d'icones de Lightburn. Voici les réglages que j'ai changés :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/Config-SmoothiewareK40-LightBurn_0.9.18.png&quot; title=&quot;Config-SmoothiewareK40-LightBurn 0.9.18.png, nov. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.Config-SmoothiewareK40-LightBurn_0.9.18_m.png&quot; alt=&quot;Config-SmoothiewareK40-LightBurn 0.9.18.png, nov. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) : Dimensions de la table (déjà vu dans l'assistant) et &lt;strong&gt;origine en bas à droite&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;(2) : Homing automatique lors de la connexion de la prise USB / Allumage machine&lt;/li&gt;
&lt;li&gt;(3) : Activer le Clustering Smoothie : pour tirer partie du firmware &quot;Cluster&quot;. Ne pas mettre 'on' si firmware standard Smoothieware.&lt;/li&gt;
&lt;li&gt;(4) : Reduce Smoothieware pause Delay: Smoothie ne supporte pas la mise en pause automatique dans un mouvement en cours. Permet de diviser les grands mouvements en plusieurs petits pour que l'utilisateur puisse mettre en pause plus facilement.&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Tests de déplacement et vitesses moteurs&lt;/h4&gt;


&lt;p&gt;Ensuite, on peut raccorer la nappe portant le moteur X et les fins de courses, et le moteur Y (seulement 2 connecteurs à cabler...). &lt;strong&gt;Le laser doit être impérativement coupé en le mettant sur 'Off' sur le panneau avant.&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Les essais moteurs peuvent maintenant démarrer avec le laser coupé. Si vous avez raccordé la carte par votre propre alim 24V, vous n'êtes d'ailleurs même pas obligé d'allumé la machine, seulement l'alim de la  carte Bigtreetech... encore plus sûr..&lt;/p&gt;


&lt;p&gt;Une fois compris que l'origine est en haut à gauche, et qu'il faut faire la recherche d'origine dans le sens négatif sur l'axe X et positif sur l'axe Y (c'est bien sur lié à la position physique des capteurs optiques sur la K40), ca commence à se comporter normalement lors du homing. La tête doit se déplacer vers le haut gauche. Le homing peut être demandé dans Smoothieware en allant dans le menu &quot;Prepare / Homing all axes&quot;.&lt;/p&gt;

&lt;pre&gt;
alpha_min_endstop       1.29^        # Connecteur homing X-
alpha_homing_direction  home_to_min  # Recherche le home en décrémentant  (X--)
alpha_min               0
alpha_max               330          # largeur = 330 mm sur une K40 modifiée

beta_max_endstop        1.28^        # Connecteur homing Y-
beta_homing_direction   home_to_max  # Recherche le home en incrémentant  (Y++)
beta_min                0
beta_max                210          # hauteur = 220 mm sur une K40 modifiée
&lt;/pre&gt;


&lt;p&gt;Les mouvements, au courant nominal (0.8A), marchent pas mal jusqu'à 25 000 mm/min (soit 417 mm/s). J'ai même pu aller au delà mais après ce sont les moteurs/mécanique qui ne suivent plus...&lt;/p&gt;


&lt;p&gt;Les moteurs étant en &lt;strong&gt;400 pas/tour&lt;/strong&gt;, en&lt;strong&gt; 1/16e de pas&lt;/strong&gt; (6400 pas par tour), avec une&lt;strong&gt; courroie au pas de 2mm&lt;/strong&gt; sur la &lt;strong&gt;poulie de 20 dents&lt;/strong&gt; (40mm / tour), il faut  (6400 pas / 40 mm ) = 160 pas pour faire 1mm.&lt;/p&gt;


&lt;p&gt;A 417mm/s (soit 25 000 mm/minute) cela nous donne donc une fréquence de pase de (417mm/s X 160 pas) = &lt;strong&gt;66.72 kHz&lt;/strong&gt;. Pas mal ! On bien au delà des 25 kHz max d'un Grbl sur arduino Uno...&lt;/p&gt;


&lt;p&gt;Au passage, c'est aussi pour cela qu'il ne me semble pas une bonne idée de mettre un GRBL/Uno sur une K40, car cela ira 2.5 fois moins vite sur les déplacements rapides. Avec GRBL sur STM32 ou ESP32 (voir sur ce même blog 2 articles sur le sujet) cela passerait sans problème. Donc oubliez l'Arduino de base à 16Mhz pour ce genre de projet...&lt;/p&gt;


&lt;p&gt;A noter que Lightburn utilise la vitesse de jog par défaut qui est réglée dans Smoothieware pour se déplacer à vitesse rapide (default_seek_rate) . Il faut donc positionner celle-ci en fonction des caractéristiques machine. Bien que cela était fonctionnel à 24000 mm/mn, j'ai pris une marge de sécurité pour ne pas travailler toujours au max, en réduisant la vitesse de jog de 25% par rapport aux tests faits ci dessus (18000 mm/min, soit &lt;strong&gt;300 mm/s&lt;/strong&gt;):&lt;/p&gt;

&lt;pre&gt;
default_seek_rate    18000             # Default speed (mm/minute) for G0 moves
&lt;/pre&gt;


&lt;p&gt;J'ai néanmoins laissé à 24000 les déplacements des moteurs, pour les rares fois ou je souhaiterais graver à très haute vitesse en mode &quot;raster&quot;. Ca a du sens...&lt;/p&gt;


&lt;p&gt;J'ai relancé la découpe du fichier qui m'a servi à faire la platine dans Lightburn (toujours sans laser!!!), et tout avait l'air de se comporter normalement, avec d'assez jolis bruits mécaniques et sur les moteurs. C'est un peu plus bruyant qu'avec l'électronique d'origine, mais cela évoluera lors de la mise en place de drivers Trinamic (plus tard...).  Au moins, &quot;it works (tm)&quot;. Il est donc temps de raccorder le laser...&lt;/p&gt;


&lt;h4&gt;K40 + Lightburn avec pilotage du laser&lt;/h4&gt;


&lt;p&gt;Le raccordement du laser nécessite 3 fils, une masse, le LO (Laser On) totalement à droite sur l'alimentation, et le PWM. Ce dernier est pris en débrancheant la cosse raccordée sur le 5V de l'alimentation, et qui va à droite du portentiomètre de réglage de puissance.  Ainsi le motentiomètre reste actif... et permet de mettre un talon sur la puissance Max admissible (18ma est une valeur qui semble faire l'unanimité sur une K40).&lt;/p&gt;


&lt;p&gt;Pas de soucis particulier lors de la découpe. J'ai du adapter la hauteur de trait en mode raster à la largeur de mon faisceau, et activer le surbalayage :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/EspacementLignesRaster-LightBurn_0.9.18.png&quot; title=&quot;EspacementLignesRaster-LightBurn 0.9.18.png, nov. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.EspacementLignesRaster-LightBurn_0.9.18_m.png&quot; alt=&quot;EspacementLignesRaster-LightBurn 0.9.18.png, nov. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le surbalayage a pour intérêt de dépasser légèrement en mode raster de part et d'autre de la pièce de façon à laisser du temps à la mécanique de se stabiliser. En effet, j'ai noté que lors d'allers retours, une oscillation pouvait être visible à la loupe sur les traits au début. Celle ci disparait totalement en surbalayage. Voici ce que donne une prévisualisation d'un surbalayage. En rose, les déplacements sans laser et en gris avec. Si les dimensions de la zone rose changent, c'est pour s'adapter à la vitesse... Ceci est fait automatiquemetn par Lightburn :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/Apercu-LightBurn_0.9.18.png&quot; title=&quot;Apercu-LightBurn 0.9.18.png, nov. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.Apercu-LightBurn_0.9.18_m.png&quot; alt=&quot;Apercu-LightBurn 0.9.18.png, nov. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Conclusion :&lt;/h3&gt;


&lt;p&gt;Du coup, j'ai passé la carte en prod, en démontant l'ancienne et en fixant la nouvelle via la plaque métallique verticale de fixation. Pour le moment, je n'ai pas encore modifié la face avant, car je ne suis pas sur que le LCD de Smoothie soit intéressant pour une découpe laser, lorsque l'on est connecté à Lightburn.&lt;/p&gt;


&lt;p&gt;Il a fallu faire un petit cable USB type B male, vers embase type B femelle et un adaptateur en impression 3D pour fixer le type B femelle dans le trou ou il y avait l'entrée USB de la précédente carte. Rien de bien méchant. Ceci dit, pour  les feignants (et patients...)  cela existe tout fait que Aliexpress à moins de 1 euro :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/typeb.jpg&quot; title=&quot;typeb.jpg, nov. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.typeb_m.jpg&quot; alt=&quot;typeb.jpg, nov. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Voici une vue d'ensemble montée :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/skr1.4/ensemble-monte.jpg&quot; title=&quot;ensemble-monte.jpg, nov. 2020&quot;&gt;&lt;img src=&quot;https://civade.com/images/skr1.4/.ensemble-monte_m.jpg&quot; alt=&quot;ensemble-monte.jpg, nov. 2020&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le couple Lightburn + Smoothieware, c'est très spectaculaire....  Rien à voir avec le logiciel d'origine. Avec la Bigtreetech SKR 1.4, il est possible de faire cette upgrade pour moins de 100 euros tout compris (logiciel aussi), ce qui en fait une modification imbattable. De toute façon je n'aurais pas mis les 250 USD de la carte  Cohesion, ou les 250 euros de la Smoothieboard + accessoires auxquels il fallait encore ajouter le logiciel.
C'est peut être pas très fair play pour les développeurs de Smoothieware, mais vu les rapports que j'ai eu avec eux, j'ai vraiment pas eu l'envie d'alimenter leur business.&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2020/10/20/Bigtreetech-SKR-V1.4-Turbo-sur-une-d%C3%A9coupe-laser-K40-avec-Smoothieware#comment-form</comments>
          <wfw:comment>https://civade.com/post/2020/10/20/Bigtreetech-SKR-V1.4-Turbo-sur-une-d%C3%A9coupe-laser-K40-avec-Smoothieware#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/107</wfw:commentRss>
              </item>
          <item>
        <title>Manuel alternatif complet pour synthétiseur Analogique Roland / Studio Electronics SE-02</title>
        <link>https://civade.com/post/2020/10/01/Manuel-alternatif-complet-pour-synth%C3%A9tiseur-Analogique-Roland-/-Studio-Electronics-SE-02</link>
        <guid isPermaLink="false">urn:md5:46d66b171aee7815c2bd2a2bd2c73cfd</guid>
        <pubDate>Thu, 01 Oct 2020 08:46:00 +0200</pubDate>
        <dc:creator>jphi</dc:creator>
                  <category>DIY-Musique</category>
                        <description>&lt;p&gt;Le manuel du SE02 n'a pas été mis à jour par Roland. Il faut donc jongler avec plusieurs documents (manuel Roland, Missing Manual, Added Func 1.10, Synshine Jones Manual) pour avoir une vision à peu près complète du sujet....&lt;/p&gt;          &lt;p&gt;Vue de mon SE-02, avec 2 flancs en châtaignier au lieu des flancs acier. Nettement pus &quot;vintage&quot;, non?&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;https://civade.com/images/SE02/IMG_2317.JPG&quot; title=&quot;IMG_2317.JPG, déc. 2018&quot;&gt;&lt;img src=&quot;https://civade.com/images/SE02/.IMG_2317_m.jpg&quot; alt=&quot;IMG_2317.JPG, déc. 2018&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Sunchine Jones, a développé un manuel alternatif beaucoup plus complet que la simple feuille de Roland (http://sunshine-jones.com/roland-boutiquestudio-electronics-se-02-the-missing-manual/). Malheureusement, il n'intègre pas (tout comme celui de Roland) les particularités des firmware 1.04, 1.10 et 1.11...&lt;/p&gt;


&lt;p&gt;Je n'ai pas réussi à contacter l'auteur, et le format diffusé est uniquement en PDF, ce qui n'est pas très &quot;communautaire&quot;. On est donc face à un document qui aussi génial soit il, est fermé aux évolutions...&lt;/p&gt;


&lt;p&gt;Je me suis donc permis de faire du reverse à partir du PDF afin de :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fabriquer ce manuel à partir d'un format de document ouvert (LibreOffice)&lt;/li&gt;
&lt;li&gt;Homogénéiser les références aux touches (en gras)&lt;/li&gt;
&lt;li&gt;Corriger les coquilles&lt;/li&gt;
&lt;li&gt;Compléter certaines sections,&lt;/li&gt;
&lt;li&gt;Ajouter toutes les fonctionnalités des différentes updates de firmware, en identifiant à partir de quelle version la fonction est disponible.&lt;/li&gt;
&lt;li&gt;Intégrant les astuces diffusées sur AF, et sur le site de Studio Electronics&lt;/li&gt;
&lt;li&gt;Reprendre l'implémentation midi, qui était intégrée en format image et ne passait pas sur tous les viewer PDF, et la compléter avec les derniers contrôleur supportés&lt;/li&gt;
&lt;li&gt;Supprimer certaines curiosités (le commodore 64, le chapitre sur l'interface cassette.. etc..).&lt;/li&gt;
&lt;li&gt;Optimiser la mise en page pour du A4, et tenter de réduire le nombre de page (34 au lieu de 40...)&lt;/li&gt;
&lt;li&gt;Explications sur le fonctionnement du LFO sur les oscillateurs dans la section LFO&lt;/li&gt;
&lt;li&gt;Ajout d'une page à la fin sur l'accès rapide aux fonctions (clear patch, tune, etc..)&lt;/li&gt;
&lt;li&gt;Modification des tableaux de patch/Pattern/Song setup pour ajouter la fonction clear.&lt;/li&gt;
&lt;li&gt;Ajout des settings pour la bonne communication avec l'éditeur SE02 dans l'accès rapide aux fonctions. (&quot;Quick memento&quot;)&lt;/li&gt;
&lt;li&gt;Ajout d'Audio Fanzine dans les contributeurs&lt;/li&gt;
&lt;li&gt;Et enfin produire le résultat sous forme de PDF intégrant le format ODT (Libre Office) de façon à le rendre éditable. Il suffit d'installer Libre Office (open source) et de faire un fichier / ouvrir sur le PDF...&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;C'est un travail en cours, que je soumet à votre sagacité, et voir si certains d'entre vous seraient intéressés pour le compléter avec leurs astuces, voir en faire une traduction française.&lt;/p&gt;


&lt;p&gt;Il est téléchargeable ICI : &lt;a href=&quot;https://civade.com/images/SE02/Roland-SE-02_V1.11_User_Guide.pdf&quot;&gt;Roland-SE-02 V1.11 User Guide.pdf&lt;/a&gt;&lt;/p&gt;</description>
        
                  <comments>https://civade.com/post/2020/10/01/Manuel-alternatif-complet-pour-synth%C3%A9tiseur-Analogique-Roland-/-Studio-Electronics-SE-02#comment-form</comments>
          <wfw:comment>https://civade.com/post/2020/10/01/Manuel-alternatif-complet-pour-synth%C3%A9tiseur-Analogique-Roland-/-Studio-Electronics-SE-02#comment-form</wfw:comment>
          <wfw:commentRss>https://civade.com/feed/atom/comments/106</wfw:commentRss>
              </item>
      </channel>
</rss>
