↩️ Назад

Категории

Push-уведомления для IoT-системы на Raspberry Pi

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

Push-уведомления на смартфон для IoT-системы на Raspberry Pi

В этой статье я покажу, как добавить push‑уведомления на телефон в уже работающую IoT‑систему на Raspberry Pi. Мы используем ntfy — лёгкий сервер уведомлений с открытым исходным кодом. Всё работает через WireGuard и не требует публичного IP.

📌 Что мы получим

📱 Мгновенные push
Уведомления приходят за 1–2 секунды. Без почты и мессенджеров.
⚙️ Гибкие правила
Любые условия: температура > 30°, влажность < 20%, протечка, движение.
🛡️ Защита от спама
Максимум 3 уведомления за цикл. Счётчик сбрасывается при возврате датчика в норму.
🧩 Скриптовые условия
Поддержка JSON и сложной логики: sensor.water_leak == true

🧠 Как это работает

┌─────────────────────────────────────────────────────────────────┐
│                      Raspberry Pi                              │
│  ┌────────────┐   ┌────────────┐   ┌────────────┐           │
│  │  Cron job  │ → │  PHP‑скрипт │ → │ Python‑    │           │
│  │  (1 мин)   │   │ проверяет  │   │ отправитель│           │
│  └────────────┘   │  правила   │   └────────────┘           │
│                   └────────────┘          ↓                  │
│  ┌──────────────────────────────────────────────────────────┐ │
│  │              ntfy (Docker)  :8081                       │ │
│  └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
                              │
                              │ WireGuard / Wi‑Fi
                              ▼
                    ┌─────────────────┐
                    │   Ваш телефон   │
                    │   (ntfy app)    │
                    └─────────────────┘

1️⃣ Установка ntfy (сервер уведомлений)

Самый быстрый способ — запустить ntfy через Docker. У меня порт 8081 уже занят Zigbee2MQTT, поэтому я выбрал свободный порт.

# Устанавливаем Docker (если ещё нет)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Запускаем ntfy на порту 8081
sudo docker run -d \
  --name ntfy \
  --restart unless-stopped \
  -p 8081:80 \
  -v /var/lib/ntfy:/var/lib/ntfy \
  binwiederhier/ntfy serve

# Проверяем
curl http://localhost:8081
<!doctype html>… ntfy web …

2️⃣ База данных: добавляем поля для push

В таблицу automations добавляем колонки для хранения настроек push‑уведомлений и счётчика отправок.

-- Добавляем колонки
ALTER TABLE automations
  ADD COLUMN push_notify TINYINT(1) DEFAULT 0,
  ADD COLUMN push_topic VARCHAR(255) NULL DEFAULT 'iot-alerts',
  ADD COLUMN push_priority ENUM('low','high','urgent') DEFAULT 'high',
  ADD COLUMN last_triggered TIMESTAMP NULL,
  ADD COLUMN push_count INT DEFAULT 0;

3️⃣ Python‑скрипт для отправки

Скрипт push_sender.py получает параметры и отправляет уведомление через ntfy. Все эмодзи и кириллица удалены из заголовков, чтобы избежать ошибок кодировки.

# /var/www/html/iot/push_sender.py
#!/usr/bin/env python3
import pymysql, requests, logging, sys

NTFY_SERVER = 'http://localhost:8081'

def send_push(rule_id, rule_name, topic, value, push_topic, priority):
    message = f"Alert: {rule_name}\nTopic: {topic}\nValue: {value}"
    headers = {'Title': f"Alert: {rule_name}", 'Priority': priority}
    r = requests.post(f"{NTFY_SERVER}/{push_topic}",
                      data=message.encode('utf-8'),
                      headers=headers,
                      timeout=10)
    return r.status_code == 200
📦 Зависимости: устанавливаем в виртуальное окружение, чтобы не ломать системный Python.
cd /var/www/html/iot
python3 -m venv venv
source venv/bin/activate
pip install pymysql requests

4️⃣ Cron‑скрипт проверки правил (с защитой от спама)

cron_push.php запускается каждую минуту, проверяет все активные правила с включенным push и отправляет уведомление при срабатывании условия.

Особенности:

# /var/www/html/iot/cron_push.php
$ php cron_push.php

// Проверяем счётчик отправок
if ($push_count >= 3) {
    file_put_contents($logFile, "⛔ Достигнут лимит (3)\n", FILE_APPEND);
    continue;
}

// Если датчик вернулся в норму — сбрасываем счётчик
if ($value == 0 && $rule['push_count'] > 0) {
    UPDATE automations SET push_count = 0 WHERE id = ?
}

5️⃣ Настройка cron

# crontab -e
* * * * * /usr/bin/php /var/www/html/iot/cron_push.php >> /var/log/push_cron.log 2>&1

6️⃣ Веб‑интерфейс (админка)

В файл logic_test.php добавлена секция для настройки push‑уведомлений. Теперь при создании правила можно указать:

💡 Скриптовые условия: если датчик присылает JSON, используйте sensor.water_leak == true или sensor.temperature > 30.

7️⃣ Настройка телефона

  1. Установите приложение ntfy (Google Play / App Store / F-Droid)
  2. Нажмите на шестерёнку → Сервер: http://IP_вашей_малины:8081
  3. На главном экране подпишитесь на топик: iot-alerts
# Узнать IP на Raspberry Pi
hostname -I
192.168.1.100

🎯 Приоритеты уведомлений

Приоритет Звук Когда использовать Пример
Низкий (low) тихо / без звука информация, статистика сухой горшок, полив
Высокий (high) громко важные события высокая температура, движение
Срочный (urgent) очень громко, мигает критические пожар, протечка, дым

🛡️ Как работает защита от спама

Событие Что происходит
Датчик показывает water_leak: true ✅ Отправляется 1‑е уведомление (push_count = 1)
Через минуту всё ещё true ✅ Отправляется 2‑е уведомление (push_count = 2)
Ещё через минуту всё ещё true ✅ Отправляется 3‑е уведомление (push_count = 3)
Датчик всё ещё true ⛔ Лимит достигнут — уведомления НЕ приходят
Датчик показывает water_leak: false 🔄 Счётчик сбрасывается в 0

🧪 Тестируем

Шаг 1: Вставляем тестовые данные

mysql -u user -p123456 iot_db -e "
UPDATE sensor_data
SET value = '{\"water_leak\": true, \"battery\": 100}'
WHERE topic = 'zigbee2mqtt/leak_bath';
"

Шаг 2: Запускаем проверку

sudo /usr/bin/php /var/www/html/iot/cron_push.php

Шаг 3: Смотрим логи

cat /var/log/push_cron_debug.log

=== 2026-08-02 22:41:45 ===
Найдено правил с push: 1
Проверяем правило: протечка
  Топик: zigbee2mqtt/leak_bath = {"water_leak": true}
  Скрипт: $sensorData["water_leak"] == true = true
  🚀 Отправка (1/3): ...
  ✅ Уведомление отправлено!
✅ Результат: на телефоне приходит уведомление. После 3‑х срабатываний — спам прекращается.

🎉 Что в итоге

Теперь я получаю уведомления о протечке, высокой температуре, сухой почве и движении прямо на телефон. Никаких лишних действий — система сама следит за домом.


📎 Полезные ссылки

Теги: #iot #push #raspberry_pi #смартфон #уведомления
👍 Оцените статью
Всего голосов: 0



Категории:

Категории

Комментарии

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

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

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

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

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