✅ Как работает:
Раз в час проверяет текущую влажность
Если влажность < 30% и сегодня ещё не отправляли → отправляет email
Одно письмо в день, чтобы не спамить
Уровень сухости подскажет, насколько критично 🌵
Для можжевельника идеально! Полил → влажность поднялась → следующий email только когда снова упадёт ниже 30% на следующий день.
#!/usr/bin/php
<?php
/**
* Скрипт для отправки email по влажности почвы (можжевельник)
* Добавить в cron: 0 * * * * /usr/bin/php /var/www/html/iot/cron_soil_moisture.php >> /var/log/iot-soil.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);
// Настройки
$moistureTopic = 'zigbee2mqtt/gorshok_big/humidity'; // Замени на свой топик
$emailTo = '9447333@gmail.com';
$dryThreshold = 30; // Ниже 30% - сухо, пора поливать
$checkInterval = 60; // Проверяем раз в час (в минутах)
// 1. Последнее значение влажности
$stmt = $pdo->prepare("
SELECT value, timestamp
FROM sensor_data
WHERE topic = ?
ORDER BY timestamp DESC
LIMIT 1
");
$stmt->execute([$moistureTopic]);
$sensor = $stmt->fetch();
if (!$sensor) {
echo date('Y-m-d H:i:s') . " ⚠️ Нет данных по топику: $moistureTopic\n";
exit;
}
$moisture = (int)$sensor['value'];
$lastCheckTime = strtotime($sensor['timestamp']);
// 2. Проверяем, не отправляли ли уже сегодня
$stmt = $pdo->prepare("
SELECT COUNT(*) as sent FROM email_triggers
WHERE rule_name = 'soil_moisture'
AND DATE(triggered_at) = CURDATE()
");
$stmt->execute();
$sent = $stmt->fetch();
// 3. Если сухо и письмо ещё не отправляли сегодня
if ($moisture < $dryThreshold && $sent['sent'] == 0) {
$subject = "💧 Можжевельник хочет пить!";
// Определяем уровень сухости
if ($moisture < 10) $level = "КРИТИЧЕСКИ СУХО!!!";
elseif ($moisture < 20) $level = "Очень сухо";
elseif ($moisture < 30) $level = "Сухо, пора поливать";
else $level = "Нормально";
$message = "🌵 Можжевельник:\n";
$message .= "- Влажность почвы: {$moisture}%\n";
$message .= "- Состояние: {$level}\n";
$message .= "- Время замера: {$sensor['timestamp']}\n";
$message .= "- Порог: ниже {$dryThreshold}%\n\n";
$message .= "💡 Совет: полей растение и проверь через час.\n";
$message .= "\n---\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 (0, 'soil_moisture', ?, ?, ?, 1)
");
$stmt->execute([$emailTo, $moistureTopic, $moisture]);
echo date('Y-m-d H:i:s') . " ✅ Email отправлен (влажность: {$moisture}%)\n";
} else {
echo date('Y-m-d H:i:s') . " ❌ Ошибка отправки email\n";
}
} elseif ($moisture >= $dryThreshold) {
echo date('Y-m-d H:i:s') . " 💚 Влажность в норме: {$moisture}% (≥ {$dryThreshold}%)\n";
} else {
echo date('Y-m-d H:i:s') . " ⏸️ Письмо уже отправлено сегодня (влажность: {$moisture}%)\n";
}
// 4. Дополнительно: очищаем старые записи (старше 30 дней)
$pdo->exec("DELETE FROM email_triggers WHERE triggered_at < DATE_SUB(NOW(), INTERVAL 30 DAY)");
# Создаём файл
sudo nano /var/www/html/iot/cron_soil_moisture.php
# Вставляем код (не забудь поправить топик датчика!)
# Делаем исполняемым
sudo chmod +x /var/www/html/iot/cron_soil_moisture.php
# Проверяем вручную
sudo php /var/www/html/iot/cron_soil_moisture.php
sudo crontab -e
0 * * * * /usr/bin/php /var/www/html/iot/cron_soil_moisture.php >> /var/log/iot-soil.log 2>&1
$moistureTopic = 'zigbee2mqtt/soil_sensor/humidity'; // Твой топик влажности
$dryThreshold = 30; // Порог сухости (30% = поливать)
Комментарии
Пока нет комментариев. Будьте первым!