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.