<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://blog.lfz.ovh/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Blog LFZ</title>
	<link>https://blog.lfz.ovh/</link>
	<description></description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://blog.lfz.ovh/spip.php?id_rubrique=2&amp;page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>Changement d'infrastructure serveur ???</title>
		<link>https://blog.lfz.ovh/spip.php?article5</link>
		<guid isPermaLink="true">https://blog.lfz.ovh/spip.php?article5</guid>
		<dc:date>2025-10-27T17:51:54Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>johann</dc:creator>



		<description>
&lt;p&gt;L'id&#233;e de derri&#232;re tout ceci : &lt;br class='autobr' /&gt;
Je suis les vid&#233;os YouTube de Raynox, dont l'infrastructure domotique ressemble beaucoup &#224; la mienne, tout comme la logique qui nous a amen&#233; &#224; ce type d'architecture. L'une de ses vid&#233;os a particuli&#232;rement retenu mon attention : il y expose des arguments pertinents, notamment celui du choix d'ex&#233;cuter un conteneur Docker &#224; l'int&#233;rieur d'une machine virtuelle QEMU/KVM ou d'un conteneur LXC, autrement dit, une virtualisation en deux niveaux. &lt;br class='autobr' /&gt;
Intuitivement, on (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.lfz.ovh/spip.php?rubrique2" rel="directory"&gt;Domotique&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='https://blog.lfz.ovh/IMG/logo/podman.png?1761587901' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt; L'id&#233;e de derri&#232;re tout ceci : &lt;/h2&gt;
&lt;p&gt;Je suis les vid&#233;os YouTube de &lt;a href=&#034;https://www.youtube.com/@Raynoxis&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Raynox&lt;/a&gt;, dont l'infrastructure domotique ressemble beaucoup &#224; la mienne, tout comme la logique qui nous a amen&#233; &#224; ce type d'architecture. L'une de ses vid&#233;os a particuli&#232;rement retenu mon attention : il y expose des arguments pertinents, notamment celui du choix d'ex&#233;cuter un conteneur Docker &#224; l'int&#233;rieur d'une machine virtuelle QEMU/KVM ou d'un conteneur LXC, autrement dit, une virtualisation en deux niveaux.&lt;/p&gt;
&lt;p&gt;Intuitivement, on sent bien que cette approche n'est pas optimale.&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&#034;640&#034; height=&#034;360&#034; src=&#034;https://www.youtube.com/embed/-fXW1gx0i1Y&#034; title=&#034;BYE PROXMOX &#9760;&#65039; - (Je vous ai &#233;cout&#233; &#128591;) - Optimisation CONTENEURS &#128170; (MaJ Architecture / Cockpit) #2&#034; frameborder=&#034;0&#034; allow=&#034;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#034; referrerpolicy=&#034;strict-origin-when-cross-origin&#034; allow4ullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;Dans un second temps, il pr&#233;sente une alternative que je ne connaissais pas : une distribution Fedora int&#233;grant l'interface web Cockpit, qui permet de g&#233;rer aussi bien des conteneurs Podman (&#233;quivalents de Docker) que des machines virtuelles QEMU/KVM. &lt;/p&gt;
&lt;p&gt;J'avais un mini-PC (Ryzen 5 3500U) qui prenait la poussi&#232;re dans un coin ... et une carte Hailo 8L en PCIe fra&#238;chement command&#233;e. Alors, par curiosit&#233; et un peu pour le fun de la bidouille, je me suis dit :&lt;/p&gt;
&lt;center&gt;&lt;i&gt;&#8220;Allez, voyons ce que &#231;a peut donner !&#8221;&lt;/i&gt;&lt;/center&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;1. Installation de Fedora Server &lt;/h2&gt;
&lt;p&gt;L'installation de &lt;strong&gt;Fedora Server&lt;/strong&gt; ne pr&#233;sente pas de difficult&#233; particuli&#232;re, m&#234;me si son installateur peut sembler un peu d&#233;routant lorsqu'on vient plut&#244;t de l'univers &lt;strong&gt;Debian&lt;/strong&gt; ou &lt;strong&gt;Manjaro&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le processus recommande de &lt;strong&gt;d&#233;sactiver le compte root&lt;/strong&gt; et de cr&#233;er &#224; la place un &lt;strong&gt;compte utilisateur disposant des privil&#232;ges sudo&lt;/strong&gt;, qui servira &#224; l'administration du syst&#232;me.&lt;/p&gt;
&lt;p&gt;J'ai opt&#233; pour une &lt;strong&gt;installation minimaliste&lt;/strong&gt; de Fedora Server, sans s&#233;lectionner d'autres paquets : tout le reste sera ajout&#233; plus tard, selon les besoins.&lt;/p&gt;
&lt;p&gt;Le &lt;strong&gt;serveur SSH&lt;/strong&gt; est op&#233;rationnel et activ&#233; par d&#233;faut, tout comme &lt;strong&gt;Cockpit&lt;/strong&gt;, la suite d'administration web int&#233;gr&#233;e &#224; Fedora.&lt;/p&gt;
&lt;p&gt;En fin d'installation, la machine est imm&#233;diatement &lt;strong&gt;accessible &#224; distance&lt;/strong&gt;, que ce soit en SSH pour la ligne de commande ou via Cockpit pour la gestion graphique.&lt;/p&gt;
&lt;p&gt;Pour identifier l'adresse IP de votre serveur, deux options s'offrent &#224; vous : soit &lt;strong&gt;consulter les informations de votre serveur DHCP&lt;/strong&gt; (par exemple dans l'interface de votre routeur/box), soit &lt;strong&gt;vous connecter physiquement (clavier + &#233;cran)&lt;/strong&gt; &#224; la machine et ex&#233;cuter la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ip -a&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Une fois votre serveur identifi&#233; sur le r&#233;seau, la premi&#232;re op&#233;ration est de &lt;strong&gt;mettre &#224; jour la machine&lt;/strong&gt;, en ligne de commande avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo dnf upgrade --refresh -y&lt;/code&gt; ou &#224; partir de l'interface cockpit.&lt;/p&gt;
&lt;p&gt;Les outils logiciels pour la gestion des containers Podman et des machines virtuelles sont installables dans le menu &#171; Outils &#187; / &#171; Applications &#187; de l'interface de Cockpit.&lt;/p&gt;
&lt;p&gt;Dans le menu r&#233;seau, il est &#233;galement possible de d&#233;finir une adresse &lt;strong&gt;ipv4 statique&lt;/strong&gt; et de cr&#233;er une &lt;strong&gt;interface bridge&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&#9888;&#65039; Gestion d'espace disque sous Fedora (LVM)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lors d'une installation par d&#233;faut de Fedora utilisant le gestionnaire de volumes logiques (LVM), tout l'espace disque disponible n'est pas imm&#233;diatement allou&#233; au volume logique racine (/dev/mapper/fedora-root). Pour visualiser l'&#233;tat en cours &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;df -h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;La commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo vgs&lt;/code&gt; permet pour voir les d&#233;tails du groupe de volumes et l'espace libre non allou&#233; (Colonne VFree).&lt;/p&gt;
&lt;p&gt;Pour l'assigner,en totalit&#233; ou en partie &#224; la partition racine, la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt; sudo lvextend -r -L+XXX.XXg /dev/mapper/fedora-root&lt;/code&gt; est a ex&#233;cuter, avec XXX.XXg la valeur en Gb, selon la quantit&#233; de disque disponible indiqu&#233; par la commande vgs&lt;/p&gt;
&lt;p&gt;Enfin pour confirmer : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;df -h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;2. Installation de Frigate dans un container Podman &lt;/h2&gt;
&lt;p&gt;L'un des avantages majeurs de Podman par rapport &#224; Docker est sa capacit&#233; &#224; ex&#233;cuter des conteneurs en mode &lt;strong&gt;rootless&lt;/strong&gt;, c'est-&#224;-dire sans privil&#232;ges administrateur. Les conteneurs tournent alors avec les droits d'un simple utilisateur du syst&#232;me, ce qui renforce consid&#233;rablement la s&#233;curit&#233;.&lt;/p&gt;
&lt;p&gt;Pour cela, il suffit de cr&#233;er un &lt;strong&gt;utilisateur d&#233;di&#233;&lt;/strong&gt;, ici nomm&#233; &#171; &lt;strong&gt;frigate&lt;/strong&gt; &#187;, qui sera responsable de l'ex&#233;cution du conteneur Podman Frigate. Cette cr&#233;ation peut se faire aussi bien en ligne de commande qu'&#224; partir de l'interface web Cockpit.&lt;/p&gt;
&lt;p&gt;L'utilisateur frigate doit pouvoir &lt;strong&gt;acc&#233;der au GPU&lt;/strong&gt; de la machine afin de b&#233;n&#233;ficier de l'acc&#233;l&#233;ration mat&#233;rielle pour le d&#233;codage des flux vid&#233;o.&lt;/p&gt;
&lt;p&gt;Sous Linux, les p&#233;riph&#233;riques graphiques /dev/dri/cardX et /dev/dri/renderD128 appartiennent respectivement &lt;strong&gt;aux groupes video et render&lt;/strong&gt;. Il est donc n&#233;cessaire d'ajouter notre utilisateur frigate &#224; ces deux groupes afin qu'il puisse y acc&#233;der avec les commandes &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo usermod -aG video frigate&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo usermod -aG render frigate&lt;/code&gt;&lt;/p&gt;
&lt;div class='spip_document_52 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/compte_frigate.png?1761322533' width='500' height='231' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Le syst&#232;me Fedora est maintenant op&#233;rationnel, avec deux comptes bien distincts :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; un &lt;strong&gt;utilisateur administrateur&lt;/strong&gt;, disposant des droits sudo pour g&#233;rer la machine,&lt;/li&gt;&lt;li&gt; et un &lt;strong&gt;utilisateur standard&lt;/strong&gt;, d&#233;di&#233; &#224; l'ex&#233;cution du conteneur Frigate avec des droits sur le GPU.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;i&gt;Cette distinction est importante, car certaines commandes devront &#234;tre ex&#233;cut&#233;es par l'un ou l'autre de ces comptes, selon qu'elles concernent la configuration du syst&#232;me h&#244;te ou celle du conteneur.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Il s'agit &#224; pr&#233;sent de mettre en place un &lt;strong&gt;conteneur Frigate&lt;/strong&gt; basique, &lt;strong&gt;sans acc&#233;l&#233;ration mat&#233;rielle pour la d&#233;tection&lt;/strong&gt; (c'est-&#224;-dire sans module Hailo-8L).&lt;/p&gt;
&lt;p&gt;Par d&#233;faut, Fedora Server est prot&#233;g&#233; par un &lt;strong&gt;pare-feu actif&lt;/strong&gt;. Il faut donc autoriser l'acc&#232;s aux ports utilis&#233;s par Frigate, avec le &lt;strong&gt;compte administrateur&lt;/strong&gt;, soit directement depuis l'interface web Cockpit, soit en ligne de commande avec les instructions suivantes :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo firewall-cmd --add-port=5000/tcp --permanent sudo firewall-cmd --add-port=8555/tcp --permanent sudo firewall-cmd --add-port=8554/tcp --permanent sudo firewall-cmd --add-port=8554/udp --permanent sudo firewall-cmd --add-port=8555/udp --permanent&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le &lt;strong&gt;d&#233;marrage&lt;/strong&gt; du conteneur Frigate, dans un terminal de l'&lt;strong&gt;utilisateur standard&lt;/strong&gt; Frigate, s'effectue &#224; l'aide de la commande suivante :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;frigate@localhost:~$ podman run -d --name frigate --restart=unless-stopped --shm-size=256m --device /dev/dri:/dev/dri -v /etc/localtime:/etc/localtime:ro -v /home/frigate/config:/config:z -v /home/frigate/media:/media/frigate:z --tmpfs /tmp/cache:size=1000000000,mode=1777 -p 5000:5000 -p 1935:1935 -p 8554:8554 -p 8555:8555/tcp -p 8555:8555/udp -e FRIGATE_RTSP_PASSWORD='monMotdePasse' ghcr.io/blakeblackshear/frigate:stable ff900b6866c639bd85ac0b183cb3789059c404c93deee2ae051966bfff9fd428 frigate@localhost:~$&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le conteneur d&#233;marre correctement, mais le fichier de configuration par d&#233;faut de Frigate provoque quelques probl&#232;mes dans mon cas.&lt;br class='autobr' /&gt;
J'ai donc d&#251; l'adapter &#224; ma configuration, puis effectuer un red&#233;marrage forc&#233; du conteneur depuis l'interface Cockpit pour que les modifications soient prises en compte.&lt;/p&gt;
&lt;div class='spip_document_53 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://blog.lfz.ovh/IMG/png/2cam_cpu_only_detector.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/2cam_cpu_only_detector.png?1761478077' width='500' height='116' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;center&gt;&lt;p style='font-size:10pt;font-style: italic;margin-top:-30px;'&gt;Vitesse du d&#233;tecteur de frigate avec 2 cameras h264 2k et une d&#233;tection sur CPU uniquement&lt;/p&gt;
&lt;/center&gt;
&lt;p&gt;Les performances sont pour l'instant modestes, mais l'ajout de l'inf&#233;rence mat&#233;rielle pour la d&#233;tection devrait normalement les am&#233;liorer de mani&#232;re significative.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;3. D&#233;tails de la commande &#171; podman run &#187;&lt;/h2&gt;
&lt;p&gt;Je d&#233;taille ci-dessous, pour m&#233;moire, la commande de base pr&#233;sent&#233;e ci-dessus, accompagn&#233;e d'options et d'explications compl&#233;mentaires, pas toujours &#233;videntes &#224; saisir au premier abord, notamment en ce qui concerne les implications en mati&#232;re de s&#233;curit&#233;.&lt;br class='autobr' /&gt;
L'objectif &#233;tant de mettre en place un conteneur rootless, il serait dommage de tout compromettre en n&#233;gligeant ces aspects.&lt;/p&gt;
&lt;p&gt;&#9881;&#65039; &lt;strong&gt; Options g&#233;n&#233;rales Podman &lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;podman run -d \ --name frigate \ --restart=unless-stopped \ .... ghcr.io/blakeblackshear/frigate:stable&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;podman run&lt;/code&gt; initialise un nouveau conteneur nomm&#233; &#171; frigate &#187;, en utilisant l'image sp&#233;cifi&#233;e &#224; la fin de la commande. Le conteneur est lanc&#233; en mode d&#233;tach&#233;, c'est-&#224;-dire qu'il s'ex&#233;cute en arri&#232;re-plan comme un d&#233;mon, et il est configur&#233; pour red&#233;marrer automatiquement, sauf lorsqu'il est arr&#234;t&#233; manuellement.&lt;/p&gt;
&lt;p&gt;&#128190; &lt;strong&gt;M&#233;moire et p&#233;riph&#233;riques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'option &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--shm-size=256m&lt;/code&gt; permet de d&#233;finir la taille du segment m&#233;moire partag&#233; (/dev/shm), utile au buffering vid&#233;o (FFmpeg et TensorFlow l'utilisent)&lt;/p&gt;
&lt;p&gt;L'option &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--device /dev/dri:/dev/dri&lt;/code&gt; permet au conteneur Podman d'acc&#233;der directement &#224; la carte graphique de l'h&#244;te, activant ainsi l'acc&#233;l&#233;ration mat&#233;rielle (hardware) pour le traitement vid&#233;o.&lt;br class='autobr' /&gt;
Pour que cela fonctionne correctement, l'utilisateur ex&#233;cutant le conteneur (dans mon cas frigate) doit appartenir aux groupes video et render, afin d'avoir les permissions n&#233;cessaires sur les p&#233;riph&#233;riques GPU.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;frigate@localhost:~$ ls -al /dev/dri total 0 drwxr-xr-x. 3 root root 100 23 oct. 17:41 . drwxr-xr-x. 20 root root 4040 23 oct. 17:41 .. drwxr-xr-x. 2 root root 80 23 oct. 17:41 by-path crw-rw----. 1 root video 226, 1 23 oct. 17:41 card1 crw-rw-rw-. 1 root render 226, 128 23 oct. 17:41 renderD128 frigate@localhost:~$ sudo usermod -aG render frigate frigate@localhost:~$ sudo usermod -aG video frigate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#128274; &lt;strong&gt;S&#233;curit&#233; et permissions&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; --group-add keep-groups \ --security-opt label=disable \ --cap-add CAP_PERFMON \ --cap-add SYS_ADMIN \&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'option &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--group-add keep-groups&lt;/code&gt; autorise le conteneur &#224; h&#233;riter des groupes secondaires de l'utilisateur h&#244;te.&lt;br class='autobr' /&gt;
Cependant, ici, elle est superflue : les p&#233;riph&#233;riques GPU sont explicitement mont&#233;s via &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--device /dev/dri:/dev/dri&lt;/code&gt;, et l'utilisateur qui lance le conteneur &lt;i&gt;rootless&lt;/i&gt; est d&#233;j&#224; membre des groupes n&#233;cessaires (video et render).&lt;br class='autobr' /&gt;
Cette ligne est conserv&#233;e uniquement &#224; titre informatif.&lt;/p&gt;
&lt;p&gt;Sur une distribution &lt;strong&gt;Fedora Server&lt;/strong&gt;, la configuration par d&#233;faut de &lt;strong&gt;SELinux&lt;/strong&gt; emp&#234;che un conteneur rootless d'acc&#233;der aux statistiques du GPU, ce qui g&#233;n&#232;re l'erreur :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Unable to poll intel GPU stats: Failed to initialize PMU! (Operation not permitted)&lt;/code&gt;.&lt;br class='autobr' /&gt;
Les options permettent simplement de contourner cette restriction et d'obtenir l'acc&#232;s aux statistiques GPU, au prix d'un compromis sur la s&#233;curit&#233;.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--security-opt label=disable&lt;/code&gt; : D&#233;sactive l'isolation SELinux. &lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--cap-add CAP_PERFMON&lt;/code&gt; : Autorise la lecture des compteurs de performance mat&#233;riels (GPU/CPU).	Requis pour la t&#233;l&#233;m&#233;trie GPU (intel_gpu_top, Frigate GPU stats).&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--cap-add SYS_ADMIN&lt;/code&gt; : Donne un large acc&#232;s syst&#232;me (quasi root).&lt;/p&gt;
&lt;p&gt;
Pour m&#233;moire &#233;galement, l'option &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--privileged&lt;/code&gt; conf&#232;re au conteneur des privil&#232;ges quasi &#233;quivalents &#224; ceux du root de l'h&#244;te. Cela permet l'acc&#232;s direct &#224; tous les p&#233;riph&#233;riques (/dev/dri/*, /dev/video*, etc.), rendant superflue la configuration des groupes pour l'acc&#232;s GPU.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En environnement de production, l'acc&#232;s aux statistiques du GPU n'&#233;tant pas vital, il est conseill&#233; de retirer ces options afin de r&#233;duire les risques et renforcer la s&#233;curit&#233;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&#128194; &lt;strong&gt;Volumes et r&#233;pertoires mont&#233;s&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;-v /etc/localtime:/etc/localtime:ro	. -v /home/frigate/config:/config:z -v /home/frigate/media:/media/frigate:z&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ces options sont classiques sous Docker ou Podman et permettent de partager certains fichiers ou volumes entre l'h&#244;te et le conteneur.&lt;br class='autobr' /&gt;
Il faut toutefois pr&#234;ter une attention particuli&#232;re au montage des volumes : l'ajout de l'option &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;:z&lt;/code&gt; est n&#233;cessaire sous &lt;strong&gt;SELinux&lt;/strong&gt; afin d'ajuster automatiquement le contexte de s&#233;curit&#233; et permettre l'acc&#232;s aux donn&#233;es par le conteneur.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--tmpfs /tmp/cache:size=1000000000,mode=1777&lt;/code&gt;&lt;br class='autobr' /&gt;
Cette option cr&#233;ee un Ramdisk temporaire en m&#233;moire vive (&#8776; 1 Go) pour le cache vid&#233;o (plus rapide que le disque), accessible &#224; tous (mode=1777)&lt;/p&gt;
&lt;p&gt;&#127760; R&#233;seau et ports expos&#233;s&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; -p 5000:5000 \ -p 1935:1935 \ -p 8554:8554 \ -p 8555:8555/tcp \ -p 8555:8555/udp \&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ces options sont &#233;galement classiques sous Docker ou Podman et permettent d'exposer les ports de l'interface web de frigate (5000), des flux RTMP(1935) , des flux RTSP restream&#233;s (8554) et des flux WebRTC faible latence (8555 / UDP &amp; TCP)&lt;/p&gt;
&lt;p&gt;&#127807; &lt;strong&gt;Variables d'environnement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;-e FRIGATE_RTSP_PASSWORD=''monMotdePasse''&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Frigate int&#232;gre un serveur RTSP interne qui permet de restreamer les flux vid&#233;o des cam&#233;ras (par exemple pour les visualiser dans Home Assistant, VLC ou d'autres clients RTSP). La variable d'environnement FRIGATE_RTSP_PASSWORD sert &#224; d&#233;finir le mot de passe RTSP utilis&#233; pour acc&#233;der &#224; ces flux restream&#233;s sur &lt;i&gt;rtsp ://ip_du_serveur:8554/nom_de_camera ?user=frigate&amp;password='monMotdePasse'&lt;/i&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;4. Hailo 8L / Compilation &lt;/h2&gt;
&lt;p&gt;Le syst&#232;me logiciel Hailo est une pile d'&#233;l&#233;ments qui interagissent ensemble.&lt;/p&gt;
&lt;p&gt;1&#65039;&#8419; Pilote PCIe (Kernel Driver) : C'est le module bas niveau qui permet au syst&#232;me d'exploitation (Fedora Server) de voir le p&#233;riph&#233;rique et de communiquer avec lui (lecture/&#233;criture sur le bus PCIe).&lt;/p&gt;
&lt;p&gt;2&#65039;&#8419; Firmware (hailo8_fw.bin) : C'est le microcode qui est charg&#233; sur le Hailo-8L lui-m&#234;me par le pilote au d&#233;marrage. Il g&#232;re le fonctionnement interne de la puce.&lt;/p&gt;
&lt;p&gt;3&#65039;&#8419; Runtime HailoRT : C'est la biblioth&#232;que que vos applications utilisent pour envoyer des mod&#232;les et des donn&#233;es au p&#233;riph&#233;rique.&lt;/p&gt;
&lt;p&gt;Le pilote PCIe (driver), le runtime HailoRT (biblioth&#232;que logicielle) et le firmware du Hailo-8L doivent &lt;strong&gt;id&#233;alement &#234;tre de la m&#234;me version&lt;/strong&gt;, cela &#233;vite d'avoir &#224; ce poser des questions lorsque cela ne fonctionne pas.&lt;/p&gt;
&lt;p&gt;&#9881;&#65039; &lt;strong&gt;V&#233;rification de la d&#233;tection physique (PCIe)&lt;/strong&gt;&lt;br class='autobr' /&gt;
La commande lspci permet de v&#233;rifier la pr&#233;sence de la carte Hailo sur le bus PCI Express :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;johann@localhost:~$ lspci -nnk | grep -i hailo 04:00.0 Co-processor [0b40]: Hailo Technologies Ltd. Hailo-8 AI Processor [1e60:2864] (rev 01) Subsystem: Hailo Technologies Ltd. Hailo-8 AI Processor [1e60:2864] Kernel driver in use: hailo Kernel modules: hailo_pci&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si la carte est d&#233;tect&#233;e, une ligne mentionnant l'appareil devrait apparaitre. Les ligne &#171; Kernel driver in use &#187; et &#171; Kernel driver &#187; devraient &#234;tre vide &#224; ce stade, mais vous voyez un retour car, au moment o&#249; j'&#233;cris ceci, mon syst&#232;me est op&#233;rationnel et le pilote est d&#233;j&#224; charg&#233;.&#034;&lt;/p&gt;
&lt;p&gt;Si rien n'appara&#238;t : La carte n'est pas d&#233;tect&#233;e. Le probl&#232;me est mat&#233;riel (mauvaise installation, slot PCIe d&#233;sactiv&#233;/d&#233;fectueux, ou alimentation, ...).&lt;/p&gt;
&lt;p&gt;&#128269; &lt;strong&gt;Identification de la version du Runtime HailoRT&lt;/strong&gt;&lt;br class='autobr' /&gt;
Comme indiqu&#233; pr&#233;c&#233;demment, les trois composants de la pile logicielle Hailo doivent id&#233;alement &#234;tre de versions compatibles. Le driver s'ex&#233;cute sur le syst&#232;me h&#244;te, tandis que le runtime et les biblioth&#232;ques logicielles fonctionnent &#224; l'int&#233;rieur du conteneur Frigate. Une fois le conteneur op&#233;rationnel, la commande podman ci-dessus permet de v&#233;rifier la version du runtime utilis&#233;e par l'image Frigate.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;frigate@localhost:~$ podman exec frigate hailortcli --version HailoRT-CLI version 4.21.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#9881;&#65039; &lt;strong&gt;Compilation du pilote PCIe (Kernel Driver)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La documentation et les fichiers n&#233;cessaires pour la carte Hailo-8L requi&#232;rent la cr&#233;ation d'un compte d&#233;veloppeur sur le site &lt;a href=&#034;https://hailo.ai/developer-zone/software-downloads/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Hailo.ai&lt;/a&gt;. Bien qu'un paquet .deb pr&#234;t &#224; l'emploi soit fourni pour Ubuntu, aucune solution n'est propos&#233;e pour Fedora. &lt;br class='autobr' /&gt;
Pour contourner ce probl&#232;me, je me suis appuy&#233; sur la &lt;a href=&#034;https://docs.frigate.video/frigate/installation#hailo-8l&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;documentation de Frigate&lt;/a&gt;, qui fournit un &lt;a href=&#034;https://github.com/blakeblackshear/frigate/blob/dev/docker/hailo8l/user_installation.sh&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;script&lt;/a&gt; (&#224; adapter), permettant de t&#233;l&#233;charger directement les fichiers depuis le GitHub librement accessible, et les &#233;tapes de compilation.&lt;/p&gt;
&lt;p&gt;Avec le compte &lt;strong&gt;utilisateur administrateur&lt;/strong&gt;, voici l'ensemble des commandes que j'ai rentr&#233; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo dnf install -y gcc make cmake kernel-devel kernel-headers dkms git hailo_version='4.21.0' git clone --depth 1 --branch v${hailo_version} https://github.com/hailo-ai/hailort-drivers.git cd hailort-drivers/linux/pcie sudo make all sudo make install cd ../../ ./download_firmware.sh sudo mkdir /lib/firmware/hailo sudo cp hailo8_fw.4.21.0.bin /lib/firmware/hailo sudo ln -s /lib/firmware/hailo/hailo8_fw.4.21.0.bin /lib/firmware/hailo/hailo8_fw.bin sudo cp ./linux/pcie/51-hailo-udev.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules &amp;&amp; sudo udevadm trigger&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La r&#232;gle udev fixe les permissions sur /dev/hailo0 &#224; 0666&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cat ./linux/pcie/51-hailo-udev.rules #Change mode rules for Hailo's PCIe driver SUBSYSTEM=='hailo_chardev', MODE='0666'&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et enfin un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo modprobe hailo_pci&lt;/code&gt;, si tout c'est correctement d&#233;roul&#233;, entraine avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo dmesg&lt;/code&gt; le chargement du driver :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[161447.538082] hailo: Init module. driver version 4.21.0 [161447.538197] hailo 0000:04:00.0: Probing on: 1e60:2864... [161447.538205] hailo 0000:04:00.0: Probing: Allocate memory for device extension, 13192 [161447.549591] hailo 0000:04:00.0: Probing: Device enabled [161447.549626] hailo 0000:04:00.0: Probing: mapped bar 0 - 000000007146fbe2 16384 [161447.549639] hailo 0000:04:00.0: Probing: mapped bar 2 - 000000002a9ea0a1 4096 [161447.549650] hailo 0000:04:00.0: Probing: mapped bar 4 - 0000000064a2fabf 16384 [161447.549657] hailo 0000:04:00.0: Probing: Setting max_desc_page_size to 4096, (page_size=4096) [161447.549749] hailo 0000:04:00.0: Probing: Enabled 64 bit dma [161447.549755] hailo 0000:04:00.0: Probing: Using userspace allocated vdma buffers [161447.549761] hailo 0000:04:00.0: Disabling ASPM L0s [161447.549767] hailo 0000:04:00.0: Successfully disabled ASPM L0s [161447.552467] hailo 0000:04:00.0: soft reset finished [161447.552471] hailo 0000:04:00.0: Soft reset done [161447.552475] hailo 0000:04:00.0: Writing file hailo/hailo8_fw.bin [161447.599845] hailo 0000:04:00.0: File hailo/hailo8_fw.bin written successfully [161447.599849] hailo 0000:04:00.0: Writing file hailo/hailo8_board_cfg.bin [161447.599929] hailo 0000:04:00.0: File hailo/hailo8_board_cfg.bin written successfully [161447.599931] hailo 0000:04:00.0: Writing file hailo/hailo8_fw_cfg.bin [161447.599985] hailo 0000:04:00.0: File hailo/hailo8_fw_cfg.bin written successfully [161447.689228] hailo 0000:04:00.0: NNC Firmware loaded successfully [161447.689238] hailo 0000:04:00.0: FW loaded, took 138 ms [161447.700933] hailo 0000:04:00.0: Probing: Added board 1e60-2864, /dev/hailo0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il faut maintenant adapter la commande de lancement du conteneur Frigate pour qu'elle prenne en compte le nouveau p&#233;riph&#233;rique /dev/hailo0, fra&#238;chement reconnu par le syst&#232;me.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;podman run --replace -d --name frigate --restart=unless-stopped --shm-size=256m --device /dev/hailo0:/dev/hailo0 --device /dev/dri:/dev/dri -v /etc/localtime:/etc/localtime:ro -v /home/frigate/config:/config:z -v /home/frigate/media:/media/frigate:z --tmpfs /tmp/cache:size=1000000000,mode=1777 -p 5000:5000 -p 1935:1935 -p 8554:8554 -p 8555:8555/tcp -p 8555:8555/udp -e FRIGATE_RTSP_PASSWORD='monMotdePasse' ghcr.io/blakeblackshear/frigate:stable&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La commande &lt;strong&gt;hailortcli fw-control identify&lt;/strong&gt; lanc&#233;e &#224; l'int&#233;rieur du conteneur Frigate retourne l'&lt;strong&gt;erreur 13 (Permission denied)&lt;/strong&gt;, indiquant un d&#233;faut de permission d'acc&#232;s au Hailo.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;frigate@localhost:~$ podman exec frigate hailortcli fw-control identify [HailoRT] [error] CHECK failed - Failed to open device file /dev/hailo0 with error 13 [HailoRT] [error] CHECK_SUCCESS failed with status=HAILO_DRIVER_OPERATION_FAILED(36) [HailoRT] [error] CHECK_SUCCESS failed with status=HAILO_DRIVER_OPERATION_FAILED(36) [HailoRT] [error] CHECK_SUCCESS failed with status=HAILO_DRIVER_OPERATION_FAILED(36) [HailoRT CLI] [error] CHECK_SUCCESS failed with status=HAILO_DRIVER_OPERATION_FAILED(36)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;N'ayant pas install&#233; le runtime HailoRT sur l'h&#244;te, il n'est pas possible de tester la commande directement depuis celui-ci.&lt;br class='autobr' /&gt;
Cependant, les droits d'acc&#232;s sur /dev/hailo0 &#233;tant corrects et le driver PCIe correctement charg&#233;, SELinux appara&#238;t comme le principal suspect de ce probl&#232;me.&lt;/p&gt;
&lt;p&gt;Dans le terminal &lt;strong&gt;utilisateur administrateur&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;johann@localhost:~$ sudo ausearch -m AVC -ts recent ---- time-&gt;Mon Oct 27 09:46:00 2025 type=AVC msg=audit(1761554760.453:1201): avc: denied { read write } for pid=75883 comm=&#034;hailortcli&#034; name=&#034;hailo0&#034; dev=&#034;devtmpfs&#034; ino=812 scontext=system_u:system_r:container_t:s0:c132,c197 tcontext=system_u:object_r:device_t:s0 tclass=chr_file permissive=0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Les &lt;strong&gt;logs SELinux&lt;/strong&gt; indique bien un soucis. Je &lt;strong&gt;d&#233;sactive temporairement SELinux&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;johann@localhost:~$ getenforce Enforcing johann@localhost:~$ sudo setenforce 0 johann@localhost:~$ getenforce Permissive&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et dans le terminal &lt;strong&gt;utilisateur frigate&lt;/strong&gt;, on relance la commande :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;frigate@localhost:~$ podman exec frigate hailortcli fw-control identify Executing on device: 0000:04:00.0 Identifying board Control Protocol Version: 2 Firmware Version: 4.21.0 (release,app,extended context switch buffer) Logger Version: 0 Board Name: Hailo-8 Device Architecture: HAILO8L Serial Number: HLDDxxxxxxxxxxxx Part Number: HMxxxxxxxxxx Product Name: HAILO-8L AI ACC M.2 B+M KEY MODULE EXT TMP&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Bingo !!!&lt;/strong&gt; mais ne pas oublier de r&#233;tablir le mode &#171; Enforcing &#187; de SELinux avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo setenforce 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Je ne suis clairement pas un expert de SELinux, loin de l&#224;. Heureusement, ChatGPT m'a traduit tout &#231;a dans un langage enfin compr&#233;hensible par des &#234;tres humains. &#128517;&lt;/p&gt;
&lt;div class='spip_document_54 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://blog.lfz.ovh/IMG/png/chatgpt_selinux_hailo.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/chatgpt_selinux_hailo.png?1761556820' width='500' height='236' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;johann@localhost:~$ ls -Z /dev/hailo0 system_u:object_r:device_t:s0 /dev/hailo0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Tout comme Gemini :&lt;br class='autobr' /&gt;
&lt;i&gt;Gemini : Ce message de refus (AVC denied) de SELinux est tr&#232;s pr&#233;cis et indique clairement que le contexte de s&#233;curit&#233; de votre conteneur (container_t) n'a pas la permission d'acc&#233;der en lecture et en &#233;criture (read write) au p&#233;riph&#233;rique Hailo (hailo0), qui a le contexte de p&#233;riph&#233;rique g&#233;n&#233;rique (device_t).&lt;/i&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;5. Hailo 8L / SELinux &lt;/h2&gt;
&lt;p&gt;Apr&#232;s plusieurs &#233;changes avec les IA et quelques tests, deux solutions se d&#233;gagent. Pour ma part, j'ai mis en &#339;uvre avec succ&#232;s la seconde, bas&#233;e sur la cr&#233;ation d'une politique SELinux sp&#233;cifique car c'est la solution pr&#233;conis&#233;e par Cockpit dans le menu SELinux de l'interface.&lt;/p&gt;
&lt;div class='spip_document_58 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://blog.lfz.ovh/IMG/png/capture_cockpit_selinux.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/capture_cockpit_selinux.png?1761608821' width='500' height='229' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;1&#65039;&#8419; &lt;strong&gt;Solution semanage / restorecon&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; sudo semanage fcontext -a -t container_file_t '/dev/hailo0'&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Ceci &#233;tablit une r&#232;gle persistante (une &#034;policy file context&#034;) dans la base de donn&#233;es de SELinux.&lt;/li&gt;&lt;li&gt;La r&#232;gle dit : &#034;Chaque fois que le syst&#232;me rencontre le chemin /dev/hailo0, il doit lui attribuer le type container_file_t.&#034;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; sudo restorecon -v /dev/hailo0 :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Ceci est la commande d'ex&#233;cution. Elle applique imm&#233;diatement la r&#232;gle d&#233;finie par semanage fcontext.&lt;/li&gt;&lt;li&gt; Elle change le contexte de s&#233;curit&#233; actuel du fichier /dev/hailo0 en container_file_t.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;La probl&#233;matique de cette approche est qu'elle autorise tous les conteneurs &#224; faire toutes les op&#233;rations (lecture/&#233;criture, etc.) sur /dev/hailo0.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour att&#233;nuer cette probl&#233;matique, on peut s'assurer que le p&#233;riph&#233;rique /dev/hailo0 appartient &#224; un groupe sp&#233;cifique (par exemple, le groupe hailo). L'utilisateur ex&#233;cutant le conteneur Frigate (en mode rootless) doit ensuite &#234;tre ajout&#233; &#224; ce m&#234;me groupe pour h&#233;riter des droits d'acc&#232;s.&#034;&lt;/p&gt;
&lt;p&gt;Le fichier &#171; /etc/udev/rules.d/51-hailo-udev.rules &#187; serait modifier pour contenir &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;SUBSYSTEM=='hailo_chardev', GROUP='hailo', MODE='0660'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;2&#65039;&#8419; &lt;strong&gt;Solution audit2allow&lt;/strong&gt;&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;Installation des Outils N&#233;cessaires&lt;/i&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo dnf install policycoreutils-devel -y&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Identification des refus dans les logs&lt;/i&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo ausearch -m avc | grep hailo&lt;/code&gt;&lt;br class='autobr' /&gt;
Toutes les tentatives infructueuses devraient s'afficher&lt;/li&gt;&lt;li&gt; &lt;i&gt;G&#233;n&#233;ration d'une r&#232;gle de politique SELinux&lt;/i&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo ausearch -m avc -c hailortcli | audit2allow -M hailo&lt;/code&gt;&lt;br class='autobr' /&gt;
&#128073; Cela cr&#233;e deux fichiers dans ton r&#233;pertoire courant :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; hailo.te &#8594; le texte de la r&#232;gle SELinux&lt;/li&gt;&lt;li&gt; hailo.pp &#8594; le module compil&#233; pr&#234;t &#224; &#234;tre charg&#233;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;module hailo 1.0; require { type container_t; type device_t; class chr_file { ioctl open read write }; } #============= container_t ============== #!!!! This avc can be allowed using the boolean 'container_use_devices' allow container_t device_t:chr_file { ioctl read write }; #!!!! This avc is allowed in the current policy allow container_t device_t:chr_file open;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;Chargement du module de politique hailo&lt;/i&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo semodule -i hailo.pp&lt;/code&gt;&lt;br class='autobr' /&gt;
Cette r&#232;gle devient persistante entre les red&#233;marrages.&lt;/li&gt;&lt;li&gt; &lt;i&gt;V&#233;rification Finale&lt;/i&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo semodule -l | grep hailo&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Lancez &#224; nouveau dans le terminal utilisateur standard,la commande qui &#233;chouait :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;podman exec -it frigate hailortcli fw-control identify&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Si la politique a &#233;t&#233; correctement appliqu&#233;e, la commande devrait maintenant r&#233;ussir &#224; s'ex&#233;cuter, et vous verrez les d&#233;tails de votre carte Hailo-8L. Votre syst&#232;me reste en mode enforcing, garantissant la s&#233;curit&#233; pour toutes les autres op&#233;rations non li&#233;es &#224; votre carte.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;5. Podman Frigate / Systemd &lt;/h2&gt;
&lt;p&gt;Deux approches sont possibles :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Utiliser Quadlet, la m&#233;thode recommand&#233;e et native pour l'int&#233;gration de Podman avec systemd,&lt;/li&gt;&lt;li&gt; ou Employer la m&#233;thode dite &#171; classique &#187;, d&#233;sormais consid&#233;r&#233;e comme obsol&#232;te mais toujours parfaitement fonctionnelle, via la commande suivante :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;podman generate systemd --name frigate --files --new&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;J'ai mis en oeuvre pour ma part la deuxi&#232;me solution, voici mon mode op&#233;ratoire&lt;br class='autobr' /&gt;
&lt;i&gt;Dans un terminal de l'&lt;strong&gt;utilisateur standard Frigate&lt;/strong&gt; :&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Lancer le container frigate avec ces options d&#233;finitives :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;podman run --replace -d --name frigate --restart=unless-stopped --shm-size=256m --device /dev/hailo0:/dev/hailo0 --device /dev/dri:/dev/dri -v /etc/localtime:/etc/localtime:ro -v /home/frigate/config:/config:z -v /home/frigate/media:/media/frigate:z --tmpfs /tmp/cache:size=1000000000,mode=1777 -p 5000:5000 -p 1935:1935 -p 8554:8554 -p 8555:8555/tcp -p 8555:8555/udp -e FRIGATE_RTSP_PASSWORD='motDePasse' ghcr.io/blakeblackshear/frigate:stable&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; S'assurer du bon fonctionnement de frigate, avec une attention particuli&#232;re pour l'acc&#233;l&#233;ration GPU et NPU Hailo. Les &#171; journaux syst&#232;me &#187; et les &#171; Incateurs syst&#232;mes &#187; du menu permettent d'&#233;tablir rapidement un diagnostique.&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; G&#233;n&#233;rer le fichier container-frigate.service avec la commande&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;podman generate systemd --name frigate --files --new&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Valider le contenu du container-frigate.service : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;cat container-frigate.service&lt;/code&gt; et modifier au besoin&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Cr&#233;er le r&#233;pertoire /home/frigate/.config/systemd/user et copier/d&#233;placer le fichier container-frigate.service dans ce r&#233;pertoire&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mkdir -p ~/.config/systemd/user cp ./container-frigate.service ~/.config/systemd/user&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Informer systemd d'une modification des fichiers de configuration : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;systemctl --user daemon-reload&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; Activer le service container frigate : &lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;systemctl --user enable --now container-frigate.service&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;
&lt;i&gt;Dans un terminal de l'&lt;strong&gt;utilisateur administrateur&lt;/strong&gt; :&lt;/i&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo loginctl enable-linger frigate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Bien que n'ayant pas mis en oeuvre la premi&#232;re solution (Quadlet), le &lt;a href=&#034;https://www.linuxtricks.fr/wiki/quadlet-execution-de-conteneurs-podman-sous-systemd&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;site linuxtricks&lt;/a&gt; propose un &#233;clairage tr&#232;s pertinent sur la m&#233;thode.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;6. Conclusion &lt;/h2&gt;
&lt;p&gt;Je ne pr&#233;tends pas ma&#238;triser tous les aspects de Podman et systemd, et il est possible que certaines &#233;tapes puissent &#234;tre am&#233;lior&#233;es.&lt;br class='autobr' /&gt;
Quoi qu'il en soit, mon installation Frigate est op&#233;rationnelle, et si ce guide peut aider ne serait-ce qu'un peu, l'objectif est atteint.&lt;/p&gt;
&lt;div class='spip_document_56 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://blog.lfz.ovh/IMG/png/2cam_hailo_detector.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/2cam_hailo_detector.png?1761587361' width='500' height='114' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Apr&#232;s, on ve na pas se mentir, cela est bien plus complexe que la solution actuelle Proxmox + LXC + Docker.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>G&#233;olocalisation et Home assistant</title>
		<link>https://blog.lfz.ovh/spip.php?article3</link>
		<guid isPermaLink="true">https://blog.lfz.ovh/spip.php?article3</guid>
		<dc:date>2025-08-07T20:40:28Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>johann</dc:creator>



		<description>
&lt;p&gt;L'objectif est de g&#233;olocaliser une personne &#224; l'aide de son smartphone, puis de transmettre cette information &#224; un serveur domotique (Home Assistant dans mon cas). La position ainsi obtenue permet de d&#233;clencher des automatisations sp&#233;cifiques, comme par exemple l'activation ou la d&#233;sactivation d'une alarme. &lt;br class='autobr' /&gt; Infrastructures envisageables &lt;br class='autobr' /&gt;
Pour atteindre cet objectif, plusieurs solutions techniques peuvent &#234;tre envisag&#233;es : Utiliser l'application companion de Home Assistant : Il s'agit (&#8230;)&lt;/p&gt;


-
&lt;a href="https://blog.lfz.ovh/spip.php?rubrique2" rel="directory"&gt;Domotique&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='https://blog.lfz.ovh/IMG/logo/logo_geoloc.png?1754212655' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;L'objectif est de g&#233;olocaliser une personne &#224; l'aide de son smartphone, puis de transmettre cette information &#224; un serveur domotique (Home Assistant dans mon cas). La position ainsi obtenue permet de d&#233;clencher des automatisations sp&#233;cifiques, comme par exemple l'activation ou la d&#233;sactivation d'une alarme.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt; Infrastructures envisageables &lt;/h2&gt;
&lt;p&gt;Pour atteindre cet objectif, plusieurs solutions techniques peuvent &#234;tre envisag&#233;es :&lt;/p&gt;
&lt;div class='spip_document_37 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://blog.lfz.ovh/IMG/png/illustration.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/illustration.png?1754225382' width='500' height='500' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Utiliser l'application &lt;a href=&#034;https://play.google.com/store/apps/details?id=io.homeassistant.companion.android&amp;hl=fr&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;companion de Home Assistant&lt;/a&gt; :&lt;/strong&gt; &lt;br class='autobr' /&gt;
Il s'agit de la solution la plus simple &#224; mettre en &#339;uvre, tout en offrant une excellente fiabilit&#233;. Toutefois, cette approche pr&#233;sente quelques inconv&#233;nients :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; L'utilisateur doit disposer d'un compte avec les droits d'acc&#232;s au syst&#232;me Home Assistant, ce qui n'est pas toujours pertinent ni souhaitable, notamment pour un utilisateur novice.&lt;/li&gt;&lt;li&gt; La fr&#233;quence des mises &#224; jour de position n'est pas enti&#232;rement ma&#238;trisable, ce qui peut limiter la r&#233;activit&#233; des automatisations.&lt;/li&gt;&lt;li&gt; Cette solution restreint l'utilisation &#224; l'&#233;cosyst&#232;me Home Assistant, sauf si l'on met en place dans celui-ci, des actions sp&#233;cifiques permettant de redistribuer l'information, par exemple via un partage des donn&#233;es de g&#233;olocalisation sur un broker MQTT.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Utiliser l'API REST du syst&#232;me domotique :&lt;/strong&gt;&lt;br class='autobr' /&gt;
Cette solution est compatible non seulement avec Home Assistant, mais &#233;galement avec d'autres plateformes domotiques disposant d'une interface REST, comme Jeedom. Elle pr&#233;sente toutefois certains inconv&#233;nients :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Une complexit&#233; technique plus &#233;lev&#233;e, notamment en raison de la mise en &#339;uvre de m&#233;canismes d'authentification n&#233;cessaires pour garantir un niveau minimal de s&#233;curit&#233;.&lt;/li&gt;&lt;li&gt; Une adaptation sp&#233;cifique &#224; chaque syst&#232;me domotique, les API REST variant d'un syst&#232;me &#224; l'autre.&lt;br class='autobr' /&gt; Ce point peut n&#233;anmoins &#234;tre vu comme un avantage : il devient possible de cibler plusieurs syst&#232;mes en parall&#232;le en envoyant simplement les m&#234;mes donn&#233;es de g&#233;olocalisation &#224; diff&#233;rentes interfaces via des requ&#234;tes multiples.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt;&lt;strong&gt; Utiliser un broker MQTT :&lt;/strong&gt;&lt;br class='autobr' /&gt;
Il s'agit d'une solution plus universelle, compatible avec tout logiciel prenant en charge le protocole MQTT, tels que Home Assistant, Jeedom ou Node-RED. Elle permet une grande souplesse dans la distribution des donn&#233;es de g&#233;olocalisation entre diff&#233;rents syst&#232;mes.&lt;br class='autobr' /&gt;
Cependant, cette approche implique une mise en &#339;uvre plus complexe. En plus du serveur domotique, il est n&#233;cessaire de d&#233;ployer un broker MQTT, avec toute la configuration associ&#233;e, notamment en mati&#232;re de s&#233;curisation.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Il est &#233;galement possible de combiner ces diff&#233;rentes solutions, afin de tirer parti des avantages de chacune.&lt;br class='autobr' /&gt;
Par exemple, l'application compagnon de Home Assistant peut &#234;tre utilis&#233;e en parall&#232;le d'un envoi de donn&#233;es via MQTT ou vers une API REST, permettant ainsi une plus grande flexibilit&#233;, une redondance fonctionnelle et une interop&#233;rabilit&#233; entre plusieurs syst&#232;mes domotiques.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Mise en garde&lt;/h2&gt;
&lt;p&gt;Quelle que soit la solution retenue, le serveur domotique &#8212; ou le broker MQTT dans le cas d'une architecture distribu&#233;e &#8212; doit &#234;tre accessible depuis Internet.&lt;br class='autobr' /&gt;
Cela implique de porter une attention particuli&#232;re &#224; la s&#233;curit&#233; des communications : utilisation de connexions chiffr&#233;es (HTTPS/TLS), authentification robuste, et protection des acc&#232;s.&lt;/p&gt;
&lt;p&gt;Il vous appartient de ma&#238;triser parfaitement les implications techniques de cette acc&#232;s depuis l'Internet, notamment en ce qui concerne :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; L'ouverture de ports sur la box Internet,&lt;/li&gt;&lt;li&gt; La mise en place &#233;ventuelle d'un reverse proxy s&#233;curis&#233;,&lt;/li&gt;&lt;li&gt; La surveillance des connexions et des tentatives d'intrusion.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;En cas de doute, il est vivement conseill&#233; de s'appuyer sur des solutions s&#233;curis&#233;es pr&#234;tes &#224; l'emploi comme &lt;a href=&#034;https://www.nabucasa.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Nabu Casa&lt;/a&gt; propos&#233; par l'offre Cloud Home Assistant.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Application mobile Home Assistant &lt;a href=&#034;https://play.google.com/store/apps/details?id=io.homeassistant.companion.android&amp;hl=fr&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;companion&lt;/a&gt; :&lt;/h2&gt;&lt;div class='spip_document_38 spip_document spip_documents spip_document_image spip_documents_right spip_document_right'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://blog.lfz.ovh/local/cache-vignettes/L435xH588/creer_user_ha-27cf7.png?1771485815' width='435' height='588' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&#192; moins d'avoir un besoin sp&#233;cifique et/ou d'&#234;tre l'administrateur de l'instance Home Assistant, il est recommand&#233; de cr&#233;er un utilisateur d&#233;di&#233; &#224; l'utilisation de l'application compagnon.&lt;br class='autobr' /&gt;
Cette cr&#233;ation se fait via le menu Param&#232;tres &gt; Personnes dans Home Assistant. L'utilisateur ainsi cr&#233;&#233; devra disposer des droits n&#233;cessaires pour se connecter &#224; l'instance&lt;/p&gt;
&lt;p&gt;L'installation et la configuration de l'application mobile Companion restent relativement accessibles. Il est n&#233;cessaire de renseigner l'adresse externe (accessible depuis Internet) de votre instance Home Assistant, ainsi que les identifiants de l'utilisateur pr&#233;alablement cr&#233;&#233;.&lt;/p&gt;
&lt;div class='spip_document_39 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://blog.lfz.ovh/IMG/png/companion_global.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/companion_global.png?1754383021' width='500' height='148' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;L'autorisation d'acc&#232;s &#224; la localisation doit &#233;galement &#234;tre accord&#233;e &#224; l'application. Cette &#233;tape d&#233;clenchera des messages de configuration du syst&#232;me Android relatifs aux droits d'acc&#232;s &#224; la position.&lt;br class='autobr' /&gt;
Il est important de configurer ces permissions en ad&#233;quation avec l'objectif recherch&#233; (suivi en temps r&#233;el, en arri&#232;re-plan, etc.), afin d'assurer un fonctionnement fiable des automatisations bas&#233;es sur la g&#233;olocalisation.&lt;/p&gt;
&lt;p&gt;Une fois ces &#233;tapes termin&#233;es et valid&#233;es, une entit&#233; de type device_tracker devrait appara&#238;tre automatiquement dans Home Assistant (dans mon exemple &lt;i&gt;device_tracker.portableBlogUser&lt;/i&gt;)&lt;br class='autobr' /&gt;
Cette entit&#233; a un &#233;tat indiquant le lieu (home, not_home, maison, etc....), et expose plusieurs attributs utiles tels que la latitude, la longitude, la vitesse, la pr&#233;cision de localisation, etc.&lt;/p&gt;
&lt;div class='spip_document_40 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://blog.lfz.ovh/IMG/png/device_tracker.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/device_tracker.png?1754413033' width='500' height='323' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Par ailleurs, dans l'application mobile Companion, via le menu Param&#232;tres de l'application &gt; G&#233;rer les capteurs, il est possible d'activer la remont&#233;e d'autres donn&#233;es pertinentes comme par exemple le niveau de batterie. Ces informations peuvent pr&#233;sent&#233;es un int&#233;r&#234;t dans les automatisations pour affiner les sc&#233;narios domotiques.&lt;/p&gt;
&lt;div class='spip_document_41 spip_document spip_documents spip_document_image spip_documents_right spip_document_right'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://blog.lfz.ovh/local/cache-vignettes/L346xH614/association_tracker_person-f69ab.png?1771485815' width='346' height='614' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Home Assistant distingue les entit&#233;s de type &lt;i&gt;device_tracker&lt;/i&gt; des entit&#233;s de type &lt;i&gt;person&lt;/i&gt;, m&#234;me si le &#171; tracker &#187; a &#233;t&#233; g&#233;n&#233;r&#233; via le compte d'un utilisateur donn&#233;.&lt;br class='autobr' /&gt;
Il est donc n&#233;cessaire d'associer manuellement le &#171; tracker &#187; nouvellement cr&#233;&#233; &#224; une ou plusieurs personnes, afin de permettre &#224; Home Assistant de suivre leur pr&#233;sence de mani&#232;re coh&#233;rente. Pour effectuer cette association :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Connectez-vous en tant qu'administrateur.&lt;/li&gt;&lt;li&gt; Rendez-vous dans le menu Param&#232;tres &gt; Personnes.&lt;/li&gt;&lt;li&gt; S&#233;lectionnez la personne &#224; laquelle vous souhaitez associer le &#171; tracker &#187;.&lt;/li&gt;&lt;li&gt; En bas de la fen&#234;tre, &#224; l'endroit intitul&#233; &#171; S&#233;lectionnez les appareils qui appartiennent &#224; cette personne &#187;, choisissez ou saisissez le nom du &#171; tracker &#187;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Une fois cette association r&#233;alis&#233;e, Home Assistant combinera automatiquement les informations du &#171; tracker &#187; avec l'&#233;tat de pr&#233;sence de la personne&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Nota : Une version de l'application &lt;a href=&#034;https://apps.apple.com/fr/app/home-assistant/id1099568401&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Companion&lt;/a&gt; existe &#233;galement pour les appareils Apple (iOS). N'&#233;tant pas familier de cet environnement, je ne peux pas d&#233;tailler pr&#233;cis&#233;ment sa configuration. Toutefois, les principes g&#233;n&#233;raux restent similaires : connexion &#224; l'instance Home Assistant via une adresse externe, authentification avec un utilisateur d&#233;di&#233;, et autorisation de la g&#233;olocalisation afin de permettre les automatisations bas&#233;es sur la position.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;API REST de Home Assistant&lt;/h2&gt;
&lt;p&gt;L'objectif est d'envoyer les donn&#233;es de g&#233;olocalisation directement vers une entit&#233; device_tracker de Home Assistant, en utilisant une requ&#234;te HTTP/HTTPS adress&#233;e &#224; son API REST. Pour cela, plusieurs &#233;tapes sont n&#233;cessaires des deux c&#244;t&#233;s : c&#244;t&#233; Home Assistant et c&#244;t&#233; smartphone.&lt;/p&gt;
&lt;div class='spip_document_42 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://blog.lfz.ovh/IMG/png/ha_rest_illustration.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/ha_rest_illustration.png?1754466554' width='500' height='243' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&#128295; C&#244;t&#233; Home Assistant :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; V&#233;rifier et ajuster la configuration pour autoriser l'acc&#232;s &#224; l'API REST,&lt;/li&gt;&lt;li&gt; Cr&#233;er un jeton (token) d'authentification pour le smartphone &#233;metteur,&lt;/li&gt;&lt;li&gt; Cr&#233;er l'entit&#233; &lt;i&gt;device_tracker cible&lt;/i&gt;, afin qu'elle puisse &#234;tre mise &#224; jour depuis une requ&#234;te externe.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&#128241; C&#244;t&#233; smartphone :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Mettre en place une solution capable de collecter la position GPS,&lt;/li&gt;&lt;li&gt; Transmettre &#224; Home Assistant via une requ&#234;te HTTP(S)&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;C&#244;t&#233; smartphone, plusieurs applications permettent d'automatiser la r&#233;cup&#233;ration et l'envoi de la g&#233;olocalisation. Parmi les solutions envisageables : Tasker, Automate, Node-RED (en version mobile), IFTTT, etc.&lt;/p&gt;
&lt;p&gt;Pour ma part, j'ai choisi &lt;a href=&#034;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&amp;hl=fr&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Tasker&lt;/a&gt;, principalement pour sa simplicit&#233; de mise en &#339;uvre et sa grande flexibilit&#233;, m&#234;me il est n&#233;cessaire d'acqu&#233;rir la version payante. Internet regorge de comparatifs et de tutoriels si vous souhaitez explorer d'autres solutions logicielles que celle pr&#233;sent&#233;e ici.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&#128295; V&#233;rifier et ajuster la configuration pour autoriser l'acc&#232;s &#224; l'API REST&lt;/strong&gt;&lt;br class='autobr' /&gt;
Il est important de v&#233;rifier le contenu du fichier configuration.yaml de Home Assistant. Dans la plupart des cas, la configuration est d&#233;j&#224; correcte si vous avez mis en place un acc&#232;s externe (autre que via Nabu Casa).&lt;/p&gt;
&lt;p&gt;Par exemple, dans mon cas, l'acc&#232;s est autoris&#233; via un reverse proxy et depuis ma passerelle Internet, ce qui permet aux requ&#234;tes entrantes d'atteindre Home Assistant de mani&#232;re s&#233;curis&#233;e.&lt;/p&gt;
&lt;pre&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http: ip_ban_enabled: true login_attempts_threshold: 3 use_x_forwarded_for: true trusted_proxies: - 192.168.5.240/32 # Reverse Proxy on Local Lan - 192.168.5.254/32 # Gateway on Local Lan - 172.20.0.0/16 # Depend on HA Docker network&lt;/code&gt; &lt;/pre&gt;&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Conseil pour les tests : Il est recommand&#233; de d&#233;sactiver &lt;strong&gt;temporairement&lt;/strong&gt; l'option ip_ban_enabled durant les phases de configuration et de test. Cela &#233;vite un bannissement en cas de tentatives incorrectes. Une fois la solution valid&#233;e et fonctionnelle, &lt;strong&gt;r&#233;activez cette option pour renforcer la s&#233;curit&#233;&lt;/strong&gt; de votre installation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;
&lt;strong&gt; &#128273; Cr&#233;er un jeton d'acc&#232;s &#224; longue dur&#233;e&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour g&#233;n&#233;rer un jeton d'acc&#232;s (long-live token) :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Cliquez sur votre nom et/ou avatar situ&#233; en bas de la barre lat&#233;rale gauche pour ouvrir le menu Profil.&lt;/li&gt;&lt;li&gt; Rendez-vous dans l'onglet &#034;S&#233;curit&#233;&#034;.&lt;/li&gt;&lt;li&gt; En bas de la page, cliquez sur le bouton &#171; Cr&#233;er un jeton &#187;.&lt;/li&gt;&lt;li&gt; Donnez un nom explicite &#224; votre jeton (par exemple : tasker_gps_tracker) et validez.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;&#9888;&#65039; Important : Copiez et sauvegardez imm&#233;diatement le jeton g&#233;n&#233;r&#233;. Il ne sera affich&#233; qu'une seule fois. Si vous le perdez, il faudra en g&#233;n&#233;rer un nouveau.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous rencontrez des difficult&#233;s lors de la mise en &#339;uvre avec Home Assistant, vous pouvez consulter ce &lt;a href=&#034;https://www.scrample.xyz/utilisation-de-tasker-avec-home-assistant/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;tutoriel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;
&lt;strong&gt; &#128736;&#65039; Cr&#233;ation de l'entit&#233; &lt;i&gt;device_tracker&lt;/i&gt; cible&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'&#233;tape de cr&#233;ation manuelle de l'entit&#233; &#171; device_tracker &#187; via un appel au service &#171; device_tracker.see &#187;, comme d&#233;crit ci-dessous, &lt;strong&gt;n'est pas indispensable&lt;/strong&gt;. &lt;br class='autobr' /&gt;
En effet, lors de la premi&#232;re requ&#234;te valide &#233;mise par le smartphone via l'API REST, si l'entit&#233; sp&#233;cifi&#233;e n'existe pas, Home Assistant se chargera automatiquement de la cr&#233;er.&lt;/p&gt;
&lt;p&gt;Il est important de noter que la moindre erreur de syntaxe dans le nom de l'entit&#233; (champ dev_id) entra&#238;nera la cr&#233;ation d'une nouvelle entit&#233; incorrecte. Par cons&#233;quent, vous risquez de chercher une entit&#233; qui n'existe pas, simplement &#224; cause d'une faute de frappe. &lt;br class='autobr' /&gt;
C'est pourquoi je pr&#233;f&#232;re, dans ma propre d&#233;marche, cr&#233;er manuellement l'entit&#233; &#171; device_tracker &#187; dans Home Assistant avant toute automatisation c&#244;t&#233; smartphone. Cela pr&#233;sente plusieurs avantages :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &#201;viter les erreurs de nommage susceptibles de g&#233;n&#233;rer des entit&#233;s fant&#244;mes ou incorrectes,&lt;/li&gt;&lt;li&gt; Mieux structurer la configuration en ayant une vue claire sur les entit&#233;s existantes.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&#192; ce jour, sauf m&#233;connaissance de ma part, Home Assistant ne permet pas de cr&#233;er directement une entit&#233; &lt;a href=&#034;https://www.home-assistant.io/integrations/device_tracker/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;i&gt;device_tracker&lt;/i&gt;&lt;/a&gt; de type gps via un menu ou par une configuration YAML (documentation officielle).&lt;/p&gt;
&lt;p&gt;&#128161; Astuce : Pour forcer la cr&#233;ation de l'entit&#233;, il est possible de simuler une mise &#224; jour via l'appel du service &#171; device_tracker.see &#187; sur une entit&#233; encore inexistante. D&#232;s la premi&#232;re mise &#224; jour re&#231;ue, Home Assistant cr&#233;era automatiquement l'entit&#233; si elle n'existe pas encore. Cette m&#233;thode n'est pas de moi, mais provient d'un &#233;change sur le &lt;a href=&#034;https://community.home-assistant.io/t/user-can-make-own-device-tracker/749072/1&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;forum officiel Home Assistant&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;service: device_tracker.see data: dev_id: fake_tracker gps: - 48.67 - 12.5 gps_accuracy: 10&lt;/code&gt; &lt;/pre&gt;
&lt;p&gt;L'acc&#232;s au service &#171; device_tracker.see &#187; se fait par le menu Outils de d&#233;veloppement, puis l'onglet Actions. Les valeurs saisies n'ont pour l'instant aucune importance.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&#128241; C&#244;t&#233; smartphone&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour la suite de cette mise en &#339;uvre, j'utiliserai l'application &lt;a href=&#034;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&amp;hl=fr&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Tasker&lt;/a&gt; sur Android. Avant d'entrer dans les d&#233;tails, il est important de bien comprendre deux concepts fondamentaux de ce logiciel :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Les Profils&lt;/strong&gt; : ils d&#233;finissent les conditions ou d&#233;clencheurs (ex. changement de position, niveau de batterie, heure, connexion &#224; un WIFI particulier, etc.). Il peuvent &#234;tre &lt;strong&gt;actifs&lt;/strong&gt; ou &lt;strong&gt;inactifs&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Les Actions&lt;/strong&gt; : ce sont les t&#226;ches ex&#233;cut&#233;es lorsque les conditions d'un profil sont remplies (ex. envoi d'une requ&#234;te HTTP, affichage de notification, etc.).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Dans un premier temps, pour assurer une mise &#224; jour r&#233;guli&#232;re de la position, il est possible de d&#233;finir un profil cyclique dans Tasker. Par exemple, un d&#233;clenchement toutes les 5 minutes permet un bon compromis entre pr&#233;cision et consommation de batterie.&lt;/p&gt;
&lt;p&gt;La cr&#233;ation d'un tel profil se fait depuis l'onglet &#171; Profils &#187; de Tasker :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Appuyez sur le bouton &#171; + &#187; pour ajouter un nouveau profil.&lt;/li&gt;&lt;li&gt; S&#233;lectionnez le contexte &#034;Heure&#034;.&lt;/li&gt;&lt;li&gt; D&#233;finissez :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Heure de d&#233;but : 00:00&lt;/li&gt;&lt;li&gt; Heure de fin : 23:59&lt;/li&gt;&lt;li&gt; Fr&#233;quence : toutes les 5 minutes (ou autre selon vos besoins)
&lt;div class='spip_document_44 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://blog.lfz.ovh/local/cache-vignettes/L303xH643/profil_tasker_5mn-6b36f.png?1771485815' width='303' height='643' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Ce param&#233;trage permet au profil d'&#234;tre actif en continu tout au long de la journ&#233;e, avec une activation toutes les 5 minutes. &lt;/i&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Une fois la configuration du profil valid&#233;e (en appuyant sur la fl&#232;che retour en haut &#224; gauche), Tasker vous proposera d'associer une t&#226;che, soit une nouvelle t&#226;che, soit une t&#226;che existante.&lt;/p&gt;
&lt;p&gt;Cette t&#226;che sera ex&#233;cut&#233;e automatiquement &#224; chaque fois que le profil devient actif . Pour ma part, j'ai choisi de cr&#233;er une nouvelle t&#226;che que j'ai nomm&#233;e &#171; Localisation &#187;. Bien entendu, ces valeurs sont &#224; adapter selon votre propre sc&#233;nario.&lt;/p&gt;
&lt;p&gt;Ce profil s'activera bri&#232;vement &#224; l'intervalle sp&#233;cifi&#233;. Lorsqu'il est actif, l'action associ&#233;e &#171; Localisation &#187; aura pour r&#244;le de :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Acqu&#233;rir la position GPS actuelle du smartphone (latitude, longitude),&lt;/li&gt;&lt;li&gt; Formater ces donn&#233;es dans un un payload JSON,&lt;/li&gt;&lt;li&gt; Envoyer une requ&#234;te HTTPS/POST sur l'API REST Home Assistant, en incluant le token d'acc&#232;s pr&#233;alablement g&#233;n&#233;r&#233;.&lt;/li&gt;&lt;/ul&gt;&lt;div class='spip_document_43 spip_document spip_documents spip_document_image spip_documents_right spip_document_right'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://blog.lfz.ovh/IMG/jpg/http_request_task_details.jpg' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/jpeg&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/jpg/http_request_task_details.jpg?1754512544' width='500' height='833' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div style=&#034;font-size: 10px;&#034;&gt;&lt;pre&gt; Task: Localisation A1: Get Location v2 [ Timeout (Seconds): 30 ] A2: HTTP Request [ Method: POST URL: https://IP_EXTERNE_HA/api/services/device_tracker/see Headers: Authorization:Bearer YOUR_TOKEN content-type:application/json Body: { &#034;dev_id&#034; : &#034;fake_tracker&#034;, &#034;gps&#034; : [%gl_latitude, %gl_longitude ], &#034;gps_accuracy&#034; : %gl_coordinates_accuracy, &#034;battery&#034; : %BATT } Timeout (Seconds): 30 Automatically Follow Redirects: On Structure Output (JSON, etc): On Continue Task After Error:On ] &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#192; ce stade, &lt;strong&gt;la g&#233;olocalisation doit &#234;tre fonctionnelle&lt;/strong&gt; et les donn&#233;es de position doivent remonter correctement dans Home Assistant. Il reste cependant une &#233;tape importante : associer l'entit&#233; &#171; device_tracker &#187; &#224; une personne.&lt;br class='autobr' /&gt;
Cette op&#233;ration se fait dans le menu Param&#232;tres &gt; Personnes, comme d&#233;crit pr&#233;c&#233;demment dans le paragraphe sur l'application Companion.&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;&#128161; Il est tout &#224; fait possible d'associer plusieurs device_tracker &#224; une m&#234;me personne. Dans mon propre syst&#232;me, l'application Android Home Assistant Companion et une automatisation Tasker personnalis&#233;e remontent toutes deux ma position g&#233;ographique.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une simple action de localisation toutes les x minutes peut suffire, mais il ne faut pas n&#233;gliger l'impact de l'usage r&#233;p&#233;t&#233; du GPS sur la batterie du smartphone.&lt;/p&gt;
&lt;p&gt;Or, dans la vie quotidienne, nous restons souvent longtemps dans des lieux familiers comme le domicile, le travail ou chez des proches. Il est donc pertinent d'exploiter cette stabilit&#233; g&#233;ographique pour optimiser la fr&#233;quence des requ&#234;tes de g&#233;olocalisation, en adaptant le comportement de Tasker selon le contexte.&lt;/p&gt;
&lt;p&gt;Tasker permet justement de d&#233;finir des profils conditionnels, activ&#233;s par exemple :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; la connexion (ou la possibilit&#233; de connexion) &#224; un r&#233;seau Wi-Fi sp&#233;cifique,&lt;/li&gt;&lt;li&gt; la d&#233;tection de certaines antennes relais GSM (cell tower),&lt;/li&gt;&lt;li&gt; ou d'autres crit&#232;res contextuels.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Dans mon cas, j'ai choisi de me baser uniquement sur la connexion Wi-Fi. Cela me permet de d&#233;sactiver la g&#233;olocalisation par GPS lorsque le t&#233;l&#233;phone est connect&#233; &#224; mon r&#233;seau domestique ou professionnel, r&#233;duisant ainsi l'usage de la batterie sans perte de pr&#233;cision dans les sc&#233;narios d'automatisation.&lt;/p&gt;
&lt;p&gt;Pour cr&#233;er un profil Tasker qui ne s'active que lorsque le t&#233;l&#233;phone est connect&#233; &#224; un r&#233;seau Wi-Fi sp&#233;cifique (comme votre Wi-Fi domestique).&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Acc&#233;dez &#224; l'onglet &#8220;Profils&#8221; dans Tasker.&lt;/li&gt;&lt;li&gt; Appuyez sur le bouton &#171; + &#187; pour cr&#233;er un nouveau profil.&lt;/li&gt;&lt;li&gt; Choisissez le contexte suivant : &#201;tat &#8594; R&#233;seau &#8594; WiFi connect&#233;&lt;/li&gt;&lt;li&gt;Saisissez le nom du r&#233;seau Wi-Fi (SSID) auquel le profil doit &#234;tre associ&#233;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Une fois cette &#233;tape valid&#233;e, Tasker vous proposera automatiquement d'associer une t&#226;che &#224; ce profil. Cette t&#226;che s'ex&#233;cutera lorsque le t&#233;l&#233;phone se connectera au r&#233;seau sp&#233;cifi&#233;.&lt;/p&gt;
&lt;div class='spip_document_45 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://blog.lfz.ovh/local/cache-vignettes/L302xH280/tasker_profil_wifi-4019e.png?1771485815' width='302' height='280' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Vous pouvez &#233;galement d&#233;finir une t&#226;che lorsque le profil devient inactif, c'est-&#224;-dire quand le t&#233;l&#233;phone se d&#233;connecte du Wi-Fi. &lt;br class='autobr' /&gt;
Une fois le profil cr&#233;&#233;, vous pouvez le renommer en appuyant longuement sur son nom. Choisissez un intitul&#233; clair et explicite (ex. : WiFi Maison connect&#233;) pour faciliter la gestion de vos profils, surtout si vous en avez plusieurs actifs selon diff&#233;rents contextes.&lt;/p&gt;
&lt;p&gt;L'id&#233;e est d&#233;sormais d'associer des coordonn&#233;es GPS fixes aux lieux connus &#8212; c'est-&#224;-dire ceux qui activent un profil sp&#233;cifique &#8212; et de n'utiliser le GPS qu'en l'absence de profil actif. Bien que cette logique puisse &#234;tre r&#233;partie sur plusieurs actions, j'ai choisi de tout centraliser dans la seule t&#226;che &#171; Localisation &#187;.&lt;/p&gt;
&lt;p&gt;Tasker permet de tester si un profil est actif &#224; l'aide de l'expression &#171; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;%PACTIVE ~ *,nom_du_profil,*&lt;/code&gt; &#187;. Cette condition v&#233;rifie si le profil sp&#233;cifi&#233; figure parmi les profils actuellement actifs, d'ou les *.&lt;/p&gt;
&lt;p&gt;Je consid&#232;re, pour la suite, que deux profils ont &#233;t&#233; cr&#233;&#233;s et renomm&#233;s en Wifi_Maison_1 et Wifi_Maison_2. L'action &#171; Localisation &#187; s'articule donc d&#233;sormais comme suit :&lt;/p&gt;
&lt;div style=&#034;font-size: 10px;&#034;&gt;&lt;pre&gt; Task: Localisation A1: If [ %PACTIVE ~ *,Wifi_Maion_1,* ] A2: Variable Set [ Name: %gpsCoord To: [latitude_lieu_1, longitude_lieu_1] Structure Output (JSON, etc): On ] A3: Variable Set [ Name: %gpsAccuracy To: 20 Structure Output (JSON, etc): On ] A4: Else A5: If [ %PACTIVE ~ *,Wifi_Maion_2,* ] A6: Variable Set [ Name: %gpsCoord To: [latitude_lieu_2, longitude_lieu_2] Structure Output (JSON, etc): On ] A7: Variable Set [ Name: %gpsAccuracy To: 20 Structure Output (JSON, etc): On ] A8: Else A9: Get Location v2 [ Timeout (Seconds): 30 ] A10: Variable Set [ Name: %gpsCoord To: [%gl_latitude, %gl_longitude ] Structure Output (JSON, etc): On ] A11: Variable Set [ Name: %gpsAccuracy To: %gl_coordinates_accuracy Structure Output (JSON, etc): On ] A12: End If A13: End If A14: HTTP Request [ Method: POST URL: https://IP_EXTERNE/api/services/device_tracker/see Headers: Authorization:Bearer VOTRE_TOKEN_HA content-type:application/json Body: { &#034;dev_id&#034; : &#034;fake_tracker&#034;, &#034;gps&#034; : %gpsCoord, &#034;gps_accuracy&#034; : %gpsAccuracy, &#034;battery&#034; : %BATT } Timeout (Seconds): 30 Automatically Follow Redirects: On Structure Output (JSON, etc): On Continue Task After Error:On ] &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&#128161; Astuce bonus &#8211; Localiser automatiquement sa voiture :&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt; Tasker permet de cr&#233;er un profil actif lorsque le smartphone est connect&#233; en Bluetooth &#224; un appareil sp&#233;cifique. La majorit&#233; des v&#233;hicules modernes disposent d'un syst&#232;me multim&#233;dia avec une connexion bluetooth.&lt;br class='autobr' /&gt;
Ainsi, en utilisant un profil &#034;Bluetooth connect&#233;&#034;, il devient possible de suivre la position du v&#233;hicule en temps r&#233;el :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Lorsque que la connexion est active, la position du smartphone correspond &#224; la position du v&#233;hicule.&lt;/li&gt;&lt;li&gt; Et lorsque la connexion Bluetooth est coup&#233;e, la derni&#232;re position connue correspond tr&#232;s probablement &#224; l'endroit o&#249; le v&#233;hicule a &#233;t&#233; stationn&#233;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cette m&#233;thode est particuli&#232;rement efficace dans le cas d'un conducteur unique, comme c'est le cas pour moi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Broker MQTT&lt;/h2&gt;
&lt;p&gt;Dans le cas de l'utilisation d'un broker MQTT, la solution initiale consisterait &#224; ouvrir ses ports (par exemple 1883 pour MQTT classique, ou 8083/8084 pour WebSocket). Toutefois, cela soul&#232;ve rapidement des probl&#233;matiques de s&#233;curit&#233; et de chiffrement : un certificat SSL d&#233;di&#233; au broker et &#224; Home Assistant serait n&#233;cessaire.&lt;/p&gt;
&lt;p&gt;Dans mon cas, le certificat est d&#233;j&#224; g&#233;r&#233; par un reverse proxy pour l'ensemble du domaine (certificat wildcard). Il para&#238;t donc plus coh&#233;rent et s&#233;curis&#233; de laisser ce reverse proxy prendre en charge toute la couche HTTPS de l'infrastructure.&lt;br class='autobr' /&gt;
Dans cette optique, et sachant que faire suivre une websocket MQTT &#224; travers mon reverse proxy &#233;tant inaccessible (impossible ou hors de ma comp&#233;tence), une passerelle HTTP vers MQTT (http2mqtt) s'impose naturellement comme solution : elle permet de conserver un point d'entr&#233;e unique, s&#233;curis&#233;, tout en assurant la transmission des donn&#233;es vers le broker interne.&lt;/p&gt;
&lt;div class='spip_document_46 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://blog.lfz.ovh/IMG/png/geoloc_mqtt.png?1754594560' width='500' height='325' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Le serveur http2mqtt est d&#233;ploy&#233; sur une instance Docker. Plusieurs images existent ; pour ma part, j'ai utilis&#233; celles de &lt;a href=&#034;https://github.com/vsimonaitis/http2mqtt&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;vsimonaitis/http_to_mqtt&lt;/a&gt; et &lt;a href=&#034;https://hub.docker.com/r/rsteckler/docker-http-mqtt-bridge&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;rsteckler/docker-http-mqtt-bridge:v1&lt;/a&gt;. Cette solution n&#233;cessite, lors de la configuration du conteneur Docker, la cr&#233;ation d'un token afin de s&#233;curiser l'acc&#232;s. Le docker compose ressemble &#224; :&lt;/p&gt;
&lt;div style=&#034;font-size: 10px;&#034;&gt;&lt;pre&gt; --- services: http2mqtt: image: vsimonaitis/http_to_mqtt container_name: http2mqtt environment: - AUTH_KEY=VotreTokenHttp2Mqtt - MQTT_HOST=mqtt://IP_Interne_LAN_Broker:1883 - MQTT_USER=username_broker_mqtt - MQTT_PASS=mdp_broker_mqtt - PGID=1001 ports: - 5000:5000 restart: unless-stopped &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Avec le Docker Compose propos&#233;, le reverse proxy devra rediriger une URL entrante depuis l'internet (par exemple, &lt;a href=&#034;https://broker.mondomaine.fr&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://broker.mondomaine.fr&lt;/a&gt;) vers l'adresse IP h&#233;bergeant le conteneur http2mqtt, sur le port 5000.&lt;/p&gt;
&lt;p&gt;Le fonctionnement c&#244;t&#233; Tasker / smartphone ne change pas fondamentalement, seules l'adresse et la structure des donn&#233;es envoy&#233;es diff&#232;rent.&lt;/p&gt;
&lt;p&gt;L'adresse vers laquelle la requ&#234;te POST est envoy&#233;e est &lt;a href=&#034;https://broker.mondomaine.fr/post&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://broker.mondomaine.fr/post&lt;/a&gt;. Aucun header sp&#233;cifique n'est requis, bien que le format JSON soit attendu. Veillez cependant &#224; ce que votre reverse proxy transmette correctement la requ&#234;te, car le chemin /post est indispensable.&lt;/p&gt;
&lt;p&gt;La structure des donn&#233;es envoy&#233;es inclut le topic MQTT de destination et le token d&#233;finit pr&#233;c&#233;demment. Son format est le suivant :&lt;/p&gt;
&lt;div style=&#034;font-size: 10px;&#034;&gt;&lt;pre&gt; { &#034;topic&#034;:&#034;loc/fake_tracker&#034;, &#034;key&#034; :&#034;VotreTokenHttp2Mqtt&#034;, &#034;message&#034;:&#034;{\&#034;coordinates\&#034;:[latitude,longitude],\&#034;batt\&#034;:%BATT}&#034; } &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C&#244;t&#233; Home Assistant, il est n&#233;cessaire de d&#233;finir les trackers via la configuration. La &lt;a href=&#034;https://www.home-assistant.io/integrations/device_tracker.mqtt&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;documentation officielle&lt;/a&gt; pr&#233;sente toutes les options de configuration possibles.&lt;/p&gt;
&lt;p&gt;Disposant de nombreux &#233;quipements communiquant via MQTT, j'ai d&#233;di&#233; un r&#233;pertoire sp&#233;cifique dans Home Assistant pour les g&#233;rer. Mon fichier configuration.yaml contient ainsi la ligne suivante :&lt;/p&gt;
&lt;center&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mqtt: !include_dir_list mqtt&lt;/code&gt;&lt;/center&gt;
&lt;p&gt;ce qui indique que le r&#233;pertoire mqtt regroupe tous les &#233;quipements MQTT non pris en charge directement par l'int&#233;gration MQTT.&lt;/p&gt;
&lt;p&gt;Dans ce r&#233;pertoire, un fichier tracker.yaml g&#232;re les trackers. Son contenu est le suivant :&lt;/p&gt;
&lt;div style=&#034;font-size: 10px;&#034;&gt;&lt;pre&gt; device_tracker: - name: &#034;tracker fake_tracker&#034; json_attributes_topic: &#034;loc/fake_tracker&#034; #state_topic: &#034;loc/fake_trackerForceState&#034; unique_id: tracker fake_tracker &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'attribut &#171; &lt;i&gt;state_topic&lt;/i&gt; &#187; est optionnel et peut &#234;tre omis si &#171; &lt;i&gt;json_attributes_topic&lt;/i&gt; &#187; contient toutes les informations n&#233;cessaires &#224; Home Assistant pour d&#233;terminer l'&#233;tat.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Il est fort probable qu'il existe d'autres solutions ou approches techniques pour atteindre le m&#234;me objectif. Cet article a pour but de partager la mani&#232;re dont je l'ai mise en &#339;uvre, et non de pr&#233;senter la m&#233;thode &#224; suivre.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
