Solution locale de diffusion en direct pour Raspberry Pi 4B sous DietPi Bookworm, pensée pour un direct nomade avec OBS Studio, un téléphone Xiaomi 11T et une liaison capteurs la plus indépendante possible du réseau mobile utilisé pour la diffusion.
Ce dépôt fournit une base simple, locale, robuste et traduisible pour :
- préparer les scènes et sources OBS avec l'interface complète quand c'est nécessaire ;
- lancer le direct avec un démarrage OBS allégé, sans dépendre d'OBS Studio ouvert manuellement en mode complet ;
- piloter localement la diffusion et quelques sources depuis un écran tactile relié au Raspberry ;
- recevoir des capteurs via MQTT sur une liaison Bluetooth distincte du tethering 5G, puis les écrire dans un fichier JSON local ;
- garder
obs-websocketen boucle locale (127.0.0.1) pour ne pas exposer le contrôle OBS sur le réseau mobile.
Cette section s'adresse à une personne qui repart d'une carte mémoire vierge, sans DietPi déjà installé. Elle décrit uniquement les étapes nécessaires pour obtenir un Raspberry Pi 4B prêt à recevoir nomade. Pour les cas non couverts ici, reportez-vous au site officiel de DietPi.
- Récupérer l'image DietPi
- Téléchargez l'image DietPi correspondant au Raspberry Pi 4B (base Bookworm/Debian 12) depuis le site officiel : https://dietpi.com/
- Créer la carte mémoire de démarrage
- Utilisez un outil d'écriture d'image disque pour copier le fichier téléchargé sur la carte mémoire.
- Plusieurs outils conviennent, au choix selon votre système : Raspberry Pi Imager, balenaEtcher ou Win32 Disk Imager. Aucun de ces choix n'est obligatoire, retenez celui qui vous convient.
- Premier démarrage du Raspberry Pi
- Insérez la carte mémoire dans le Raspberry Pi, branchez un écran et un clavier (ou préparez un accès par le réseau si vous maîtrisez déjà cette méthode), puis mettez sous tension.
- Première connexion
- Identifiez-vous avec les comptes par défaut de DietPi : nom d'utilisateur
root(oudietpi), mot de passedietpi. - DietPi vous demandera normalement de changer ce mot de passe par défaut dès la première connexion : faites-le, pour votre sécurité.
- Identifiez-vous avec les comptes par défaut de DietPi : nom d'utilisateur
- Paramétrage initial (
dietpi-config)- Réglez au minimum la langue du clavier, le fuseau horaire, ainsi que la connexion réseau (Wi-Fi ou câble Ethernet) si ce n'est pas déjà fait automatiquement.
- Installation des logiciels de base (
dietpi-software)- Cet outil se lance normalement tout seul après le premier paramétrage. S'il ne se lance pas automatiquement, tapez la commande
dietpi-software. - Dans la liste des logiciels proposés, section Affichage (« Display »), choisissez LXDE : il s'agit d'un environnement de bureau graphique léger, adapté au Raspberry Pi. C'est ce bureau qui permettra ensuite d'afficher OBS et l'interface tactile de nomade.
- Vous pouvez également installer ici des outils utiles comme
git, si la liste vous le propose.
- Cet outil se lance normalement tout seul après le premier paramétrage. S'il ne se lance pas automatiquement, tapez la commande
- Mise à jour du système
- Une fois le bureau installé, mettez le système à jour avant d'aller plus loin :
apt-get update && apt-get upgrade -y- Récupération du dépôt nomade
- Installez
gitsi nécessaire (apt-get install -y git), puis récupérez le dépôt :
- Installez
git clone https://github.com/Thalyn-/nomade.git
cd nomade- Installation d'OBS et des dépendances de nomade
- Le paquet OBS fourni par défaut sur cette architecture ne contient pas la Source Navigateur : le dépôt installe donc un paquet communautaire (Pi-Apps) qui l'inclut. Cette étape, ainsi que l'installation de Python et des autres dépendances, est prise en charge par le script d'installation décrit dans la section Installation (DietPi Bookworm) ci-dessous.
Une fois ces neuf étapes réalisées, votre Raspberry Pi dispose d'un environnement graphique fonctionnel et du dépôt nomade en place : vous pouvez enchaîner directement avec la procédure d'installation détaillée plus bas dans ce document.
- Préparation OBS :
scripts/lancer_obs_preparation.sh- interface OBS complète ;
- profil de préparation dédié ;
- même surcharge
MESA_GL_VERSION_OVERRIDE=3.3.
- Direct OBS :
scripts/lancer_obs_direct.sh- profil de direct fixe dédié ;
- options OBS natives réellement disponibles sur OBS 30.2.x :
--profile,--collection,--scene,--minimize-to-tray,--disable-missing-files-check,--startstreamingen option ; - pas de vrai mode headless : OBS Studio ne fournit pas ici de mode sans interface adapté à ce besoin. Le meilleur compromis natif reste donc un démarrage réduit, avec profil figé et fenêtre réduite.
- Interface locale :
scripts/lancer_nomade.shpuisscripts/interface_nomade.py- démarre l'interface Python ;
- démarre aussi OBS direct allégé si OBS n'est pas déjà lancé ;
- attend la disponibilité d'
obs-websocketsur127.0.0.1.
- Configuration centralisée :
config/nomade.tomlpuisconfig/nomade.local.toml- valeurs par défaut suivies dans Git ;
- surcharge locale ignorée par Git ;
- validation légère au démarrage et diagnostic via
scripts/nomade_config.py.
- Capteurs :
scripts/lancer_capteurs_mqtt.shpuisscripts/capteurs_mqtt.py- abonnement MQTT local ;
- validation minimale des messages JSON ;
- écriture atomique de
/var/lib/nomade/capteurs.json.
À utiliser hors direct pour créer ou modifier les scènes, profils et sources :
./scripts/lancer_obs_preparation.shVariables utiles :
NOMADE_OBS_PROFIL_PREPARATION: nom du profil de préparation (défaut :Nomade preparation)NOMADE_OBS_COLLECTION: collection de scènes à ouvrir
À utiliser pendant le direct, ou automatiquement via scripts/lancer_nomade.sh :
./scripts/lancer_obs_direct.shVariables utiles :
NOMADE_OBS_PROFIL_DIRECT: nom du profil préparé/fixe (défaut :Nomade direct fixe)NOMADE_OBS_COLLECTION: collection de scènes à ouvrirNOMADE_OBS_SCENE: scène initialeNOMADE_OBS_AUTOSTART_DIFFUSION=1: ajoute--startstreamingsi l'on veut démarrer la diffusion dès l'ouverture d'OBS
Cette version ne prétend pas fournir un « OBS headless » complet, car OBS Studio n'offre pas ici un mode sans interface réellement adapté à la préparation puis au direct. Le dépôt fournit donc :
- OBS complet pour la préparation ;
- OBS allégé au maximum avec les options natives disponibles pour le direct.
- Le contrôle OBS doit rester local au Raspberry.
- L'interface utilise
127.0.0.1par défaut et refuse les hôtes distants par sécurité. - Il ne faut pas exposer
obs-websocketsur0.0.0.0, sur l'interface 5G, ni sur une interface de tethering. - Le transport des capteurs du téléphone ne doit pas être confondu avec le contrôle OBS : ce sont deux chemins distincts.
Nomade privilégie maintenant un fichier de configuration TOML unique plutôt que des modifications réparties dans plusieurs scripts.
- configuration suivie :
config/nomade.toml - modèle local :
config/nomade.local.toml.example - surcharge locale ignorée par Git :
config/nomade.local.toml
Mise en route :
cp config/nomade.local.toml.example config/nomade.local.toml
python3 scripts/nomade_config.py --diagnosticLa configuration couvre notamment :
- la langue de l'interface ;
- les adresses et ports OBS/MQTT ;
- l'interface réseau capteurs (
bnep0par défaut) et les informations Bluetooth utiles ; - les scènes, profils et sources OBS ;
- le service de chat multicanal et la source Navigateur OBS associée ;
- quelques préférences d'affichage et fonctions activables ;
- les emplacements du dépôt, du venv Python, des données et des journaux.
La configuration accepte désormais une liste [[video_sources]] :
id: identifiant stable côté Nomade ;label: libellé affiché dans l'interface tactile ;type:capture_usb,srtouwebcam;obs_source_name: nom exact de la source dans OBS ;group: groupe fonctionnel exclusif ;enabled_by_default: état initial ;srt_port: optionnel (informatif) pour les sourcessrt.
Les sources d'un même group sont mutuellement exclusives dans l'interface : sélectionner une source désactive automatiquement les autres du même groupe dans OBS.
Exemple typique :
- groupe
camera_principale: G7 principal, G7 secours, Xiaomi grand angle ; - groupe
vignette_visage: Xiaomi selfie.
Nomade ne décode pas lui-même les flux SRT : OBS reste le moteur vidéo unique.
Pour une source SRT (ex. Larix Broadcaster sur Xiaomi), configurez côté OBS une Source Média en écoute :
srt://0.0.0.0:9000?mode=listener
Le flux est reçu nativement par OBS, puis Nomade ne fait qu'activer/désactiver la source via websocket.
La liste [[presets]] permet d'appliquer en un clic plusieurs actions :
id,labelactiver: identifiants à activerdesactiver: identifiants à désactiver
Ces identifiants peuvent cibler les overlays existants (selfie, carte, vitesse, pulsations, meteo, heure, chat_multicanal) et les id de video_sources.
Exemples inclus :
sans_reperes: masquecarteetvitessetrajet: affichecarteetvitesse
Le chemin par défaut du venv reste /opt/nomade-venv. C'est un choix d'organisation classique pour une application tierce sous Debian/DietPi, pas un gain de performances. Le dépôt évite ainsi de mélanger l'environnement Python de nomade avec le système.
Si une installation existante a déjà été préparée sous /root/nomade, elle peut être conservée en surchargeant localement :
[paths]
python_venv = "/root/nomade/myvenv"Cette surcharge permet une migration progressive sans casser l'installation actuelle.
L'interface principale reste Python/Tkinter. Ce choix est volontaire pour un Raspberry Pi 4B en direct :
- pas de serveur web supplémentaire à maintenir ;
- pas de navigateur obligatoire à ouvrir pendant le live ;
- moins de RAM et de moteur de rendu qu'une page Firefox/Chromium dédiée.
Une interface web locale pourrait être étudiée plus tard comme extension facultative, mais elle n'est pas implémentée dans cette évolution.
cd /chemin/vers/le/depot/nomade
chmod +x \
scripts/install_nomade.sh \
scripts/installer_obs_navigateur.sh \
scripts/nomade_config.py \
scripts/lancer_obs.sh \
scripts/lancer_obs_preparation.sh \
scripts/lancer_obs_direct.sh \
scripts/lancer_nomade.sh \
scripts/lancer_capteurs_mqtt.sh
sudo ./scripts/install_nomade.shLe script installe notamment :
- Python et Tk ;
- les dépendances Python du dépôt ;
mosquittoetmosquitto-clientspour un courtier MQTT local ;- OBS Studio avec Source Navigateur via le paquet communautaire Pi-Apps ;
- les répertoires de données et journaux définis dans
config/nomade.toml.
Le paquet officiel apt install obs-studio fourni sur Debian Bookworm ARM64 n'inclut pas la Source Navigateur sur cette cible. Le dépôt conserve donc scripts/installer_obs_navigateur.sh, qui installe à la place un paquet communautaire (Pi-Apps) incluant cette fonctionnalité.
Ce choix est volontaire :
- on ne supprime pas la Source Navigateur ;
- on garde l'accélération
MESA_GL_VERSION_OVERRIDE=3.3nécessaire au Raspberry Pi 4 ; - on évite de faire croire qu'un paquet Debian standard suffirait à reproduire le même comportement.
Exemple minimal :
export OBS_MDP='votre_mot_de_passe'
./scripts/lancer_nomade.shComportement :
- si aucun processus
obsn'est déjà lancé, le script démarrescripts/lancer_obs_direct.sh; - l'interface attend ensuite
obs-websocketpendant30secondes par défaut ; - l'hôte OBS reste fixé à
127.0.0.1via le script de lancement.
Variables utiles :
OBS_MDP: mot de passeobs-websocketNOMADE_LANGUE=frouNOMADE_LANGUE=en
Pour diagnostiquer la configuration réellement chargée :
python3 scripts/nomade_config.py --diagnosticLes textes visibles de l'interface sont externalisés dans :
locales/fr.json(par défaut)locales/en.json(repli anglais minimal)
Pour choisir la langue :
NOMADE_LANGUE=en ./scripts/lancer_nomade.shLes noms de scènes, noms de sources et messages d'erreur techniques détaillés restent configurables et ne sont pas traduits automatiquement.
Le français reste la langue par défaut des textes destinés à l'utilisateur.
Pour ajouter une autre langue :
- copier
locales/fr.json; - traduire les valeurs ;
- enregistrer le fichier sous
locales/<code>.json; - lancer avec
NOMADE_LANGUE=<code>.
Les noms restent modifiables par arguments si besoin :
- scène principale :
Scene principale - source selfie :
Selfie - carte :
Carte - vitesse :
Vitesse - pulsations :
Pulsations - météo :
Meteo - heure :
Heure
Le dépôt privilégie une ingestion capteurs MQTT locale pour éviter autant que possible :
- les WebSocket venant du téléphone ;
- le Wi-Fi du hotspot/tethering ;
- l'USB tethering.
Le cas visé est une liaison Bluetooth indépendante, par exemple :
- Bluetooth PAN / BNEP entre téléphone et Raspberry ;
- ou un autre transport Bluetooth réellement compatible avec SensorCast et un courtier MQTT accessible côté Raspberry.
Cette version ne prétend pas que SensorCast, Bluetooth PAN, BNEP ou Mosquitto seraient configurés automatiquement par le dépôt. Il faut préparer explicitement :
- le jumelage Bluetooth ;
- le profil réseau Bluetooth réellement utilisé ;
- l'adresse IP de l'interface Bluetooth côté Raspberry ;
- la configuration de SensorCast pour publier en MQTT vers ce courtier local.
./scripts/lancer_capteurs_mqtt.sh \
--mqtt-hote 192.168.44.1 \
--mqtt-port 1883 \
--mqtt-sujet nomade/capteursVariables ou options disponibles :
NOMADE_MQTT_HOTE(ouconfig/nomade.local.toml)NOMADE_MQTT_PORTNOMADE_MQTT_SUJETNOMADE_MQTT_CLIENT_IDNOMADE_MQTT_UTILISATEURNOMADE_MQTT_MOT_DE_PASSENOMADE_FICHIER_CAPTEURS
Le service :
- accepte des messages JSON ;
- vérifie au minimum que la charge utile est un objet JSON, et que
position,reseauetmeteosont des objets s'ils existent ; - écrit
/var/lib/nomade/capteurs.jsonde façon atomique ; - ignore un message invalide sans arrêter le processus ;
- tente de se reconnecter automatiquement si la liaison MQTT tombe.
Le dépôt fournit un exemple minimal dans examples/mosquitto-bluetooth.conf.example.
Principe recommandé :
- écouter uniquement sur l'adresse IP de l'interface Bluetooth (par exemple
bnep0) ; - ne pas écouter sur l'interface 5G ni sur toutes les interfaces.
Nomade ne réimplémente pas le chat dans Python. Le dépôt réutilise la Source Navigateur OBS déjà requise pour afficher une page de discussion multicanal distante.
Services prévus dans la configuration :
nonevelorabotrixcustom
Exemple de surcharge locale :
[chat]
service = "velora"
source_name = "Chat multicanal"
enabled_by_default = false
velora_url = "https://velora.tv/overlay/chat-multi/identifiant-exemple"Points importants :
- ne versionnez jamais vos URL personnelles Velora/Botrix ;
- l'interface Tkinter peut activer/désactiver la source OBS correspondante ;
- si
sync_chat_browser_source = true, Nomade met à jour l'URL de la source Navigateur au démarrage ; - une URL distante reste une dépendance réseau supplémentaire : vérifiez toujours la confiance accordée au service tiers ;
- une panne du service de chat ne doit pas empêcher le contrôle local OBS ni l'ingestion MQTT/Bluetooth.
Cette évolution n'automatise pas encore le multistream complet, Restream ni la gestion de clés de diffusion.
La section [streaming] du TOML sert seulement à préparer des destinations nommées pour une évolution future, sans secrets. Pour l'instant :
- préparez vos profils et destinations dans
OBS-Preparation; - choisissez ensuite le bon profil OBS pour le direct ;
- ne stockez ni clé de diffusion ni URL privée dans le dépôt.
Par défaut :
- capteurs :
/var/lib/nomade/capteurs.json - chat :
/var/lib/nomade/chat_unifie.log
Exemple capteurs.json :
{
"position": {"latitude": 48.8566, "longitude": 2.3522},
"vitesse_kmh": 18.4,
"pulsations": 121,
"reseau": {"type": "5G", "signal_dbm": -92},
"meteo": {"temperature_c": 22.1, "description": "nuageux"}
}Vérifications prévues avant demande de fusion :
- syntaxe shell avec
bash -n - compilation Python
- tests légers ciblés
- validation sécurité/secrets sur les fichiers modifiés
-
L'interface dit que la connexion OBS est impossible Vérifier que
obs-websocketest activé dans OBS, avec mot de passe, sur127.0.0.1:4455. -
OBS s'ouvre mais reste lourd C'est une limite d'OBS Studio : il n'existe pas ici de mode headless complet pour le direct. Utiliser
scripts/lancer_obs_direct.shavec un profil fixe, déjà préparé. -
Les capteurs n'arrivent pas Vérifier d'abord la liaison Bluetooth/PAN, puis le courtier MQTT local, puis le sujet réellement publié par SensorCast.
-
Je veux vérifier ma configuration sans lancer le direct Exécuter
python3 scripts/nomade_config.py --diagnosticpuis corrigerconfig/nomade.local.tomlsi nécessaire. -
Le direct 5G se coupe quand SensorCast tourne Revenir à une topologie où MQTT ne passe pas par le tethering Wi-Fi ou USB, mais par une liaison Bluetooth réellement séparée.
- pas de vrai mode headless OBS dans ce dépôt ;
- la configuration exacte de SensorCast et du profil réseau Bluetooth dépend du matériel et n'est donc pas imposée silencieusement ;
- la récupération directe des pulsations de certains objets connectés peut rester limitée selon leurs protocoles ;
- l'installation OBS repose toujours sur un paquet communautaire Pi-Apps pour conserver la Source Navigateur ;
- le multistream complet reste volontairement reporté à une évolution séparée.