↩️ Назад

Категории

Скрипт для отправки email по влажности почвы

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

✅ Как работает:
Раз в час проверяет текущую влажность
Если влажность < 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% = поливать)




Категории:

Категории

Комментарии

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

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

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

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

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