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 ──► MCU │
└──────────────┘ │ (UART, 868 MHz) │
└─────────────────────────────┘
openqiarad est lui-même la passerelle radio : le daemon constructeur
fbxhome est arrêté au boot, et openqiarad pilote directement le MCU
(appairage, heartbeat, crypto, bytecode des capteurs). Au premier démarrage, il
importe les capteurs déjà appairés depuis /data/fbxhome.xml.* en gardant
leurs IDs.
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. 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 | ✅ AAC-ELD (libfdk-aac de la caméra) |
| Web UI pour appairage & config | ✅ |
| 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.
-
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 : remise sous tension physique complète. Voirdocs/sensors.md. -
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 ou Linux (Ubuntu/Debian),
et un réseau WiFi 2.4 GHz. Deux scripts d'install équivalents sont fournis :
sd_setup.sh (macOS) et sd_setup_ubuntu.sh (Linux).
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.imgSur Linux, repère le disque avec lsblk et dumpe les partitions
(sdb1/sdb2/sdb3 sur un lecteur USB, mmcblk0p1… sur un contrôleur SD) :
DISK=sdb # ajuster (lsblk)
sudo dd if=/dev/${DISK}1 bs=1M of=backup_rootfs.img
sudo dd if=/dev/${DISK}2 bs=1M of=backup_data.img
sudo dd if=/dev/${DISK}3 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 # macOS ; sur Linux : curl -LO $BASE/sd_setup_ubuntu.sh
curl -LO $BASE/camera_boot.sh # requis : sd_setup.sh le copie dans /data/boot.sh
curl -LO $BASE/SHA256SUMS
# Vérification d'intégrité
shasum -a 256 -c SHA256SUMS
chmod +x sd_setup.sh
sd_setup.shcherchecamera_boot.shà côté de lui (install release-only) ou dansscripts/(checkout du repo). Garde-les dans le même dossier.
Si tu préfères compiler toi-même, voir la section Compilation plus bas.
macOS :
brew install e2fsprogs
./sd_setup.sh \
--disk disk4 \
--wifi-ssid "MonReseau" \
--wifi-pass "MonMotDePasse" \
--daemon openqiarad-linux-arm7 \
--ssh-pubkey ~/.ssh/id_ed25519.pubLinux (Ubuntu/Debian) :
sudo apt install e2fsprogs # généralement déjà présent
# --disk = nom du périphérique bloc sans /dev/ (repère-le avec: lsblk)
# lecteur USB : sdb | contrôleur eMMC/SD : mmcblk0
sudo ./sd_setup_ubuntu.sh \
--disk sdb \
--wifi-ssid "MonReseau" \
--wifi-pass "MonMotDePasse" \
--daemon openqiarad-linux-arm7 \
--ssh-pubkey ~/.ssh/id_ed25519.pub
--ssh-pubkeyn'est pas optionnel en pratique. La caméra n'autorise aucun mot de passe et n'embarque aucune clé : l'accès SSH vient uniquement de/data/ssh_authorized_keys, écrit par cette commande. Sans clé, la caméra démarre et l'interface web répond, maissshrenvoiePermission denied— et la seule façon d'en ajouter une ensuite est de refaire la carte SD.
Ré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).
Permission denied (publickey)en SSH ? Deux causes, dans cet ordre :
- Aucune clé n'a été installée. Vérifie depuis la SD :
debugfs -R "cat ssh_authorized_keys" /dev/diskNs2(macOS) ousudo debugfs -R "cat ssh_authorized_keys" /dev/sdX2(Linux). Si le fichier est vide ou absent, relancesd_setup.shavec--ssh-pubkey. Attention : le script reformate/data, donc tu repars d'une config vierge et les capteurs sont à ré-appairer. Sur une caméra déjà en service, préfère écrire la clé directement dans la partition :debugfs -w -R "write ~/.ssh/id_ed25519.pub ssh_authorized_keys" /dev/diskNs2.- Ta clé est au format RSA. Le dropbear de la caméra ne signe qu'en
ssh-rsa(SHA-1), qu'OpenSSH 8.7+ refuse par défaut. Ajoute-o PubkeyAcceptedAlgorithms=+ssh-rsa, ou utilise une clé ed25519 qui n'a pas ce problème.
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)
# zig (brew install zig) compile l'encodeur audio AAC-ELD contre la glibc
# de la caméra. Sans zig ni CGO_ENABLED=1 : même binaire, sans le son.
CGO_ENABLED=1 CC="zig cc -target arm-linux-gnueabihf.2.30" \
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/api.md— API HTTP locale (/api/v1)docs/openapi.json— la même en OpenAPI 3.1 : génération de client, Postman, Brunodocs/protocol.md— référence protocole DomusRF (pour contributeurs et curieux)CONTRIBUTING.md— règles de contribution : CI, commits, synchronisation de l'API, conventions de rétro-ingénierieSECURITY.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 à la place du daemon original
fbxhome (arrêté au boot), 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) - Encodeur vidéo (
hlcamd)
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 (multicast hlcamd → packetizer RTP H.264 et AAC-ELD → 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.