↩️ Назад

Категории

Добавление емаил уведомлений по событиям iot датчиков

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

про Добавление емаил уведомлений по событиям iot датчиков

дорабатываю заброшенный проект ) В горшке влажность надо контролировать, а я все забываю полить можевельник
Добавить 3 поля в БД, 3 функции в mqtt_listener.php, несколько строк в обработку POST в logic.php и HTML-блок с чекбоксом email. Email будет отправляться когда правило срабатывает, с возможностью задать задержку (например, отправлять только если температура выше 25°C держится больше часа).

В файле logic.php - ДОБАВИТЬ в форму (после persistent checkbox):

<!-- Добавить секцию email после persistent checkbox -->
<div class="email-section" style="margin-top: 15px; padding: 10px; border: 1px solid #ff6b6b; border-radius: 5px;">
    <label style="color: #ff6b6b;">
        <input type="checkbox" name="email_notify" onchange="toggleEmail(this.checked)">
        📧 Отправлять email при срабатывании
    </label>
    
    <div id="emailSettings" style="display:none; margin-top: 10px;">
        <label>Email получателя:<br>
            <input type="email" name="email_recipient" placeholder="admin@example.com">
        </label>
        
        <label>Отправлять только если условие держится (сек):<br>
            <input type="number" name="email_condition_duration" value="0" min="0">
            <small>0 = сразу, 3600 = через час</small>
        </label>
    </div>
</div>

<script>
function toggleEmail(checked) {
    document.getElementById('emailSettings').style.display = checked ? 'block' : 'none';
}
</script>

2. В logic.php - ДОБАВИТЬ в SQL запрос UPDATE и INSERT поля email:


Найти строки с UPDATE automations SET и добавить:

// В UPDATE запросе, после persistent = ?, добавить:
email_notify = ?, email_recipient = ?, email_condition_duration = ?,

// И в VALUES соответственно добавить эти 3 переменные

блок в коде для замены:

$stmt = $pdo->prepare("
    UPDATE automations SET
        name = ?, trigger_topic = ?, ... enabled = ?, persistent = ?
    WHERE id = ?
");

Заменить на:

$stmt = $pdo->prepare("
    UPDATE automations SET
        name = ?, trigger_topic = ?, condition_type = ?, condition_operator = ?,
        condition_value = ?, condition_script = ?, condition_duration = ?,
        action_topic = ?, action_payload = ?, confirmation_topic = ?,
        confirmation_timeout = ?, max_retries = ?, retry_delay = ?,
        delay_seconds = ?, schedule_type = ?, schedule_time = ?, schedule_days = ?,
        time_restriction_start = ?, time_restriction_end = ?, dependency_topic = ?,
        dependency_value = ?, enabled = ?, persistent = ?,
        email_notify = ?, email_recipient = ?, email_condition_duration = ?
    WHERE id = ?
");

И в execute добавить эти 3 переменные перед (int)$_POST['id']:

$email_notify = isset($_POST['email_notify']) ? 1 : 0;
$email_recipient = trim($_POST['email_recipient'] ?? '');
$email_condition_duration = (int)($_POST['email_condition_duration'] ?? 0);

3. В mqtt_listener.php - ДОБАВИТЬ функцию отправки email (в самое начало или перед основным циклом):

// ========== ФУНКЦИЯ ОТПРАВКИ EMAIL ==========
function sendEmailNotification($to, $ruleName, $triggerTopic, $currentValue, $conditionValue, $operator) {
    if (empty($to) || !filter_var($to, FILTER_VALIDATE_EMAIL)) {
        return false;
    }
    
    $subject = "IoT Уведомление: $ruleName";
    $message = "
    <html>
    <body>
        <h2>📡 Сработало правило автоматизации</h2>
        <table border='1' cellpadding='5'>
            <tr><th>Параметр</th><th>Значение</th></tr>
            <tr><td>📝 Правило</td><td><strong>$ruleName</strong></td></tr>
            <tr><td>🕐 Время</td><td>" . date('Y-m-d H:i:s') . "</td></tr>
            <tr><td>📊 Топик</td><td><code>$triggerTopic</code></td></tr>
            <tr><td>🎯 Значение</td><td><strong>$currentValue</strong></td></tr>
            <tr><td>⚙️ Условие</td><td>$operator $conditionValue</td></tr>
        </table>
        <hr><small>Отправлено IoT автоматизацией</small>
    </body>
    </html>";
    
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n";
    $headers .= "From: IoT Система <iot@localhost>\r\n";
    
    $subject = "=?UTF-8?B?" . base64_encode($subject) . "?=";
    
    return mail($to, $subject, $message, $headers);
}

4. В mqtt_listener.php - ДОБАВИТЬ переменные для отслеживания длительности email (в раздел глобальных переменных):

// Добавить в начало с другими глобальными переменными
$emailConditionStartTime = [];

5. В mqtt_listener.php - ДОБАВИТЬ функцию проверки длительности для email:

// ========== ПРОВЕРКА ДЛИТЕЛЬНОСТИ ДЛЯ EMAIL ==========
function checkEmailDuration($rule, $currentValue, &$emailConditionStartTime) {
    $ruleId = $rule['id'];
    $requiredDuration = (int)($rule['email_condition_duration'] ?? 0);
    
    if ($requiredDuration <= 0) {
        return true;
    }
    
    // Проверяем выполняется ли условие
    $conditionMet = false;
    switch ($rule['condition_operator']) {
        case '==': $conditionMet = ((string)$currentValue === (string)$rule['condition_value']); break;
        case '>':  $conditionMet = ((float)$currentValue > (float)$rule['condition_value']); break;
        case '<':  $conditionMet = ((float)$currentValue < (float)$rule['condition_value']); break;
        case '>=': $conditionMet = ((float)$currentValue >= (float)$rule['condition_value']); break;
        case '<=': $conditionMet = ((float)$currentValue <= (float)$rule['condition_value']); break;
    }
    
    if ($conditionMet) {
        if (!isset($emailConditionStartTime[$ruleId])) {
            $emailConditionStartTime[$ruleId] = time();
            return false;
        }
        
        $elapsed = time() - $emailConditionStartTime[$ruleId];
        if ($elapsed >= $requiredDuration) {
            unset($emailConditionStartTime[$ruleId]);
            return true;
        }
        return false;
    } else {
        if (isset($emailConditionStartTime[$ruleId])) {
            unset($emailConditionStartTime[$ruleId]);
        }
        return false;
    }
}

6. В mqtt_listener.php - ИЗМЕНИТЬ блок срабатывания правила, добавив отправку email:


Найти блок где происходит срабатывание правила (примерно в конце, где echo "🎉 СРАБОТАЛО ПРАВИЛО"):
Добавить после отправки MQTT команды:

                // ========== ОТПРАВКА EMAIL ==========
                if (!empty($rule['email_notify']) && !empty($rule['email_recipient'])) {
                    // Проверяем длительность для email
                    if (checkEmailDuration($rule, $currentValue, $emailConditionStartTime)) {
                        sendEmailNotification(
                            $rule['email_recipient'],
                            $rule['name'],
                            $rule['trigger_topic'],
                            $currentValue,
                            $rule['condition_value'],
                            $rule['condition_operator']
                        );
                    }
                }
                // ========== КОНЕЦ ОТПРАВКИ EMAIL ==========

7. В БД - ДОБАВИТЬ колонки в таблицу automations:

ALTER TABLE automations 
ADD COLUMN email_notify TINYINT(1) DEFAULT 0 AFTER persistent,
ADD COLUMN email_recipient VARCHAR(255) NULL AFTER email_notify,
ADD COLUMN email_condition_duration INT DEFAULT 0 AFTER email_recipient;

8. В logic.php - ДОБАВИТЬ в отображение таблицы колонку Email:


Найти <th> Управление</th> и добавить перед ним:

<th>Email</th>

И в теле таблицы добавить ячейку:

<td>
    <?php if ($rule['email_notify'] && $rule['email_recipient']): ?>
        📧 <?= htmlspecialchars($rule['email_recipient']) ?>
        <?php if ($rule['email_condition_duration'] > 0): ?>
            <br><small>(через <?= $rule['email_condition_duration'] ?> сек)</small>
        <?php endif; ?>
    <?php else: ?>
        —
    <?php endif; ?>
</td>



Категории:

Категории

Комментарии

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

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

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

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

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