Как работает:
Раз в час скрипт проверяет, было ли движение за последние 60 минут
Если было и за этот час ещё не отправляли → отправляет email
Запоминает отправку в таблице email_triggers
В следующем часе снова проверяет и при необходимости отправляет новое письмо
То есть письмо будет приходить не чаще раза в час, даже если движение есть постоянно. Для можжевельника — самое то! 🌱
#!/usr/bin/php
<?php
/**
* Скрипт для отправки email по движению (раз в час)
* Добавить в cron: 0 * * * * /usr/bin/php /var/www/html/iot/cron_motion_hourly.php >> /var/log/iot-motion.log 2>&1
*/
$pdo = new PDO("mysql:host=127.0.0.1;dbname=iot_db;charset=utf8mb4", "user", "123456");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Настройки
$motionTopic = 'zigbee2mqtt/motion_sensor/presence';
$emailTo = '9447333@gmail.com';
$checkMinutes = 60; // Проверяем за последний час
// 1. Было ли движение за последний час
$stmt = $pdo->prepare("
SELECT COUNT(*) as cnt, MIN(timestamp) as first_motion, MAX(timestamp) as last_motion
FROM sensor_data
WHERE topic = ? AND value = '1'
AND timestamp > DATE_SUB(NOW(), INTERVAL ? MINUTE)
");
$stmt->execute([$motionTopic, $checkMinutes]);
$motion = $stmt->fetch();
// 2. Проверяем, не отправляли ли уже письмо за этот час
$stmt = $pdo->prepare("
SELECT COUNT(*) as sent FROM email_triggers
WHERE rule_name = 'motion_hourly'
AND DATE(triggered_at) = CURDATE()
AND HOUR(triggered_at) = HOUR(NOW())
");
$stmt->execute();
$sent = $stmt->fetch();
// 3. Если было движение и письмо ещё не отправляли
if ($motion['cnt'] > 0 && $sent['sent'] == 0) {
$subject = "📡 Движение за последний час";
$message = "За последние $checkMinutes минут:\n";
$message .= "- Количество срабатываний: {$motion['cnt']}\n";
$message .= "- Первое движение: {$motion['first_motion']}\n";
$message .= "- Последнее движение: {$motion['last_motion']}\n";
$message .= "\nВремя проверки: " . date('Y-m-d H:i:s');
$headers = "From: it@logoakademia.ru\r\n";
$headers .= "Content-Type: text/plain; charset=utf-8\r\n";
if (mail($emailTo, $subject, $message, $headers)) {
// Записываем в лог отправки
$stmt = $pdo->prepare("
INSERT INTO email_triggers (rule_id, rule_name, recipient, trigger_topic, trigger_value, sent)
VALUES (?, ?, ?, ?, ?, 1)
");
$stmt->execute([0, 'motion_hourly', $emailTo, $motionTopic, $motion['cnt']]);
echo date('Y-m-d H:i:s') . " ✅ Email отправлен (движений: {$motion['cnt']})\n";
} else {
echo date('Y-m-d H:i:s') . " ❌ Ошибка отправки email\n";
}
} else {
if ($motion['cnt'] == 0) {
echo date('Y-m-d H:i:s') . " ⏸️ Движения не было\n";
} else {
echo date('Y-m-d H:i:s') . " ⏸️ Письмо уже отправлено за этот час\n";
}
}
# Создаём файл
sudo nano /var/www/html/iot/cron_motion_hourly.php
# Вставляем код выше
# Делаем исполняемым
sudo chmod +x /var/www/html/iot/cron_motion_hourly.php
# Проверяем вручную
sudo php /var/www/html/iot/cron_motion_hourly.php
sudo crontab -e
0 * * * * /usr/bin/php /var/www/html/iot/cron_motion_hourly.php >> /var/log/iot-motion.log 2>&1
Комментарии
Пока нет комментариев. Будьте первым!