Зачем нужна IoT-платформа
Устройства собирают данные — температуру, вибрацию, уровень жидкости, GPS-координаты. Без платформы каждый проект превращается в набор самописных скриптов: MQTT-брокер здесь, база там, Grafana сбоку. Это работает на 10 устройствах, но ломается на 1 000.
IoT-платформа берёт на себя:
- Подключение устройств — MQTT, CoAP, HTTP, LwM2M, Modbus, OPC-UA
- Хранение телеметрии — time-series БД с автоматическим TTL
- Визуализацию — дашборды без фронтенд-разработки
- Правила и алерты — Rule Engine с цепочкой обработки
- Управление устройствами — RPC-команды, OTA, конфигурация
- Мультитенантность — изоляция данных между клиентами
ThingsBoard — одна из самых зрелых open-source платформ, которая закрывает все эти задачи.
ThingsBoard: обзор архитектуры
ThingsBoard — open-source IoT-платформа, разрабатываемая с 2016 года. Написана на Java (Spring Boot), работает на Linux, Windows, Docker, Kubernetes.
Основные компоненты
| Компонент | Назначение | Технология |
|---|---|---|
| Transport | Приём данных от устройств | MQTT, CoAP, HTTP, LwM2M |
| Rule Engine | Обработка сообщений, маршрутизация, обогащение | Цепочки нод (node chains) |
| Core | Управление сущностями, REST API, WebSocket | Spring Boot, gRPC |
| База данных | Хранение сущностей и телеметрии | PostgreSQL + Cassandra/TimescaleDB |
| UI | Дашборды, администрирование | Angular |
Иерархия сущностей
ThingsBoard оперирует иерархией:
Tenant → Customer → Device / Asset / Dashboard
- Tenant — арендатор платформы (компания или проект)
- Customer — клиент тенанта (подрядчик, филиал, конечный пользователь)
- Device — физическое или виртуальное устройство
- Asset — логическая группировка (здание, цех, участок)
- Dashboard — визуализация данных
Такая модель подходит и для одного проекта, и для SaaS-платформы с сотнями клиентов.
Community Edition vs Professional Edition
| Критерий | CE (бесплатная) | PE (платная) |
|---|---|---|
| Лицензия | Apache 2.0 | Коммерческая |
| Устройства | Без ограничений | Без ограничений |
| Rule Engine | Полный | Полный + дополнительные ноды |
| Дашборды | Базовые виджеты | Расширенные виджеты (SCADA, карты, графики) |
| White-labeling | Нет | Да (логотип, домен, цвета) |
| Интеграции | MQTT, HTTP, CoAP | + Sigfox, LoRaWAN Network Server, OPC-UA, TCP/UDP |
| Scheduler | Нет | Да (расписания команд, отчётов) |
| CSV/XLS export | Базовый | Расширенный с шаблонами |
| Группы устройств | Статические | Статические + динамические |
| Поддержка | Сообщество, GitHub | SLA, приоритетная поддержка |
| Стоимость | 0 ₽ | от $10/устройство/месяц (cloud) или лицензия |
Рекомендация: начинайте с CE — её функциональности хватает для 90% проектов. PE нужна, когда требуется white-labeling для конечных клиентов или готовые интеграции с LoRaWAN Network Server.
Установка ThingsBoard: три сценария
Сценарий 1: Docker Compose (рекомендуется для старта)
Самый быстрый способ — Docker Compose. Один файл, одна команда.
# Клонируем конфигурацию
git clone https://github.com/thingsboard/thingsboard.git
cd thingsboard/docker
# Создаём .env файл
cat > .env << 'EOF'
TB_QUEUE_TYPE=in-memory
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard
EOF
# Запускаем
docker compose up -d
После запуска: http://localhost:8080
Логин по умолчанию:
| Роль | Логин | Пароль |
|---|---|---|
| Системный администратор | sysadmin@thingsboard.org | sysadmin |
| Тенант-администратор | tenant@thingsboard.org | tenant |
Сценарий 2: Ubuntu / Debian (продакшен)
# Java 17
sudo apt install -y openjdk-17-jdk
# PostgreSQL 15
sudo apt install -y postgresql-15
# ThingsBoard CE
wget https://github.com/thingsboard/thingsboard/releases/download/v3.7/thingsboard-3.7.deb
sudo dpkg -i thingsboard-3.7.deb
# Настройка БД
sudo -u postgres psql -c "CREATE DATABASE thingsboard;"
sudo -u postgres psql -c "CREATE USER tb WITH PASSWORD 'your_password';"
sudo -u postgres psql -c "GRANT ALL ON DATABASE thingsboard TO tb;"
# Конфигурация
sudo nano /etc/thingsboard/conf/thingsboard.conf
# SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard
# SPRING_DATASOURCE_USERNAME=tb
# SPRING_DATASOURCE_PASSWORD=your_password
# Инициализация схемы и запуск
sudo /usr/share/thingsboard/bin/install/install.sh
sudo systemctl start thingsboard
sudo systemctl enable thingsboard
Сценарий 3: Kubernetes (масштабирование)
Для кластеров от 10 000 устройств ThingsBoard предоставляет Helm Chart:
helm repo add thingsboard https://thingsboard.github.io/helm-charts
helm install tb thingsboard/thingsboard \
--set cassandra.enabled=true \
--set kafka.enabled=true \
--namespace iot
В Kubernetes-деплое компоненты (Transport, Rule Engine, Core) масштабируются независимо. Transport можно масштабировать горизонтально для обработки миллионов подключений.
| Сценарий | Устройства | Рекомендация |
|---|---|---|
| Разработка / PoC | до 100 | Docker Compose, in-memory queue |
| Продакшен (малый) | 100–5 000 | Ubuntu + PostgreSQL + Kafka |
| Продакшен (средний) | 5 000–50 000 | Docker Compose + Cassandra + Kafka |
| Продакшен (крупный) | 50 000+ | Kubernetes + Cassandra + Kafka |
Подключение первого устройства
Шаг 1: Создание устройства в UI
- Войдите как Tenant Administrator
- Devices → Add new device
- Укажите имя:
temperature-sensor-01 - Тип устройства:
temperature-sensor - Скопируйте Access Token — он понадобится для отправки данных
Шаг 2: Отправка телеметрии по MQTT
# Установка mosquitto-клиента
sudo apt install -y mosquitto-clients
# Отправка телеметрии
mosquitto_pub -h localhost -p 1883 \
-t "v1/devices/me/telemetry" \
-u "YOUR_ACCESS_TOKEN" \
-m '{"temperature": 23.5, "humidity": 61.2}'
Шаг 3: Отправка по HTTP (альтернатива)
curl -X POST http://localhost:8080/api/v1/YOUR_ACCESS_TOKEN/telemetry \
-H "Content-Type: application/json" \
-d '{"temperature": 23.5, "humidity": 61.2}'
Шаг 4: Проверка в UI
Devices → temperature-sensor-01 → Latest telemetry — здесь появятся ключи temperature и humidity с последними значениями.
Типы данных в ThingsBoard
| Тип | Описание | Пример |
|---|---|---|
| Telemetry | Временные ряды (метрики) | temperature, humidity, voltage |
| Attributes (client) | Атрибуты устройства, которые оно само сообщает | firmware_version, ip_address |
| Attributes (shared) | Атрибуты, которые задаёт сервер | config_interval, threshold |
| Attributes (server) | Атрибуты, вычисляемые на сервере | last_activity_time |
Телеметрия — time-series с таймстемпом. Атрибуты — key-value без истории (перезаписываются).
Rule Engine: обработка данных
Rule Engine — сердце ThingsBoard. Каждое входящее сообщение проходит через цепочку нод (Rule Chain).
Структура Rule Chain
[Device] → Message → [Input Node] → [Filter] → [Enrichment] → [Transform] → [Action]
Основные типы нод
| Категория | Нода | Что делает |
|---|---|---|
| Filter | Script | JavaScript-фильтр: пропускает или отклоняет сообщение |
| Filter | Message Type | Фильтр по типу сообщения (telemetry, attribute, RPC) |
| Enrichment | Originator Attributes | Добавляет атрибуты устройства в метаданные |
| Enrichment | Related Attributes | Добавляет атрибуты связанных сущностей |
| Transform | Script | JavaScript-трансформация payload |
| Transform | To Email | Формирует email из шаблона |
| Action | Save Timeseries | Сохраняет телеметрию в БД |
| Action | Create Alarm | Создаёт алерт |
| Action | REST API Call | Вызывает внешний API |
| Action | Send Email | Отправляет email через SMTP |
| Action | RPC Call | Отправляет команду на устройство |
Пример: алерт при превышении температуры
- Input Node → принимает сообщение
- Script Filter — проверяем условие:
return msg.temperature > 50;
- Create Alarm — если true, создаём алерт типа
High Temperature - Send Email — уведомляем оператора
Rule Engine работает асинхронно. В кластерном деплое Rule Engine ноды распределяются по серверам — это обеспечивает горизонтальное масштабирование обработки.
Дашборды: визуализация без кода
ThingsBoard предоставляет визуальный редактор дашбордов. Виджеты добавляются drag-and-drop, данные подтягиваются из телеметрии устройств.
Основные виджеты
| Виджет | Назначение | Пример использования |
|---|---|---|
| Timeseries Line Chart | График временных рядов | Температура за 24 часа |
| Digital Gauge | Круговой индикатор | Текущая влажность |
| Map (OpenStreetMap) | Карта с маркерами устройств | GPS-трекеры |
| Alarm Table | Таблица активных алертов | Список аварий |
| Entity Table | Таблица устройств с атрибутами | Список датчиков с последними значениями |
| HTML Card | Произвольный HTML | Кастомный UI-элемент |
| Control Widget | Кнопка / переключатель | Включить реле, открыть клапан |
Создание дашборда: пошагово
- Dashboards → Add new dashboard → укажите имя
- Open dashboard → Edit mode (карандаш)
- Add widget → Charts → Timeseries Line Chart
- В настройках виджета выберите Entity:
temperature-sensor-01 - Добавьте ключи:
temperature,humidity - Настройте период:
Last 24 hours - Save dashboard
Дашборды можно расшаривать через публичные ссылки или назначать конкретным Customer.
REST API: интеграция с внешними системами
ThingsBoard предоставляет полноценный REST API. Все операции, доступные в UI, доступны через API.
Аутентификация
# Получение JWT-токена
TOKEN=$(curl -s -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"tenant@thingsboard.org","password":"tenant"}' \
| jq -r '.token')
Получение телеметрии
# Последние значения
curl -s http://localhost:8080/api/plugins/telemetry/DEVICE/$DEVICE_ID/values/timeseries \
-H "X-Authorization: Bearer $TOKEN"
# Исторические данные за период
curl -s "http://localhost:8080/api/plugins/telemetry/DEVICE/$DEVICE_ID/values/timeseries?keys=temperature&startTs=1716300000000&endTs=1716386400000" \
-H "X-Authorization: Bearer $TOKEN"
Отправка RPC-команды на устройство
curl -X POST http://localhost:8080/api/rpc/oneway/$DEVICE_ID \
-H "X-Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"method": "setRelay", "params": {"state": true}}'
Основные эндпоинты
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/auth/login | Аутентификация |
| GET | /api/tenant/devices | Список устройств тенанта |
| POST | /api/device | Создание устройства |
| GET | /api/plugins/telemetry/DEVICE/:id/values/timeseries | Последняя телеметрия |
| POST | /api/rpc/oneway/:id | Односторонняя RPC-команда |
| POST | /api/rpc/twoway/:id | Двусторонняя RPC-команда |
| GET | /api/alarm/:entityType/:entityId | Список алертов |
| POST | /api/dashboard | Создание дашборда |
Интеграции: подключение внешних источников
MQTT-интеграция (стороннего брокера)
Если устройства уже отправляют данные на внешний MQTT-брокер (например, Mosquitto), ThingsBoard может подписаться на его топики:
Integration → MQTT → Broker: mqtt://external-broker:1883
Topic: sensors/+/telemetry
Uplink converter: парсит payload в формат ThingsBoard
Интеграция с Telegram (через Rule Engine)
- Создайте REST API Call ноду в Rule Chain
- URL:
https://api.telegram.org/botYOUR_TOKEN/sendMessage - Body:
{
"chat_id": "YOUR_CHAT_ID",
"text": "Alarm: ${alarmType} on device ${deviceName}"
}
Популярные интеграции
| Интеграция | Способ | Назначение |
|---|---|---|
| Grafana | REST API + плагин | Расширенная визуализация |
| Kafka | TB Kafka Integration | Стриминг телеметрии в data pipeline |
| Node-RED | MQTT / REST | Сложные сценарии автоматизации |
| Telegram | REST API Call (Rule Engine) | Уведомления в чат |
| AWS S3 | REST API Call | Архивирование данных |
| PostgreSQL (внешняя) | JDBC Action | Дублирование данных в аналитическую БД |
Масштабирование и производительность
Архитектура для высоких нагрузок
| Нагрузка | Архитектура | Ресурсы |
|---|---|---|
| 1 000 msg/s | Monolith + PostgreSQL | 4 CPU, 8 GB RAM |
| 10 000 msg/s | Microservices + Kafka + PostgreSQL | 3 ноды по 8 CPU, 16 GB |
| 100 000 msg/s | Microservices + Kafka + Cassandra | 5+ нод, Cassandra-кластер |
Оптимизация PostgreSQL
-- Партиционирование таблицы телеметрии по месяцам
-- ThingsBoard CE делает это автоматически через TTL-настройки
-- В thingsboard.conf:
-- SQL_TTL_TS_ENABLED=true
-- SQL_TTL_TS_EXECUTION_INTERVAL=86400000
-- SQL_TTL_TS_TS_KV_TTL=31536000000 (365 дней)
Переход на Cassandra
Для проектов с более чем 10 000 устройствами PostgreSQL как time-series хранилище становится узким местом. Переход на Cassandra:
- Телеметрия → Cassandra (горизонтальное масштабирование записи)
- Сущности, пользователи, дашборды → PostgreSQL (реляционные данные)
- Очередь сообщений → Kafka (вместо in-memory)
Это гибридная схема: ThingsBoard поддерживает её из коробки через конфигурацию DATABASE_TS_TYPE=cassandra.
Безопасность
Аутентификация устройств
| Метод | Безопасность | Применение |
|---|---|---|
| Access Token | Низкая (токен в открытом виде) | PoC, внутренние сети |
| Basic (login + password) | Средняя | Простые проекты |
| X.509 сертификат | Высокая (mTLS) | Продакшен, критичные системы |
Рекомендации для продакшена
- Включите HTTPS — TLS-терминация на Nginx / Traefik перед ThingsBoard
- Используйте X.509 для устройств в продакшене
- Ограничьте Rate Limiting — ThingsBoard поддерживает лимиты на уровне тенанта
- Настройте Audit Log — логирование всех действий администратора
- Регулярные бэкапы — PostgreSQL:
pg_dump, Cassandra:nodetool snapshot - Разделите сети — Transport (MQTT/CoAP) в DMZ, Core и БД во внутренней сети
ThingsBoard vs альтернативы
| Критерий | ThingsBoard | Chirpstack | AWS IoT Core | Azure IoT Hub |
|---|---|---|---|---|
| Тип | Open-source платформа | Open-source LoRaWAN сервер | Managed cloud | Managed cloud |
| Self-hosted | Да | Да | Нет | Нет |
| Протоколы | MQTT, CoAP, HTTP, LwM2M, Modbus | LoRaWAN | MQTT, HTTP | MQTT, AMQP, HTTP |
| Дашборды | Встроенные | Минимальные | CloudWatch | Power BI / Grafana |
| Rule Engine | Визуальный, мощный | Базовый | AWS IoT Rules (SQL) | Stream Analytics |
| Стоимость (1K устройств) | 0 ₽ (CE) | 0 ₽ | ~$30/мес | ~$25/мес |
| Стоимость (100K устройств) | Серверы (~$500/мес) | Серверы | ~$3 000/мес | ~$2 500/мес |
| Vendor lock-in | Нет | Нет | AWS | Azure |
ThingsBoard выигрывает по соотношению функциональности к стоимости при self-hosted деплое. Облачные решения AWS/Azure проще в эксплуатации, но дороже на масштабе.
Матрица выбора: когда ThingsBoard — правильный выбор
| Сценарий | ThingsBoard подходит? | Почему |
|---|---|---|
| PoC на 10 устройств | Да | Быстрый старт через Docker |
| Мониторинг производства (500 датчиков) | Да | CE бесплатна, Rule Engine закрывает алерты |
| SaaS-платформа для клиентов | Да (PE) | Мультитенантность, white-labeling |
| Только LoRaWAN-шлюзы | Частично | Лучше Chirpstack + ThingsBoard для визуализации |
| Реалтайм-видеоаналитика | Нет | ThingsBoard не обрабатывает видеопотоки |
| Edge-вычисления на устройстве | Частично | ThingsBoard Edge есть, но ограничен |
| Интеграция с ERP/MES | Да | REST API + Rule Engine для двусторонней интеграции |
Типичные ошибки при внедрении
-
Хранить всё вечно. Без TTL база растёт линейно. Настройте TTL: сырые данные — 90 дней, агрегаты — 2 года.
-
Один Rule Chain на всё. Разделяйте цепочки по типам устройств. Один общий Rule Chain с 50 нодами — неуправляемый хаос.
-
Access Token в продакшене. Токен передаётся в открытом виде по MQTT. Для продакшена — только X.509 или хотя бы TLS + basic auth.
-
Игнорировать Kafka. In-memory очередь теряет сообщения при перезапуске. С 1 000+ устройств Kafka обязателен.
-
Не тестировать нагрузку. Перед продакшеном прогоните нагрузочный тест: ThingsBoard предоставляет утилиту
tb-gatewayдля эмуляции устройств.
Что дальше
ThingsBoard — мощная платформа, но её внедрение требует проектирования: выбор архитектуры, настройка Rule Engine под бизнес-логику, интеграция с существующими системами, обеспечение безопасности.
Нужна помощь с IoT-платформой? Мы в Новаком проектируем и внедряем IoT-решения на базе ThingsBoard, Chirpstack и облачных платформ.
- IoT-аудит за 25 000 ₽ — оценим архитектуру, найдём узкие места, дадим рекомендации за 5 рабочих дней
- IoT-разработка под ключ — от прототипа до масштабирования на тысячи устройств