Code webhook_presence.php
code pour créer webhook_presence.php
Deux possibilités pour créer le fichier.
Vous créez le fichier webhook_presence.php sur votre PC et tranferrez le via FTP
Ou depuis votre terminal, connectez-vous à votre Raspberry Pi et créez webhook_presence.php :
sudo nano /var/www/html/webhook_presence.phpp Copier le code suivant et coller le dans le fichier qui vient de s'ouvrir.
changer la valeur const WEBHOOK_SECRET par votre propre jeton.Noter le, nous utiliserons lorsque nous automatiserons la mise en service avec le smartphone
<?php
date_default_timezone_set('Europe/Paris');
$config = include('/var/www/html/data/.env.php');
define('STATUS_FILE', $config['DATA_DIR'] . 'devices_status.json');
define('LOG_FILE', $config['LOG_PATH']);
define('WEBHOOK_SECRET', $config['SECRET_PHRASE']);
/**
* Fonction de notification double (SMS + Email)
*/
function notify($sujet, $msg) {
global $config;
// 1. Envoi Email (avec le lien vers le site)
if (isset($config['MAIL_ENABLED']) && $config['MAIL_ENABLED'] === true) {
$to = $config['MAIL_DEST'];
$from = $config['MAIL_FROM'];
$headers = "From: $from\r\n";
$headers .= "Reply-To: $from\r\n";
$headers .= "Content-Type: text/plain; charset=utf-8\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$corps_complet = $msg . "\n\n🏠 Accéder au site : http://motioneye.free.fr";
@mail($to, $sujet, $corps_complet, $headers);
}
// 2. Envoi SMS Free (Texte brut sans lien)
if (isset($config['FREE_SMS_ACTIVE']) && $config['FREE_SMS_ACTIVE'] === true) {
$user = $config['FREE_USER'];
$pass = $config['FREE_PASS'];
$url = "https://smsapi.free-mobile.fr/sendmsg?user=$user&pass=$pass&msg=" . urlencode($sujet . " : " . $msg);
@file_get_contents($url);
}
}
// --- Récupération des paramètres ---
$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 de sécurité
if ($received_secret !== WEBHOOK_SECRET) {
header('HTTP/1.0 401 Unauthorized');
die('Secret invalide');
}
// --- Mise à jour du statut ---
$current_statuses = file_exists(STATUS_FILE) ? json_decode(file_get_contents(STATUS_FILE), true) : [];
$current_statuses[$device_id] = $new_status;
file_put_contents(STATUS_FILE, json_encode($current_statuses, JSON_PRETTY_PRINT), LOCK_EX);
// Vérification de la présence globale
$is_all_absent = true;
foreach ($current_statuses as $st) {
if ($st === 'present') {
$is_all_absent = false;
break;
}
}
$motioneye_status = (trim(shell_exec("systemctl is-active motioneye")) === 'active') ? 'active' : 'inactive';
$timestamp = date('Y-m-d H:i:s');
$log_msg = "";
// --- Logique Automatique ---
if ($is_all_absent && $motioneye_status === 'inactive') {
shell_exec('sudo /bin/systemctl start motioneye');
$log_msg = "[$timestamp] [AUTO] Caméra DÉMARRÉE (Départ de $device_id).";
notify("Alarme Maison", "Démarrage AUTO (Départ de $device_id)");
} elseif (!$is_all_absent && $motioneye_status === 'active') {
shell_exec('sudo /bin/systemctl stop motioneye');
$log_msg = "[$timestamp] [AUTO] Caméra ARRÊTÉE (Arrivée de $device_id).";
notify("Alarme Maison", "Arrêt AUTO (Arrivée de $device_id)");
} else {
$etat_actuel = ($motioneye_status === 'active') ? "DÉMARRÉE" : "ARRÊTÉE";
$log_msg = "[$timestamp] [INFO] Statut $new_status for $device_id. Service reste $etat_actuel.";
}
// --- Journalisation avec rotation ---
file_put_contents(LOG_FILE, $log_msg . "\n", FILE_APPEND | LOCK_EX);
$lines = file(LOG_FILE);
if (count($lines) > 500) {
file_put_contents(LOG_FILE, implode("", array_slice($lines, -500)), LOCK_EX);
}
header('Content-Type: application/json');
echo json_encode(['status' => 'success']);
date_default_timezone_set('Europe/Paris');
$config = include('/var/www/html/data/.env.php');
define('STATUS_FILE', $config['DATA_DIR'] . 'devices_status.json');
define('LOG_FILE', $config['LOG_PATH']);
define('WEBHOOK_SECRET', $config['SECRET_PHRASE']);
/**
* Fonction de notification double (SMS + Email)
*/
function notify($sujet, $msg) {
global $config;
// 1. Envoi Email (avec le lien vers le site)
if (isset($config['MAIL_ENABLED']) && $config['MAIL_ENABLED'] === true) {
$to = $config['MAIL_DEST'];
$from = $config['MAIL_FROM'];
$headers = "From: $from\r\n";
$headers .= "Reply-To: $from\r\n";
$headers .= "Content-Type: text/plain; charset=utf-8\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$corps_complet = $msg . "\n\n🏠 Accéder au site : http://motioneye.free.fr";
@mail($to, $sujet, $corps_complet, $headers);
}
// 2. Envoi SMS Free (Texte brut sans lien)
if (isset($config['FREE_SMS_ACTIVE']) && $config['FREE_SMS_ACTIVE'] === true) {
$user = $config['FREE_USER'];
$pass = $config['FREE_PASS'];
$url = "https://smsapi.free-mobile.fr/sendmsg?user=$user&pass=$pass&msg=" . urlencode($sujet . " : " . $msg);
@file_get_contents($url);
}
}
// --- Récupération des paramètres ---
$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 de sécurité
if ($received_secret !== WEBHOOK_SECRET) {
header('HTTP/1.0 401 Unauthorized');
die('Secret invalide');
}
// --- Mise à jour du statut ---
$current_statuses = file_exists(STATUS_FILE) ? json_decode(file_get_contents(STATUS_FILE), true) : [];
$current_statuses[$device_id] = $new_status;
file_put_contents(STATUS_FILE, json_encode($current_statuses, JSON_PRETTY_PRINT), LOCK_EX);
// Vérification de la présence globale
$is_all_absent = true;
foreach ($current_statuses as $st) {
if ($st === 'present') {
$is_all_absent = false;
break;
}
}
$motioneye_status = (trim(shell_exec("systemctl is-active motioneye")) === 'active') ? 'active' : 'inactive';
$timestamp = date('Y-m-d H:i:s');
$log_msg = "";
// --- Logique Automatique ---
if ($is_all_absent && $motioneye_status === 'inactive') {
shell_exec('sudo /bin/systemctl start motioneye');
$log_msg = "[$timestamp] [AUTO] Caméra DÉMARRÉE (Départ de $device_id).";
notify("Alarme Maison", "Démarrage AUTO (Départ de $device_id)");
} elseif (!$is_all_absent && $motioneye_status === 'active') {
shell_exec('sudo /bin/systemctl stop motioneye');
$log_msg = "[$timestamp] [AUTO] Caméra ARRÊTÉE (Arrivée de $device_id).";
notify("Alarme Maison", "Arrêt AUTO (Arrivée de $device_id)");
} else {
$etat_actuel = ($motioneye_status === 'active') ? "DÉMARRÉE" : "ARRÊTÉE";
$log_msg = "[$timestamp] [INFO] Statut $new_status for $device_id. Service reste $etat_actuel.";
}
// --- Journalisation avec rotation ---
file_put_contents(LOG_FILE, $log_msg . "\n", FILE_APPEND | LOCK_EX);
$lines = file(LOG_FILE);
if (count($lines) > 500) {
file_put_contents(LOG_FILE, implode("", array_slice($lines, -500)), LOCK_EX);
}
header('Content-Type: application/json');
echo json_encode(['status' => 'success']);
Important : Permissions du fichier de log
Pour que le script puisse écrire l'historique, vous devez créer le fichier de log et lui donner les droits d'écriture :
sudo touch /var/log/camera_status.logsudo chmod 666 /var/log/camera_status.log