Un remplaçant 100% local de la couche applicative cloud des caméras de sécurité Qiara.
Qiara était une startup française d'alarme-caméra qui a coupé ses serveurs,
laissant ses clients avec des appareils briqués. OpenQiara les remet en service
en faisant tourner un petit daemon Go (openqiarad) directement sur la caméra,
qui dialogue avec les capteurs 868 MHz existants et les expose à
Home Assistant via MQTT.
┌──────────────┐ MQTT ┌─────────────────────────────┐
│ Home │◄───────────────►│ Caméra Qiara │
│ Assistant │ auto-discovery │ │
│ + Alarmo │ │ openqiarad ──► fbxhome ──► │
└──────────────┘ │ │ MCU│
│ (charmux UART) │
│ radio 868 MHz │
└─────────────────────────────┘
Par défaut, openqiarad tourne en mode proxy fbxhome : le daemon
constructeur fbxhome reste en charge de la radio (cycle de vie des capteurs,
crypto MCU), et openqiarad discute avec son API HTTP locale + suit son fichier
de log. Un mode charmux direct (sans fbxhome) existe également, mais ce
n'est pas la voie recommandée aujourd'hui — on y perd la crypto MCU de fbxhome
et la gestion du heartbeat.
OpenQiara a été construit et validé sur les propres caméras de l'auteur, avec son propre mix de capteurs. Chaque code path du tableau de statut ci-dessous fonctionne de bout en bout dans cette configuration, mais le projet n'a pas encore connu de déploiement plus large.
Attends-toi à des rugosités. Cas probablement non gérés :
- Modèles de capteurs / versions de firmware différents du hardware de l'auteur (le bytecode poussé à un capteur est identifié par préfixe de modèle ; une variante inconnue échouera silencieusement ou bouclera en reinit).
- Setups multi-caméras (le daemon suppose une seule caméra par réseau).
- Pairing concurrent de plusieurs capteurs du même type.
- Cas réseau limites : broker MQTT offline au boot, conflits mDNS, réseaux IPv6-only, WiFi à portail captif.
- Stabilité long terme : validé sur quelques heures/jours, pas des semaines. Une fuite mémoire dans le pipeline HomeKit + SRTP est plausible.
- Mises à jour firmware caméra poussées par Free (aucune observée depuis le shutdown, mais le bootloader appelle toujours la maison s'il est joignable).
Si tu tombes sur un cas non couvert, ouvre une issue avec les logs pertinents
de /data/openqiarad.log et /var/log/fbxhome.log. Les PR sont les bienvenues.
| Fonctionnalité | Statut |
|---|---|
| Events détecteurs d'ouverture (DWS) | ✅ |
| Events mouvement PIR | ✅ |
| Clavier (KPD) PIN + armement/désarmement | ✅ (un seul PIN) |
| Déclenchement sirène (SRN) | ✅ (son discret ; voir limitations pour le wail pleine puissance) |
| Moteur d'alarme autonome | ✅ (source Local/Remote, grâce post-armement) |
| Mode bridge Alarmo | ✅ |
| Auto-discovery MQTT pour HA | ✅ |
| Bridge HomeKit (capteurs + alarme) | ✅ |
| Vidéo live caméra HomeKit | ✅ (SRTP pure-Go natif, sans ffmpeg) |
| Audio caméra HomeKit | |
| Web UI pour appairage & config | ✅ |
| Reporting batterie / température | ✅ |
| Appareil | Préfixe modèle | Entité HA |
|---|---|---|
| Détecteur d'ouverture | HOMELABDWS |
binary_sensor (opening) |
| Détecteur de mouvement | HOMELABPIR |
binary_sensor (motion) |
| Sirène | HOMELABSRN |
siren |
| Clavier | HOMELABKPD |
alarm_control_panel |
| Caméra | HOMELABCAM |
(appareil hôte) |
OpenQiara ne peut pas appairer de capteurs neufs d'autres fabricants — seuls les capteurs livrés à l'origine avec un kit Qiara fonctionnent.
Voici les rugosités identifiées. Elles sont pour la plupart inhérentes au fait
de tourner offline sur un firmware constructeur conçu pour un cloud désormais
mort — pas des bugs à corriger en bidouillant openqiarad.
-
PIN clavier. Un seul PIN par clavier. Ajouter un second code via l'API stock nécessite une autorisation cloud et échoue silencieusement en offline.
-
Volume du wail d'intrusion sirène. Les endpoints
test_powerettest_durationsont en lecture seule via l'API locale fbxhome, donc le "wail" qu'on déclenche en intrusion est le même son discret que le bouton de test manuel (~10 s, faible puissance). Un vrai wail pleine puissance nécessiterait de pousser fbxhome dans son état internealarm_trigged(ou de parler directement au SRN en mode charmux) — ni l'un ni l'autre n'est fait aujourd'hui. -
Sirène après remise sous tension physique. Débrancher puis rebrancher le SRN peut le laisser
reachable=1mais muet, ou complètement injoignable. Récupération :fbxbusctl call fbxhome reboot_srnpour le cas muet, remise sous tension physique complète si totalement injoignable. Voirdocs/sensors.md. -
Patch binaire constructeur requis. Pour utiliser
openqiaradcomme seul contrôleur d'alarme (surtout en modealarmo), on patche deux instructions dans/usr/bin/fbxhomepour que le KPD cesse de piloter en parallèle la machine à états d'alarme interne de fbxhome. Le patch est appliqué au boot depuis/data/fbxhome.patched. Détails et offsets dansdocs/protocol.md(§ "fbxhome binary patch"). -
Audio caméra HomeKit. La vidéo marche, l'audio est silencieux. HomeKit exige de l'AAC-ELD ; le pipeline pure-Go ne le transcode pas encore.
-
Sécurité — état alpha. Le mot de passe admin du Web UI est stocké en clair dans
/data/openqiara.jsonet la comparaison HTTP Basic Auth n'est pas constant-time. CORS est ouvert (*) et il n'y a pas de protection CSRF ni de rate limiting. À considérer comme un LAN de confiance uniquement ; ne pas exposer la caméra sur Internet. VoirSECURITY.md.
Prérequis : macOS avec Homebrew et un réseau WiFi 2.4 GHz.
Avant toute chose, sauvegarde la carte SD d'origine. Éteins la caméra, retire la SD, insère-la dans ton Mac, et trouve son identifiant de disque :
diskutil list # cherche le disque avec 3 partitions Linux (ex : disk4)Puis dump les trois partitions :
DISK=disk4 # ajuster selon ton disque
sudo dd if=/dev/r${DISK}s1 bs=1M of=backup_rootfs.img
sudo dd if=/dev/r${DISK}s2 bs=1M of=backup_data.img
sudo dd if=/dev/r${DISK}s3 bs=1M of=backup_media.imgGarde ces fichiers en lieu sûr — c'est ton billet retour si quelque chose tourne mal.
Récupère le tag de la dernière release sur la page des releases
(tant qu'on est en pre-release alpha, l'URL releases/latest/download/ renvoie un 404 — il faut
pointer le tag explicitement) :
mkdir -p openqiara && cd openqiara
VERSION=v0.1.0-alpha.3 # ajuster selon la dernière release publiée
# Binaire daemon (ARMv7) + scripts d'install
BASE=https://github.com/Caligone/openqiara/releases/download/$VERSION
curl -LO $BASE/openqiarad-linux-arm7
curl -LO $BASE/sd_setup.sh
curl -LO $BASE/patch_fbxhome.sh
curl -LO $BASE/SHA256SUMS
# Vérification d'intégrité
shasum -a 256 -c SHA256SUMS
chmod +x sd_setup.sh patch_fbxhome.shSi tu préfères compiler toi-même, voir la section Compilation plus bas.
brew install e2fsprogs
./sd_setup.sh \
--disk disk4 \
--wifi-ssid "MonReseau" \
--wifi-pass "MonMotDePasse" \
--daemon openqiarad-linux-arm7 \
--ssh-pubkey ~/.ssh/id_ed25519.pubRéinsère la SD dans la caméra, allume-la, et attends ~60 secondes. Trouve la caméra sur le réseau :
arp -a | grep lwipCaméra introuvable sur le réseau ? Le boot écrit un diagnostic wifi dans
/data/boot_wifi.log(écrasé à chaque démarrage). Tu peux le lire en remettant la SD dans le Mac et en ouvrant la partitiondataavecdebugfs -R "cat boot_wifi.log" /dev/diskNs2. Tu y verras le SSID configuré, l'état de l'interfacessv0et les messagesdmesgdu driver wifi. Rappels : la puce est 2.4 GHz uniquement et ne gère que WPA2-PSK (pas WPA3-only ni WPA-Enterprise).
Pour qu'OpenQiara pilote l'alarme sans interférence du démon vendor (cf
docs/protocol.md §11), patche fbxhome sur la cam :
scp -i ~/.ssh/id_ed25519 patch_fbxhome.sh root@<ip-cam>:/tmp/
ssh -i ~/.ssh/id_ed25519 root@<ip-cam> 'sh /tmp/patch_fbxhome.sh'
ssh -i ~/.ssh/id_ed25519 root@<ip-cam> rebootLe script vérifie le MD5 du binaire vendor avant d'appliquer le patch ; il abandonne proprement si la version installée n'est pas celle qu'on connaît (évite de corrompre un firmware imprévu).
Ouvre http://openqiara.local (ou l'IP de la caméra) pour appairer les
capteurs et configurer MQTT.
Si tu préfères builder toi-même plutôt que d'utiliser une release :
git clone https://github.com/Caligone/openqiara
cd openqiara
# Cross-compile le daemon pour la caméra (ARMv7)
GOOS=linux GOARCH=arm GOARM=7 go build -trimpath -ldflags="-s -w" \
-o bin/openqiarad ./cmd/openqiarad
# Tests (à lancer sur ta machine de dev)
go test ./...Prérequis : Go 1.26+.
docs/getting-started.md— commence icidocs/install.md— installation avancée (préparation SD, recovery)docs/architecture.md— architecture interne deopenqiaraddocs/sensors.md— appairage et comportement par capteurdocs/kpd.md— détails du protocole clavier (PIN, armement/désarmement, particularités)docs/mqtt.md— topics MQTT et discovery Home Assistantdocs/homekit.md— intégration HomeKitdocs/protocol.md— référence protocole DomusRF (pour contributeurs et curieux)SECURITY.md— politique de sécurité et report de vulnérabilités
OpenQiara est un overlay sur le rootfs stock de la caméra. Il ne
re-flashe pas la caméra, ne remplace pas le kernel, et ne touche pas au
firmware du MCU. Il se lance à côté (ou à la place) du daemon original
fbxhome, parle au même multiplexeur UART charmux que le firmware d'origine,
et utilise le même protocole DomusRF avec les mêmes capteurs.
Ce qui reste du constructeur :
- Kernel Linux + drivers Sigmastar (le SoC de la caméra)
- Driver WiFi (
ssv6x5x.ko) charmux(multiplexeur UART vers le MCU)uartboot(flashe le firmware MCU à chaque boot)- Le firmware MCU lui-même (
/lib/firmwares/hlcam02_ctrl.bin) - Pipeline vidéo (
hlcamd,hls)
Ce qu'OpenQiara remplace :
- Le daemon applicatif
fbxhome— reverse-engineeré et réimplémenté en Go, sans dépendance cloud
C'est similaire en esprit à Tasmota sur ESP ou OpenWrt sur routeurs : le bootloader et les blobs propriétaires restent, la couche applicative devient du logiciel libre.
Distribué sous Licence MIT.
OpenQiara est un projet d'interopérabilité au titre de la directive européenne 2009/24/CE (Article 6) et du CPI français L122-6-1.IV. Aucun code propriétaire, firmware ou matériel cryptographique de Qiara, Free, Iliad, Cofidur EMS ou Sigmastar n'est inclus dans ce dépôt ni distribué par lui.
Utilisation à tes risques et périls. Modifier ta caméra peut annuler la
garantie constructeur (mais Qiara étant défunte, c'est surtout théorique) et
peut briquer l'appareil si tu ignores les avertissements sur les opcodes MCU
dangereux dans docs/protocol.md. Fais des backups.
L'essentiel de cette base de code — le reverse engineering DomusRF, le daemon Go, le pipeline de streaming caméra HomeKit (HLS watcher → parser MPEG-TS → packetizer RTP H.264 → SRTP) — a été écrit en sessions de pair-programming avec Claude Code tournant sur le modèle Claude Opus. Les décisions d'architecture, la validation sur le hardware réel, et les innombrables investigations en cul-de-sac ont été une collaboration humain + LLM. Le résultat est le travail d'un hobbyiste solo qui n'aurait jamais sorti tout ça en temps raisonnable seul.