↩️ Назад

Категории

Скрипт для отправки email по движению (раз в час)

09.05.2026 | коды из категории: IOT умный дом

Как работает:
Раз в час скрипт проверяет, было ли движение за последние 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



Категории:

Категории

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку

Посетителей сегодня: 0
о блоге | карта блога | 📡 Подписаться на RSS

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA