<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Automation on Ronan's Blog</title><link>https://www.rfontenay.fr/categories/automation/</link><description>Recent content in Automation on Ronan's Blog</description><generator>Hugo -- gohugo.io</generator><language>en-en</language><lastBuildDate>Sun, 03 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.rfontenay.fr/categories/automation/index.xml" rel="self" type="application/rss+xml"/><item><title>Building an Exhaustive ADS-B Feeder Station with Buildroot on Raspberry Pi 3</title><link>https://www.rfontenay.fr/posts/adsb-feeder-buildroot-raspberry-fr24/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/adsb-feeder-buildroot-raspberry-fr24/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/adsb-feeder-buildroot-raspberry-fr24/buildroot-adsb-feeder.png" alt="Featured image of post Building an Exhaustive ADS-B Feeder Station with Buildroot on Raspberry Pi 3" /&gt;&lt;p&gt;Following our work on maritime AIS, we are now targeting aviation. This guide explains how to build a professional-grade ADS-B station on a Raspberry Pi 3. We are using &lt;strong&gt;Buildroot&lt;/strong&gt; to create a custom Linux firmware that is ultra-lightweight, boots in seconds, and runs entirely in RAM (read-only) to prevent SD card corruption.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="1-project-architecture"&gt;1. Project Architecture
&lt;/h3&gt;&lt;p&gt;We use the &lt;code&gt;BR2_EXTERNAL&lt;/code&gt; mechanism to keep our custom logic clean and portable. First, clone the stable Buildroot source:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://gitlab.com/buildroot.org/buildroot.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd buildroot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout 2025.02.13
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our project tree is organized as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── buildroot/ # Official sources (git clone)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── external-pi/ # Custom recipes layer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── Config.in
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── external.desc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── external.mk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── board/ # &amp;lt;--- Boot configs (config.txt, cmdline.txt)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── package/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── librtlsdr-blog/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── mlat-client/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── readsb/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── overlay/ # System files (Init, Network, Configs)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── etc/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── fr24feed.ini
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── init.d/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├── S50readsb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├── S60fr24
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├── S99mlat-client-adsbfi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ └── S99mlat-client-adsbx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── lighttpd/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── modprobe.d/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── network/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └── wpa_supplicant.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── usr/bin/fr24feed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── var/www/tar1090
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="2-the-external-layer-external-pi"&gt;2. The External Layer (external-pi)
&lt;/h3&gt;&lt;p&gt;These files declare the project to Buildroot:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;external-pi/external.desc&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;name: PI_FEEDER_EXT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;desc: Station ADS-B pour Pi3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;external-pi/external.mk&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;include&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;sort &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;wildcard &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;BR2_EXTERNAL_PI_FEEDER_EXT_PATH&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/package/*/*.mk&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;external-pi/Config.in&lt;/strong&gt; (Menu integration):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source &amp;#34;$BR2_EXTERNAL_PI_FEEDER_EXT_PATH/package/librtlsdr-blog/Config.in&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source &amp;#34;$BR2_EXTERNAL_PI_FEEDER_EXT_PATH/package/readsb/Config.in&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source &amp;#34;$BR2_EXTERNAL_PI_FEEDER_EXT_PATH/package/mlat-client/Config.in&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="3-software-recipes--compilation"&gt;3. Software Recipes &amp;amp; Compilation
&lt;/h3&gt;&lt;h4 id="a-optimized-drivers-librtlsdr-blog"&gt;A. Optimized Drivers: librtlsdr-blog
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;external-pi/package/librtlsdr-blog/Config.in&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;config BR2_PACKAGE_LIBRTLSDR_BLOG
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	bool &amp;#34;librtlsdr-blog&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	select BR2_PACKAGE_LIBUSB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	help
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Version optimisée pour RTL-SDR Blog V4 avec support Bias-T.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 https://github.com/rtlsdrblog/rtl-sdr-blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;external-pi/package/librtlsdr-blog/librtlsdr-blog.mk&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LIBRTLSDR_BLOG_VERSION &lt;span style="color:#f92672"&gt;=&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LIBRTLSDR_BLOG_SITE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;call github,rtlsdrblog,rtl-sdr-blog,&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;LIBRTLSDR_BLOG_VERSION&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LIBRTLSDR_BLOG_LICENSE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GPL-2.0+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LIBRTLSDR_BLOG_INSTALL_STAGING &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LIBRTLSDR_BLOG_DEPENDENCIES &lt;span style="color:#f92672"&gt;=&lt;/span&gt; libusb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# On active explicitement le détachement du driver kernel (DVB-T) 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# et l&amp;#39;installation des outils (rtl_sdr, rtl_biast, etc.)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LIBRTLSDR_BLOG_CONF_OPTS &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	-DINSTALL_UDEV_RULES&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ON &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	-DDETACH_KERNEL_DRIVER&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ON
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;eval &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;cmake-package&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="b-the-decoder-readsb"&gt;B. The Decoder: readsb
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;external-pi/package/readsb/Config.in&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;config BR2_PACKAGE_READSB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	bool &amp;#34;readsb&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	select BR2_PACKAGE_LIBRTLSDR_BLOG
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	select BR2_PACKAGE_NCURSES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	select BR2_PACKAGE_ZLIB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	select BR2_PACKAGE_ZSTD
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	help
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Readsb est un décodeur ADS-B haute performance.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;external-pi/package/readsb/readsb.mk&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;READSB_VERSION &lt;span style="color:#f92672"&gt;=&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;READSB_SITE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;call github,wiedehopf,readsb,&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;READSB_VERSION&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;READSB_DEPENDENCIES &lt;span style="color:#f92672"&gt;=&lt;/span&gt; librtlsdr-blog ncurses zlib zstd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;READSB_LICENSE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GPL-3.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# On utilise le hook SED pour les versions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;define&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;READSB_FIX_VERSION_MACROS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#960050;background-color:#1e0010"&gt;sed&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;-i&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;s/READSB_SHORT_VERSION/&amp;#34;2025&amp;#34;/g&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;@D&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/json_out.c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#960050;background-color:#1e0010"&gt;sed&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;-i&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;s/READSB_SHORT_COMMIT/&amp;#34;v4&amp;#34;/g&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;@D&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/json_out.c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;endef&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;READSB_POST_PATCH_HOOKS &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; READSB_FIX_VERSION_MACROS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# On passe RTLSDR=yes ET on force le flag de compilation manuellement dans CFLAGS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;READSB_MAKE_OPTS &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	RTLSDR&lt;span style="color:#f92672"&gt;=&lt;/span&gt;yes &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	CFLAGS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;TARGET_CFLAGS&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; -D_GNU_SOURCE -D_DEFAULT_SOURCE -DENABLE_RTLSDR&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;define&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;READSB_BUILD_CMDS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;TARGET_MAKE_ENV&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;MAKE&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;TARGET_CONFIGURE_OPTS&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;-C&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;@D&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;READSB_MAKE_OPTS&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;endef&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;define&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;READSB_INSTALL_TARGET_CMDS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;INSTALL&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;-D&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;-m&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;0755&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;@D&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/readsb&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;TARGET_DIR&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/usr/bin/readsb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;INSTALL&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;-D&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;-m&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;0755&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;@D&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/viewadsb&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;TARGET_DIR&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/usr/bin/viewadsb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;endef&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;eval &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;generic-package&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="c-mlat-client"&gt;C. MLAT Client
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;external-pi/package/mlat-client/Config.in&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;config BR2_PACKAGE_MLAT_CLIENT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	bool &amp;#34;mlat-client&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	depends on BR2_PACKAGE_PYTHON3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	select BR2_PACKAGE_PYTHON_PYASYNCORE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	select BR2_PACKAGE_PYTHON_PYASYNCHAT²
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	select BR2_PACKAGE_PYTHON3_ZLIB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	help
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Mode S Multilateration client for ADS-B feeders.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 https://github.com/mutability/mlat-client
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comment &amp;#34;mlat-client needs python3&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	depends on !BR2_PACKAGE_PYTHON3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;external-pi/package/mlat-client/mlat-client.mk&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MLAT_CLIENT_VERSION &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0.2.13
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MLAT_CLIENT_SITE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;call github,mutability,mlat-client,v&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;MLAT_CLIENT_VERSION&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MLAT_CLIENT_LICENSE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GPL-3.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MLAT_CLIENT_LICENSE_FILES &lt;span style="color:#f92672"&gt;=&lt;/span&gt; COPYING
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MLAT_CLIENT_SETUP_TYPE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; setuptools
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;eval &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;python-package&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="4-system-configuration-overlay"&gt;4. System Configuration (Overlay)
&lt;/h3&gt;&lt;p&gt;The overlay directory contains custom configuration files and pre-compiled binaries that are merged into the final root filesystem.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some binaries like &lt;code&gt;fr24feed&lt;/code&gt; and the &lt;code&gt;tar1090&lt;/code&gt; web interface files should be placed manually in the &lt;code&gt;overlay/&lt;/code&gt; directory before building if they are not managed by a Buildroot recipe.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="network--wifi"&gt;Network &amp;amp; WiFi
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;overlay/etc/network/interfaces&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auto lo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iface lo inet loopback
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auto eth0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iface eth0 inet dhcp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auto wlan0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iface wlan0 inet dhcp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pre-up sleep 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wpa-conf /etc/wpa_supplicant.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;overlay/etc/wpa_supplicant.conf&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;country=FR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;network={
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ssid=&amp;#34;YOUR_SSID&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; psk=&amp;#34;YOUR_PASSWORD&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;overlay/etc/modprobe.d/rtlsdr-blacklist.conf&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blacklist dvb_usb_rtl28xxu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blacklist rtl2832
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blacklist rtl2830
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="init-scripts-the-automation"&gt;Init Scripts (The Automation)
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;overlay/etc/init.d/S50readsb&lt;/strong&gt; (The Core Decoder):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DAEMON&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;readsb&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BINARY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/readsb&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SITE_UUID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;YOUR_UUID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Arguments finaux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ARGS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;--device-type rtlsdr \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --net \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --fix \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --dcfilter \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --lat YOUR_LAT \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --lon YOUR_LON \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --net-ri-port 0 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --net-ro-port 30002 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --net-bi-port 30004 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --net-bo-port 30005 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --write-json /tmp/readsb \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --net-connector feed.adsb.fi,30004,beast_reduce_out,uuid=&lt;/span&gt;$SITE_UUID&lt;span style="color:#e6db74"&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --net-connector feed.adsbexchange.com,30004,beast_reduce_out&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo -n &lt;span style="color:#e6db74"&gt;&amp;#34;Starting &lt;/span&gt;$DAEMON&lt;span style="color:#e6db74"&gt;: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /usr/bin/rtl_biast -b &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &amp;gt; /dev/null 2&amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start-stop-daemon -S -b -x $BINARY -- $ARGS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? -eq &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;FAIL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stop&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo -n &lt;span style="color:#e6db74"&gt;&amp;#34;Stopping &lt;/span&gt;$DAEMON&lt;span style="color:#e6db74"&gt;: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start-stop-daemon -K -x $BINARY
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? -eq &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;FAIL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restart&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $0 stop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $0 start
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; *&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Usage: &lt;/span&gt;$0&lt;span style="color:#e6db74"&gt; {start|stop|restart}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;overlay/etc/init.d/S99mlat-client-adsbx&lt;/strong&gt; (Feed ADSBExchange):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;mlat-client-adsbx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DAEMON&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/mlat-client&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PIDFILE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/var/run/&lt;/span&gt;$NAME&lt;span style="color:#e6db74"&gt;.pid&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ARGS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;--input-type dump1090 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --input-connect 127.0.0.1:30005 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --lat YOUR_LAT \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --lon YOUR_LON \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --alt 45m \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --user YOUR_USER \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --server feed.adsbexchange.com:31090 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --no-udp \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --results beast,connect,127.0.0.1:30004&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo -n &lt;span style="color:#e6db74"&gt;&amp;#34;Starting &lt;/span&gt;$NAME&lt;span style="color:#e6db74"&gt;: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start-stop-daemon -S -q -b -m -p $PIDFILE -x $DAEMON -- $ARGS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stop&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo -n &lt;span style="color:#e6db74"&gt;&amp;#34;Stopping &lt;/span&gt;$NAME&lt;span style="color:#e6db74"&gt;: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start-stop-daemon -K -q -p $PIDFILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rm -f $PIDFILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restart&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $0 stop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $0 start
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; *&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Usage: &lt;/span&gt;$0&lt;span style="color:#e6db74"&gt; {start|stop|restart}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;overlay/etc/init.d/S99mlat-client-adsbfi&lt;/strong&gt; (Feed ADSB.fi):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;mlat-client-adsbfi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DAEMON&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/mlat-client&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PIDFILE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/var/run/&lt;/span&gt;$NAME&lt;span style="color:#e6db74"&gt;.pid&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ARGS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;--input-type dump1090 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --input-connect 127.0.0.1:30005 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --lat YOUR_LAT \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --lon YOUR_LON \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --alt 45m \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --user YOUR_USER \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --server feed.adsb.fi:31090 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --no-udp \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; --results beast,connect,127.0.0.1:30004&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo -n &lt;span style="color:#e6db74"&gt;&amp;#34;Starting &lt;/span&gt;$NAME&lt;span style="color:#e6db74"&gt;: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start-stop-daemon -S -q -b -m -p $PIDFILE -x $DAEMON -- $ARGS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stop&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo -n &lt;span style="color:#e6db74"&gt;&amp;#34;Stopping &lt;/span&gt;$NAME&lt;span style="color:#e6db74"&gt;: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start-stop-daemon -K -q -p $PIDFILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rm -f $PIDFILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restart&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $0 stop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $0 start
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; *&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Usage: &lt;/span&gt;$0&lt;span style="color:#e6db74"&gt; {start|stop|restart}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;overlay/etc/init.d/S60fr24&lt;/strong&gt; (FlightRadar24 Feed):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DAEMON&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;fr24feed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BINARY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/fr24feed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo -n &lt;span style="color:#e6db74"&gt;&amp;#34;Starting &lt;/span&gt;$DAEMON&lt;span style="color:#e6db74"&gt;: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start-stop-daemon -S -b -x $BINARY
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? -eq &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;FAIL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stop&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo -n &lt;span style="color:#e6db74"&gt;&amp;#34;Stopping &lt;/span&gt;$DAEMON&lt;span style="color:#e6db74"&gt;: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start-stop-daemon -K -x $BINARY
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? -eq &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;FAIL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restart&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $0 stop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $0 start
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; *&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Usage: &lt;/span&gt;$0&lt;span style="color:#e6db74"&gt; {start|stop|restart}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="feeder-configurations"&gt;Feeder Configurations
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;overlay/etc/fr24feed.ini&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;receiver&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;beast-tcp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fr24key&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;YOUR_FR24_KEY&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;127.0.0.1:30005&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;bs&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;no&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;raw&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;no&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;logmode&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;logpath&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/tmp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mlat&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mlat-without-gps&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;overlay/etc/lighttpd/lighttpd.conf&lt;/strong&gt; (Web Interface):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server.modules += ( &amp;#34;mod_alias&amp;#34;, &amp;#34;mod_setenv&amp;#34; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server.document-root = &amp;#34;/var/www/tar1090&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server.port = 80
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;index-file.names = ( &amp;#34;index.html&amp;#34; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mimetype.assign = (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;.html&amp;#34; =&amp;gt; &amp;#34;text/html&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;.css&amp;#34; =&amp;gt; &amp;#34;text/css&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;.js&amp;#34; =&amp;gt; &amp;#34;application/javascript&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;.json&amp;#34; =&amp;gt; &amp;#34;application/json&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;.png&amp;#34; =&amp;gt; &amp;#34;image/png&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;.svg&amp;#34; =&amp;gt; &amp;#34;image/svg+xml&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alias.url += ( &amp;#34;/data/&amp;#34; =&amp;gt; &amp;#34;/tmp/readsb/&amp;#34; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$HTTP[&amp;#34;url&amp;#34;] =~ &amp;#34;^/data/&amp;#34; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setenv.add-response-header = ( &amp;#34;Cache-Control&amp;#34; =&amp;gt; &amp;#34;no-cache, no-store, must-revalidate&amp;#34; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-ram-only-boot-configuration"&gt;5. RAM-Only Boot Configuration
&lt;/h3&gt;&lt;p&gt;To run the OS entirely in RAM, we use the &lt;strong&gt;initramfs&lt;/strong&gt; strategy. This loads the &lt;code&gt;rootfs.cpio.gz&lt;/code&gt; into the Raspberry Pi&amp;rsquo;s memory at boot time. You have two options to implement this:&lt;/p&gt;
&lt;h4 id="method-a-automated-buildroot-integration"&gt;Method A: Automated (Buildroot Integration)
&lt;/h4&gt;&lt;p&gt;This is the professional way. The files are generated correctly every time you run &lt;code&gt;make&lt;/code&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prepare your custom board files:&lt;/strong&gt;
Create a folder &lt;code&gt;external-pi/board/&lt;/code&gt; and create two files:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;external-pi/board/config.txt&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# RAM Boot Config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;initramfs rootfs.cpio.gz followkernel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Enable UART for console
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;enable_uart=1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;external-pi/board/cmdline.txt&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;console=serial0,115200 console=tty1 root=/dev/ram0 rw rootwait
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Buildroot (&lt;code&gt;make menuconfig&lt;/code&gt;):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Filesystem images&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Enable &lt;code&gt;cpio the root file system&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Compression: &lt;code&gt;gzip&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target packages&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Hardware handling&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Select &lt;code&gt;rpi-firmware&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;Configuration file&lt;/code&gt; to &lt;code&gt;$(BR2_EXTERNAL_PI_FEEDER_EXT_PATH)/board/config.txt&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System configuration&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;Custom scripts to run after creating the images&lt;/code&gt; to point to a script that copies your &lt;code&gt;cmdline.txt&lt;/code&gt; to the output folder (or use the default RPi post-image script and point it to your custom file).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="method-b-manual-quick-edit-on-sd-card"&gt;Method B: Manual (Quick Edit on SD Card)
&lt;/h4&gt;&lt;p&gt;If you don&amp;rsquo;t want to touch Buildroot files, you can edit the files on the SD card after flashing.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Flash the SD card&lt;/strong&gt; as described in Section 7.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mount the BOOT partition&lt;/strong&gt; on your PC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edit &lt;code&gt;config.txt&lt;/code&gt;&lt;/strong&gt;: Add the line &lt;code&gt;initramfs rootfs.cpio.gz followkernel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edit &lt;code&gt;cmdline.txt&lt;/code&gt;&lt;/strong&gt;: Replace the content with &lt;code&gt;console=serial0,115200 console=tty1 root=/dev/ram0 rw rootwait&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The Buildroot files in &lt;code&gt;buildroot/board/raspberrypi/&lt;/code&gt; are templates. You should &lt;strong&gt;never edit them directly&lt;/strong&gt;; always use a custom board directory in your &lt;code&gt;external-pi&lt;/code&gt; layer as shown in Method A.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="6-buildroot-setup-checklist"&gt;6. Buildroot Setup Checklist
&lt;/h3&gt;&lt;p&gt;Enable these options in &lt;code&gt;make menuconfig&lt;/code&gt; to match our project&amp;rsquo;s requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Target options:&lt;/strong&gt; Cortex-A53, NEON-VFPV4, Hard float (EABIhf), instructions ARM (not Thumb2).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Toolchain:&lt;/strong&gt; &lt;code&gt;Glibc&lt;/code&gt; library, Linux Headers &lt;code&gt;6.6.x&lt;/code&gt;, &lt;code&gt;GCC 13.x&lt;/code&gt;, &lt;code&gt;Binutils 2.43.x&lt;/code&gt;. Enable &lt;code&gt;Wchar&lt;/code&gt;, &lt;code&gt;Locale&lt;/code&gt;, and &lt;code&gt;C++&lt;/code&gt; support.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kernel:&lt;/strong&gt; Custom Raspberry Pi kernel (&lt;code&gt;bcm2709_defconfig&lt;/code&gt;) using the 6.6.y branch. Enable &lt;code&gt;Device Tree&lt;/code&gt; support and &lt;code&gt;DTB overlay support&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System Configuration:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Root login&lt;/code&gt; enabled (password: &lt;code&gt;root&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DHCP&lt;/code&gt; enabled on &lt;code&gt;eth0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BR2_ROOTFS_OVERLAY&lt;/code&gt; pointing to your &lt;code&gt;overlay/&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Purge locale&lt;/code&gt; (C, en_US).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WiFi Stack:&lt;/strong&gt; &lt;code&gt;linux-firmware -&amp;gt; Broadcom BCM43xxx&lt;/code&gt; &amp;amp; &lt;code&gt;Cypress CYW43xxx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Networking:&lt;/strong&gt; &lt;code&gt;lighttpd&lt;/code&gt; (with &lt;code&gt;zlib&lt;/code&gt;), &lt;code&gt;dropbear&lt;/code&gt; (SSH), &lt;code&gt;wpa_supplicant&lt;/code&gt; (with &lt;code&gt;nl80211&lt;/code&gt;), &lt;code&gt;chrony&lt;/code&gt; (NTP sync).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tools:&lt;/strong&gt; &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;python3&lt;/code&gt; (with &lt;code&gt;zlib&lt;/code&gt;, &lt;code&gt;unicodedata&lt;/code&gt;, &lt;code&gt;pyasyncore&lt;/code&gt;, &lt;code&gt;pyasynchat&lt;/code&gt;), &lt;code&gt;socat&lt;/code&gt;, &lt;code&gt;kmod&lt;/code&gt; (tools), &lt;code&gt;ca-certificates&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Libraries:&lt;/strong&gt; &lt;code&gt;libusb&lt;/code&gt;, &lt;code&gt;ncurses&lt;/code&gt;, &lt;code&gt;readline&lt;/code&gt;, &lt;code&gt;zlib&lt;/code&gt;, &lt;code&gt;zstd&lt;/code&gt;, &lt;code&gt;xxhash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filesystem:&lt;/strong&gt; &lt;code&gt;cpio&lt;/code&gt; with &lt;code&gt;gzip&lt;/code&gt; compression.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="7-deployment"&gt;7. Deployment
&lt;/h3&gt;&lt;h4 id="method-a-manual-sd-formatting"&gt;Method A: Manual SD Formatting
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Format 1 FAT32 partition on SD card&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkfs.vfat -F &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt; -n BOOT /dev/sdX1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Copy boot images from output/images/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cp zImage rootfs.cpio.gz bcm2710-rpi-3-b.dtb rpi-firmware/* /mnt/sdcard/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="method-b-network-deployment-fast-iteration"&gt;Method B: Network Deployment (Fast Iteration)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Update your running Pi remotely&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scp -O output/images/zImage output/images/rootfs.cpio.gz &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output/images/bcm2710-rpi-3-b.dtb root@192.168.1.123:/boot/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh root@192.168.1.123 &lt;span style="color:#e6db74"&gt;&amp;#34;reboot&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="8-results--performance"&gt;8. Results &amp;amp; Performance
&lt;/h3&gt;&lt;p&gt;Once the station is up and running, you can access the local web interface (tar1090) to view real-time traffic. The custom Buildroot firmware ensures extremely low CPU usage and high stability.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 1: Local tar1090 interface showing live aircraft tracking." class="gallery-image" data-flex-basis="245px" data-flex-grow="102" height="740" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/adsb-feeder-buildroot-raspberry-fr24/readsb-tar1090-adsb-feeder.png" width="758"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 2: ADS-B hits and positions reported to FlightRadar24." class="gallery-image" data-flex-basis="347px" data-flex-grow="144" height="363" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/adsb-feeder-buildroot-raspberry-fr24/fr24-adsb-hits-and-positions.png" width="525"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 3: Reception performance: hits vs. distance." class="gallery-image" data-flex-basis="358px" data-flex-grow="149" height="337" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/adsb-feeder-buildroot-raspberry-fr24/fr24-hits-vs-distance.png" width="504"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 4: General feeder statistics on the FlightRadar24 dashboard." class="gallery-image" data-flex-basis="1920px" data-flex-grow="800" height="90" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/adsb-feeder-buildroot-raspberry-fr24/fr24-stats.png" width="720"&gt;&lt;/p&gt;</description></item><item><title>Hayward Aquarite integration in Home Assistant with Tasmota</title><link>https://www.rfontenay.fr/posts/hayward-aquarite-integration-home-assistant-tasmota/</link><pubDate>Sun, 21 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/hayward-aquarite-integration-home-assistant-tasmota/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/hayward-aquarite-integration-home-assistant-tasmota/home-assistant-aquarite-wifi-tasmota.png" alt="Featured image of post Hayward Aquarite integration in Home Assistant with Tasmota" /&gt;&lt;p&gt;In order to get an Hayward Aquarite integration in Home Assistant with &lt;a class="link" href="https://tasmota.github.io/docs/" target="_blank" rel="noopener"
 &gt;Tasmota&lt;/a&gt; we&amp;rsquo;ll go through several steps including wiring the ESP32 to the Aquarite and then the Home Assistant configuration.&lt;/p&gt;
&lt;h2 id="hardware--esp32"&gt;Hardware : ESP32
&lt;/h2&gt;&lt;h3 id="step-1--prototype"&gt;Step 1 : Prototype
&lt;/h3&gt;&lt;p&gt;We&amp;rsquo;ll use :&lt;br&gt;
- ESP32 from AZ-Delivery&lt;br&gt;
- RS485 to TTL adapter&lt;/p&gt;
&lt;p&gt;The wiring will be done as follow :&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wiring prototype ESP32 RS485" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="20230828_190207.jpg"&gt;&lt;/p&gt;
&lt;h3 id="step-2--final-version"&gt;Step 2 : Final version
&lt;/h3&gt;&lt;p&gt;For the final version, we&amp;rsquo;ll use an M5stack ESP32 with a RS485 tail, in order to have a clean, small and 10v powered device.&lt;/p&gt;
&lt;p&gt;&lt;img alt="M5Stack ESP32 RS485 tail" class="gallery-image" data-flex-basis="120px" data-flex-grow="50" height="2448" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/hayward-aquarite-integration-home-assistant-tasmota/atom-RS485-tail.jpg" srcset="https://www.rfontenay.fr/posts/hayward-aquarite-integration-home-assistant-tasmota/atom-RS485-tail_hu_a0ff1879ad1dcfbc.jpg 800w, https://www.rfontenay.fr/posts/hayward-aquarite-integration-home-assistant-tasmota/atom-RS485-tail.jpg 1232w" width="1232"&gt;&lt;/p&gt;
&lt;h2 id="software--tasmota"&gt;Software : Tasmota
&lt;/h2&gt;&lt;p&gt;With the &amp;ldquo;Sugar Valley NeoPool module&amp;rdquo; Tasmota support natively this salt chlorinator.&lt;br&gt;
This option is not compile in the standard version, we&amp;rsquo;ll need to compile Tasmota in order to compile this functionality.&lt;/p&gt;
&lt;h3 id="tasmota-compilation"&gt;Tasmota compilation
&lt;/h3&gt;&lt;p&gt;Install Plateformio :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install python-pip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pip install -U platformio
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Get Tasmota files :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/arendst/Tasmota.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Before compiling, let&amp;rsquo;s enable the support of the Sugar Valley NeoPool chlorinators :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim tasmota/my_user_config.h 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And modify as follow :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// !!! Remember that your changes GOES AT THE BOTTOM OF THIS FILE right before the last #endif !!!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#ifndef USE_NEOPOOL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define USE_NEOPOOL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#endif &lt;/span&gt;&lt;span style="color:#75715e"&gt;// _USER_CONFIG_OVERRIDE_H_
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then compile and upload :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;platformio run -e tasmota32 --target upload --upload-port /dev/ttyUSB0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="tasmota-configurtion"&gt;Tasmota configurtion
&lt;/h3&gt;&lt;p&gt;Configure IO as follow :&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tasmota ESP32 Configuration" class="gallery-image" data-flex-basis="272px" data-flex-grow="113" height="386" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/hayward-aquarite-integration-home-assistant-tasmota/ESP32-tamsota-config-RS485-aquarite.png" width="438"&gt;&lt;/p&gt;
&lt;p&gt;Then wire it, start it and you should be able to use data :&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tasmota WiFi Data Interface" class="gallery-image" data-flex-basis="181px" data-flex-grow="75" height="952" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/hayward-aquarite-integration-home-assistant-tasmota/tasmota-wifi-data-aquarite.jpg" width="720"&gt;&lt;/p&gt;
&lt;h3 id="home-assistant-integration"&gt;Home assistant integration
&lt;/h3&gt;&lt;p&gt;Once done, you could process to MQTT integration and have a nice native integration in Home Assistant with Tasmota integration.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re done with Hayward Aquarite integration in Home Assistant with Tasmota.&lt;/p&gt;</description></item><item><title>PID regulation : Led brightness regulation with Arduino</title><link>https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/</link><pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/arduino-PID-regulation.png" alt="Featured image of post PID regulation : Led brightness regulation with Arduino" /&gt;&lt;p&gt;&lt;a class="link" href="https://docs.arduino.cc/libraries/pid/" target="_blank" rel="noopener"
 &gt;PID regulation&lt;/a&gt; : Led brightness regulation with Arduino. To get this done we&amp;rsquo;ll first do a bit of wiring and then program our Arduino.&lt;/p&gt;
&lt;h2 id="led-wiring-and-control"&gt;Led wiring and control
&lt;/h2&gt;&lt;h3 id="wiring"&gt;Wiring
&lt;/h3&gt;&lt;p&gt;Our led is a Yellow led with a 2.4v forward voltage at 20mA.&lt;br&gt;
Our current source (Arduino) delivers 3.3v.&lt;br&gt;
Resistor calculation : R = (3.3v - 2.4 V) / 25 mA = 0.9v / 0.02A = 45Ω&lt;/p&gt;
&lt;p&gt;We’ll wire the cathode to one of the digital I/O of the Arduino. Note, we chose the digital I/O #3 as we’ll need to use PWM (described below).&lt;/p&gt;
&lt;p&gt;As I just had a 47Ω resistor, this will work :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="411px" data-flex-grow="171" height="732" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/LED-simple.png" srcset="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/LED-simple_hu_556f4fbc4c710a82.png 800w, https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/LED-simple.png 1254w" width="1254"&gt;&lt;/p&gt;
&lt;h3 id="control"&gt;Control
&lt;/h3&gt;&lt;p&gt;In order to control the brightness of the LED, we’ll use the Pulse-width modulation (PWM), or pulse-duration modulation (PDM) :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="330px" data-flex-grow="137" height="536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/PWM.png" width="737"&gt;&lt;/p&gt;
&lt;p&gt;To do this, we’ll use the following function : analogWrite(pin, value)&lt;br&gt;
- pin: the pin to write to.&lt;br&gt;
- value: the duty cycle: between 0 (always off) and 255 (always on)&lt;/p&gt;
&lt;p&gt;Code sample :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;void setup()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pinMode(3, OUTPUT); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;void loop()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;//Analog write
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;analogWrite(3, 64); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Results (0, 25%, 75%, 100%) :&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="PWM-0-25-75-100-1.jpg"&gt;&lt;/p&gt;
&lt;h2 id="led-brightness-regulation"&gt;Led brightness regulation
&lt;/h2&gt;&lt;h4 id="sensor"&gt;Sensor
&lt;/h4&gt;&lt;p&gt;We’ll add a light sensor as wired below :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="290px" data-flex-grow="121" height="1035" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/LED-and-light-sensor.png" srcset="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/LED-and-light-sensor_hu_e7e3186fe65eb7eb.png 800w, https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/LED-and-light-sensor.png 1254w" width="1254"&gt;&lt;/p&gt;
&lt;p&gt;Just place the sensor in front of the LED:&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="484px" data-flex-grow="201" height="989" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/led-and-light-sensor-picture-assembly.jpg" srcset="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/led-and-light-sensor-picture-assembly_hu_f624e137c212898f.jpg 800w, https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/led-and-light-sensor-picture-assembly_hu_230051e5c5e3f798.jpg 1600w, https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/led-and-light-sensor-picture-assembly.jpg 1995w" width="1995"&gt;&lt;/p&gt;
&lt;h3 id="regulation"&gt;Regulation
&lt;/h3&gt;&lt;p&gt;In order to regulate, we’ll use a proportional–integral–derivative controller. A PID controller is a control loop feedback mechanism (controller) commonly used in industrial control systems. A PID controller continuously calculates an error value as the difference between a desired setpoint and a measured process variable. The controller attempts to minimize the error over time by adjustment of a control variable.&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="521px" data-flex-grow="217" height="738" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/PID.png" srcset="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/PID_hu_61fc8e91469d82e5.png 800w, https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/PID_hu_590a483b7546d8ee.png 1600w, https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/PID.png 1604w" width="1604"&gt;&lt;/p&gt;
&lt;p&gt;Here is the code :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;PID_v1.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Variables
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; Setpoint, Input, Output;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//PID parameters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; Kp&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, Ki&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, Kd&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Start PID instance
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PID &lt;span style="color:#a6e22e"&gt;myPID&lt;/span&gt;(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;Input, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;Output, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;Setpoint, Kp, Ki, Kd, DIRECT);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setup&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Start a serial connection to send data by serial connection
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Serial.&lt;span style="color:#a6e22e"&gt;begin&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;9600&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Set point : Here is the brightness target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Setpoint &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Turn the PID on
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; myPID.&lt;span style="color:#a6e22e"&gt;SetMode&lt;/span&gt;(AUTOMATIC);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Adjust PID values
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; myPID.&lt;span style="color:#a6e22e"&gt;SetTunings&lt;/span&gt;(Kp, Ki, Kd);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;loop&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Read the value from the light sensor. Analog input : 0 to 1024. We map is to a value from 0 to 255 as it&amp;#39;s used for our PWM function.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Input &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;analogRead&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;), &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//PID calculation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; myPID.&lt;span style="color:#a6e22e"&gt;Compute&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Write the output as calculated by the PID function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;analogWrite&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,Output);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Send data by serial for plotting 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Serial.&lt;span style="color:#a6e22e"&gt;print&lt;/span&gt;(Input);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Serial.&lt;span style="color:#a6e22e"&gt;print&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Serial.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(Output); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PID Parameters :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kp accounts for present values of the error (e.g. if the error is large and positive, the control variable will be large and negative).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ki accounts for past values of the error (e.g. if the output is not sufficient to reduce the size of the error, the control variable will accumulate over time, causing the controller to apply a stronger action).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kd accounts for possible future values of the error, based on its current rate of change.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Arduino 1.6.6 comes with a tool called “Serial plotter”, that might be useful to graph our data:&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="577px" data-flex-grow="240" height="529" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/arduino-plotting-PID.png" srcset="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/arduino-plotting-PID_hu_8ebe59041c979963.png 800w, https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/arduino-plotting-PID.png 1272w" width="1272"&gt;&lt;/p&gt;
&lt;p&gt;The measured value is note stable, probably due to the PWM. A solution would be to smooth the results by doing an average on the lasts results, in order to filter the high frequency changes.&lt;/p&gt;
&lt;p&gt;Note : You can graph several values at the same time, you just need to send them on the same line, with a space as a delimiter.&lt;/p&gt;
&lt;p&gt;When I disrupt the system with an external light, we clearly see that the system tries to keep the brightness at the setpoint (100) by managing the led control value :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="646px" data-flex-grow="269" height="371" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/arduino-plotting-PID-external-factors.png" srcset="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/arduino-plotting-PID-external-factors_hu_cbc6aeb160426c06.png 800w, https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/arduino-plotting-PID-external-factors.png 999w" width="999"&gt;&lt;/p&gt;
&lt;p&gt;To conclude, here is how the system is handling a change from 0 to setpoint, or from setpoint to 0 :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="480px" data-flex-grow="200" height="375" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/pid-regulation-led-brightness-regulation-with-arduino/arduino-plotting-PID-transition.png" width="750"&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re done with PID regulation : Led brightness regulation with Arduino&lt;/p&gt;</description></item><item><title>Siemens PLC simulation with virtual commissioning</title><link>https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/</link><pubDate>Sun, 14 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/virtual-commissionning-plc-siemens-s7.png" alt="Featured image of post Siemens PLC simulation with virtual commissioning" /&gt;&lt;p&gt;For Siemens PLC simulation with virtual commissioning we&amp;rsquo;ll use &lt;a class="link" href="https://www.siemens.com/global/en/products/automation/systems/industrial/plc/s7-plcsim-advanced.html" target="_blank" rel="noopener"
 &gt;PLCSIM Advanced&lt;/a&gt; and C# co-simulation.&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;We’ll run the simulator and the editor on two computers :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="370px" data-flex-grow="154" height="450" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/network.png" width="695"&gt;&lt;/p&gt;
&lt;h3 id="simulator-configuration"&gt;Simulator configuration
&lt;/h3&gt;&lt;p&gt;First let’s start an instance with the following parameters :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="134px" data-flex-grow="55" height="771" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/2_plcsim_advanced_configuration.png" width="431"&gt;&lt;/p&gt;
&lt;p&gt;Once started, it should be like that :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="135px" data-flex-grow="56" height="771" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/2_plcsim_advanced_running.png" width="435"&gt;&lt;/p&gt;
&lt;h2 id="plc-programming"&gt;PLC Programming
&lt;/h2&gt;&lt;h3 id="hardware-configuration"&gt;Hardware configuration
&lt;/h3&gt;&lt;p&gt;Let’s do a simple configuration as follow :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="680px" data-flex-grow="283" height="172" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/3_hardware_config.png" width="488"&gt;&lt;/p&gt;
&lt;p&gt;Network configuration :&lt;br&gt;
- PLC_1 : 192.168.1.1/24&lt;br&gt;
- IO device_1 : 192.168.1.2/24&lt;/p&gt;
&lt;p&gt;Note : On the simulator, we have different IP addresses for all the network interfaces : Ethernet adapter, PLCSIM virtual ethernet adapter, PLC and I/Os !&lt;/p&gt;
&lt;p&gt;With the following I/Os :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="407px" data-flex-grow="169" height="313" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/4_ET200.png" width="531"&gt;&lt;/p&gt;
&lt;p&gt;Note that you’ll need to activate this option in the project settings :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="937px" data-flex-grow="390" height="201" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/4_simulation_during_compil.png" width="785"&gt;&lt;/p&gt;
&lt;h3 id="program"&gt;Program
&lt;/h3&gt;&lt;p&gt;Our program will be very simple ! OB1 will toggle a bit every second :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="301px" data-flex-grow="125" height="576" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/OB1-1.png" width="723"&gt;&lt;/p&gt;
&lt;p&gt;And FB1 will do a safety check between the relay output and the input feedback :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="339px" data-flex-grow="141" height="544" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/FB1.png" width="770"&gt;&lt;/p&gt;
&lt;h3 id="compiling-and-loading"&gt;Compiling and loading
&lt;/h3&gt;&lt;p&gt;You should be able to compile and load :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="281px" data-flex-grow="117" height="683" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/5_load_program.png" srcset="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/5_load_program_hu_fd51a9d9965a9156.png 800w, https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/5_load_program.png 801w" width="801"&gt;&lt;/p&gt;
&lt;h2 id="simulation"&gt;Simulation
&lt;/h2&gt;&lt;p&gt;As soon as you’ll run the program, you should have an error on the feedback monitoring :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="492" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/6_fb_error.png" width="492"&gt;&lt;/p&gt;
&lt;h3 id="co-simulation"&gt;Co-simulation
&lt;/h3&gt;&lt;p&gt;To solve this issue, we’ll running co-simulation with C#. The script will check the output value (%Q9.0) and set the feedback (%I0.0) accordingly. We’ll be using sharpdevelop as IDE.&lt;/p&gt;
&lt;h4 id="import-dll"&gt;Import DLL
&lt;/h4&gt;&lt;p&gt;Importing the DLL is easy :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="560px" data-flex-grow="233" height="702" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/7_import_DLL.png" srcset="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/7_import_DLL_hu_4cfb5b204d97b7f2.png 800w, https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/7_import_DLL_hu_40828d15a56781ad.png 1600w, https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/7_import_DLL.png 1638w" width="1638"&gt;&lt;/p&gt;
&lt;p&gt;Then we write a short program :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Created by SharpDevelop.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;using System;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;using System.Threading;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;using Siemens.Simatic.Simulation.Runtime;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;namespace CPU1515F
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	class Program
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		public static void Main(string[] args)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Console.WriteLine(&amp;#34;Starting simulation&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			//Use it for local instance
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			//IInstance myInstance = SimulationRuntimeManager.CreateInterface(&amp;#34;Golf8&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			//Use it for remote instance
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			IRemoteRuntimeManager myRemoteInstance = SimulationRuntimeManager.RemoteConnect(&amp;#34;192.168.1.101:50000&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			IInstance myInstance = myRemoteInstance.CreateInterface(&amp;#34;1515F&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			//Update tag list from API
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Console.WriteLine(&amp;#34;Tags synchronization&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			myInstance.UpdateTagList();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			//Start a thread to synchronize feedbacks inputs 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Thread tFeedbacks = new Thread(()=&amp;gt;synchroFeedbacks(myInstance));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			tFeedbacks.Start();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			//Allow the user to quit simulation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Console.WriteLine(&amp;#34;Simulation running&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Console.WriteLine(&amp;#34;Press any key to quit . . . &amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Console.ReadKey(true);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		static void synchroFeedbacks(IInstance myInstance)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			while(true){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				//Keep %I and %Q opposite
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				myInstance.WriteBool(&amp;#34;FB_KA1&amp;#34;, !myInstance.ReadBool(&amp;#34;KA1&amp;#34;));	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And run it :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="657px" data-flex-grow="273" height="435" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/8_simulation_running.png" srcset="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/8_simulation_running_hu_a8ab5ee14960c477.png 800w, https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/8_simulation_running.png 1191w" width="1191"&gt;&lt;/p&gt;
&lt;p&gt;Once acknowledged, we should not have any issue.&lt;/p&gt;
&lt;p&gt;Using the trace tool, we can confirm that it’s running perfectly fine, updating the input in around 100ms.&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="770px" data-flex-grow="321" height="445" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/Trace1.png" srcset="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/Trace1_hu_28c04f5efa9d9cb3.png 800w, https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/Trace1.png 1429w" width="1429"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="770px" data-flex-grow="321" height="445" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/Trace2.png" srcset="https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/Trace2_hu_1797fb07c6e64169.png 800w, https://www.rfontenay.fr/posts/automation-virtual-commissioning-plcsim-advanced-2-0-with-csharp/Trace2.png 1429w" width="1429"&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re done with Siemens PLC simulation with virtual commissioning.&lt;/p&gt;</description></item></channel></rss>