Категории

Умный дом зигби и не только - архитектура моей IoT-системы на распбери пи

2025-11-23 10:24:53 | Статья из категории: IOT умный дом

Архитектура моей IoT-системы умного дома на зигби: обзор файлов и компонентов

Эта статья служит отправной точкой для понимания архитектуры моей локальной IoT-системы. Некоторое время проект был в состоянии «заморозки», и сейчас я постепенно восстанавливаю в памяти, как всё устроено — где лежат ключевые файлы, как они взаимодействуют и за что отвечают. Git, к сожалению, освоил не до конца, поэтому документация особенно актуальна.

В ближайшее время я планирую выложить все исходники и проставить внутренние ссылки, чтобы получилось хоть какое-то подобие структурированной документации. Код за время разработки заметно «распух», и без карты уже трудно разобраться.

Цель статьи — создать своего рода «дорожную карту» архитектуры: краткое описание основных компонентов, их назначения и связей между ними. Это поможет не только мне быстро вспомнить устройство системы спустя месяцы, но и может оказаться полезным для тех, кто ищет пример полностью локального IoT-решения для умного дома — без облачных сервисов, сторонних зависимостей и избыточной сложности.

Система лёгкая и ненасыщенная: она не требует ресурсов дата-центра и способна работать даже на таких скромных устройствах, как Raspberry Pi Zero или смарт-часы. Иными словами — функциональность без наворотов.

Основные компоненты системы

Ключевые файлы проекта

/index.php — основной веб-интерфейс

Это главная страница системы. Он:

/admin/send_mqtt.php — отправка команд в MQTT

Принимает GET-параметры topic и payload, формирует MQTT-сообщение и отправляет его через mosquitto_pub. Используется кнопками «ВКЛ/ВЫКЛ» из index.php.

/api/history.php — API для графиков

Возвращает JSON с историей значений конкретного топика из таблицы sensor_history. Используется Chart.js в index.php для отрисовки графиков.

/scripts/mqtt-to-mysql.py — слушатель MQTT

Daemon-скрипт (запускается как mqtt-to-mysql.service). Подписывается на все топики, получает сообщения от датчиков и записывает их в:

/scripts/iot-automation.php — движок автоматизации

Запускается по cron каждую минуту (или как iot-automation.service). Проверяет:

/scripts/rpi-monitor.sh — сбор системных метрик

Запускается по cron. Собирает:

Результаты отправляются в MQTT и сохраняются в таблицу rpi_monitor.

/scripts/log-analyzer.php — парсинг логов

Раз в час анализирует системные или прикладные логи, ищет ключевые слова (ошибки, перезагрузки и т.д.), агрегирует счётчики и сохраняет в таблицу log_stats.

Структура базы данных (iot_db)

Как работает управление устройствами

Когда пользователь нажимает «ВКЛ» на карточке клапана:

  1. JavaScript в index.php формирует MQTT-топик замены: /status/set
  2. Отправляется GET-запрос к /admin/send_mqtt.php?topic=...&payload=...
  3. Скрипт публикует команду в MQTT
  4. Устройство (например, Zigbee-клапан) получает команду и меняет состояние
  5. Новое состояние публикуется обратно в MQTT → попадает в БД → обновляется в интерфейсе (через автообновление страницы)

Папки проекта

/admin

Содержит административные скрипты и файлы, доступные только авторизованным пользователям.

/api

Содержит API-эндпоинты, используемые веб-интерфейсом.

/css

Содержит CSS-стили для веб-интерфейса.

/scripts

Содержит фоновые скрипты, запускаемые по cron или как systemd-сервисы.

🔌 Как добавить новое Zigbee-устройство в домашнюю IoT-систему

Когда вы подключаете новое Zigbee-устройство (розетку, реле, датчик и т.д.) через Zigbee2MQTT, важно убедиться, что оно не только сопряглось, но и корректно передаёт данные в вашу систему. Ниже — проверенный рабочий алгоритм от сопряжения до отображения на панели.

1. Сопряжение устройства

  • Зайдите в веб-интерфейс Zigbee2MQTT (обычно http://ваш_сервер:8080).
  • Нажмите «Add new device» и следуйте инструкциям для вашего устройства (часто — удержание кнопки при подаче питания).
  • После сопряжения устройству присвоится MAC-адрес вида 0xa4c1385d1ba39457.

2. Задайте понятное имя

Откройте файл конфигурации Zigbee2MQTT — обычно /opt/zigbee2mqtt/data/configuration.yaml — и добавьте:

devices:
  '0xa4c1385d1ba39457':
    friendly_name: fish_light

Перезапустите службу: sudo systemctl restart zigbee2mqtt.

3. Проверьте MQTT-трафик в реальном времени

Выполните в терминале:

mosquitto_sub -h localhost -t "zigbee2mqtt/#" -v

Теперь включите/выключите устройство. Вы должны увидеть сообщения вида:

zigbee2mqtt/fish_light {"state_l1":"OFF","state_l2":"OFF","state_l3":"OFF","linkquality":210}

Если JSON содержит нужные поля (state, temperature, state_l1 и т.д.) — устройство работает.

4. Убедитесь, что данные сохраняются в базу

Ваш логгер (например, mqtt-to-mysql.py) должен «разворачивать» JSON и сохранять каждое поле отдельно:

zigbee2mqtt/fish_light/state_l1 → OFF
zigbee2mqtt/fish_light/state_l2 → OFF

Проверьте в MySQL:

SELECT topic, value FROM sensor_data
WHERE topic LIKE '%fish_light%'
ORDER BY timestamp DESC LIMIT 5;

Если записей нет — обновите логгер, чтобы он сохранял все ключи, кроме служебных (linkquality, last_seen и т.д.).

5. Добавьте устройство на панель

Выполните в базе данных:

INSERT INTO sensor_info (topic, name, room, group_name, icon) VALUES
('zigbee2mqtt/fish_light/state_l1', 'Кормушка 1', 'Аквариум', 'Реле', '🔌'),
('zigbee2mqtt/fish_light/state_l2', 'Кормушка 2', 'Аквариум', 'Реле', '🔌'),
('zigbee2mqtt/fish_light/state_l3', 'Кормушка 3', 'Аквариум', 'Реле', '🔌');

6. Настройте управление

Убедитесь, что ваша панель распознаёт state_l1 как управляемый переключатель. В PHP-коде должно быть:

$type = basename($row['topic']);
if ($type === 'status' || preg_match('/^state_l\d+$/', $type)) {
    $type = 'valve';
}

А в JS-функции отправки команды — корректная обработка каналов:

// Пример для топика zigbee2mqtt/fish_light/state_l1
const match = decodedTopic.match(/^(zigbee2mqtt\/[^\/]+)\/state_(l\d+)$/);
if (match) {
    payload[match[2]] = command; // → {"l1": "ON"}
}

💡 Советы

  • Если устройство не публикует state_l1, а только status — используйте общий режим управления через {"state": "ON"}.
  • Не забудьте обновить автоматизации: старые правила с MAC-адресом перестанут работать после смены имени.
  • Регулярно очищайте таблицу sensor_data — иначе сайт начнёт тормозить. Достаточно оставлять данные за последние 3–7 дней.

После этих шагов ваше устройство будет полноценно интегрировано в систему: вы сможете управлять им с панели, строить графики и создавать автоматизации.

Комментарии

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

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

← Назад к списку статей

Важно: Блог-эксперимент

Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


кто я | книга | контакты без контактов

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