В этой статье я покажу, как добавить push‑уведомления на телефон в уже работающую IoT‑систему на Raspberry Pi. Мы используем ntfy — лёгкий сервер уведомлений с открытым исходным кодом. Всё работает через WireGuard и не требует публичного IP.
┌─────────────────────────────────────────────────────────────────┐
│ 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;
Скрипт 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 // Получаем правила с 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 }
# crontab -e * * * * * /usr/bin/php /var/www/html/iot/cron_push.php >> /var/log/push_cron.log 2>&1
В файл logic_test.php я добавил секцию для настройки push‑уведомлений.
Теперь при создании правила можно указать:
iot-alertshttp://IP_вашей_малины:8081iot-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 "Если вы это видите — всё работает!"
Теперь я получаю уведомления о пожаре, высокой температуре, сухой почве и движении прямо на телефон. Никаких лишних действий — система сама следит за домом.
Комментарии
Пока нет комментариев. Будьте первым!