🎯 Задача
Добавить возможность отправлять 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-уведомления работают. Можжевельник будет вовремя полит! 🌱💧
Комментарии
Пока нет комментариев. Будьте первым!