В этой статье я покажу, как добавить push‑уведомления на телефон в уже работающую IoT‑систему на Raspberry Pi. Мы используем ntfy — лёгкий сервер уведомлений с открытым исходным кодом. Всё работает через WireGuard и не требует публичного IP.
sensor.water_leak == true
┌─────────────────────────────────────────────────────────────────┐
│ Raspberry Pi │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ Cron job │ → │ PHP‑скрипт │ → │ Python‑ │ │
│ │ (1 мин) │ │ проверяет │ │ отправитель│ │
│ └────────────┘ │ правила │ └────────────┘ │
│ └────────────┘ ↓ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ ntfy (Docker) :8081 │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
│ WireGuard / Wi‑Fi
▼
┌─────────────────┐
│ Ваш телефон │
│ (ntfy app) │
└─────────────────┘
Самый быстрый способ — запустить 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 …
В таблицу 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;
Скрипт 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
cd /var/www/html/iot python3 -m venv venv source venv/bin/activate pip install pymysql requests
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 = ? }
# crontab -e * * * * * /usr/bin/php /var/www/html/iot/cron_push.php >> /var/log/push_cron.log 2>&1
В файл logic_test.php добавлена секция для настройки push‑уведомлений.
Теперь при создании правила можно указать:
iot-alertssensor.water_leak == true или sensor.temperature > 30.
http://IP_вашей_малины:8081iot-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): ...
✅ Уведомление отправлено!
Теперь я получаю уведомления о протечке, высокой температуре, сухой почве и движении прямо на телефон. Никаких лишних действий — система сама следит за домом.
Комментарии
Пока нет комментариев. Будьте первым!