{"id":3723,"date":"2025-04-01T17:18:27","date_gmt":"2025-04-01T15:18:27","guid":{"rendered":"https:\/\/domo.rem81.com\/?p=3723"},"modified":"2025-04-24T08:22:21","modified_gmt":"2025-04-24T06:22:21","slug":"ha-panneau-de-commande-pour-piscine-avec-un-esp32-openhasp-et-home-assistant","status":"publish","type":"post","link":"https:\/\/domo.rem81.com\/index.php\/2025\/04\/01\/ha-panneau-de-commande-pour-piscine-avec-un-esp32-openhasp-et-home-assistant\/","title":{"rendered":"HA-Panneau de commande pour piscine avec un ESP32, OpenHASP et Home Assistant"},"content":{"rendered":"\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Update:<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>23\/04\/2025: J&rsquo;ai test\u00e9 \u00e9galement celui-ci <strong><a href=\"https:\/\/fr.aliexpress.com\/item\/1005006622746590.html?spm=a2g0o.order_list.order_list_main.35.cfed5e5bmDY1Yl&amp;gatewayAdapt=glo2fra\" data-type=\"link\" data-id=\"https:\/\/fr.aliexpress.com\/item\/1005006622746590.html?spm=a2g0o.order_list.order_list_main.35.cfed5e5bmDY1Yl&amp;gatewayAdapt=glo2fra\" target=\"_blank\" rel=\"noreferrer noopener\">ESP32-S3 Arduino LVGL WIFI<\/a><\/strong> moins cher (~25\u20ac) et plus pratique \u00e0 flasher directement sur sa prise USB-C. Dans <a href=\"https:\/\/nightly.openhasp.com\">https:\/\/nightly.openhasp.com<\/a> il faut choisir \u00ab\u00a0G<strong>uition ESP32-S3-4848S040<\/strong>\u00ab\u00a0. PS: Sur ma Freebox Delta, j&rsquo;ai d\u00fb lui attribuer une IP Statique pour \u00e9viter des deconnections\/reconnections intempestives.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Intro<\/h1>\n\n\n\n<p>Dans cet article, je vous pr\u00e9sente un projet que j\u2019ai ador\u00e9 mettre en place : un <strong>panneau de commande tactile<\/strong> pour g\u00e9rer ma piscine, bas\u00e9 sur un module ESP32 avec \u00e9cran tactile, et utilisant <strong>OpenHASP<\/strong> pour l\u2019interface graphique. Ce dispositif, connect\u00e9 \u00e0 Home Assistant, me permet de surveiller et de contr\u00f4ler les param\u00e8tres de ma piscine (temp\u00e9rature, pH, ORP, filtration, etc.) depuis une interface intuitive. Je vais vous expliquer comment j\u2019ai flash\u00e9 l\u2019ESP32, configur\u00e9 OpenHASP avec un fichier JSONL, et cr\u00e9\u00e9 une interface sur mesure, avec des captures d\u2019\u00e9cran pour illustrer le r\u00e9sultat !<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Objectif du projet<\/h1>\n\n\n\n<p>L\u2019objectif \u00e9tait de centraliser le contr\u00f4le de ma piscine sur un petit \u00e9cran tactile, que je peux installer pr\u00e8s de la piscine ou dans mon local technique. Ce panneau affiche des donn\u00e9es en temps r\u00e9el (temp\u00e9rature de l\u2019eau, pH, pression du filtre, etc.) et me permet de contr\u00f4ler des \u00e9quipements comme la pompe de filtration ou le volet de la piscine. Le module ESP32 avec \u00e9cran tactile est id\u00e9al pour ce projet : compact, abordable et compatible avec OpenHASP.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Mat\u00e9riel utilis\u00e9<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Module ESP32 avec \u00e9cran tactile<\/strong> : Un module ESP32 \u00e9quip\u00e9 d\u2019un \u00e9cran TFT tactile de 2,8 pouces (r\u00e9solution 480&#215;320 pixels). Ce mod\u00e8le int\u00e8gre un ESP32 et un \u00e9cran tactile capacitif, parfait pour une interface utilisateur achet\u00e9 sur <a href=\"https:\/\/fr.aliexpress.com\/item\/1005005908193645.html?spm=a2g0o.order_list.order_list_main.40.cfed5e5bTFzcRZ&amp;gatewayAdapt=glo2fra\" data-type=\"link\" data-id=\"https:\/\/fr.aliexpress.com\/item\/1005005908193645.html?spm=a2g0o.order_list.order_list_main.40.cfed5e5bTFzcRZ&amp;gatewayAdapt=glo2fra\" target=\"_blank\" rel=\"noreferrer noopener\">AliExpress.<\/a><\/li>\n\n\n\n<li><strong>C\u00e2ble USB-C<\/strong> : Pour l\u2019alimentation<\/li>\n\n\n\n<li><strong>Un convertisseur<\/strong> USB&lt;-&gt;Port s\u00e9rie  pour le flashage du firmware.<\/li>\n\n\n\n<li>Une connexion WiFi pour int\u00e9grer le panneau \u00e0 Home Assistant.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Flashage initial du module<\/h1>\n\n\n\n<p>Avant de pouvoir utiliser OpenHASP, il faut flasher le firmware sur le module ESP32.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pr\u00e9paration du mat\u00e9riel<\/strong> :<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Branchez le module ESP32 \u00e0 votre ordinateur via le convertisseur USB-s\u00e9rie. Il devrait \u00eatre reconnu comme un port s\u00e9rie (par exemple, <code>\/dev\/ttyUSB0<\/code> sur Linux ou <code>COM3<\/code> sur Windows).<\/li>\n\n\n\n<li>T\u00e9l\u00e9chargez et installez <strong>esptool.py<\/strong>, un outil pour flasher les ESP32. Vous pouvez l\u2019installer via pip : <code>pip install esptool<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Telechargement du firmware &#8211; Solution 1:<\/h2>\n\n\n\n<p>Vous pouvez utiliser ce site pour flasher simplement votre appareil:<\/p>\n\n\n\n<p><a href=\"https:\/\/install.openhasp.com\">https:\/\/install.openhasp.com<\/a><\/p>\n\n\n\n<p>ou celui ci qui est mieux fourni:<\/p>\n\n\n\n<p><a href=\"https:\/\/nightly.openhasp.com\">https:\/\/nightly.openhasp.com<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>T\u00e9l\u00e9chargement du firmware &#8211; Solution 2<\/strong> :<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rendez-vous sur le site officiel d\u2019OpenHASP (<a href=\"https:\/\/www.openhasp.com\/0.7.0\/\" target=\"_blank\" rel=\"noreferrer noopener\">Openhasp<\/a>) et t\u00e9l\u00e9chargez le firmware correspondant \u00e0 votre mod\u00e8le d\u2019\u00e9cran. Pour mon module, j\u2019ai choisi une version pour un ESP32 avec \u00e9cran TFT 320&#215;240.<\/li>\n\n\n\n<li>Prendre le Firmware:<strong> panlee-zw3d95ce01s-tr-4848_16MB<\/strong> si vous avez achet\u00e9 le m\u00eame panel<\/li>\n\n\n\n<li>Si votre \u00e9cran n\u2019est pas list\u00e9, vous devrez peut-\u00eatre compiler le firmware vous-m\u00eame en utilisant PlatformIO, en ajustant les param\u00e8tres de l\u2019\u00e9cran (r\u00e9solution, pilote, etc.).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Flashage du firmware<\/strong> :<\/h2>\n\n\n\n<p>Afin d&rsquo;utiliser ce module avec HA, nous devons flasher le panel via son port s\u00e9rie.<\/p>\n\n\n\n<p>Il faut connecter le module au port USB d&rsquo;un PC avec ce <a href=\"https:\/\/fr.aliexpress.com\/item\/4000492274243.html?spm=a2g0o.productlist.main.37.2c471f73qEqhg6&amp;algo_pvid=1ffed911-0c73-4df5-9920-ce93791a9524&amp;algo_exp_id=1ffed911-0c73-4df5-9920-ce93791a9524-18&amp;pdp_ext_f=%7B%22sku_id%22%3A%2210000002208891354%22%7D&amp;pdp_npi=2%40dis%21EUR%211.91%211.68%21%21%21%21%21%402100b76616732599821855166d06ba%2110000002208891354%21sea&amp;curPageLogUid=800oAxGbCbzg\" data-type=\"URL\" data-id=\"https:\/\/fr.aliexpress.com\/item\/4000492274243.html?spm=a2g0o.productlist.main.37.2c471f73qEqhg6&amp;algo_pvid=1ffed911-0c73-4df5-9920-ce93791a9524&amp;algo_exp_id=1ffed911-0c73-4df5-9920-ce93791a9524-18&amp;pdp_ext_f=%7B%22sku_id%22%3A%2210000002208891354%22%7D&amp;pdp_npi=2%40dis%21EUR%211.91%211.68%21%21%21%21%21%402100b76616732599821855166d06ba%2110000002208891354%21sea&amp;curPageLogUid=800oAxGbCbzg\" target=\"_blank\" rel=\"noreferrer noopener\">type de module.<\/a>, c&rsquo;est un convertisseur USB&lt;-&gt;Port s\u00e9rie.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"504\" height=\"365\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/01\/image-3-1.png\" alt=\"\" class=\"wp-image-2453\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/01\/image-3-1.png 504w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2023\/01\/image-3-1-300x217.png 300w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><\/figure>\n\n\n\n<p>Vous devez le brancher \u00e0 votre carte selon le mapping suivant (utilisation des <a href=\"https:\/\/fr.aliexpress.com\/item\/4000203371860.html?spm=a2g0o.order_list.order_list_main.173.24e05e5b3wWmm4&amp;gatewayAdapt=glo2fra\" data-type=\"URL\" data-id=\"https:\/\/fr.aliexpress.com\/item\/4000203371860.html?spm=a2g0o.order_list.order_list_main.173.24e05e5b3wWmm4&amp;gatewayAdapt=glo2fra\" target=\"_blank\" rel=\"noreferrer noopener\">c\u00e2bles Dupont<\/a>):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Carte relais (connecteur 20 broches femelles)&lt;-&gt; Convertisseur<\/strong>\n<ul class=\"wp-block-list\">\n<li>GND &lt;-&gt; GND<\/li>\n\n\n\n<li>Tx &lt;-&gt; Rx<\/li>\n\n\n\n<li>Rx &lt;-&gt; Tx<\/li>\n\n\n\n<li>3.3 V &lt;-&gt; Vcc<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Nota 1: Sur le panel, Il faut ponter les broches GND et I00 (uniquement pour ce premier flashage)<\/li>\n\n\n\n<li>Nota 2: Sur le convertisseur, positionner un cavalier sur le 3.3V.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"504\" height=\"365\" data-id=\"3744\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-8.png\" alt=\"\" class=\"wp-image-3744\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-8.png 504w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-8-300x217.png 300w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"769\" height=\"1024\" data-id=\"3748\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/257673709-b53e5382-72e1-4643-838b-98d93403736b-769x1024.png\" alt=\"\" class=\"wp-image-3748\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/257673709-b53e5382-72e1-4643-838b-98d93403736b-769x1024.png 769w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/257673709-b53e5382-72e1-4643-838b-98d93403736b-225x300.png 225w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/257673709-b53e5382-72e1-4643-838b-98d93403736b-768x1023.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/257673709-b53e5382-72e1-4643-838b-98d93403736b-1153x1536.png 1153w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/257673709-b53e5382-72e1-4643-838b-98d93403736b.png 1492w\" sizes=\"auto, (max-width: 769px) 100vw, 769px\" \/><\/figure>\n<\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ouvrez un terminal et ex\u00e9cutez la commande suivante pour flasher le firmware (remplacez <code>\/dev\/ttyUSB0<\/code> par votre port s\u00e9rie et path-to-your-firmware\/panlee-zw3d95ce01s-ar-4848_ota_v0.7.0-rc8_f28627c.bin par le chemin de votre fichier firmware) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>esptool.py --port \/dev\/xxx write_flash 0x0 '\/path-to-your-firmware\/panlee-zw3d95ce01s-ar-4848_ota_v0.7.0-rc8_f28627c.bin' <\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une fois le flashage termin\u00e9, l\u2019\u00e9cran affiche une interface par d\u00e9faut avec un message de bienvenue d\u2019OpenHASP<\/li>\n<\/ul>\n\n\n\n<p>Vous trouverez des explications compl\u00e9mentaires en <a href=\"https:\/\/github.com\/HASwitchPlate\/openHASP\/discussions\/435\" data-type=\"link\" data-id=\"https:\/\/github.com\/HASwitchPlate\/openHASP\/discussions\/435\" target=\"_blank\" rel=\"noreferrer noopener\">suivant ce lien<\/a><\/p>\n\n\n\n<p><strong>Configuration initiale<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OpenHASP cr\u00e9e un point d\u2019acc\u00e8s WiFi temporaire (SSID : <code>HASP_XXXX<\/code>). Connectez-vous \u00e0 ce r\u00e9seau avec votre t\u00e9l\u00e9phone ou ordinateur.<\/li>\n\n\n\n<li>Acc\u00e9dez \u00e0 l\u2019interface web d\u2019OpenHASP via l\u2019adresse <code>192.168.4.1<\/code>. Depuis cette interface, configurez les identifiants de votre r\u00e9seau WiFi pour connecter le module \u00e0 votre r\u00e9seau local.<\/li>\n\n\n\n<li>Notez l\u2019adresse IP attribu\u00e9e au module (par exemple, <code>192.168.0.xxx<\/code>), car vous en aurez besoin pour la configuration.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Ecran de configuration du Module<\/h1>\n\n\n\n<p>En saisissant l&rsquo;adresse IP du du module vous arrivez sur l&rsquo;interface web OpenHASP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fonctionnalit\u00e9s de l\u2019interface web OpenHASP<\/h2>\n\n\n\n<p>En plus de l\u2019int\u00e9gration dans Home Assistant, OpenHASP propose une <strong>interface web<\/strong> accessible via l\u2019adresse IP du module (par exemple, <code>http:\/\/192.168.0.xxx<\/code>). Cette interface, disponible pour mon appareil <code>ecran01<\/code>, offre un ensemble d\u2019outils pratiques pour g\u00e9rer le panneau, personnaliser son interface graphique, et effectuer des t\u00e2ches de maintenance. Voici un aper\u00e7u des fonctionnalit\u00e9s disponibles, illustr\u00e9 par une capture d\u2019\u00e9cran de cette interface.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"622\" height=\"504\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-12.png\" alt=\"\" class=\"wp-image-3769\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-12.png 622w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-12-300x243.png 300w\" sizes=\"auto, (max-width: 622px) 100vw, 622px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Aper\u00e7u des options de l\u2019interface web<\/h2>\n\n\n\n<p>L\u2019interface web d\u2019OpenHASP, visible dans la capture d\u2019\u00e9cran, propose plusieurs sections, chacune offrant des fonctionnalit\u00e9s sp\u00e9cifiques pour g\u00e9rer le panneau :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>HASP Design<\/strong> : Cette section permet de configurer les param\u00e8tres d\u2019affichage et d\u2019interface du panneau. Comme montr\u00e9 dans la capture, elle inclut plusieurs options :\n<ul class=\"wp-block-list\">\n<li><strong>UI Theme<\/strong> : Permet de s\u00e9lectionner un th\u00e8me d\u2019interface (par exemple, \u201cHasp Light\u201d dans la capture). Cela change l\u2019apparence g\u00e9n\u00e9rale de l\u2019interface graphique.<\/li>\n\n\n\n<li><strong>Primary Color et Secondary Color<\/strong> : D\u00e9finit les couleurs principales et secondaires utilis\u00e9es dans l\u2019interface (bleu et orange dans la capture). Ces couleurs peuvent \u00eatre ajust\u00e9es pour correspondre \u00e0 vos pr\u00e9f\u00e9rences esth\u00e9tiques.<\/li>\n\n\n\n<li><strong>Default Font<\/strong> : Permet de choisir une police par d\u00e9faut pour les textes affich\u00e9s (ici, \u201cNone\u201d est s\u00e9lectionn\u00e9, ce qui utilise la police par d\u00e9faut d\u2019OpenHASP).<\/li>\n\n\n\n<li><strong>Start Layout<\/strong> : Indique le fichier de configuration charg\u00e9 au d\u00e9marrage (dans mon cas, <code>\/pages.jsonl<\/code>, qui correspond au fichier JSONL que j\u2019ai utilis\u00e9 pour d\u00e9finir l\u2019interface graphique).<\/li>\n\n\n\n<li><strong>Startup Page<\/strong> : D\u00e9finit la page affich\u00e9e au d\u00e9marrage (page 1 dans la capture, correspondant \u00e0 la page \u201cPiscine\u201d).<\/li>\n\n\n\n<li><strong>Startup Dim<\/strong> : Ajuste la luminosit\u00e9 initiale de l\u2019\u00e9cran au d\u00e9marrage (255 dans la capture, soit la luminosit\u00e9 maximale).<\/li>\n\n\n\n<li><strong>Save Settings<\/strong> : Un bouton pour enregistrer les modifications apport\u00e9es dans cette section. Ces param\u00e8tres permettent de personnaliser l\u2019apparence et le comportement initial du panneau sans modifier directement le fichier JSONL.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"606\" height=\"645\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-13.png\" alt=\"\" class=\"wp-image-3797\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-13.png 606w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-13-282x300.png 282w\" sizes=\"auto, (max-width: 606px) 100vw, 606px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Screenshot<\/strong> : Cette fonctionnalit\u00e9 permet de capturer une image de l\u2019\u00e9cran actuel du panneau. C\u2019est particuli\u00e8rement utile pour documenter l\u2019interface ou partager des aper\u00e7us de l\u2019affichage, comme les captures de la page \u201cPiscine\u201d ou \u201cCommandes\u201d que j\u2019ai pr\u00e9sent\u00e9es plus t\u00f4t. La capture est g\u00e9n\u00e9r\u00e9e directement depuis l\u2019ESP32 et peut \u00eatre t\u00e9l\u00e9charg\u00e9e.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"611\" height=\"701\" data-id=\"3780\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/Capture-decran-du-2025-04-11-17-41-43.png\" alt=\"\" class=\"wp-image-3780\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/Capture-decran-du-2025-04-11-17-41-43.png 611w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/Capture-decran-du-2025-04-11-17-41-43-261x300.png 261w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"609\" height=\"699\" data-id=\"3779\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/Capture-decran-du-2025-04-11-17-41-59.png\" alt=\"\" class=\"wp-image-3779\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/Capture-decran-du-2025-04-11-17-41-59.png 609w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/Capture-decran-du-2025-04-11-17-41-59-261x300.png 261w\" sizes=\"auto, (max-width: 609px) 100vw, 609px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"610\" height=\"702\" data-id=\"3778\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/Capture-decran-du-2025-04-11-17-42-35.png\" alt=\"\" class=\"wp-image-3778\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/Capture-decran-du-2025-04-11-17-42-35.png 610w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/Capture-decran-du-2025-04-11-17-42-35-261x300.png 261w\" sizes=\"auto, (max-width: 610px) 100vw, 610px\" \/><\/figure>\n<\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Information<\/strong> : Cette section affiche des d\u00e9tails techniques sur le panneau, comme la version du firmware (OpenHASP 0.7.0-rc9 dans la capture), l\u2019adresse IP, l\u2019\u00e9tat de la connexion WiFi, et d\u2019autres informations syst\u00e8me (utilisation de la m\u00e9moire, \u00e9tat des capteurs, etc.). C\u2019est un outil pr\u00e9cieux pour le d\u00e9bogage ou pour v\u00e9rifier que le panneau fonctionne correctement.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"633\" height=\"512\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-14.png\" alt=\"\" class=\"wp-image-3800\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-14.png 633w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-14-300x243.png 300w\" sizes=\"auto, (max-width: 633px) 100vw, 633px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Configuration<\/strong> : Permet de modifier les param\u00e8tres d\u2019OpenHASP, comme les identifiants WiFi, les param\u00e8tres MQTT (adresse du broker, port, utilisateur, mot de passe), ou les options d\u2019affichage (luminosit\u00e9, d\u00e9lai d\u2019inactivit\u00e9, etc.). C\u2019est ici que j\u2019ai initialement configur\u00e9 la connexion MQTT pour int\u00e9grer <code>ecran01<\/code> dans Home Assistant.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"614\" height=\"737\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-15.png\" alt=\"\" class=\"wp-image-3802\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-15.png 614w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-15-250x300.png 250w\" sizes=\"auto, (max-width: 614px) 100vw, 614px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Firmware Update<\/strong> : Cette option permet de mettre \u00e0 jour le firmware d\u2019OpenHASP directement depuis l\u2019interface web. Il suffit de t\u00e9l\u00e9charger la nouvelle version du firmware (par exemple, depuis le site officiel d\u2019OpenHASP) et de la charger via cette section. Cela garantit que le panneau reste \u00e0 jour avec les derni\u00e8res am\u00e9liorations et corrections de bugs.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"627\" height=\"580\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-16.png\" alt=\"\" class=\"wp-image-3804\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-16.png 627w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-16-300x278.png 300w\" sizes=\"auto, (max-width: 627px) 100vw, 627px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>File Editor<\/strong> : Un \u00e9diteur de fichiers int\u00e9gr\u00e9 qui permet de modifier les fichiers de configuration (comme le fichier JSONL que j\u2019utilise pour d\u00e9finir l\u2019interface graphique). Vous pouvez t\u00e9l\u00e9charger, \u00e9diter, ou supprimer des fichiers directement depuis cette interface, ce qui est pratique pour ajuster l\u2019interface graphique sans avoir \u00e0 re-flasher l\u2019ESP32.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"217\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-17-1024x217.png\" alt=\"\" class=\"wp-image-3805\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-17-1024x217.png 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-17-300x64.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-17-768x163.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-17-1536x325.png 1536w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-17.png 1595w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Restart<\/strong> : Un bouton rouge qui permet de red\u00e9marrer l\u2019ESP32 \u00e0 distance. Cette fonctionnalit\u00e9 est similaire au bouton <code>button.ecran01_restart<\/code> disponible dans Home Assistant, mais elle est accessible directement depuis l\u2019interface web. C\u2019est utile pour appliquer des modifications (par exemple, apr\u00e8s une mise \u00e0 jour du firmware ou un changement de configuration) sans avoir \u00e0 d\u00e9brancher physiquement le panneau.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Pourquoi ces fonctionnalit\u00e9s sont-elles utiles ?<\/h2>\n\n\n\n<p>L\u2019interface web d\u2019OpenHASP est un compl\u00e9ment pr\u00e9cieux \u00e0 l\u2019int\u00e9gration dans Home Assistant. Elle offre une gestion autonome du panneau, ce qui est particuli\u00e8rement utile lors de la configuration initiale ou pour des t\u00e2ches de maintenance. Par exemple, j\u2019ai utilis\u00e9 la section <strong>HASP Design<\/strong> pour ajuster la luminosit\u00e9 de d\u00e9marrage (<code>Startup Dim<\/code>) et d\u00e9finir la page \u201cPiscine\u201d comme page par d\u00e9faut (<code>Startup Page<\/code>), garantissant que le panneau affiche directement les informations essentielles au d\u00e9marrage. La section <strong>Screenshot<\/strong> m\u2019a permis de capturer les images que j\u2019ai partag\u00e9es dans cet article. La possibilit\u00e9 de mettre \u00e0 jour le firmware ou de red\u00e9marrer l\u2019appareil \u00e0 distance via l\u2019interface web est \u00e9galement un gain de temps, surtout si le panneau est install\u00e9 dans un endroit difficile d\u2019acc\u00e8s, comme mon local technique.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Int\u00e9gration avec Home Assistant<\/h1>\n\n\n\n<p>OpenHASP communique avec Home Assistant via MQTT ou l&rsquo;int\u00e9gration \u00ab\u00a0openHASP\u00a0\u00bb. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Configuration MQTT<\/strong> :<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Assurez-vous qu\u2019un broker MQTT (comme Mosquitto) est configur\u00e9 dans Home Assistant.<\/li>\n\n\n\n<li>Dans l\u2019interface web d\u2019OpenHASP (accessible via l\u2019adresse IP du module, par exemple http:\/\/192.168.0.xxx), allez dans les param\u00e8tres et entrez les informations de votre broker MQTT (adresse, port, utilisateur, mot de passe).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Int\u00e9gration\u00a0\u00bbopenHASP\u00a0\u00bb<\/strong> :<\/h2>\n\n\n\n<p>Elle est disponible dans la biblioth\u00e8que des integrations:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"482\" height=\"398\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-9.png\" alt=\"\" class=\"wp-image-3752\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-9.png 482w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-9-300x248.png 300w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/figure>\n\n\n\n<p>Une fois configur\u00e9e le module est automatiquement d\u00e9tect\u00e9 par Home Assistant et met \u00e0 disposition des entit\u00e9s de contr\u00f4le et de configuration.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"625\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-10-1024x625.png\" alt=\"\" class=\"wp-image-3753\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-10-1024x625.png 1024w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-10-300x183.png 300w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-10-768x469.png 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-10.png 1143w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration de l\u2019interface avec OpenHASP<\/h2>\n\n\n\n<p>OpenHASP utilise des fichiers JSONL (JSON Lines) pour d\u00e9finir l\u2019interface graphique. J\u2019ai cr\u00e9\u00e9 un fichier de configuration pour personnaliser mon panneau de commande, en m\u2019appuyant sur le fichier <code>pane1.yaml<\/code> que je partage en annexe pour lier les donn\u00e9es dynamiques, et sur le fichier \u00ab\u00a0pages.JSONL\u00a0\u00bb que je vais d\u00e9tailler ici pour la mise en page graphique.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Structure g\u00e9n\u00e9rale de l\u2019interface<\/h2>\n\n\n\n<p>Le fichier \u00ab\u00a0pages.JSONL\u00a0\u00bb d\u00e9finit trois pages principales :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Page 0<\/strong> : Contient des \u00e9l\u00e9ments communs \u00e0 toutes les pages, comme l\u2019heure, les temp\u00e9ratures int\u00e9rieure et ext\u00e9rieure, et les boutons de navigation.<\/li>\n\n\n\n<li><strong>Page 1<\/strong> : Vue g\u00e9n\u00e9rale de la piscine, avec les param\u00e8tres essentiels (temp\u00e9rature, pH, ORP, etc.) et des contr\u00f4les.<\/li>\n\n\n\n<li><strong>Page 2<\/strong> : Contr\u00f4les manuels pour activer\/d\u00e9sactiver les \u00e9quipements.<\/li>\n\n\n\n<li><strong>Page 3<\/strong> : R\u00e9glages des modes de fonctionnement.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Page 0 : \u00c9l\u00e9ments communs<\/h3>\n\n\n\n<p>Cette page d\u00e9finit des \u00e9l\u00e9ments affich\u00e9s en haut et en bas de l\u2019\u00e9cran sur toutes les pages :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Heure<\/strong> (<code>p0b2<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":0,\"id\":2,\"obj\":\"btn\",\"x\":10,\"y\":0,\"w\":62,\"h\":40,\"text\":\"00:00\",\"text_font\":28,\"bg_color\":\"#2C3E50\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0}<\/code><\/pre>\n\n\n\n<p>Affiche l\u2019heure (09:53 dans les captures). La valeur est mise \u00e0 jour dynamiquement via <code>pane1.yaml<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p0b2\"\n    properties:\n      \"text\": \"{{ states('sensor.time') }}\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Temp\u00e9rature ext\u00e9rieure<\/strong> (<code>p0b6<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":0,\"id\":6,\"obj\":\"btn\",\"x\":300,\"y\":0,\"w\":100,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"00.00\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":28}<\/code><\/pre>\n\n\n\n<p>Affiche la temp\u00e9rature ext\u00e9rieure (16.8\u00b0C dans les captures), mise \u00e0 jour via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p0b6\"\n    properties:\n      \"text\": \"\\uE2DC {{'%.1f' | format (states('sensor.vp2_temp_out') | round(1)) }}\u00b0C\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Temp\u00e9rature int\u00e9rieure<\/strong> (<code>p0b7<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":0,\"id\":7,\"obj\":\"btn\",\"x\":80,\"y\":0,\"w\":100,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"00.00\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":28}<\/code><\/pre>\n\n\n\n<p>Affiche la temp\u00e9rature int\u00e9rieure (21.9\u00b0C dans les captures), mise \u00e0 jour via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p0b7\"\n    properties:\n      \"text\": \"\\uE6A1 {{'%.1f' | format (states('sensor.vp2_temp_in') | round(1)) }}\u00b0C\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Boutons de navigation<\/strong> (<code>p0b3<\/code>, <code>p0b4<\/code>, <code>p0b5<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":0,\"id\":3,\"obj\":\"btn\",\"action\":\"prev\",\"x\":0,\"y\":440,\"w\":160,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"\\uE141\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":32}\n  {\"page\":0,\"id\":4,\"obj\":\"btn\",\"action\":\"back\",\"x\":160,\"y\":440,\"w\":160,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"\\uE2DC\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":32}\n  {\"page\":0,\"id\":5,\"obj\":\"btn\",\"action\":\"next\",\"x\":320,\"y\":440,\"w\":160,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"\\uE142\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":32}<\/code><\/pre>\n\n\n\n<p>Ces boutons permettent de naviguer entre les pages (pr\u00e9c\u00e9dent, retour, suivant), visibles en bas des captures d\u2019\u00e9cran.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Page 1 : Vue g\u00e9n\u00e9rale de la piscine<\/h3>\n\n\n\n<p>Cette page affiche les param\u00e8tres essentiels de la piscine et permet de contr\u00f4ler certains \u00e9quipements. Voici quelques \u00e9l\u00e9ments cl\u00e9s :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Titre<\/strong> (<code>p1b1<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":1,\"id\":1,\"obj\":\"btn\",\"x\":0,\"y\":0,\"w\":480,\"h\":40,\"text\":\"Piscine\",\"text_font\":28,\"bg_color\":\"#2C3E50\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0}<\/code><\/pre>\n\n\n\n<p>Affiche le titre \u201cPiscine\u201d en haut de la page (visible dans la premi\u00e8re capture).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Temp\u00e9rature de l\u2019eau<\/strong> (<code>p1b130<\/code>, <code>p1b131<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":1,\"id\":130,\"obj\":\"label\",\"x\":5,\"y\":50,\"w\":80,\"h\":80,\"text\":\"\\uE50F\",\"text_font\":80,\"align\":1,\"text_color\":\"#00ff00\"}\n  {\"page\":1,\"id\":131,\"obj\":\"label\",\"x\":120,\"y\":50,\"w\":225,\"h\":80,\"text\":\"Offline\",\"text_font\":80,\"align\":1,\"text_color\":\"#2C3E50\"}<\/code><\/pre>\n\n\n\n<p>Affiche une ic\u00f4ne de thermom\u00e8tre et la temp\u00e9rature de l\u2019eau (16.6\u00b0C dans la capture), mise \u00e0 jour via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p1b131\"\n    properties:\n      \"text\": \"{{ states('sensor.esp178_temperature_eau')|float(0) |round(1)}} C\u00b0\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>pH<\/strong> (<code>p1b135<\/code>, <code>p1b136<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":1,\"id\":135,\"obj\":\"label\",\"x\":5,\"y\":130,\"w\":80,\"h\":80,\"text\":\"\\uE606\",\"text_font\":80,\"align\":1,\"text_color\":\"#00ff00\"}\n  {\"page\":1,\"id\":136,\"obj\":\"label\",\"x\":120,\"y\":130,\"w\":240,\"h\":80,\"text\":\"Offline\",\"text_font\":80,\"align\":1,\"text_color\":\"#2C3E50\"}<\/code><\/pre>\n\n\n\n<p>Affiche une ic\u00f4ne et le pH de l\u2019eau (5.85 dans la capture), mis \u00e0 jour via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p1b136\"\n    properties:\n      \"text\": \"{{ states('sensor.esp178_ph_ezo')|float(0) |round(2)}} pH\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pompe de filtration<\/strong> (<code>p1b132<\/code>, <code>p1b133<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":1,\"id\":132,\"obj\":\"label\",\"x\":380,\"y\":50,\"w\":90,\"h\":25,\"text\":\"Ppe\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n  {\"page\":1,\"id\":133,\"obj\":\"btn\",\"x\":385,\"y\":75,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}<\/code><\/pre>\n\n\n\n<p>Affiche un bouton pour la pompe de filtration, qui change de couleur et d\u2019ic\u00f4ne selon son \u00e9tat (d\u00e9sactiv\u00e9e dans la capture, ic\u00f4ne rouge). La logique est d\u00e9finie dans <code>pane1.yaml<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p1b133\"\n    properties:\n      \"val\": '{{ 1 if states(\"switch.esp178_cde_pompe_filtration\") == \"on\" else 0 }}'\n      \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_pompe_filtration\", \"on\") else \"\\uE156\" | e }}'\n      \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_pompe_filtration', 'on') else '#ff0000' }}\"\n    event:\n      \"up\":\n        - service: homeassistant.toggle\n          entity_id: \"switch.esp178_cde_pompe_filtration\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Volet de la piscine<\/strong> (<code>p1b137<\/code>, <code>p1b138<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":1,\"id\":137,\"obj\":\"label\",\"x\":380,\"y\":130,\"w\":90,\"h\":25,\"text\":\"Volet\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n  {\"page\":1,\"id\":138,\"obj\":\"btn\",\"x\":385,\"y\":155,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}<\/code><\/pre>\n\n\n\n<p>Affiche un bouton pour le volet (ferm\u00e9 dans la capture, ic\u00f4ne verte), mis \u00e0 jour via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p1b138\"\n    properties:\n      \"val\": '{{ 1 if states(\"cover.esp178_volet_piscine\") == \"on\" else 0 }}'\n      \"text\": '{{ \"\\uF11E\" if is_state(\"cover.esp178_volet_piscine\", \"open\") else \"\\uF11C\" | e }}'\n      \"text_color\": \"{{ '#ff0000' if is_state('cover.esp178_volet_piscine', 'open') else '#00ff00' }}\"\n    event:\n      \"up\":\n        - service: homeassistant.toggle\n          entity_id: \"cover.esp178_volet_piscine\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Autres donn\u00e9es<\/strong> :<\/li>\n\n\n\n<li><strong>Horaire de filtration<\/strong> (<code>p1b140<\/code>, <code>p1b141<\/code>) : <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>{\"page\":1,\"id\":140,\"obj\":\"label\",\"x\":5,\"y\":210,\"w\":90,\"h\":40,\"text\":\"Horaire:\",\"text_font\":30,\"align\":1,\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":141,\"obj\":\"label\",\"x\":100,\"y\":210,\"w\":300,\"h\":40,\"text\":\"Offline\",\"text_font\":40,\"align\":\"center\",\"text_color\":\"#2C3E50\"}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<p>Affiche les horaires (12:00\/12:15 dans la capture), mis \u00e0 jour via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code> - obj: \"p1b141\" properties: \"text\": \"{{ states('sensor.esp178_affich_heure_filtration')}}\"<\/code><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dur\u00e9e de filtration<\/strong> (<code>p1b145<\/code>, <code>p1b146<\/code>) : <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><code>{\"page\":1,\"id\":145,\"obj\":\"label\",\"x\":5,\"y\":255,\"w\":70,\"h\":40,\"text\":\"Duree:\",\"text_font\":30,\"align\":1,\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":146,\"obj\":\"label\",\"x\":90,\"y\":255,\"w\":160,\"h\":40,\"text\":\"Offline\",\"text_font\":40,\"align\":\"left\",\"text_color\":\"#2C3E50\"}<\/code><\/code><\/pre>\n\n\n\n<p>Affiche la dur\u00e9e (00:00:00), mis \u00e0 jour via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> <span style=\"background-color: initial; font-family: inherit; font-size: 0.9375rem;\">- obj: \"p1b146\" properties: \"text\": \"{{ states('time.esp178_duree_filtration')}}\"<\/span><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Coefficient de filtration<\/strong> (<code>p1b147<\/code>, <code>p1b148<\/code>) : <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><code>{\"page\":1,\"id\":147,\"obj\":\"label\",\"x\":260,\"y\":255,\"w\":70,\"h\":40,\"text\":\"Coef:\",\"text_font\":30,\"align\":1,\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":148,\"obj\":\"label\",\"x\":300,\"y\":255,\"w\":150,\"h\":40,\"text\":\"Offline\",\"text_font\":40,\"align\":\"right\",\"text_color\":\"#2C3E50\"}<\/code><\/code><\/pre>\n\n\n\n<p> Affiche le coefficient (80.0%), mis \u00e0 jour via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> <code>- obj: \"p1b148\" properties: \"text\": \"{{ states('number.esp178_coeff_filtration')}} %\"<\/code><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mode de fonctionnement<\/strong> (<code>p1b150<\/code>, <code>p1b151<\/code>) : <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><code>{\"page\":1,\"id\":150,\"obj\":\"label\",\"x\":5,\"y\":305,\"w\":70,\"h\":40,\"text\":\"Fonct:\",\"text_font\":30,\"align\":1,\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":151,\"obj\":\"dropdown\",\"x\":100,\"y\":305,\"w\":300,\"h\":40,\"options\":\"Palier\\nClassique\\nAbaque\\nHoraire\\nMa_f\\nAt_f\",\"direction\":1,\"text_font\":25,\"align\":1,\"text_color\":\"#2C3E50\"}<\/code><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li> Permet de s\u00e9lectionner le mode de fonctionnement (Horaire dans la capture), contr\u00f4l\u00e9 via : <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>- obj: \"p1b151\"\n  properties:\n    \"val\": &gt;\n      {% set st = states('select.esp178_mode_fonctionnement_filtration')%}\n      {% for text,num in &#091;('Palier',0),('Classique',1),('Abaque',2),('Horaire',3),('Ma_f',4),('At_f',5) ] %}\n      {% if st == text %}\n        {{ num }}\n      {%endif%}\n      {% endfor %}\n  event:\n    \"changed\":\n      - service: select.select_option\n        target:\n          entity_id: select.esp178_mode_fonctionnement_filtration\n        data:\n          option: &gt;\n            {% if text == \"Palier\" -%}\n            Palier\n            {% elif text == 'Classique' -%}\n            Classique\n            {% elif text == 'Abaque' -%}\n            Abaque\n            {% elif text == 'Horaire' -%}\n            Horaire\n            {% elif text == 'Ma_f' -%}\n            Ma_f\n            {% elif text == 'At_f' -%}\n            At_f\n            {% endif -%}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pression, ORP, Puissance, Conso journali\u00e8re<\/strong> (<code>p1b221<\/code> \u00e0 <code>p1b231<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><code>{\"page\":1,\"id\":221,\"obj\":\"label\",\"x\":5,\"y\":355,\"w\":130,\"h\":40,\"text\":\"Pression:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":222,\"obj\":\"label\",\"x\":140,\"y\":355,\"w\":100,\"h\":40,\"text\":\"Offline\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":223,\"obj\":\"label\",\"x\":250,\"y\":355,\"w\":130,\"h\":40,\"text\":\"-ORP:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":224,\"obj\":\"label\",\"x\":330,\"y\":355,\"w\":150,\"h\":40,\"text\":\"Offline\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":225,\"obj\":\"label\",\"x\":5,\"y\":395,\"w\":130,\"h\":40,\"text\":\"Puissance:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":226,\"obj\":\"label\",\"x\":140,\"y\":395,\"w\":150,\"h\":40,\"text\":\"Offline\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":230,\"obj\":\"label\",\"x\":250,\"y\":395,\"w\":130,\"h\":40,\"text\":\"-Conso J:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"} {\"page\":1,\"id\":231,\"obj\":\"label\",\"x\":370,\"y\":395,\"w\":150,\"h\":40,\"text\":\"Offline\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}<\/code><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><br>Affiche la pression (0.304 bar), l\u2019ORP (72.80 mV), la puissance (8.30 W), et la consommation journali\u00e8re (0 kWh), mis \u00e0 jour via :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>- obj: \"p1b222\"\n  properties:\n    \"text\": \"{{ states('sensor.esp178_pression_filtre') }} b\"\n- obj: \"p1b224\"\n  properties:\n    \"text\": \"{{ states('sensor.esp178_orp_ezo') }} ms\"\n- obj: \"p1b226\"\n  properties:\n    \"text\": \"{{ states('sensor.pzem_pisc_puissance') }} W\"\n- obj: \"p1b231\"\n  properties:\n    \"text\": \"{{ states('sensor.compteur_energie_piscine_jour_hp_hc') }} kWh\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Page 2 : Contr\u00f4les manuels<\/h3>\n\n\n\n<p>Cette page permet de contr\u00f4ler manuellement diff\u00e9rents \u00e9quipements de la piscine.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Titre<\/strong> (<code>p2b1<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":2,\"id\":1,\"obj\":\"btn\",\"x\":0,\"y\":0,\"w\":480,\"h\":40,\"text\":\"Cde\",\"text_font\":28,\"bg_color\":\"#2C3E50\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0}<\/code><\/pre>\n\n\n\n<p>Affiche le titre \u201cCde\u201d (Commandes) en haut de la page (visible dans la troisi\u00e8me capture).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Boutons de contr\u00f4le<\/strong> (<code>p2b101<\/code> \u00e0 <code>p2b127<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":2,\"id\":101,\"obj\":\"label\",\"x\":5,\"y\":45,\"w\":90,\"h\":25,\"text\":\"Ppe\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n  {\"page\":2,\"id\":121,\"obj\":\"btn\",\"x\":10,\"y\":70,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}<\/code><\/pre>\n\n\n\n<p>Boutons pour activer\/d\u00e9sactiver la pompe de filtration, la pompe pH-, la pompe chlore, l\u2019ouverture\/fermeture du volet, l\u2019\u00e9clairage, et l\u2019\u00e9lectrovanne d\u2019eau. Dans la capture, tous sont d\u00e9sactiv\u00e9s (ic\u00f4nes rouges). Exemple pour la pompe de filtration :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- obj: \"p2b121\"\n  properties:\n    \"val\": '{{ 1 if states(\"switch.esp178_cde_pompe_filtration\") == \"on\" else 0 }}'\n    \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_pompe_filtration\", \"on\") else \"\\uE156\" | e }}'\n    \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_pompe_filtration', 'on') else '#ff0000' }}\"\n  event:\n    \"up\":\n      - service: homeassistant.toggle\n        entity_id: \"switch.esp178_cde_pompe_filtration\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ajustement du coefficient<\/strong> (<code>p2b150<\/code> \u00e0 <code>p2b153<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":2,\"id\":150,\"obj\":\"label\",\"x\":100,\"y\":225,\"w\":90,\"h\":30,\"text\":\"Coef:\",\"text_font\":30,\"align\":\"center\",\"text_color\":\"#2C3E50\"}\n  {\"page\":2,\"id\":151,\"obj\":\"btn\",\"x\":10,\"y\":260,\"w\":80,\"h\":60,\"text\":\"\\uE374\",\"text_font\":48,\"mode\":\"break\",\"align\":\"center\",\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n  {\"page\":2,\"id\":152,\"obj\":\"btn\",\"x\":100,\"y\":260,\"w\":110,\"h\":60,\"text\":\"\\uE156\",\"text_font\":30,\"mode\":\"break\",\"align\":\"center\",\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n  {\"page\":2,\"id\":153,\"obj\":\"btn\",\"x\":220,\"y\":260,\"w\":80,\"h\":60,\"text\":\"\\uE415\",\"text_font\":48,\"mode\":\"break\",\"align\":\"center\",\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}<\/code><\/pre>\n\n\n\n<p>Permet d\u2019ajuster le coefficient de filtration (80% dans la capture) avec des boutons \u201c+\u201d et \u201c-\u201d, contr\u00f4l\u00e9 via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p2b151\"\n    event:\n      \"up\":\n        - service: number.decrement\n          target:\n            entity_id: number.esp178_coeff_filtration\n  - obj: \"p2b152\"\n    properties:\n      \"text\": \"{{'%.0f' | format (states('number.esp178_coeff_filtration') | round(0)) }}%\"\n  - obj: \"p2b153\"\n    event:\n      \"up\":\n        - service: number.increment\n          target:\n            entity_id: number.esp178_coeff_filtration<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Page 3 : R\u00e9glages<\/h3>\n\n\n\n<p>Cette page permet de configurer les modes de fonctionnement.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Titre<\/strong> (<code>p3b1<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":3,\"id\":1,\"obj\":\"btn\",\"x\":0,\"y\":0,\"w\":480,\"h\":40,\"text\":\"Autom's\",\"text_font\":28,\"bg_color\":\"#2C3E50\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0}<\/code><\/pre>\n\n\n\n<p>Affiche le titre \u201cAutom\u2019s\u201d (Automatisations) en haut de la page (visible dans la deuxi\u00e8me capture).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Modes de r\u00e9gulation<\/strong> (<code>p3b101<\/code> \u00e0 <code>p3b132<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":3,\"id\":101,\"obj\":\"label\",\"x\":5,\"y\":100,\"w\":130,\"h\":40,\"text\":\"Regul pH:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n  {\"page\":3,\"id\":102,\"obj\":\"dropdown\",\"x\":150,\"y\":100,\"w\":200,\"h\":40,\"options\":\"Auto\\nMa_f\\nAt_f\",\"direction\":0,\"text_font\":25,\"align\":1,\"text_color\":\"#2C3E50\"}<\/code><\/pre>\n\n\n\n<p>Permet de choisir le mode de r\u00e9gulation du pH (At_f dans la capture). La logique est d\u00e9finie dans <code>pane1.yaml<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p3b102\"\n    properties:\n      \"val\": &gt;\n        {% set st = states('select.esp178_mode_fonctionnement_regul_ph')%}\n        {% for text,num in &#091;('Auto',0),('Ma_f',1),('At_f',2) ] %}\n        {% if st == text %}\n          {{ num }}\n        {%endif%}\n        {% endfor %}\n    event:\n      \"changed\":\n        - service: select.select_option\n          target:\n            entity_id: select.esp178_mode_fonctionnement_regul_ph\n          data:\n            option: &gt;\n              {% if text == \"Auto\" -%}\n              Auto\n              {% elif text == 'Ma_f' -%}\n              Ma_f\n              {% elif text == 'At_f' -%}\n              At_f\n              {% endif -%}<\/code><\/pre>\n\n\n\n<p>Des s\u00e9lecteurs similaires existent pour la r\u00e9gulation du chlore, l\u2019appoint d\u2019eau, et le mode hors gel (D\u00e9sactiv\u00e9 dans la capture).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>RAZ du temps de galet de chlore<\/strong> (<code>p3b150<\/code>, <code>p3b151<\/code>) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>  {\"page\":3,\"id\":150,\"obj\":\"label\",\"x\":5,\"y\":310,\"w\":160,\"h\":40,\"text\":\"RAZ Cart Chl:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n  {\"page\":3,\"id\":151,\"obj\":\"btn\",\"x\":200,\"y\":300,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":30,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}<\/code><\/pre>\n\n\n\n<p>Affiche le temps restant pour le galet de chlore (0h dans la capture) et permet de r\u00e9initialiser ce compteur, contr\u00f4l\u00e9 via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  - obj: \"p3b151\"\n    properties:\n      \"text\": \"{{'%.0f' | format (states('sensor.esp178_temps_galet_chlore') | round(0)) }}h\"\n    event:\n      \"up\":\n        - service: button.press\n          target:\n            entity_id: button.esp178_bp_raz_tps_galet_chlore<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">R\u00e9sultat et captures d\u2019\u00e9cran du module<\/h1>\n\n\n\n<p>Voici \u00e0 quoi ressemble mon panneau en action, comme montr\u00e9 dans les captures d\u2019\u00e9cran :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Page 1 (Piscine)<\/strong> : Une vue d\u2019ensemble avec la temp\u00e9rature de l\u2019eau (16.6\u00b0C), le pH (5.85), l\u2019ORP (72.80 mV), la pression du filtre (0.304 bar), et des contr\u00f4les pour la pompe et le volet. Les horaires de filtration (12:00\/12:15) et le coefficient (80%) sont \u00e9galement affich\u00e9s.<\/li>\n\n\n\n<li><strong>Page 2 (Commandes)<\/strong> : Des boutons pour activer\/d\u00e9sactiver manuellement les \u00e9quipements (pompe, pH-, chlore, volet, \u00e9clairage, etc.), tous d\u00e9sactiv\u00e9s dans la capture. On peut aussi ajuster le coefficient de filtration.<\/li>\n\n\n\n<li><strong>Page 3 (R\u00e9glages)<\/strong> : Des s\u00e9lecteurs pour configurer les modes de r\u00e9gulation (pH, chlore, eau, hors gel) et un bouton pour r\u00e9initialiser le compteur de galet de chlore.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" data-id=\"3727\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0662-768x1024.jpeg\" alt=\"\" class=\"wp-image-3727\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0662-768x1024.jpeg 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0662-225x300.jpeg 225w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0662-1152x1536.jpeg 1152w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0662.jpeg 1536w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" data-id=\"3726\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0663-768x1024.jpeg\" alt=\"\" class=\"wp-image-3726\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0663-768x1024.jpeg 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0663-225x300.jpeg 225w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0663-1152x1536.jpeg 1152w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0663.jpeg 1536w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" data-id=\"3725\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0664-768x1024.jpeg\" alt=\"\" class=\"wp-image-3725\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0664-768x1024.jpeg 768w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0664-225x300.jpeg 225w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0664-1152x1536.jpeg 1152w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/IMG_0664.jpeg 1536w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n<\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Int\u00e9gration dans Home Assistant<\/h1>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"408\" height=\"423\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-11.png\" alt=\"\" class=\"wp-image-3756\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-11.png 408w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2025\/04\/image-11-289x300.png 289w\" sizes=\"auto, (max-width: 408px) 100vw, 408px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9cran de contr\u00f4le<\/h2>\n\n\n\n<p>L\u2019int\u00e9gration d\u2019OpenHASP dans Home Assistant offre un ensemble d\u2019entit\u00e9s qui permettent de contr\u00f4ler et de surveiller le panneau directement depuis l\u2019interface de Home Assistant. Ces entit\u00e9s, g\u00e9n\u00e9r\u00e9es automatiquement lors de l\u2019int\u00e9gration MQTT d\u2019OpenHASP, sont accessibles dans Home Assistant sous le nom de l\u2019appareil (dans mon cas, <code>ecran01<\/code>). Elles permettent de g\u00e9rer des fonctionnalit\u00e9s comme le r\u00e9tro\u00e9clairage, la navigation entre les pages, ou encore la protection contre la br\u00fblure d\u2019\u00e9cran, tout en offrant une int\u00e9gration fluide avec le reste de mon syst\u00e8me domotique. Voici un aper\u00e7u de ces entit\u00e9s, de leurs fonctionnalit\u00e9s, et d\u2019une automatisation que j\u2019ai mise en place pour g\u00e9rer l\u2019\u00e9cran, illustr\u00e9 par une capture d\u2019\u00e9cran de l\u2019interface de Home Assistant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entit\u00e9s fournies par l\u2019int\u00e9gration OpenHASP<\/h2>\n\n\n\n<p>Une fois OpenHASP connect\u00e9 via MQTT, Home Assistant d\u00e9tecte automatiquement l\u2019appareil et expose plusieurs entit\u00e9s, visibles dans la capture d\u2019\u00e9cran sous l\u2019appareil <code>ecran01<\/code>. Voici les principales entit\u00e9s et leurs usages :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Backlight (R\u00e9tro\u00e9clairage)<\/strong> : Cette entit\u00e9 est un interrupteur (<code>switch.ecran01_backlight<\/code>) qui permet d\u2019allumer ou d\u2019\u00e9teindre le r\u00e9tro\u00e9clairage de l\u2019\u00e9cran. Dans la capture, il est activ\u00e9 (ic\u00f4ne jaune allum\u00e9e). Cela peut \u00eatre utilis\u00e9 dans une automatisation pour, par exemple, \u00e9teindre l\u2019\u00e9cran la nuit afin d\u2019\u00e9conomiser de l\u2019\u00e9nergie.<\/li>\n\n\n\n<li><strong>Moodlight (Mode lumi\u00e8re)<\/strong> : Un autre interrupteur (<code>switch.ecran01_moodlight<\/code>) qui active ou d\u00e9sactive un mode \u201cmoodlight\u201d. Ce mode peut modifier l\u2019ambiance lumineuse de l\u2019\u00e9cran (par exemple, pour un effet d\u00e9coratif). Dans la capture, il est d\u00e9sactiv\u00e9, mais il pourrait \u00eatre utilis\u00e9 pour cr\u00e9er une ambiance visuelle dans certaines situations.<\/li>\n\n\n\n<li><strong>Switch 0<\/strong> : Cette entit\u00e9 (<code>switch.ecran01_switch_0<\/code>) est un interrupteur g\u00e9n\u00e9rique fourni par OpenHASP. Elle peut \u00eatre configur\u00e9e pour contr\u00f4ler une sortie GPIO de l\u2019ESP32 ou une autre fonctionnalit\u00e9 personnalis\u00e9e. Dans mon cas, je ne l\u2019ai pas utilis\u00e9e, et elle est d\u00e9sactiv\u00e9e dans la capture.<\/li>\n\n\n\n<li><strong>Antiburn (Protection contre la br\u00fblure d\u2019\u00e9cran)<\/strong> : Un interrupteur (<code>switch.ecran01_antiburn<\/code>) qui active ou d\u00e9sactive la fonctionnalit\u00e9 de protection contre la br\u00fblure d\u2019\u00e9cran. Lorsqu\u2019elle est activ\u00e9e (comme dans la capture), OpenHASP d\u00e9place l\u00e9g\u00e8rement les pixels ou r\u00e9duit la luminosit\u00e9 apr\u00e8s une p\u00e9riode d\u2019inactivit\u00e9, ce qui prolonge la dur\u00e9e de vie de l\u2019\u00e9cran TFT. C\u2019est particuli\u00e8rement utile pour un panneau qui affiche des donn\u00e9es statiques en continu, comme les param\u00e8tres de ma piscine.<\/li>\n\n\n\n<li><strong>Page Number (Num\u00e9ro de page)<\/strong> : Une entit\u00e9 de type \u201cnumber\u201d (<code>number.ecran01_page_number<\/code>) qui permet de s\u00e9lectionner la page affich\u00e9e sur le panneau. Dans la capture, la page 1 est s\u00e9lectionn\u00e9e, ce qui correspond \u00e0 la page \u201cPiscine\u201d vue dans les captures pr\u00e9c\u00e9dentes. Cette entit\u00e9 est pratique pour naviguer entre les pages (Piscine, Commandes, R\u00e9glages) depuis Home Assistant, par exemple dans un tableau de bord ou une automatisation.<\/li>\n\n\n\n<li><strong>Restart (Red\u00e9marrage)<\/strong> : Un bouton (<code>button.ecran01_restart<\/code>) qui permet de red\u00e9marrer l\u2019ESP32 \u00e0 distance. Cela peut \u00eatre utile pour appliquer des modifications ou r\u00e9soudre des probl\u00e8mes de connexion sans avoir \u00e0 acc\u00e9der physiquement au panneau.<\/li>\n\n\n\n<li><strong>Appuyer<\/strong> : Une entit\u00e9 de type bouton (<code>button.ecran01_appuyer<\/code>) qui semble \u00eatre une action personnalis\u00e9e ou un placeholder. Dans mon cas, elle n\u2019est pas configur\u00e9e pour une action sp\u00e9cifique, mais elle pourrait \u00eatre utilis\u00e9e pour d\u00e9clencher une commande via MQTT ou HTTP, par exemple pour ex\u00e9cuter un script dans Home Assistant.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Utilisation dans Home Assistant<\/h2>\n\n\n\n<p>Ces entit\u00e9s peuvent \u00eatre utilis\u00e9es dans Home Assistant pour cr\u00e9er des tableaux de bord, des automatisations, ou des scripts. Par exemple, je pourrais cr\u00e9er une carte Lovelace qui affiche le num\u00e9ro de page actuel (<code>number.ecran01_page_number<\/code>) et permet de naviguer entre les pages. L\u2019entit\u00e9 <code>switch.ecran01_antiburn<\/code> est particuli\u00e8rement utile pour garantir la long\u00e9vit\u00e9 de l\u2019\u00e9cran, et je l\u2019ai laiss\u00e9e activ\u00e9e en permanence.<\/p>\n\n\n\n<p>Dans la capture d\u2019\u00e9cran, on voit que l\u2019appareil <code>ecran01<\/code> est bien int\u00e9gr\u00e9 dans Home Assistant, avec toutes les entit\u00e9s list\u00e9es. Cela me permet de g\u00e9rer le panneau de mani\u00e8re centralis\u00e9e, aux c\u00f4t\u00e9s des autres entit\u00e9s de ma piscine (comme <code>sensor.esp178_temperature_eau<\/code> ou <code>switch.esp178_cde_pompe_filtration<\/code>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exemple d\u2019automatisation : Gestion du r\u00e9tro\u00e9clairage<\/h2>\n\n\n\n<p>Pour optimiser l\u2019utilisation de l\u2019\u00e9cran et \u00e9conomiser de l\u2019\u00e9nergie, j\u2019ai cr\u00e9\u00e9 une automatisation dans Home Assistant qui ajuste le r\u00e9tro\u00e9clairage toutes les 30 minutes. Voici le d\u00e9tail de cette automatisation, nomm\u00e9e <strong>\u201cEcran01 Eteint ecran toutes x mn\u201d<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alias: Ecran01 Eteint ecran toutes x mn\ndescription: \"\"\nmode: single\ntriggers:\n  - minutes: \/30\n    trigger: time_pattern\nconditions: &#091;]\nactions:\n  - data:\n      topic: hasp\/ecran01\/command\n      payload: backlight {\"state\":\"true\",\"brightness\":10}\n    enabled: false\n    action: mqtt.publish\n  - data:\n      topic: hasp\/ecran01\/config\/gui\n      payload: \"{\\\"idle2\\\":20}\"\n    enabled: false\n    action: mqtt.publish\n  - type: turn_off\n    device_id: 31203080ff3e67d781d95be03b42e98e\n    entity_id: caf58cffba51ee848ade4eaa4c57a127\n    domain: light<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Explication de l\u2019automatisation<\/strong> :<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>D\u00e9clencheur<\/strong> : L\u2019automatisation se d\u00e9clenche toutes les 30 minutes (via <code>time_pattern<\/code> avec <code>minutes: \/30<\/code>).<\/li>\n\n\n\n<li><strong>Actions<\/strong> :<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Ajustement du r\u00e9tro\u00e9clairage<\/strong> : Envoie une commande MQTT au topic <code>hasp\/ecran01\/command<\/code> pour activer le r\u00e9tro\u00e9clairage (<code>\"state\":\"true\"<\/code>) avec une luminosit\u00e9 r\u00e9duite \u00e0 10 (<code>\"brightness\":10<\/code>). Cette action est actuellement d\u00e9sactiv\u00e9e (<code>enabled: false<\/code>), mais elle pourrait \u00eatre utilis\u00e9e pour ajuster la luminosit\u00e9 \u00e0 un niveau minimal.<\/li>\n\n\n\n<li><strong>Configuration du mode inactif<\/strong> : Envoie une commande MQTT au topic <code>hasp\/ecran01\/config\/gui<\/code> pour d\u00e9finir un d\u00e9lai d\u2019inactivit\u00e9 (<code>\"idle2\":20<\/code>), apr\u00e8s lequel l\u2019\u00e9cran pourrait passer en mode basse consommation. Cette action est \u00e9galement d\u00e9sactiv\u00e9e pour le moment.<\/li>\n\n\n\n<li><strong>Extinction d\u2019une lumi\u00e8re<\/strong> : \u00c9teint une entit\u00e9 de type lumi\u00e8re (<code>light<\/code> avec l\u2019<code>entity_id: caf58cffba51ee848ade4eaa4c57a127<\/code>). Dans mon cas, cette entit\u00e9 correspond probablement \u00e0 une lumi\u00e8re associ\u00e9e au panneau ou \u00e0 la piscine, mais elle n\u2019est pas directement li\u00e9e \u00e0 OpenHASP. Cette action permet de coordonner l\u2019extinction de l\u2019\u00e9cran avec d\u2019autres \u00e9quipements.<\/li>\n<\/ol>\n\n\n\n<p><strong>Pourquoi cette automatisation ?<\/strong><br>Cette automatisation me permet de g\u00e9rer l\u2019\u00e9cran de mani\u00e8re intelligente : en r\u00e9duisant la luminosit\u00e9 ou en \u00e9teignant des \u00e9quipements associ\u00e9s, je peux \u00e9conomiser de l\u2019\u00e9nergie tout en prolongeant la dur\u00e9e de vie de l\u2019\u00e9cran. Bien que certaines actions soient d\u00e9sactiv\u00e9es pour le moment, je peux les activer selon mes besoins, par exemple pour ajuster la luminosit\u00e9 en fonction de l\u2019heure de la journ\u00e9e.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pourquoi c\u2019est utile ?<\/h3>\n\n\n\n<p>Ces entit\u00e9s fournies par l\u2019int\u00e9gration OpenHASP permettent une gestion fine du panneau directement depuis Home Assistant, sans avoir \u00e0 passer par l\u2019interface web d\u2019OpenHASP. Elles offrent une flexibilit\u00e9 suppl\u00e9mentaire pour int\u00e9grer le panneau dans des sc\u00e9narios domotiques complexes. Par exemple, l\u2019automatisation ci-dessus montre comment je peux coordonner le r\u00e9tro\u00e9clairage avec d\u2019autres \u00e9quipements, tandis que l\u2019entit\u00e9 <code>number.ecran01_page_number<\/code> me permet de changer de page (par exemple, pour afficher la page \u201cCommandes\u201d dans certaines conditions). Cette int\u00e9gration renforce l\u2019aspect centralis\u00e9 et pratique de mon syst\u00e8me domotique.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>Ce projet montre \u00e0 quel point OpenHASP et un simple module ESP32 peuvent transformer la gestion d\u2019une piscine en une exp\u00e9rience intuitive et centralis\u00e9e. Avec Home Assistant, les possibilit\u00e9s de personnalisation sont infinies. Si vous avez une piscine ou un autre syst\u00e8me \u00e0 automatiser, je vous encourage \u00e0 essayer OpenHASP ! Qu\u2019en pensez-vous ? Avez-vous des id\u00e9es pour am\u00e9liorer ce panneau ? Laissez-moi un commentaire !<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Liste des publications en lien avec cet article:<\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Filtration avec <a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/03\/21\/ha-gestion-complete-dune-piscine-avec-esp32-et-esphome\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2025\/03\/21\/ha-gestion-complete-dune-piscine-avec-esp32-et-esphome\/\" target=\"_blank\" rel=\"noreferrer noopener\">ESPHome et ESP32<\/a><\/li>\n\n\n\n<li>Filtration avec \u00ab\u00a0<a href=\"https:\/\/domo.rem81.com\/index.php\/2022\/02\/02\/ha-gestion-piscine-1-filtration-avec-appdaemon-2\/\" target=\"_blank\" rel=\"noreferrer noopener\">AppDaemon\u00a0\u00bb<\/a><\/li>\n\n\n\n<li>Filtration avec \u00ab\u00a0<a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/01\/20\/home-assistant-gestion-piscine-filtration-poolpump\/\" target=\"_blank\" rel=\"noreferrer noopener\">Pool Pump Manager<\/a>\u00ab\u00a0<\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/02\/24\/home-assistant-gestion-piscine-2_mesure-de-puissance-electrique\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mesure de puissance \u00e9lectrique<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/04\/02\/home-assistant-gestion-piscine-1_mise-a-niveau-automatique\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mise \u00e0 niveau automatique<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/05\/11\/home-assistant-gestion-piscine-4_mesure-ph\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mesure du pH<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/08\/14\/ha-gestion-piscine-5_regulation-du-ph\/\" target=\"_blank\" rel=\"noreferrer noopener\">R\u00e9gulation du Ph<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/11\/30\/ha-gestion-piscine-6_mode-hors-gel\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mise Hors Gel<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2022\/05\/13\/ha-gestion-piscine-7_mesure-de-pression\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mesure de pression<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/04\/ha-mesurer-la-consommation-deau-de-ma-piscine-avec-un-esp8266-et-esphome\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/04\/ha-mesurer-la-consommation-deau-de-ma-piscine-avec-un-esp8266-et-esphome\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mesure consommation d&rsquo;eau<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/11\/ha-panneau-de-commande-pour-piscine-avec-un-esp32-openhasp-et-home-assistant\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/11\/ha-panneau-de-commande-pour-piscine-avec-un-esp32-openhasp-et-home-assistant\/\" target=\"_blank\" rel=\"noreferrer noopener\">Panneau de contr\u00f4le avec un ESP32<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/13\/ha-analyse-de-leau-de-piscine-avec-le-poollab-2-0-et-integration-dans-home-assistant\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/13\/ha-analyse-de-leau-de-piscine-avec-le-poollab-2-0-et-integration-dans-home-assistant\/\" target=\"_blank\" rel=\"noreferrer noopener\">Analyse de l&rsquo;eau avec PoolLAB2.0<\/a><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Annexes:<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Fichier de configuration du panel \u00ab\u00a0pages.JSONL\u00a0\u00bb:<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>{\"page\":0,\"id\":1,\"obj\":\"btn\",\"x\":440,\"y\":0,\"w\":30,\"h\":40,\"text\":\"\\uE5A9\",\"text_font\":\"2\",\"text_color\":\"gray\",\"bg_opa\":0,\"border_width\":0}\n{\"page\":0,\"id\":2,\"obj\":\"btn\",\"x\":10,\"y\":0,\"w\":62,\"h\":40,\"text\":\"00:00\",\"text_font\":28,\"bg_color\":\"#2C3E50\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0}\n\n{\"page\":0,\"id\":6,\"obj\":\"btn\",\"x\":300,\"y\":0,\"w\":100,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"00.00\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":28}\n{\"page\":0,\"id\":7,\"obj\":\"btn\",\"x\":80,\"y\":0,\"w\":100,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"00.00\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":28}\n\n{\"page\":0,\"id\":3,\"obj\":\"btn\",\"action\":\"prev\",\"x\":0,\"y\":440,\"w\":160,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"\\uE141\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":32}\n{\"page\":0,\"id\":4,\"obj\":\"btn\",\"action\":\"back\",\"x\":160,\"y\":440,\"w\":160,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"\\uE2DC\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":32}\n{\"page\":0,\"id\":5,\"obj\":\"btn\",\"action\":\"next\",\"x\":320,\"y\":440,\"w\":160,\"h\":40,\"bg_color\":\"#2C3E50\",\"text\":\"\\uE142\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0,\"text_font\":32}\n\n\n{\"page\":1,\"id\":1,\"obj\":\"btn\",\"x\":0,\"y\":0,\"w\":480,\"h\":40,\"text\":\"Piscine\",\"text_font\":28,\"bg_color\":\"#2C3E50\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0}\n\n\n{\"page\":1,\"id\":130,\"obj\":\"label\",\"x\":5,\"y\":50,\"w\":80,\"h\":80,\"text\":\"\\uE50F\",\"text_font\":80,\"align\":1,\"text_color\":\"#00ff00\"}\n{\"page\":1,\"id\":131,\"obj\":\"label\",\"x\":120,\"y\":50,\"w\":225,\"h\":80,\"text\":\"Offline\",\"text_font\":80,\"align\":1,\"text_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":132,\"obj\":\"label\",\"x\":380,\"y\":50,\"w\":90,\"h\":25,\"text\":\"Ppe\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":133,\"obj\":\"btn\",\"x\":385,\"y\":75,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":135,\"obj\":\"label\",\"x\":5,\"y\":130,\"w\":80,\"h\":80,\"text\":\"\\uE606\",\"text_font\":80,\"align\":1,\"text_color\":\"#00ff00\"}\n{\"page\":1,\"id\":136,\"obj\":\"label\",\"x\":120,\"y\":130,\"w\":240,\"h\":80,\"text\":\"Offline\",\"text_font\":80,\"align\":1,\"text_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":137,\"obj\":\"label\",\"x\":380,\"y\":130,\"w\":90,\"h\":25,\"text\":\"Volet\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":138,\"obj\":\"btn\",\"x\":385,\"y\":155,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":140,\"obj\":\"label\",\"x\":5,\"y\":210,\"w\":90,\"h\":40,\"text\":\"Horaire:\",\"text_font\":30,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":141,\"obj\":\"label\",\"x\":100,\"y\":210,\"w\":300,\"h\":40,\"text\":\"Offline\",\"text_font\":40,\"align\":\"center\",\"text_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":145,\"obj\":\"label\",\"x\":5,\"y\":255,\"w\":70,\"h\":40,\"text\":\"Duree:\",\"text_font\":30,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":146,\"obj\":\"label\",\"x\":90,\"y\":255,\"w\":160,\"h\":40,\"text\":\"Offline\",\"text_font\":40,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":147,\"obj\":\"label\",\"x\":260,\"y\":255,\"w\":70,\"h\":40,\"text\":\"Coef:\",\"text_font\":30,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":148,\"obj\":\"label\",\"x\":300,\"y\":255,\"w\":150,\"h\":40,\"text\":\"Offline\",\"text_font\":40,\"align\":\"right\",\"text_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":150,\"obj\":\"label\",\"x\":5,\"y\":305,\"w\":70,\"h\":40,\"text\":\"Fonct:\",\"text_font\":30,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":151,\"obj\":\"dropdown\",\"x\":100,\"y\":305,\"w\":300,\"h\":40,\"options\":\"Palier\\nClassique\\nAbaque\\nHoraire\\nMa_f\\nAt_f\",\"direction\":1,\"text_font\":25,\"align\":1,\"text_color\":\"#2C3E50\"}\n\n\n{\"page\":1,\"id\":221,\"obj\":\"label\",\"x\":5,\"y\":355,\"w\":130,\"h\":40,\"text\":\"Pression:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":222,\"obj\":\"label\",\"x\":140,\"y\":355,\"w\":100,\"h\":40,\"text\":\"Offline\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":223,\"obj\":\"label\",\"x\":250,\"y\":355,\"w\":130,\"h\":40,\"text\":\"-ORP:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":224,\"obj\":\"label\",\"x\":330,\"y\":355,\"w\":150,\"h\":40,\"text\":\"Offline\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":225,\"obj\":\"label\",\"x\":5,\"y\":395,\"w\":130,\"h\":40,\"text\":\"Puissance:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":226,\"obj\":\"label\",\"x\":140,\"y\":395,\"w\":150,\"h\":40,\"text\":\"Offline\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n\n{\"page\":1,\"id\":230,\"obj\":\"label\",\"x\":250,\"y\":395,\"w\":130,\"h\":40,\"text\":\"-Conso J:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n{\"page\":1,\"id\":231,\"obj\":\"label\",\"x\":370,\"y\":395,\"w\":150,\"h\":40,\"text\":\"Offline\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n\n\n{\"page\":2,\"id\":1,\"obj\":\"btn\",\"x\":0,\"y\":0,\"w\":480,\"h\":40,\"text\":\"Cde\",\"text_font\":28,\"bg_color\":\"#2C3E50\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0}\n\n\n{\"page\":2,\"id\":101,\"obj\":\"label\",\"x\":5,\"y\":45,\"w\":90,\"h\":25,\"text\":\"Ppe\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":121,\"obj\":\"btn\",\"x\":10,\"y\":70,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n{\"page\":2,\"id\":102,\"obj\":\"label\",\"x\":100,\"y\":45,\"w\":90,\"h\":25,\"text\":\"Ppe ph-\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":122,\"obj\":\"btn\",\"x\":105,\"y\":70,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n{\"page\":2,\"id\":103,\"obj\":\"label\",\"x\":195,\"y\":45,\"w\":90,\"h\":25,\"text\":\"Ppe Chl\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":123,\"obj\":\"btn\",\"x\":200,\"y\":70,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n{\"page\":2,\"id\":104,\"obj\":\"label\",\"x\":290,\"y\":45,\"w\":90,\"h\":25,\"text\":\"Ouv Volet\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":124,\"obj\":\"btn\",\"x\":295,\"y\":70,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n{\"page\":2,\"id\":105,\"obj\":\"label\",\"x\":385,\"y\":45,\"w\":90,\"h\":25,\"text\":\"ferm Volet.\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":125,\"obj\":\"btn\",\"x\":390,\"y\":70,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n{\"page\":2,\"id\":106,\"obj\":\"label\",\"x\":5,\"y\":130,\"w\":90,\"h\":25,\"text\":\"Spot\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":126,\"obj\":\"btn\",\"x\":10,\"y\":155,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n{\"page\":2,\"id\":107,\"obj\":\"label\",\"x\":100,\"y\":130,\"w\":90,\"h\":25,\"text\":\"Ev eau\",\"text_font\":16,\"align\":1,\"text_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":127,\"obj\":\"btn\",\"x\":105,\"y\":155,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":48,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n{\"page\":2,\"id\":2,\"obj\":\"btn\",\"x\":0,\"y\":220,\"w\":480,\"h\":2,\"text\":\"\",\"value_font\":22,\"text_color\":\"#000000\",\"radius\":0,\"border_side\":15,\"border_color\":\"#2C3E50\"}\n\n{\"page\":2,\"id\":150,\"obj\":\"label\",\"x\":100,\"y\":225,\"w\":90,\"h\":30,\"text\":\"Coef:\",\"text_font\":30,\"align\":\"center\",\"text_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":151,\"obj\":\"btn\",\"x\":10,\"y\":260,\"w\":80,\"h\":60,\"text\":\"\\uE374\",\"text_font\":48,\"mode\":\"break\",\"align\":\"center\",\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":152,\"obj\":\"btn\",\"x\":100,\"y\":260,\"w\":110,\"h\":60,\"text\":\"\\uE156\",\"text_font\":30,\"mode\":\"break\",\"align\":\"center\",\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n{\"page\":2,\"id\":153,\"obj\":\"btn\",\"x\":220,\"y\":260,\"w\":80,\"h\":60,\"text\":\"\\uE415\",\"text_font\":48,\"mode\":\"break\",\"align\":\"center\",\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n\n\n{\"page\":3,\"id\":1,\"obj\":\"btn\",\"x\":0,\"y\":0,\"w\":480,\"h\":40,\"text\":\"Autom's\",\"text_font\":28,\"bg_color\":\"#2C3E50\",\"text_color\":\"#FFFFFF\",\"radius\":0,\"border_side\":0}\n\n{\"page\":3,\"id\":2,\"obj\":\"label\",\"x\":100,\"y\":40,\"w\":150,\"h\":30,\"text\":\"R\u00e9gulations\",\"text_font\":30,\"align\":\"center\",\"text_color\":\"#2C3E50\"}\n\n\n{\"page\":3,\"id\":101,\"obj\":\"label\",\"x\":5,\"y\":100,\"w\":130,\"h\":40,\"text\":\"Regul pH:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n{\"page\":3,\"id\":102,\"obj\":\"dropdown\",\"x\":150,\"y\":100,\"w\":200,\"h\":40,\"options\":\"Auto\\nMa_f\\nAt_f\",\"direction\":0,\"text_font\":25,\"align\":1,\"text_color\":\"#2C3E50\"}\n\n{\"page\":3,\"id\":111,\"obj\":\"label\",\"x\":5,\"y\":150,\"w\":130,\"h\":40,\"text\":\"Regul Chl:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n{\"page\":3,\"id\":112,\"obj\":\"dropdown\",\"x\":150,\"y\":150,\"w\":200,\"h\":40,\"options\":\"Auto\\nMa_f\\nAt_f\",\"direction\":0,\"text_font\":25,\"align\":1,\"text_color\":\"#2C3E50\"}\n\n{\"page\":3,\"id\":121,\"obj\":\"label\",\"x\":5,\"y\":200,\"w\":130,\"h\":40,\"text\":\"Regul Eau:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n{\"page\":3,\"id\":122,\"obj\":\"dropdown\",\"x\":150,\"y\":200,\"w\":200,\"h\":40,\"options\":\"Auto\\nMa_f\\nAt_f\",\"direction\":0,\"text_font\":25,\"align\":1,\"text_color\":\"#2C3E50\"}\n\n{\"page\":3,\"id\":131,\"obj\":\"label\",\"x\":5,\"y\":250,\"w\":130,\"h\":40,\"text\":\"Hors Gel:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n{\"page\":3,\"id\":132,\"obj\":\"dropdown\",\"x\":150,\"y\":250,\"w\":200,\"h\":40,\"options\":\"Desactiv\u00e9\\nActiv\u00e9\",\"direction\":0,\"text_font\":25,\"align\":1,\"text_color\":\"#2C3E50\"}\n\n\n\n{\"page\":3,\"id\":150,\"obj\":\"label\",\"x\":5,\"y\":310,\"w\":160,\"h\":40,\"text\":\"RAZ Cart Chl:\",\"text_font\":30,\"align\":\"left\",\"text_color\":\"#2C3E50\"}\n{\"page\":3,\"id\":151,\"obj\":\"btn\",\"x\":200,\"y\":300,\"w\":80,\"h\":60,\"text\":\"\\uE156\",\"text_font\":30,\"mode\":\"break\",\"align\":1,\"radius\":0,\"text_color\":\"#FFFFFF\",\"border_color\":\"#2C3E50\",\"bg_color\":\"#2C3E50\"}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Fichier de configuration Home Assistant: pane1.yaml<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>openhasp:\n  ecran01:\n    objects:\n      - obj: \"p0b1\"\n        properties:\n          \"text_color\": \"{% if -30 &lt;= state_attr('openhasp.ecran01','rssi') |int %}#00ff00{% elif -31 &gt; state_attr('openhasp.ecran01','rssi') |int &gt;= -50 %}#ccff00{% elif -51 &gt; state_attr('openhasp.ecran01','rssi') |int &gt;= -80 %}#ff9100{% else %}#ff0000{% endif %}\"\n      - obj: \"p0b2\"\n        properties:\n          \"text\": \"{{ states('sensor.time') }}\"\n      - obj: \"p0b6\"\n        properties:\n          \"text\": \"\\uE2DC {{'%.1f' | format (states('sensor.vp2_temp_out') | round(1)) }}\u00b0C\"\n      - obj: \"p0b7\"\n        properties:\n          \"text\": \"\\uE6A1 {{'%.1f' | format (states('sensor.vp2_temp_in') | round(1)) }}\u00b0C\"\n\n\n\n# Affichage piscine\n      - obj: \"p1b131\"\n        properties:\n          \"text\": \"{{ states('sensor.esp178_temperature_eau')|float(0) |round(1)}} C\u00b0\" \n\n      - obj: \"p1b133\"  \n        properties:\n          \"val\": '{{ 1 if states(\"switch.esp178_cde_pompe_filtration\") == \"on\" else 0 }}'\n          \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_pompe_filtration\", \"on\") else \"\\uE156\" | e }}'\n          \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_pompe_filtration', 'on') else '#ff0000' }}\" \n        event:\n          \"up\":\n            - service: homeassistant.toggle\n              entity_id: \"switch.esp178_cde_pompe_filtration\"\n\n      - obj: \"p1b136\"\n        properties:\n          \"text\": \"{{ states('sensor.esp178_ph_ezo')|float(0) |round(2)}} pH\" \n\n      - obj: \"p1b138\"  \n        properties:\n          \"val\": '{{ 1 if states(\"cover.esp178_volet_piscine\") == \"on\" else 0 }}'\n          \"text\": '{{ \"\\uF11E\" if is_state(\"cover.esp178_volet_piscine\", \"open\") else \"\\uF11C\" | e }}'\n          \"text_color\": \"{{ '#ff0000' if is_state('cover.esp178_volet_piscine', 'open') else '#00ff00' }}\" \n        event:\n          \"up\":\n            - service: homeassistant.toggle\n              entity_id: \"cover.esp178_volet_piscine\"\n\n      - obj: \"p1b141\"\n        properties:\n          \"text\": \"{{ states('sensor.esp178_affich_heure_filtration')}}\" \n\n      - obj: \"p1b146\"\n        properties:\n          \"text\": \"{{ states('time.esp178_duree_filtration')}}\" \n\n      - obj: \"p1b148\"\n        properties:\n          \"text\": \"{{ states('number.esp178_coeff_filtration')}} %\" \n\n      - obj: \"p1b151\"\n        properties:\n          \"val\": &gt;\n            {% set st = states('select.esp178_mode_fonctionnement_filtration')%}\n            {% for text,num in &#091;('Palier',0),('Classique',1),('Abaque',2),('Horaire',3),('Ma_f',4),('At_f',5) ] %}\n            {% if st == text %}\n              {{ num }}\n            {%endif%}\n            {% endfor %}\n        event:\n          \"changed\":\n            - service: select.select_option\n              target:\n                entity_id: select.esp178_mode_fonctionnement_filtration\n              data:\n                option: &gt;\n                  {% if text == \"Palier\" -%}\n                  Palier\n                  {% elif text == 'Classique' -%}\n                  Classique\n                  {% elif text == 'Abaque' -%}\n                  Abaque\n                  {% elif text == 'Horaire' -%}\n                  Horaire\n                  {% elif text == 'Ma_f' -%}\n                  Ma_f\n                  {% elif text == 'At_f' -%}\n                  At_f\n                  {% endif -%}\n      - obj: \"p1b222\"\n        properties:\n          \"text\": \"{{ states('sensor.esp178_pression_filtre') }} b\"       \n      - obj: \"p1b224\"\n        properties:\n          \"text\": \"{{ states('sensor.esp178_orp_ezo') }} ms\"                      \n      - obj: \"p1b226\"\n        properties:\n          \"text\": \"{{ states('sensor.pzem_pisc_puissance') }} W\"\n      - obj: \"p1b231\"\n        properties:\n          \"text\": \"{{ states('sensor.compteur_energie_piscine_jour_hp_hc') }} kWh\"\n# Page2\n\n      - obj: \"p2b121\"  \n        properties:\n          \"val\": '{{ 1 if states(\"switch.esp178_cde_pompe_filtration\") == \"on\" else 0 }}'\n          \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_pompe_filtration\", \"on\") else \"\\uE156\" | e }}'\n          \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_pompe_filtration', 'on') else '#ff0000' }}\" \n        event:\n          \"up\":\n            - service: homeassistant.toggle\n              entity_id: \"switch.esp178_cde_pompe_filtration\"\n\n      - obj: \"p2b122\"  \n        properties:\n          \"val\": '{{ 1 if states(\"switch.esp178_cde_ppe_ph_moins\") == \"on\" else 0 }}'\n          \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_ppe_ph_moins\", \"on\") else \"\\uE156\" | e }}'\n          \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_ppe_ph_moins', 'on') else '#ff0000' }}\"          \n        event:\n          \"up\":\n            - service: homeassistant.toggle\n              entity_id: \"switch.esp178_cde_ppe_ph_moins\"   \n\n      - obj: \"p2b123\"\n        properties:\n          \"val\": '{{ 1 if states(\"switch.esp178_cde_ppe_chlore\") == \"on\" else 0 }}'\n          \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_ppe_chlore\", \"on\") else \"\\uE156\" | e }}'\n          \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_ppe_chlore', 'on') else '#ff0000' }}\"\n        event:\n          \"up\":\n            - service: homeassistant.toggle\n              entity_id: \"switch.esp178_cde_ppe_chlore\"   \n\n      - obj: \"p2b124\"  \n        properties:\n          \"val\": '{{ 1 if states(\"switch.esp178_cde_volet_ouverture\") == \"on\" else 0 }}'\n          \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_volet_ouverture\", \"on\") else \"\\uE156\" | e }}'\n          \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_volet_ouverture', 'on') else '#ff0000' }}\"\n        event:\n          \"up\":\n            - service: homeassistant.toggle\n              entity_id: \"switch.esp178_cde_volet_ouverture\"\n\n      - obj: \"p2b125\"  \n        properties:\n          \"val\": '{{ 1 if states(\"switch.esp178_cde_volet_fermeture\") == \"on\" else 0 }}'\n          \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_volet_fermeture\", \"on\") else \"\\uE156\" | e }}'\n          \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_volet_fermeture', 'on') else '#ff0000' }}\"\n        event:\n          \"up\":\n            - service: homeassistant.toggle\n              entity_id: \"switch.esp178_cde_volet_fermeture\"\n\n      - obj: \"p2b126\"  \n        properties:\n          \"val\": '{{ 1 if states(\"switch.esp178_cde_eclairage\") == \"on\" else 0 }}'\n          \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_eclairage\", \"on\") else \"\\uE156\" | e }}'\n          \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_eclairage', 'on') else '#ff0000' }}\"          \n        event:\n          \"up\":\n            - service: homeassistant.toggle\n              entity_id: \"switch.esp178_cde_eclairage\"   \n\n      - obj: \"p2b127\"  \n        properties:\n          \"val\": '{{ 1 if states(\"switch.esp178_cde_ev_eau\") == \"on\" else 0 }}'\n          \"text\": '{{ \"\\uE12C\" if is_state(\"switch.esp178_cde_ev_eau\", \"on\") else \"\\uE156\" | e }}'\n          \"text_color\": \"{{ '#00ff00' if is_state('switch.esp178_cde_ev_eau', 'on') else '#ff0000' }}\"          \n        event:\n          \"up\":\n            - service: homeassistant.toggle\n              entity_id: \"switch.esp178_cde_ev_eau\"   \n\n      - obj: \"p2b151\"\n        event:\n          \"up\":\n            - service: number.decrement\n              target:\n                entity_id: number.esp178_coeff_filtration\n\n      - obj: \"p2b152\"\n        properties:\n          \"text\": \"{{'%.0f' | format (states('number.esp178_coeff_filtration') | round(0)) }}%\"\n\n      - obj: \"p2b153\"\n        event:\n          \"up\":\n            - service: number.increment\n              target:\n                entity_id: number.esp178_coeff_filtration\n\n                # Page 3\n      - obj: \"p3b102\"                  \n        properties:\n          \"val\": &gt;\n            {% set st = states('select.esp178_mode_fonctionnement_regul_ph')%}\n            {% for text,num in &#091;('Auto',0),('Ma_f',1),('At_f',2) ] %}\n            {% if st == text %}\n              {{ num }}\n            {%endif%}\n            {% endfor %}\n        event:\n          \"changed\":\n            - service: select.select_option\n              target:\n                entity_id: select.esp178_mode_fonctionnement_regul_ph\n              data:\n                option: &gt;\n                  {% if text == \"Auto\" -%}\n                  Auto\n                  {% elif text == 'Ma_f' -%}\n                  Ma_f\n                  {% elif text == 'At_f' -%}\n                  At_f\n                  {% endif -%}\n\n      - obj: \"p3b112\"                  \n        properties:\n          \"val\": &gt;\n            {% set st = states('select.esp178_mode_fonct_regul_chlore')%}\n            {% for text,num in &#091;('Auto',0),('Ma_f',1),('At_f',2) ] %}\n            {% if st == text %}\n              {{ num }}\n            {%endif%}\n            {% endfor %}\n        event:\n          \"changed\":\n            - service: select.select_option\n              target:\n                entity_id: select.esp178_mode_fonct_regul_chlore\n              data:\n                option: &gt;\n                  {% if text == \"Auto\" -%}\n                  Auto\n                  {% elif text == 'Ma_f' -%}\n                  Ma_f\n                  {% elif text == 'At_f' -%}\n                  At_f\n                  {% endif -%}\n\n      - obj: \"p3b122\"                  \n        properties:\n          \"val\": &gt;\n            {% set st = states('select.esp178_mode_fonct_appoint_eau')%}\n            {% for text,num in &#091;('Auto',0),('Ma_f',1),('At_f',2) ] %}\n            {% if st == text %}\n              {{ num }}\n            {%endif%}\n            {% endfor %}\n        event:\n          \"changed\":\n            - service: select.select_option\n              target:\n                entity_id: select.esp178_mode_fonct_appoint_eau\n              data:\n                option: &gt;\n                  {% if text == \"Auto\" -%}\n                  Auto\n                  {% elif text == 'Ma_f' -%}\n                  Ma_f\n                  {% elif text == 'At_f' -%}\n                  At_f\n                  {% endif -%}\n\n      - obj: \"p3b132\"                  \n        properties:\n          \"val\": &gt;\n            {% set st = states('select.esp178_mode_hors_gel')%}\n            {% for text,num in &#091;('Desactiv\u00e9',0),('Activ\u00e9',1) ] %}\n            {% if st == text %}\n              {{ num }}\n            {%endif%}\n            {% endfor %}\n        event:\n          \"changed\":\n            - service: select.select_option\n              target:\n                entity_id: select.esp178_mode_hors_gel\n              data:\n                option: &gt;\n                  {% if text == \"Desactiv\u00e9\" -%}\n                  Auto\n                  {% elif text == 'Activ\u00e9' -%}\n                  Activ\u00e9\n                  {% endif -%}\n                  \n      - obj: \"p3b151\"  \n        properties:\n          \"text\": \"{{'%.0f' | format (states('sensor.esp178_temps_galet_chlore') | round(0)) }}h\"\n        event:\n          \"up\":\n            - service: button.press\n              target:\n                entity_id: button.esp178_bp_raz_tps_galet_chlore\n\n\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Update: Intro Dans cet article, je vous pr\u00e9sente un projet que j\u2019ai ador\u00e9 mettre en place : un panneau de commande tactile pour g\u00e9rer ma piscine, bas\u00e9 sur un module &hellip; <\/p>\n","protected":false},"author":1,"featured_media":3782,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[15,17,59,33],"class_list":["post-3723","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-homeassistant","tag-esp32","tag-esphome","tag-mqtt","tag-piscine"],"_links":{"self":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/3723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/comments?post=3723"}],"version-history":[{"count":53,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/3723\/revisions"}],"predecessor-version":[{"id":3922,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/3723\/revisions\/3922"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/media\/3782"}],"wp:attachment":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/media?parent=3723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/categories?post=3723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/tags?post=3723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}