Documentation

Guide complet pour installer, configurer et automatiser K7 Recorder.

Installation APK

K7 Recorder s'installe directement depuis le fichier APK — aucun store requis.

1

Activer les sources inconnues

Sur votre appareil Android, allez dans Paramètres → Sécurité → Sources inconnues (ou Installer des apps inconnues sur Android 8+) et autorisez votre gestionnaire de fichiers à installer des APK.
2

Télécharger le fichier APK

L'APK n'est pas en téléchargement public : il est fourni avec votre déploiement. Demandez-le depuis la page PRO.
3

Installer l'APK

Ouvrez le fichier téléchargé dans votre gestionnaire de fichiers et appuyez sur Installer. L'application apparaîtra dans votre launcher.
4

Accorder les permissions

Au premier lancement, K7 Recorder demande les permissions Caméra, Stockage et USB. Accordez toutes les permissions pour un fonctionnement optimal.

Android 8.0+ requis — L'application cible Android 15 et reste compatible à partir d'Android 8.0. Le téléphone doit supporter l'USB OTG pour recevoir une caméra USB.

Première connexion

Connectez votre première caméra UVC et vérifiez que l'API répond correctement.

1

Brancher une caméra USB UVC

Connectez votre caméra USB compatible UVC sur le port OTG de l'appareil Android. K7 Recorder détecte la caméra à la connexion et demande l'autorisation USB au premier branchement.
2

Vérifier la détection

La caméra détectée s'affiche dans le tableau de bord. Un indicateur vert confirme la connexion active.
3

Tester le serveur HTTP local

Le serveur HTTP local est désactivé par défaut — le pilotage passe par MQTT. Une fois démarré (commande start_http_server, ou depuis l'application), interrogez-le depuis un autre appareil du même réseau :
terminal
curl http://<IP_ANDROID>:8080/api/cameras
Vous devez recevoir un JSON avec l'état du système :
réponse
{
  "cameras": [
    {
      "id": 1003,
      "cameraId": 1003,
      "name": "USB Camera",
      "resolution": "1920x1080",
      "fps": 24,
      "isRecording": false,
      "recordingMode": "CONTINUOUS",
      "streamUrl": "/camera/1003/stream",
      "snapshotUrl": "/camera/1003/snapshot"
    }
  ],
  "count": 1
}
4

Démarrer un enregistrement

Les routes HTTP sont scopées par caméra. `{id}` est l'identifiant renvoyé par `/api/cameras` :
terminal
curl -X POST \
  http://<IP_ANDROID>:8080/camera/1003/api/recording/start

Paramètres généraux

Configurez les paramètres globaux de K7 Recorder via l'interface ou l'API.

Serveur HTTP local

Le serveur HTTP local est désactivé par défaut et écoute sur le port 8080 une fois démarré. Il n'a pas de couche d'authentification : l'isolation vient du tunnel VPN, il ne doit pas être exposé hors de ce périmètre.

Démarrer le serveur sur un autre port
{
  "action": "start_http_server",
  "params": { "port": 8080 },
  "request_id": "a1b2c3d4"
}

Paramètres disponibles

ParamètreTypeDéfautDescription
auto_start_recordingbooleanfalseDémarrer l'enregistrement au lancement
segmentation_enabledbooleantrueDécouper les enregistrements en segments indépendants
segment_duration_mslong600000Durée d'un segment, en millisecondes (10 min)
default_recording_fpsint24Cadence d'encodage par défaut
default_video_codecstring"H264"Codec vidéo par défaut
streaming_transportstring"SRT"Transport de diffusion par défaut : SRT ou RTSP
http_server_enabledbooleanfalseServeur HTTP local — désactivé par défaut
http_server_portint8080Port d'écoute du serveur HTTP local
storage_priority_orderstring"INTERNAL,SD_CARD,USB"Ordre de priorité d'écriture des supports
security_modestring"token"Porte des commandes : open ou token
device_codestring""Code de l'appareil dans la flotte (K1 à K99)
thermal_governor_enabledbooleanfalseDégrader la cadence quand le téléphone chauffe

Événements publiés

K7 Recorder publie son état et ses événements sur MQTT, sans qu'on ait à l'interroger. Les alertes applicatives arrivent sur le topic d'alerte de la caméra concernée.

Mouvement détectécamera/{id}/motion
Présence humaine détectéecamera/{id}/human
État d'enregistrementcamera/{id}/recording_state
Alerte caméracamera/{id}/alert
Espace de stockagedevice/{phoneId}/storage
État du téléphone (batterie, réseau)device/{phoneId}/state
Déplacement du téléphonedevice/{phoneId}/motion
Exécution d'un profil Wardendevice/{phoneId}/warden/profile/{id}/execution
Charge utile — détection de mouvement
camera/1003/motion

{
  "device_id": "<ANDROID_ID>",
  "cameraId": 1003,
  "event": "motion_started",
  "motionPercent": 4.2,
  "timestamp": 1756108800000
}

Caméras UVC

K7 Recorder supporte toutes les caméras conformes au standard USB Video Class (UVC). La plupart des webcams modernes sont UVC compatibles.

Plug & Play

Détection automatique à la connexion

Multi-caméras

Plusieurs caméras sur un hub alimenté

Reconnexion auto

Reconnexion en cas de micro-déconnexion

Hub OTG

Pour connecter plusieurs caméras, utilisez un hub USB OTG alimenté (recommandé : alimentation externe 5V/3A minimum).

Hub alimenté obligatoire pour 2+ caméras. Un hub passif (sans alimentation) peut causer des déconnexions aléatoires sous charge.

Relancer la découverte des caméras
{
  "action": "refresh_cameras",
  "request_id": "a1b2c3d4"
}

// Les caméras découvertes sont republiées sur
// device/{phoneId}/cameras/list

Réglages UVC

Les caméras UVC exposent des contrôles matériels pilotables à distance. Les paramètres réellement disponibles varient d'un modèle à l'autre : interrogez la caméra plutôt que de supposer.

Lire les capacités réelles du capteur
{
  "action": "get_capabilities",
  "params": { "camera": 1003 },
  "request_id": "a1b2c3d4"
}

// Réponse sur camera/1003/response, puis état
// complet retenu sur camera/1003/capabilities

La balance des blancs automatique (Auto Kelvin) utilise le capteur de luminosité Lux pour adapter la température de couleur en temps réel selon les conditions d'éclairage.

Concepts API

K7 Recorder repose sur un dictionnaire de commandes unique. La même action se déclenche par MQTT ou par broadcast Android — les deux voies passent par le même routeur de commandes. Le serveur HTTP local est un canal distinct, avec ses propres routes.

MQTT

Canal principal. Bi-directionnel : le téléphone publie son état et reçoit les commandes sur le même broker. C'est la voie complète — les 106 commandes y passent.

Broadcasts Android

Même dictionnaire, déclenché par Tasker, MacroDroid ou toute app Android. Utile quand le broker est injoignable.

HTTP local

Serveur embarqué, désactivé par défaut, port 8080. Sert l'aperçu MJPEG, les snapshots, la galerie et un sous-ensemble de contrôles.

Enveloppe des commandes MQTT

Une commande est un message JSON : l'action, ses paramètres, et un request_id qui corrèle la réponse. Sans request_id, la réponse ne peut pas être rattachée à la commande.

Commande publiée
// topic : device/{phoneId}/cameras/1003/command
{
  "action": "start_recording",
  "params": {
    "camera": 1003,
    "mode": "continuous"
  },
  "request_id": "a1b2c3d4"
}
Réponse reçue
// topic : camera/1003/response
{
  "action": "start_recording",
  "success": true,
  "deviceId": 1003,
  "device_id": "<ANDROID_ID>",
  "request_id": "a1b2c3d4",
  "timestamp": 1756108800000
}

Codes d'erreur des réponses

successtrueL'action a été exécutée
INVALID_PARAMSerror_codeParamètres manquants ou invalides
UNKNOWN_CAMERAerror_codeCaméra introuvable, ou caméra non précisée alors que plusieurs sont connectées
INTERNAL_ERRORerror_codeErreur interne de l'application

Diffusion SRT / RTSP

Le téléphone pousse son flux vers un serveur MediaMTX — qui tourne sur votre infrastructure, pas sur le téléphone. MediaMTX le republie ensuite en RTSP, WebRTC ou HLS pour VLC, Home Assistant, un NVR ou un navigateur. Le transport par défaut est SRT ; RTSP reste disponible.

Démarrer la diffusion
// topic : device/{phoneId}/cameras/1003/command
{
  "action": "start_rtsp_streaming",
  "params": {
    "camera": 1003,
    "transport": "SRT"
  },
  "request_id": "a1b2c3d4"
}

Lire dans VLC

VLC
vlc rtsp://<IP_MEDIAMTX>:8554/<chemin_publie>

Le flux RTSP est indépendant de l'enregistrement. Vous pouvez streamer sans enregistrer et inversement.

HTTP MJPEG

Le serveur HTTP local sert un flux MJPEG et des snapshots, affichables directement dans un navigateur ou une entité caméra Home Assistant. Il est désactivé par défaut et écoute sur le port 8080 une fois démarré.

Démarrer le serveur MJPEG
// 1. démarrer le serveur HTTP local (MQTT)
{
  "action": "start_http_server",
  "params": { "port": 8080 },
  "request_id": "a1b2c3d4"
}

// 2. flux et image fixe, par caméra
http://<IP_ANDROID>:8080/camera/1003/stream
http://<IP_ANDROID>:8080/camera/1003/snapshot

Intégration Home Assistant

configuration.yaml
camera:
  - platform: mjpeg
    name: K7 Cam
    mjpeg_url: http://<IP_ANDROID>:8080/camera/1003/stream
    still_image_url: http://<IP_ANDROID>:8080/camera/1003/snapshot

MQTT

L'intégration MQTT est bi-directionnelle : K7 Recorder publie des événements et reçoit des commandes sur le même broker.

Configurer le broker
// Le broker est provisionné avec l'appareil.
// Les identifiants se changent à distance :
{
  "action": "set_mqtt_credentials",
  "params": {
    "username": "kass",
    "password": "…"
  },
  "request_id": "a1b2c3d4"
}

Topics publiés (état et événements)

device/{phoneId}/stateÉtat du téléphone : batterie, réseau, uptime
device/{phoneId}/storageEspace libre sur chaque support
device/{phoneId}/cameras/listCaméras connectées à ce téléphone
device/{phoneId}/systemBattement système. Sa période s'adapte : 1 min en diffusion, 5 min caméra connectée au repos, 10 min sans caméra
camera/{id}/statusÉtat de la caméra
camera/{id}/recording_stateÉtat de l'enregistrement
camera/{id}/settings/currentRéglages effectifs, republiés dès qu'ils changent réellement
camera/{id}/capabilitiesCapacités réelles du capteur
camera/{id}/motionDétection de mouvement
camera/{id}/humanDétection de présence humaine
camera/{id}/responseRéponses aux commandes, corrélées par request_id

Topics de commande (souscrits par le téléphone)

Envoyer une commande MQTT
// topic : device/{phoneId}/cameras/{cameraId}/command
{
  "action": "start_recording",
  "params": {
    "camera": 1003,
    "mode": "motion"
  },
  "request_id": "a1b2c3d4"
}

Warden Engine

Le Warden Engine est le moteur d'automatisation intégré à K7 Recorder. Il permet de créer des règles trigger → action sans dépendance externe.

Triggers disponibles

schedule

Heure précise ou récurrence cron

motion

Détection de mouvement sur une caméra

network

Connexion / déconnexion réseau Wi-Fi

battery

Niveau batterie franchit un seuil

timer

Délai relatif depuis un événement

camera_connect

Caméra USB connectée / déconnectée

Créer une règle Warden
// topic : device/{phoneId}/cameras/0/command
{
  "action": "warden_create_profile",
  "params": { "name": "Garde de nuit" },
  "request_id": "a1b2c3d4"
}

// puis lier le profil à une caméra
{
  "action": "warden_assign_camera",
  "params": { "profile_id": "12", "camera": 1003 },
  "request_id": "b2c3d4e5"
}

Tasker / MacroDroid

K7 Recorder écoute des broadcasts Android que Tasker ou MacroDroid peuvent émettre. La voie principale est un broadcast unique, com.kass.recorder.ACTION_CONTROL, dont l'extra command porte le nom de l'action — le même dictionnaire qu'en MQTT. Quelques actions ont aussi leur broadcast dédié.

Broadcasts supportés

com.kass.recorder.ACTION_CONTROLVoie principale : l'extra command porte le nom de l'action, camera_id la caméra visée
com.kass.recorder.START_RECORDINGDémarrer l'enregistrement
com.kass.recorder.STOP_RECORDINGArrêter l'enregistrement
com.kass.recorder.CAPTURE_IMAGECapturer une image
com.kass.recorder.START_RTSPDémarrer la diffusion
com.kass.recorder.STOP_RTSPArrêter la diffusion
com.kass.recorder.APPLY_IMAGE_SETTINGSAppliquer les réglages image
com.kass.recorder.WAKE_DEVICERéveiller le CPU

Les extras sont transmis en chaînes de caractères — c'est ce que Tasker sait produire. Sur un montage multi-caméras, camera_id est obligatoire : sans lui, une action liée à une caméra est rejetée plutôt que routée au hasard.

Déclencher une action par broadcast
am broadcast -p com.kass.recorder \
  -a com.kass.recorder.ACTION_CONTROL \
  --es command start_recording \
  --es camera_id 1003 \
  --es mode motion

Home Assistant

Intégrez K7 Recorder dans Home Assistant via MQTT et MJPEG. Créez des automatisations depuis les événements de surveillance.

automation.yaml — enregistrer si quelqu'un sonne
automation:
  - alias: "K7 - Record on doorbell"
    trigger:
      platform: state
      entity_id: binary_sensor.doorbell
      to: "on"
    action:
      service: mqtt.publish
      data:
        topic: device/{phoneId}/cameras/1003/command
        payload: >-
          {"action": "start_recording",
           "params": {"camera": 1003},
           "request_id": "{{ now().timestamp() }}"}
configuration.yaml — caméra MJPEG
camera:
  - platform: mjpeg
    name: K7 Cam Entrance
    mjpeg_url: http://<IP_ANDROID>:8080/camera/1003/stream
    still_image_url: http://<IP_ANDROID>:8080/camera/1003/snapshot

Les topics de K7 Recorder sont du MQTT standard : Home Assistant les consomme directement, sans intégration dédiée. Le topic de mouvement d'une caméra alimente un binary_sensor, son flux MJPEG une entité camera.

S3 / MinIO

K7 Recorder peut exporter automatiquement les enregistrements vers un bucket S3 (AWS) ou une instance MinIO auto-hébergée. L'upload supporte la reprise sur interruption (chunked upload).

Configurer S3 / MinIO
{
  "action": "configure_s3",
  "params": {
    "endpoint": "https://minio.local:9000",
    "bucket": "surveillance",
    "access_key": "…",
    "secret_key": "…",
    "region": "us-east-1",
    "wifi_only": true
  },
  "request_id": "a1b2c3d4"
}

Options d'upload

wifi_onlytrueN'uploader que sur Wi-Fi pour préserver les données mobiles
auto_upload_videosfalseUpload automatique dès qu'un enregistrement est finalisé
auto_upload_snapshotsfalseUpload automatique des captures d’image
chunk_size_mb5Taille des chunks, de 5 à 100 Mo
max_concurrent1Uploads menés en parallèle, de 1 à 8
max_retries3Tentatives de reprise après échec, de 0 à 10
Déclencher l'upload manuel
{
  "action": "upload_last_video",
  "request_id": "a1b2c3d4"
}

// état de la file et de la configuration
{
  "action": "get_s3_status",
  "request_id": "b2c3d4e5"
}

Stockage local

K7 Recorder gère trois supports d'écriture avec bascule automatique silencieuse : l'enregistrement continue sans interruption même si un support est plein. L'ordre de priorité est configurable ; par défaut, le stockage interne passe en premier.

1

Stockage interne

Premier support par défaut. Toujours présent, jamais débranché en cours d'enregistrement.

2

Carte SD

Support amovible, détecté au montage.

3

USB (OTG)

Clé USB ou disque externe. Le plus grand volume, mais il occupe le port OTG — sur un montage avec caméra USB, il passe par le hub.

Lire l'état du stockage
{
  "action": "get_storage_stats",
  "request_id": "a1b2c3d4"
}

// L'espace libre est aussi publié en continu sur
// device/{phoneId}/storage

Dépannage

Solutions aux problèmes les plus fréquents.

Problèmes connus

Limitations connues et comportements attendus.