↩️ Назад

Категории

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

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

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

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

📱 Мгновенные push
Уведомления приходят на телефон за 1–2 секунды. Не нужно открывать почту или мессенджеры.
⚙️ Гибкие правила
В админке можно задать любые условия: температура > 30°, влажность < 20%, движение и т.д.
🔐 Безопасно
Все серверы в одной WireGuard‑сети. Никаких открытых портов в интернет.
🧩 Бесплатно и просто
ntfy — open source, не требует регистрации, работает через Docker за 5 минут.

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

┌─────────────────────────────────────────────────────────────────┐
│                      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;

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

// Получаем правила с push_notify = 1
$stmt = $pdo->prepare("
  SELECT * FROM automations
  WHERE enabled = 1 AND push_notify = 1
");

// Для каждого правила проверяем последнее значение датчика
foreach ($rules as $rule) {
    // Получаем значение из sensor_data
    // Сравниваем с условием (>, <, >=, <=, ==)
    // Если условие верно → вызываем push_sender.py
}

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‑уведомлений. Теперь при создании правила можно указать:

💡 Важно: в заголовках HTTP‑запроса нельзя использовать эмодзи и кириллицу. В скрипте я сделал транслитерацию, чтобы избежать ошибок кодировки.

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

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

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

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

🧪 Тестируем

Отправляем тестовое уведомление напрямую через curl:

curl -X POST http://localhost:8081/iot-alerts \
  -H "Title: Test" \
  -d "Если вы это видите — всё работает!"
✅ Результат: на телефоне приходит уведомление. Значит, связка ntfy → телефон работает.

🎉 Что в итоге

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


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

👍 Оцените статью
Всего голосов: 0



Категории:

Категории

Комментарии

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

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

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

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

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