↩️ Назад

Категории

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

01.05.2026 | Статья из категории: IOT умный дом

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

🎯 Задача

Добавить возможность отправлять email-уведомления при срабатывании правил автоматизации. Нужно контролировать влажность в горшке с можжевельником, отправлять уведомление, если температура выше 25°C держится больше часа.

📝 Что нужно добавить

  • 3 поля в БД
  • 3 функции в mqtt_listener.php
  • Несколько строк в обработку POST в logic.php
  • HTML-блок с чекбоксом email

1️⃣ Добавить колонки в БД

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;

2️⃣ Добавить HTML блок в logic.php (после 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>

3️⃣ Добавить обработку POST в logic.php

Получить значения из формы:

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

Добавить поля в SQL запрос UPDATE:

email_notify = ?, email_recipient = ?, email_condition_duration = ?

Добавить в execute:

$email_notify, $email_recipient, $email_condition_duration

4️⃣ Добавить глобальную переменную в mqtt_listener.php

$emailConditionStartTime = [];

5️⃣ Добавить функцию отправки email в mqtt_listener.php

function sendEmailNotification($to, $ruleName, $triggerTopic, $currentValue, $conditionValue, $operator) {
    if (empty($to) || !filter_var($to, FILTER_VALIDATE_EMAIL)) {
        return false;
    }
    
    $subject = "IoT Уведомление: $ruleName";
    $message = "Время: " . date('Y-m-d H:i:s') . "\n";
    $message .= "Правило: $ruleName\n";
    $message .= "Топик: $triggerTopic\n";
    $message .= "Значение: $currentValue\n";
    $message .= "Условие: $operator $conditionValue\n";
    
    $headers = "From: it@logoakademia.ru\r\n";
    
    return mail($to, $subject, $message, $headers);
}

6️⃣ Добавить функцию проверки длительности в mqtt_listener.php

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;
    }
    
    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;
    }
}

7️⃣ Добавить отправку email в блок срабатывания правила в mqtt_listener.php

// ========== ОТПРАВКА EMAIL ==========
if (!empty($rule['email_notify']) && !empty($rule['email_recipient'])) {
    if (checkEmailDuration($rule, $actual, $emailConditionStartTime)) {
        sendEmailNotification(
            $rule['email_recipient'],
            $rule['name'],
            $rule['trigger_topic'],
            $actual,
            $rule['condition_value'],
            $rule['condition_operator']
        );
    }
}
// ========== КОНЕЦ ОТПРАВКИ EMAIL ==========

8️⃣ Добавить колонку Email в таблицу правил в logic.php

В шапку таблицы добавить:

<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>

✅ Готово!

Теперь email-уведомления работают. Можжевельник будет вовремя полит! 🌱💧




Категории:

Категории

Комментарии

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

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

← Назад к списку статей

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

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