Code webhook_presence.php

Depuis votre terminal, connectez-vous a votre Raspberry PI et rentrez la commande suivante pour créer le fichier webhook_presence.php.

sudo nano /var/www/html/webhook_presence.php


Copier le code suivant et coller le dans le fichier qui vient de s'ouvrir.

<?php
date_default_timezone_set('Europe/Paris');

// --- CONFIGURATION CRITIQUE ---
const STATUS_FILE = '/var/www/html/data/devices_status.json';
const LOG_FILE = '/var/log/camera_status.log'; 

// >>> VOTRE JETON SECRET <<<
// Changez cette valeur pour un mot de passe long et aléatoire !
const WEBHOOK_SECRET = 'VOTRE_JETON_SECRET';
// ------------------------------

// --- VÉRIFICATION DES PARAMÈTRES REÇUS ---
$device_id = isset($_GET['device']) ? htmlspecialchars($_GET['device']) : null;
$new_status = isset($_GET['status']) ? strtolower(htmlspecialchars($_GET['status'])) : null;
$received_secret = isset($_GET['secret']) ? htmlspecialchars($_GET['secret']) : null;

// Vérification du jeton secret en premier
if ($received_secret !== WEBHOOK_SECRET) {
    header('HTTP/1.0 401 Unauthorized');
    die('Erreur 401: Jeton secret invalide.');
}

// Vérification de base pour s'assurer que les données sont valides
if (empty($device_id) || !in_array($new_status, ['present', 'absent'])) {
    header('HTTP/1.0 400 Bad Request');
    die('Erreur: Paramètres device ou status manquants/invalides.');
}

// --- FONCTIONS DE GESTION DES STATUTS ---

function get_devices_status() {
    if (file_exists(STATUS_FILE)) {
        $data = file_get_contents(STATUS_FILE);
        return json_decode($data, true) ?: [];
    }
    return [];
}

function save_devices_status($status_array) {
    file_put_contents(STATUS_FILE, json_encode($status_array, JSON_PRETTY_PRINT), LOCK_EX);
}

// Vérifie si TOUS les appareils sont absents
function all_devices_absent($status_array) {
    if (empty($status_array)) return true; 
    
    foreach ($status_array as $status) {
        if ($status === 'present') {
            return false;
        }
    }
    return true; 
}


// --- LOGIQUE PRINCIPALE ---

$current_statuses = get_devices_status();

// 1. Mise à jour du statut du périphérique
if (isset($current_statuses[$device_id]) && $current_statuses[$device_id] === $new_status) {
    header('Content-Type: application/json'); // Assurez-vous que le header est bien là, même si il est au début du fichier
    die(json_encode(['status' => 'info', 'message' => 'Statut déjà enregistré. Aucune action nécessaire.']));
}
// Vérifie si l'appareil est connu dans le fichier JSON
if (!isset($current_statuses[$device_id])) {
    $current_statuses[$device_id] = $new_status;
    file_put_contents(LOG_FILE, sprintf("[%s] [WARNING] Nouvel appareil (%s) ajouté automatiquement au statut.\n", date('Y-m-d H:i:s'), $device_id), FILE_APPEND | LOCK_EX);
} else {
    $current_statuses[$device_id] = $new_status;
}

save_devices_status($current_statuses);

// 2. Détermination de l'état global du foyer
$is_all_absent = all_devices_absent($current_statuses);

// 3. Contrôle du service MotionEye
$motioneye_status = shell_exec('/bin/systemctl is-active motioneye 2>/dev/null | tr -d "\n" | tr "[:upper:]" "[:lower:]"');
$timestamp = date('Y-m-d H:i:s');
$action_taken = 'none';
$log_message = '';


if ($is_all_absent && $motioneye_status === 'inactive') {
    // Dernier sorti : TOUS sont absents -> Démarrer MotionEye
    shell_exec('sudo /bin/systemctl start motioneye');
    $action_taken = 'start';
    $log_message = sprintf("[%s] [AUTO] Caméra DÉMARRÉE (Dernier Sorti - %s: %s).", $timestamp, $device_id, $new_status);
    
} elseif (!$is_all_absent && $motioneye_status === 'active') {
    // Premier entré : QUELQU'UN est présent -> Arrêter MotionEye
    shell_exec('sudo /bin/systemctl stop motioneye');
    $action_taken = 'stop';
    $log_message = sprintf("[%s] [AUTO] Caméra ARRÊTÉE (Premier Entré - %s: %s).", $timestamp, $device_id, $new_status);

} else {
    // Si l'état du service est déjà correct
    $log_message = sprintf("[%s] [INFO] Statut %s mis à jour par %s. Service inchangé (état actuel : %s).", $timestamp, $new_status, $device_id, $motioneye_status);
}

// 4. Journalisation
file_put_contents(LOG_FILE, $log_message . "\n", FILE_APPEND | LOCK_EX);

// 5. Réponse
echo json_encode(['status' => 'success', 'global_state' => ($is_all_absent ? 'absent' : 'present'), 'motioneye_action' => $action_taken]);

?>

- Vous devez remplacer la valeur de la variable " const WEBHOOK_SECRET " par votre jeton secret. Noter le, nous utiliserons lorsque nous automatiserons la mise en service avec le smartphone.