{"id":6170,"date":"2026-05-14T18:25:40","date_gmt":"2026-05-14T16:25:40","guid":{"rendered":"https:\/\/gpmfactory.com\/?p=6170"},"modified":"2026-05-14T18:32:27","modified_gmt":"2026-05-14T16:32:27","slug":"free-tv-sur-raspberry-pi-5-avec-cast-sur-google-nest","status":"publish","type":"post","link":"https:\/\/gpmfactory.com\/index.php\/2026\/05\/14\/free-tv-sur-raspberry-pi-5-avec-cast-sur-google-nest\/","title":{"rendered":"Free TV sur Raspberry Pi 5 avec Cast sur Google Nest"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Contexte<\/h2>\n\n\n\n<p>J&rsquo;utilisais depuis quelque temps un PC Windows pour diffuser les cha\u00eenes Free TV sur un \u00e9cran passif via HDMI. Le syst\u00e8me fonctionnait correctement mais pr\u00e9sentait des inconv\u00e9nients notables : consommation \u00e9lectrique \u00e9lev\u00e9e (150W), encombrement, bruit du ventilateur, et d\u00e9marrage manuel n\u00e9cessaire \u00e0 chaque utilisation.<\/p>\n\n\n\n<p>J&rsquo;ai d\u00e9cid\u00e9 de migrer cette installation vers un Raspberry Pi 5, avec pour objectif de cr\u00e9er une box TV d\u00e9di\u00e9e, silencieuse, \u00e9conome en \u00e9nergie et contr\u00f4lable enti\u00e8rement depuis un smartphone.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Architecture finale<\/h2>\n\n\n\n<p>Le syst\u00e8me repose sur une architecture simple :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mat\u00e9riel<\/strong> : Raspberry Pi 5 (8 GB RAM), \u00e9cran Dell P2210 en HDMI, Google Nest Mini pour l&rsquo;audio<\/li>\n\n\n\n<li><strong>Syst\u00e8me<\/strong> : Raspberry Pi OS avec environnement graphique X11<\/li>\n\n\n\n<li><strong>Backend<\/strong> : Serveur Node.js avec Puppeteer pilotant Chromium<\/li>\n\n\n\n<li><strong>Frontend<\/strong> : Interface web responsive accessible depuis smartphone<\/li>\n\n\n\n<li><strong>Audio<\/strong> : Diffusion via Google Cast (automatis\u00e9e par xdotool)<\/li>\n<\/ul>\n\n\n\n<p>Le Pi est connect\u00e9 en HDMI \u00e0 l&rsquo;\u00e9cran pour la vid\u00e9o, et l&rsquo;audio est envoy\u00e9 vers le Nest Mini via Cast. L&rsquo;ensemble est contr\u00f4l\u00e9 depuis un smartphone via une interface web h\u00e9berg\u00e9e par le serveur Node.js.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fonctionnalit\u00e9s<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Contr\u00f4le depuis smartphone<\/h3>\n\n\n\n<p>Une interface web permet de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>S\u00e9lectionner une cha\u00eene parmi les cha\u00eenes Free TV organis\u00e9es par cat\u00e9gories<\/li>\n\n\n\n<li>Ajuster le volume<\/li>\n\n\n\n<li>D\u00e9clencher le Cast audio automatiquement vers le Nest Mini<\/li>\n\n\n\n<li>Arr\u00eater la lecture<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Automatisation compl\u00e8te<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>D\u00e9marrage automatique du serveur au boot du Pi (service systemd)<\/li>\n\n\n\n<li>R\u00e9veil automatique de l&rsquo;\u00e9cran en cas de mise en veille<\/li>\n\n\n\n<li>Masquage automatique du curseur apr\u00e8s 1 seconde d&rsquo;inactivit\u00e9<\/li>\n\n\n\n<li>Reconnexion automatique en cas de d\u00e9connexion Puppeteer<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Acc\u00e8s distant<\/h3>\n\n\n\n<p>Configuration d&rsquo;un serveur xrdp permettant l&rsquo;acc\u00e8s graphique depuis Windows via le client RDP natif, pour les op\u00e9rations de maintenance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00e9fis techniques rencontr\u00e9s<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Navigation directe vers les streams<\/h3>\n\n\n\n<p>Contrairement \u00e0 l&rsquo;approche initiale sous Windows qui utilisait une page interm\u00e9diaire, la solution Pi navigue directement vers les URLs des streams Free TV. Cela \u00e9vite les probl\u00e8mes de Cast API et permet d&rsquo;utiliser \u00ab\u00a0Cast tab audio\u00a0\u00bb au lieu du \u00ab\u00a0Default Media Receiver\u00a0\u00bb.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Automatisation du Cast audio<\/h3>\n\n\n\n<p>L&rsquo;absence de raccourci clavier direct pour le Cast dans Chromium a n\u00e9cessit\u00e9 l&rsquo;automatisation d&rsquo;une s\u00e9quence compl\u00e8te via xdotool :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Sortie du mode plein \u00e9cran (F11)<\/li>\n\n\n\n<li>Ouverture du menu Chrome (Alt+F)<\/li>\n\n\n\n<li>Navigation dans les menus (19 touches Down)<\/li>\n\n\n\n<li>S\u00e9lection dans les sous-menus<\/li>\n\n\n\n<li>Interaction avec la popup Cast (Tab et Enter)<\/li>\n\n\n\n<li>Retour en plein \u00e9cran<\/li>\n<\/ol>\n\n\n\n<p>Cette s\u00e9quence, d\u00e9clench\u00e9e depuis le smartphone, s&rsquo;ex\u00e9cute en quelques secondes et \u00e9tablit la connexion Cast vers le Nest Mini.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Passage de Wayland \u00e0 X11<\/h3>\n\n\n\n<p>Le Pi 5 utilise par d\u00e9faut Wayland, incompatible avec xdotool. Le passage \u00e0 X11 via raspi-config a \u00e9t\u00e9 n\u00e9cessaire pour permettre l&rsquo;automatisation par simulation de frappes clavier.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Service systemd<\/h3>\n\n\n\n<p>La configuration du service de d\u00e9marrage automatique a n\u00e9cessit\u00e9 de r\u00e9soudre un cycle de d\u00e9pendances systemd. La solution : d\u00e9finir <code>WantedBy=graphical.target<\/code> et <code>After=network-online.target<\/code> sans r\u00e9f\u00e9rence circulaire \u00e0 graphical.target.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gestion de la mise en veille<\/h3>\n\n\n\n<p>L&rsquo;\u00e9cran se mettait en veille apr\u00e8s 15 minutes d&rsquo;inactivit\u00e9, n\u00e9cessitant un clic physique pour le r\u00e9activer. Deux solutions ont \u00e9t\u00e9 mises en place :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>D\u00e9sactivation compl\u00e8te du DPMS et du screen blanking via xset dans autostart<\/li>\n\n\n\n<li>R\u00e9veil automatique de l&rsquo;\u00e9cran via <code>xset dpms force on<\/code> avant chaque changement de cha\u00eene<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sp\u00e9cifications techniques<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Consommation et performances<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Consommation moyenne : 5W (vs 150W pour le PC Windows)<\/li>\n\n\n\n<li>Co\u00fbt \u00e9lectrique annuel : ~5\u20ac (vs ~150\u20ac)<\/li>\n\n\n\n<li>Utilisation RAM : ~2 Go sur 8 Go disponibles (25%)<\/li>\n\n\n\n<li>Chromium : 16 processus (architecture multi-processus normale)<\/li>\n\n\n\n<li>Temp\u00e9rature : Stable, pas de throttling<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Choix de la RAM<\/h3>\n\n\n\n<p>Le Pi 5 existe en versions 2 GB, 4 GB et 8 GB. Pour cet usage :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>2 GB : limite, risque de swap lors des pics m\u00e9moire<\/li>\n\n\n\n<li>4 GB : suffisant et confortable<\/li>\n\n\n\n<li>8 GB : confort maximal, marge importante pour RDP et multit\u00e2che<\/li>\n<\/ul>\n\n\n\n<p>Le choix du 8 GB offre une tranquillit\u00e9 totale et de la marge pour d&rsquo;\u00e9ventuelles \u00e9volutions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bilan<\/h2>\n\n\n\n<p>La migration vers Raspberry Pi 5 a permis de cr\u00e9er une box TV fonctionnelle et autonome, avec une r\u00e9duction drastique de la consommation \u00e9lectrique et l&rsquo;\u00e9limination compl\u00e8te du bruit. Le contr\u00f4le depuis smartphone et l&rsquo;automatisation du Cast audio offrent un confort d&rsquo;utilisation sup\u00e9rieur \u00e0 la solution PC.<\/p>\n\n\n\n<p>Le syst\u00e8me d\u00e9marre automatiquement, ne n\u00e9cessite aucune intervention physique pour un usage quotidien, et reste accessible \u00e0 distance pour la maintenance. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Stack technique<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OS<\/strong> : Raspberry Pi OS (X11)<\/li>\n\n\n\n<li><strong>Backend<\/strong> : Node.js, Puppeteer<\/li>\n\n\n\n<li><strong>Automatisation<\/strong> : xdotool, xset, systemd<\/li>\n\n\n\n<li><strong>Acc\u00e8s distant<\/strong> : xrdp<\/li>\n\n\n\n<li><strong>Outils<\/strong> : unclutter, cec-utils (test\u00e9), pactl<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Contexte J&rsquo;utilisais depuis quelque temps un PC Windows pour diffuser les cha\u00eenes Free TV sur un \u00e9cran passif via HDMI. Le syst\u00e8me fonctionnait correctement&#8230;<\/p>\n","protected":false},"author":1,"featured_media":6173,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"ppma_author":[150],"class_list":["post-6170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-non-classe"],"authors":[{"term_id":150,"user_id":1,"is_guest":0,"slug":"admin8700","display_name":"Patrick","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/41853cbf3fae9c0c46c0ba5e68839a78c20aabbcd1db74702bbda2c9d3980676?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/6170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/comments?post=6170"}],"version-history":[{"count":3,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/6170\/revisions"}],"predecessor-version":[{"id":6174,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/6170\/revisions\/6174"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/media\/6173"}],"wp:attachment":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/media?parent=6170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/categories?post=6170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/tags?post=6170"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/ppma_author?post=6170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}