дорабатываю заброшенный проект ) В горшке влажность надо контролировать, а я все забываю полить можевельник
Добавить 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>
Комментарии
Пока нет комментариев. Будьте первым!