Назначение
Что это за система, из чего состоит и как двигаются данные.
DTC (NBIoT) — веб-платформа мониторинга IoT-устройств. Оператор работает через браузер.
Термины
| Термин | Определение |
|---|---|
device | Физический контроллер (DTС датчик) с уникальным SN и MAC |
payload | Один пакет телеметрии: сериализованный объект с полями event, errors, tilt, rssi и др. |
command | Управляющее воздействие: restart, calibrate_tilt_sensor, set_brightness |
CBOR | Concise Binary Object Representation (RFC 8949) — бинарный формат сериализации. Компактнее JSON, оптимален для NB-IoT. |
event | Запись в системном логе: смена статуса, ошибки команды/телеметрии |
status | В работе / Неактивен / Ошибка / Нет данных |
Как двигаются данные
# поток данных
device ──( NB-IoT / GPRS )──▶ DTC server ──▶ БД ──▶ web UI
│ │
│ CBOR (настройки) │ Commands (управление)
▼ ▼
CBOR payload (метрики) web UI → оператор
Авторизация
Вход в систему по email и паролю.
- Открыть
https://dtc.duotec.ru. - Ввести
emailиpassword. - После входа — редирект на Дашборд.
Дашборд
Сводка по парку, карта, топ ошибок.
Структура экрана
| Блок | Содержимое | Действие оператора |
|---|---|---|
status.chart | Диаграмма: В работе / Неактивен / Ошибка / Нет данных | Оценка общего состояния |
error.top5 | Топ-5 ошибок с количеством устройств | Клик → список устройств |
map | Маркеры устройств | Клик → карточка устройства |
Палитра маркеров
🟢 В работе 🟡 Неактивен 🔴 Ошибка ⚪ Нет данных
Статусы устройств
Формула вычисления статуса и что делать оператору при каждом значении.
Формула статуса
| param | default | роль |
|---|---|---|
| warning_window | 180 мин | Граница «В работе» ↔ «Неактивен» |
| offline_window | 1440 мин | Граница «Неактивен» ↔ «Нет данных» |
# псевдокод
status = "В работе" if (now - last_seen) ≤ warning_window AND errors == 0
status = "Неактивен" if warning_window < (now - last_seen) ≤ offline_window
status = "Ошибка" if errors ≠ 0
status = "Нет данных" if (now - last_seen) > offline_window
rssi, tilt, vbat, temp_drvrssi < 50 — слабый сигнал.2.
event = EV_POWER_OFF — пропадало питание.3.
errors = ERR_BAT — проблема с АКБ.
errors. Связь может быть.errors.2. Ввести число в калькулятор (раздел 13).
3. Применить действие из карточки бита.
restart.last_seen в карточке.2. Последние метрики ·
rssi, vbat, errors.3. Последний
event.
Матрица приоритета
| Статус | Условие | errors | Приоритет | Действие |
|---|---|---|---|---|
| 🟢 В работе | Δt ≤ 180m | = 0 | — | Мониторинг |
| 🟡 Неактивен | 180 < Δt ≤ 1440m | любой | Средний | Питание, SIM, rssi, event |
| 🔴 Ошибка | любая связь | ≠ 0 | Высокий | Разобрать errors |
| ⚪ Нет данных | Δt > 1440m | — | Низкий | Эскалация |
Реестр устройств
Поиск, фильтрация, экспорт.
Фильтры
| Поле | Формат | Назначение |
|---|---|---|
search.by.sn | 00001255 | По SN |
search.by.mac | 58:8C:81:2F:96:CE | По MAC |
status | enum | В работе · Неактивен · Ошибка · Нет данных |
sign.type | enum | Тип маркера |
installed | bool | Флажок «Установлено» (раздел 06) |
show.deleted | bool | Снятые с учёта |
Колонки
| Колонка | Тип | Описание |
|---|---|---|
SN | string | Серийный номер |
MAC | string | MAC-адрес |
Описание | string | Метка (например, 2621) |
Тип знака | icon | Маркер карты |
Статус | enum | См. раздел 04 |
Ошибка | string | Последняя ошибка |
Последняя связь | datetime | Timestamp |
Создано | datetime | Дата регистрации |
Карточка устройства
Вкладка «Обзор» · идентификация и ключевые флаги.
| Поле | Тип | Описание |
|---|---|---|
SN | string | Серийный номер |
MAC | string | MAC-адрес |
IMEI | string | IMEI модема |
ICCID | string | Номер SIM |
sign.type | enum | Маркер карты |
installed |
bool |
Флажок «да / нет». Управляет видимостью устройства на дашборде и карте. • нет — устройство скрыто с дашборда и карты (в реестре и командах остаётся).• да — устройство отображается.Применяется при монтаже, складе, тестировании или выводе из эксплуатации без удаления. |
coords | lat/lon | Координаты |
address | string | Адрес |
FW / HW | semver / uint | Прошивка / железо |
status | enum | См. раздел 04 |
last_seen | datetime | Timestamp |
last_event | string | Последнее событие |
created_at | datetime | Дата создания |
installed не влияет на приём данных — устройство продолжает передавать метрики.
Метрики
Вкладка «Метрики». Одна строка = один пакет.
Периодичность обычно 1 час. Верхняя строка — самая свежая.
Как читать
errorsдолжно быть 0. Иначе — раздел 13 + калькулятор.rssi < 50— плохая связь.tiltвыше порога (по умолчанию 15°) — тревога наклона.temp_drvвысокое — перегрев драйвера.vbatниже порога отсечки — проблема с АКБ.counterрастёт последовательно. Разрыв = пропуск.
<> — раскрыть payload.
Спецификация payload
Поля телеметрии · источник · CBOR-тип · ед. · обязательность.
| # | JSON | Source | CBOR type | Unit | Range | Req | Описание |
|---|---|---|---|---|---|---|---|
| 0 | — | — | uint | — | 1 | req | msg_type |
| 1 | event | — | bitmap | — | — | req | Маска событий |
| 2 | errors | — | bitmap | — | — | req | Маска ошибок |
| 3 | vac | ADC | uint | мВ | — | opt | Напряжение AC |
| 4 | vdc | ADC | uint | мВ | — | opt | Напряжение DC |
| 5 | vbat | ADC | uint | мВ | — | opt | Напряжение АКБ |
| 6 | vled | INA237 CH0 | uint | мВ | — | opt | Напряжение LED |
| 7 | iled | INA237 CH0 | uint | мА | — | opt | Ток LED |
| 8 | reff | INA237 CH0 | uint | мОм | — | opt | Сопротивление нагрузки |
| 9 | temp_drv | INA237 CH0 | int | 0.1 °C | — | opt | Температура |
| 10 | pwm_duty | — | uint | % | — | opt | Скважность PWM |
| 11 | tilt | — | int | ° × 10 | — | opt | Наклон (14 = 1.4°) |
| 12 | rssi | — | uint | % | — | opt | Сигнал NB-IoT |
| 13 | counter | — | uint | — | — | req | Счётчик пакетов |
Пример payload (JSON-представление после распаковки CBOR)
{
"counter": 183, "errors": 0, "event": 2,
"iled": 2046, "pwm_duty": 100, "reff": 5800,
"rssi": 100, "temp_drv": 207, "tilt": 14,
"vac": 240, "vbat": 3898, "vdc": 11972,
"vled": 11868
}
Интерпретация
| Поле | Чтение | Тревога |
|---|---|---|
errors | bitmap · раздел 14 | ≠ 0 |
event | bitmap · раздел 15 | содержит 0x04 |
vac | 240 мВ ≈ 240 В | вне диапазона |
vbat | 3898 мВ = 3.898 В | ниже vbat_off |
tilt | 14 = 1.4° | выше tilt_thr |
rssi | 100 — отличный | < 50 |
counter | Последовательный рост | разрыв |
Сообщения
Вкладка «Сообщения» · сырые пакеты устройства.
Колонки
| ID | Type | MAC | Получено | Payload |
|---|---|---|---|---|
761173 | метрики | 58:8C:81:2F:9E:C6 | 15.10.2026 13:15:37 | 14 полей · <> |
Разбор payload
- Найдите строку по времени или типу.
- Нажмите
<>— раскроется JSON. - Сопоставьте поля с разделом 08.
errors ≠ 0→ раздел 13 + калькулятор.event & 0x04→ «Уведомления».- Отсутствующее поле — не передано в этом пакете.
Цепочка замены
История замен устройств на объекте.
Сверху — новейшее устройство, снизу — самое раннее. Текущее помечено как current.
Команды
Атомарные · настройки (CBOR) · прошивка.
Отправка
- Карточка → вкладка «Команды».
- Кнопка «Отправить команду».
- Тип: Атомарная / Настройки / Прошивка.
- Подтвердить.
Атомарные команды
| Команда | Действие | Эффект |
|---|---|---|
restart | Перезагрузка | Сбрасывает ERR_DC, ERR_LOAD, ERR_INA237_HW |
switch_on_light | Включить подсветку | — |
switch_off_light | Выключить подсветку | — |
calibrate_tilt_sensor | Калибровка наклона | Устройство должно быть в покое |
set_brightness | Установить яркость | — |
Статусы команд
ожидает выполнена ошибка
// пример ошибки команды { "kind": "command", "name": "calibrate_tilt_sensor", "error_code": 6, "error_message": "calibrate ESP_ERR_INVALID_STATE" }




Уведомления
Лента событий · ошибки устройств и команд.
Типы записей
| type | Пример | Интерпретация |
|---|---|---|
device.error |
«Датчик 58:8C:81:2F:9C:E2 перешёл в "Ошибка": (errors=32)» |
errors = 32 = ERR_ACCEL_ANGLE |
command.error |
«calibrate_tilt_sensor завершилась ошибкой: ESP_ERR_INVALID_STATE» |
Устройство не в нужном состоянии |
Контекст события
{
"from": "warning",
"to": "error",
"reason": "Ошибка телеметрии (errors=32)"
}
Число в скобках — errors. Введите в калькулятор (раздел 13).
Действия оператора
- Отметить «Прочитано».
- Нажать «Прочитать все».
- Перейти к «Устройству» или «Команде».
- Развернуть «Контекст события».
- Разложить
errorsв калькуляторе · применить действие.
Разбор errors / event
Что вижу → что значит → что делать. С калькулятором битовых масок.
Калькулятор битовой маски
🔴 errors · bitmap аппаратных ошибок
Число — сумма поломок. Каждая поломка = один бит.
errors содержит 0x01.vac.restart.errors содержит 0x02.vdc.restart.errors содержит 0x04. temp_drv высокое.temp_drv.errors содержит 0x08. vbat ниже vbat_off.vbat, vdc. Сравнить с CBOR vbat_off.errors содержит 0x10.reff, iled, vled.restart.errors содержит 0x20. tilt выше tilt_thr.tilt · CBOR ACCEL.calibrate_tilt_sensor, затем restart.errors содержит 0x40. tilt может отсутствовать.restart, при повторе — эскалация.errors содержит 0x80. vled, iled, reff, temp_drv могут отсутствовать.restart, при повторе — эскалация.errors содержит 0x100 (watchdog, assert, panic).restart; при повторе — проверить прошивку, эскалация.errors содержит 0x400.restart, при повторе — эскалация.errors содержит 0x800.🔵 event · bitmap причин отправки
Число показывает почему устройство прислало пакет. Несколько причин — сумма битов.
errors=0.errors этого пакета.ERR_BAT.Сводная шпаргалка
| Значение | Расшифровка | Действие |
|---|---|---|
| errors=0 · event=2 | Штатный плановый пакет | — |
| errors=8 | ERR_BAT | Проверить АКБ |
| errors=32 | ERR_ACCEL_ANGLE | Калибровка |
| errors=40 | ERR_BAT + ERR_ACCEL_ANGLE | Сначала питание, потом калибровка |
| errors=4 | ERR_OVERHEAT | Вентиляция |
| errors=0x80 (128) | ERR_INA237_HW | restart |
| errors=0x100 (256) | ERR_INTERNAL | restart |
| event=4 | EV_ERROR | Смотреть errors |
| event=64 | EV_BAT_LOW | Проверить питание |
| event=128 | EV_MANUAL | Проверить данные |
| event=8 | EV_POWER_ON | Проверить ошибки |
| event=16 | EV_POWER_OFF | Следить за АКБ |
| rssi < 50 | Слабый сигнал | Антенна, расположение |
| tilt > 15 | Превышен наклон | Установка, калибровка |
| temp_drv > 800 | Перегрев (80 °C) | Вентиляция |
| counter не растёт | Пропуски | Связь, rssi |
errors — диагноз · event — причина визита · поля — подтверждение.Спецификация errors
Полная битовая маска аппаратных ошибок.
// пересчёт
errors = Σ ( 1 << bit ) для активных битов
example: 0x48 = 0x40 | 0x08 = ERR_ACCEL_HW | ERR_BAT
| value | bit | mask | constant | Описание | Поддержка |
|---|---|---|---|---|---|
| 1 | 0 | 0x01 | ERR_AC | Ошибка AC 220 В | избыточно |
| 2 | 1 | 0x02 | ERR_DC | Просадка DC · restart | — |
| 4 | 2 | 0x04 | ERR_OVERHEAT | Перегрев драйвера | — |
| 8 | 3 | 0x08 | ERR_BAT | Ошибка АКБ | — |
| 16 | 4 | 0x10 | ERR_LOAD | Нагрузка/реверс · restart | — |
| 32 | 5 | 0x20 | ERR_ACCEL_ANGLE | Превышение наклона | — |
| 64 | 6 | 0x40 | ERR_ACCEL_HW | Акселерометр не отвечает | — |
| 128 | 7 | 0x80 | ERR_INA237_HW | INA237 не отвечает · restart | — |
| 256 | 8 | 0x100 | ERR_INTERNAL | Внутренняя ошибка ПО | — |
| 512 | 9 | 0x200 | ERR_RTC | Ошибка RTC | не поддержано |
| 1024 | 10 | 0x400 | ERR_CHARGER | BQ25619 не отвечает | — |
| 2048 | 11 | 0x800 | ERR_BROWNOUT | Просадка 3.3 В | — |
| — | 12–31 | — | — | Зарезервировано | — |
Спецификация event
Полная битовая маска причин отправки.
| value | prio | bit | mask | constant | Описание | Поддержка |
|---|---|---|---|---|---|---|
| 1 | 3 | 0 | 0x01 | EV_INITIAL | Запуск / перезагрузка | — |
| 2 | 10 | 1 | 0x02 | EV_TIMER | Плановый таймер | — |
| 4 | 2 | 2 | 0x04 | EV_ERROR | Аппаратная ошибка | — |
| 8 | 4 | 3 | 0x08 | EV_POWER_ON | Питание DC подключено | — |
| 16 | 4 | 4 | 0x10 | EV_POWER_OFF | Питание DC отключено | — |
| 32 | 8 | 5 | 0x20 | EV_ACCEL_SHOCK | Превышение ускорения | не используется |
| 64 | 9 | 6 | 0x40 | EV_BAT_LOW | Низкий заряд АКБ | — |
| 128 | 11 | 7 | 0x80 | EV_MANUAL | Отправка по команде | — |
| 256 | 0 | 8 | 0x100 | EV_LIGHT_ON | Подсветка включена | — |
| 512 | 0 | 9 | 0x200 | EV_LIGHT_OFF | Подсветка отключена | — |
| 1024 | 7 | 10 | 0x400 | EV_SCHEDULE_ON | Подсветка по расписанию · on | — |
| 2048 | 7 | 11 | 0x800 | EV_SCHEDULE_OFF | Подсветка по расписанию · off | — |
| — | — | 12–31 | — | — | Зарезервировано | — |
Дерево решений
Алгоритмы диагностики для оператора.
Ошибка · status = «Ошибка»
- Карточка → «Метрики» →
errors. errors=0→ ошибка ушла, отметить уведомление прочитанным.errors>0→ раздел 13 → ввести число в калькулятор.- По каждому активному биту — действие из карточки.
- Бит помечен «залипает» → отправить
restart. - Обновить карточку · убедиться
errors=0. - Зафиксировать в отчёте смены.
Неактивен · status = «Неактивен»
- Карточка → «Метрики» →
rssiпоследнего пакета. rssi < 50→ слабый сигнал · проверить антенну, расположение.rssiв норме → проверить питание, SIM.- Проверить
event: еслиEV_POWER_OFF— питание пропадало. - Если Δt > 24 ч → эскалация.
Команда · status = «Ошибка»
- «Уведомления» → найти запись об ошибке команды.
- Развернуть контекст →
error_code,error_message. ESP_ERR_INVALID_STATE→ повторить позже.- Повторяется → эскалация.
Чек-лист смены
Отмечайте пункты — прогресс сохраняется в браузере.
CBOR · параметры
Concise Binary Object Representation (RFC 8949). Значения видны в модалке «Отправить команду → Настройки».
🔧 MAIN · CBOR 1–30
| # | name | JSON | type | unit | range | note |
|---|---|---|---|---|---|---|
| 1 | MSG_TYPE | msg | uint | — | 3 | Тип пакета |
| 2 | MAIN | main | uint | — | 1–3 | 1=NORMAL · 2=SERVICE · 3=VERB |
| 3 | MODE | mode | uint | — | 0–3 | 0=IDLE · 1=TEST · 2=NORMAL · 3=LIGHT |
| 4 | LED | led | uint | — | 0–2 | 0=OFF · 1=DAILY · 2=AUTO |
| 6 | LED_MODE | led_mode | uint | — | 0–3 | 1=DAILY · 2=ASTRO · 3=TABLE |
| 7 | LED_MIN | led_min | uint | мА | 0–1000 | — |
| 8 | LED_MAX | led_max | uint | мА | 0–1000 | — |
| 9 | LAT | lat | int | ° | −720..840 | UTC+3 = 180 (МСК) |
| 10 | LON | lon | int | ° | −180..180 | — |
| 11 | SUNSET_OFF | sunset_off | int | мин | −240..240 | Смещение выключения от заката |
| 12 | SUNRISE_OFF | sunrise_off | int | мин | −240..240 | Смещение включения от рассвета |
| 13 | ON_T | on_t | uint | мин | 0–1439 | Время включения |
| 14 | OFF_T | off_t | uint | мин | 0–1439 | Время выключения |
| 15 | CHARGE | charge | uint | мА | 0–1000 | Ток заряда АКБ |
| 16 | VBAT_OFF | vbat_off | uint | мВ | 3500–4200 | Напряжение отсечки АКБ |
🔧 ACCEL · CBOR 20–22
| # | name | JSON | type | unit | range | note |
|---|---|---|---|---|---|---|
| 20 | ACCEL | accel | uint | ° × 10 | 1–80 | Порог тревоги наклона |
| 21 | ACCEL_THR | accel_thr | uint | — | 1–80 | Порог удара/вибрации |
| 22 | ACCEL_SENS | accel_sens | uint | мГ | 0–10000 | Чувствительность |
🔧 LED · CBOR 30–45
| # | name | note |
|---|---|---|
| 30 | LED_TYPE | Тип LED (0–255) |
| 36–43 | LED_VF_* | Напряжения Vf при разных уровнях яркости |
🔧 UPS · CBOR 60–68
| # | name | note |
|---|---|---|
| 60–68 | UPS_* | Режим UPS · границы AC/DC/АКБ · время заряда/работы |
🔧 SERVICE · VMF · BLE
SERVICE (70–74) — ручные тестовые параметры.
VMF (81–87) — частота, температура, период опроса.
BLE (90–92) — управление Bluetooth.
Прошивки
Управление версиями ПО устройств.
| Поле | Описание |
|---|---|
filename | Имя файла прошивки |
sha256 | Контрольная сумма |
size | Размер файла |
uploaded_at | Дата загрузки |
status | Активна / архив |
Пользователи
Управление доступом и ролями.
| role | Права |
|---|---|
ROLE_ADMIN | Полный доступ |
ROLE_USER | Просмотр · команды · метрики · уведомления |
Настройки
Глобальные параметры системы · влияют на статусы.
| param | default | effect |
|---|---|---|
| warning_window | 180 мин | Граница «В работе» ↔ «Неактивен» (см. раздел 04) |
| offline_window | 1440 мин | Граница «Неактивен» ↔ «Нет данных» |
| daily_msg_limit | 30 | Порог для отчёта |
| monthly_msg_limit | 900 | Порог для отчёта |
Типы знаков
Справочник маркеров для карты.
Таблица: icon, code, name, updated_at. Кнопка «+ Добавить» · иконка ✏️ · корзина.
Контакты
Администратор системы и платформа.
https://dtc.duotec.ru