DTC · Техническая спецификация NBIoT · spec v2.4 · оператор
статусы пакет на сервер ошибки события CBOR чек-лист
01

Назначение

Что это за система, из чего состоит и как двигаются данные.

DTC (NBIoT) — веб-платформа мониторинга IoT-устройств. Оператор работает через браузер.

Термины

ТерминОпределение
deviceФизический контроллер (DTС датчик) с уникальным SN и MAC
payloadОдин пакет телеметрии: сериализованный объект с полями event, errors, tilt, rssi и др.
commandУправляющее воздействие: restart, calibrate_tilt_sensor, set_brightness
CBORConcise Binary Object Representation (RFC 8949) — бинарный формат сериализации. Компактнее JSON, оптимален для NB-IoT.
eventЗапись в системном логе: смена статуса, ошибки команды/телеметрии
statusВ работе / Неактивен / Ошибка / Нет данных

Как двигаются данные

# поток данных
device  ──( NB-IoT / GPRS )──▶  DTC server  ──▶  БД  ──▶  web UI
   │                            │
   │ CBOR (настройки)           │ Commands (управление)
   ▼                            ▼
CBOR payload (метрики)       web UI → оператор
🧬
CBOR — «сжатый JSON». Устройство отправляет данные в CBOR, сервер DTC распаковывает их в JSON, оператор видит результат в веб-интерфейсе.
💡
Инструкция интерактивная: раскрывайте блоки, отмечайте чек-лист, кликайте по скриншотам. В разделе 13 — калькулятор битовых масок.
02

Авторизация

Вход в систему по email и паролю.

  1. Открыть https://dtc.duotec.ru.
  2. Ввести email и password.
  3. После входа — редирект на Дашборд.
⚠️
Нет доступа — обратитесь к администратору: vpopov@duotec.ru.
03

Дашборд

Сводка по парку, карта, топ ошибок.

Структура экрана

БлокСодержимоеДействие оператора
status.chartДиаграмма: В работе / Неактивен / Ошибка / Нет данныхОценка общего состояния
error.top5Топ-5 ошибок с количеством устройствКлик → список устройств
mapМаркеры устройствКлик → карточка устройства

Палитра маркеров

🟢 В работе 🟡 Неактивен 🔴 Ошибка ⚪ Нет данных

💡
Расшифровка каждой метки — раздел 04. Кнопки «Скрыть панель» и «Обновить» управляют видом карты.
Дашборд
Дашборд: статусы, топ ошибок, карта
04

Статусы устройств

Формула вычисления статуса и что делать оператору при каждом значении.

Формула статуса

paramdefaultроль
warning_window180 минГраница «В работе» ↔ «Неактивен»
offline_window1440 минГраница «Неактивен» ↔ «Нет данных»
# псевдокод
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
🟢 В работе
Δt ≤ 180m · errors=0
Что означает
Устройство активно, есть свежая связь, ошибок нет.
Где видно
Карта — зелёный · Дашборд — сектор «В работе» · Реестр — статус «В работе»
Что проверять
Выборочно: rssi, tilt, vbat, temp_drv
Действие
Штатный режим — только мониторинг.
🟡 Неактивен
180 < Δt ≤ 1440m
Что означает
Связь потеряна недавно, ещё в пределах окна офлайн.
Что проверить
1. rssi < 50 — слабый сигнал.
2. event = EV_POWER_OFF — пропадало питание.
3. errors = ERR_BAT — проблема с АКБ.
Действие
Проверить питание, SIM, антенну. Если пройдёт 1440 мин — статус станет «Нет данных».
🔴 Ошибка
errors ≠ 0
Что означает
Устройство передало пакет с ненулевым errors. Связь может быть.
Что проверить
1. Карточка → «Метрики» → errors.
2. Ввести число в калькулятор (раздел 13).
3. Применить действие из карточки бита.
Действие
Приоритетная обработка. Для «залипающих» ошибок — restart.
⚪ Нет данных
Δt > 1440m
Что означает
Устройство молчит дольше окна офлайн. Вероятна полная потеря питания/SIM.
Что проверить
1. last_seen в карточке.
2. Последние метрики · rssi, vbat, errors.
3. Последний event.
Действие
Эскалация в техподдержку. Оператор сам не восстановит.

Матрица приоритета

СтатусУсловиеerrorsПриоритетДействие
🟢 В работеΔt ≤ 180m= 0—Мониторинг
🟡 Неактивен180 < Δt ≤ 1440mлюбойСреднийПитание, SIM, rssi, event
🔴 Ошибкалюбая связь≠ 0ВысокийРазобрать errors
⚪ Нет данныхΔt > 1440m—НизкийЭскалация
✅
Правило приоритета: сначала «Ошибка» → потом «Неактивен» → потом «Нет данных».
05

Реестр устройств

Поиск, фильтрация, экспорт.

Фильтры

ПолеФорматНазначение
search.by.sn00001255По SN
search.by.mac58:8C:81:2F:96:CEПо MAC
statusenumВ работе · Неактивен · Ошибка · Нет данных
sign.typeenumТип маркера
installedboolФлажок «Установлено» (раздел 06)
show.deletedboolСнятые с учёта

Колонки

КолонкаТипОписание
SNstringСерийный номер
MACstringMAC-адрес
ОписаниеstringМетка (например, 2621)
Тип знакаiconМаркер карты
СтатусenumСм. раздел 04
ОшибкаstringПоследняя ошибка
Последняя связьdatetimeTimestamp
СозданоdatetimeДата регистрации
💡
Экспорт в CSV, кнопка «+ Добавить устройство».
Реестр устройств
Реестр устройств · фильтры и таблица
06

Карточка устройства

Вкладка «Обзор» · идентификация и ключевые флаги.

ПолеТипОписание
SNstringСерийный номер
MACstringMAC-адрес
IMEIstringIMEI модема
ICCIDstringНомер SIM
sign.typeenumМаркер карты
installed bool Флажок «да / нет». Управляет видимостью устройства на дашборде и карте.
• нет — устройство скрыто с дашборда и карты (в реестре и командах остаётся).
• да — устройство отображается.
Применяется при монтаже, складе, тестировании или выводе из эксплуатации без удаления.
coordslat/lonКоординаты
addressstringАдрес
FW / HWsemver / uintПрошивка / железо
statusenumСм. раздел 04
last_seendatetimeTimestamp
last_eventstringПоследнее событие
created_atdatetimeДата создания
⚠️
installed не влияет на приём данных — устройство продолжает передавать метрики.
Карточка — нет данных
Карточка · статус «Нет данных»
Карточка — в работе
Карточка · статус «В работе»
07

Метрики

Вкладка «Метрики». Одна строка = один пакет.

Периодичность обычно 1 час. Верхняя строка — самая свежая.

Как читать

  1. errors должно быть 0. Иначе — раздел 13 + калькулятор.
  2. rssi < 50 — плохая связь.
  3. tilt выше порога (по умолчанию 15°) — тревога наклона.
  4. temp_drv высокое — перегрев драйвера.
  5. vbat ниже порога отсечки — проблема с АКБ.
  6. counter растёт последовательно. Разрыв = пропуск.
💡
Кнопка «Обновить», иконка <> — раскрыть payload.
Метрики
История метрик: counter, errors, rssi, tilt, напряжения
08

Спецификация payload

Поля телеметрии · источник · CBOR-тип · ед. · обязательность.

#JSONSourceCBOR typeUnitRangeReqОписание
0——uint—1reqmsg_type
1event—bitmap——reqМаска событий
2errors—bitmap——reqМаска ошибок
3vacADCuintмВ—optНапряжение AC
4vdcADCuintмВ—optНапряжение DC
5vbatADCuintмВ—optНапряжение АКБ
6vledINA237 CH0uintмВ—optНапряжение LED
7iledINA237 CH0uintмА—optТок LED
8reffINA237 CH0uintмОм—optСопротивление нагрузки
9temp_drvINA237 CH0int0.1 °C—optТемпература
10pwm_duty—uint%—optСкважность PWM
11tilt—int° × 10—optНаклон (14 = 1.4°)
12rssi—uint%—optСигнал NB-IoT
13counter—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
}

Интерпретация

ПолеЧтениеТревога
errorsbitmap · раздел 14≠ 0
eventbitmap · раздел 15содержит 0x04
vac240 мВ ≈ 240 Ввне диапазона
vbat3898 мВ = 3.898 Вниже vbat_off
tilt14 = 1.4°выше tilt_thr
rssi100 — отличный< 50
counterПоследовательный ростразрыв
09

Сообщения

Вкладка «Сообщения» · сырые пакеты устройства.

Колонки

IDTypeMACПолученоPayload
761173метрики58:8C:81:2F:9E:C615.10.2026 13:15:3714 полей · <>

Разбор payload

  1. Найдите строку по времени или типу.
  2. Нажмите <> — раскроется JSON.
  3. Сопоставьте поля с разделом 08.
  4. errors ≠ 0 → раздел 13 + калькулятор.
  5. event & 0x04 → «Уведомления».
  6. Отсутствующее поле — не передано в этом пакете.
Сообщения
История сообщений
10

Цепочка замены

История замен устройств на объекте.

Сверху — новейшее устройство, снизу — самое раннее. Текущее помечено как current.

💡
Используется при ремонте, замене по гарантии, модернизации.
Цепочка замены
Цепочка замены
11

Команды

Атомарные · настройки (CBOR) · прошивка.

Отправка

  1. Карточка → вкладка «Команды».
  2. Кнопка «Отправить команду».
  3. Тип: Атомарная / Настройки / Прошивка.
  4. Подтвердить.

Атомарные команды

КомандаДействиеЭффект
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"
}
Отправка · атомарная
Модалка · «Настройки» (CBOR)
Модалка · «Прошивка»
История команд
12

Уведомления

Лента событий · ошибки устройств и команд.

Типы записей

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).

Действия оператора

  1. Отметить «Прочитано».
  2. Нажать «Прочитать все».
  3. Перейти к «Устройству» или «Команде».
  4. Развернуть «Контекст события».
  5. Разложить errors в калькуляторе · применить действие.
Уведомления
Лента уведомлений: ошибка устройства и ошибка команды
13

Разбор errors / event

Что вижу → что значит → что делать. С калькулятором битовых масок.

Калькулятор битовой маски

Введите число и нажмите «Разобрать».

🔴 errors · bitmap аппаратных ошибок

Число — сумма поломок. Каждая поломка = один бит.

ERR_AC Питание AC 220 В
0x001bit 0не используется
Что вижу
errors содержит 0x01.
Что значит
Питание 220 В отсутствует или вне допуска.
Где смотреть
Метрики → vac.
→ Действие: проверить 220 В, после восстановления — restart.
ERR_DC Питание DC
0x002bit 1залипает
Что вижу
errors содержит 0x02.
Что значит
Просадка входного DC под нагрузкой.
Где смотреть
Метрики → vdc.
→ Действие: проверить БП и нагрузку, после устранения — restart.
ERR_OVERHEAT Перегрев
0x004bit 2
Что вижу
errors содержит 0x04. temp_drv высокое.
Что значит
Температура драйвера выше порога.
Где смотреть
Метрики → temp_drv.
→ Действие: проверить вентиляцию; при продолжении — эскалация.
ERR_BAT Ошибка АКБ
0x008bit 3
Что вижу
errors содержит 0x08. vbat ниже vbat_off.
Что значит
АКБ отсутствует, не заряжается или разряжена.
Где смотреть
Метрики → vbat, vdc. Сравнить с CBOR vbat_off.
→ Действие: проверить АКБ и зарядное, при необходимости — заменить.
ERR_LOAD Нагрузка / реверс
0x010bit 4залипает
Что вижу
errors содержит 0x10.
Что значит
Проблема с нагрузкой/драйвером, возможно реверсное питание.
Где смотреть
Метрики → reff, iled, vled.
→ Действие: проверить нагрузку, после устранения — restart.
ERR_ACCEL_ANGLE Превышен порог наклона
0x020bit 5
Что вижу
errors содержит 0x20. tilt выше tilt_thr.
Что значит
Устройство наклонено больше допустимого.
Где смотреть
Метрики → tilt · CBOR ACCEL.
→ Действие: выровнять, calibrate_tilt_sensor, затем restart.
ERR_ACCEL_HW Акселерометр не отвечает
0x040bit 6
Что вижу
errors содержит 0x40. tilt может отсутствовать.
Что значит
Аппаратная проблема датчика наклона.
→ Действие: restart, при повторе — эскалация.
ERR_INA237_HW Датчик тока не отвечает
0x080bit 7залипает
Что вижу
errors содержит 0x80. vled, iled, reff, temp_drv могут отсутствовать.
Что значит
INA237 не отвечает.
→ Действие: restart, при повторе — эскалация.
ERR_INTERNAL Внутренняя ошибка ПО
0x100bit 8
Что вижу
errors содержит 0x100 (watchdog, assert, panic).
Что значит
Сбой прошивки.
→ Действие: restart; при повторе — проверить прошивку, эскалация.
ERR_CHARGER Зарядник не отвечает
0x400bit 10
Что вижу
errors содержит 0x400.
Что значит
BQ25619 не отвечает.
→ Действие: restart, при повторе — эскалация.
ERR_BROWNOUT Просадка 3.3 В
0x800bit 11
Что вижу
errors содержит 0x800.
Что значит
Просадка в цепи 3.3 В.
→ Действие: проверить питание и АКБ; при повторе — эскалация.

🔵 event · bitmap причин отправки

Число показывает почему устройство прислало пакет. Несколько причин — сумма битов.

EV_INITIAL Запуск
0x001prio 3
Что значит
Устройство включилось / перезагрузилось.
→ Действие: штатное; убедиться, что errors=0.
EV_TIMER Плановый таймер
0x002prio 10
Что значит
Плановый таймер отправки (обычно раз в час).
→ Действие: ничего, штатное.
EV_ERROR Возникла ошибка
0x004prio 2
Что значит
Пакет отправлен вне графика из-за ошибки.
→ Действие: приоритетная обработка · разложить errors этого пакета.
EV_POWER_ON Подключено питание DC
0x008prio 4
Что значит
Вернулось внешнее питание DC.
→ Действие: проверить, что ошибки сбросились.
EV_POWER_OFF Отключено питание DC
0x010prio 4
Что значит
Пропало внешнее питание DC, устройство от АКБ.
→ Действие: проверить питание, следить за АКБ.
EV_BAT_LOW Низкий заряд АКБ
0x040prio 9
Что значит
Предупреждение: скоро сработает ERR_BAT.
→ Действие: проверить питание и заряд АКБ.
EV_MANUAL Ручная отправка
0x080prio 11
Что значит
Пакет отправлен по запросу оператора.
→ Действие: проверить, что данные пришли.

Сводная шпаргалка

ЗначениеРасшифровкаДействие
errors=0 · event=2Штатный плановый пакет—
errors=8ERR_BATПроверить АКБ
errors=32ERR_ACCEL_ANGLEКалибровка
errors=40ERR_BAT + ERR_ACCEL_ANGLEСначала питание, потом калибровка
errors=4ERR_OVERHEATВентиляция
errors=0x80 (128)ERR_INA237_HWrestart
errors=0x100 (256)ERR_INTERNALrestart
event=4EV_ERRORСмотреть errors
event=64EV_BAT_LOWПроверить питание
event=128EV_MANUALПроверить данные
event=8EV_POWER_ONПроверить ошибки
event=16EV_POWER_OFFСледить за АКБ
rssi < 50Слабый сигналАнтенна, расположение
tilt > 15Превышен наклонУстановка, калибровка
temp_drv > 800Перегрев (80 °C)Вентиляция
counter не растётПропускиСвязь, rssi
💡
errors — диагноз · event — причина визита · поля — подтверждение.
14

Спецификация errors

Полная битовая маска аппаратных ошибок.

// пересчёт
errors = Σ ( 1 << bit )   для активных битов
example: 0x48 = 0x40 | 0x08 = ERR_ACCEL_HW | ERR_BAT
valuebitmaskconstantОписаниеПоддержка
100x01ERR_ACОшибка AC 220 Визбыточно
210x02ERR_DCПросадка DC · restart—
420x04ERR_OVERHEATПерегрев драйвера—
830x08ERR_BATОшибка АКБ—
1640x10ERR_LOADНагрузка/реверс · restart—
3250x20ERR_ACCEL_ANGLEПревышение наклона—
6460x40ERR_ACCEL_HWАкселерометр не отвечает—
12870x80ERR_INA237_HWINA237 не отвечает · restart—
25680x100ERR_INTERNALВнутренняя ошибка ПО—
51290x200ERR_RTCОшибка RTCне поддержано
1024100x400ERR_CHARGERBQ25619 не отвечает—
2048110x800ERR_BROWNOUTПросадка 3.3 В—
—12–31——Зарезервировано—
15

Спецификация event

Полная битовая маска причин отправки.

valuepriobitmaskconstantОписаниеПоддержка
1300x01EV_INITIALЗапуск / перезагрузка—
21010x02EV_TIMERПлановый таймер—
4220x04EV_ERRORАппаратная ошибка—
8430x08EV_POWER_ONПитание DC подключено—
16440x10EV_POWER_OFFПитание DC отключено—
32850x20EV_ACCEL_SHOCKПревышение ускоренияне используется
64960x40EV_BAT_LOWНизкий заряд АКБ—
1281170x80EV_MANUALОтправка по команде—
256080x100EV_LIGHT_ONПодсветка включена—
512090x200EV_LIGHT_OFFПодсветка отключена—
10247100x400EV_SCHEDULE_ONПодсветка по расписанию · on—
20487110x800EV_SCHEDULE_OFFПодсветка по расписанию · off—
——12–31——Зарезервировано—
16

Дерево решений

Алгоритмы диагностики для оператора.

Ошибка · status = «Ошибка»

  1. Карточка → «Метрики» → errors.
  2. errors=0 → ошибка ушла, отметить уведомление прочитанным.
  3. errors>0 → раздел 13 → ввести число в калькулятор.
  4. По каждому активному биту — действие из карточки.
  5. Бит помечен «залипает» → отправить restart.
  6. Обновить карточку · убедиться errors=0.
  7. Зафиксировать в отчёте смены.

Неактивен · status = «Неактивен»

  1. Карточка → «Метрики» → rssi последнего пакета.
  2. rssi < 50 → слабый сигнал · проверить антенну, расположение.
  3. rssi в норме → проверить питание, SIM.
  4. Проверить event: если EV_POWER_OFF — питание пропадало.
  5. Если Δt > 24 ч → эскалация.

Команда · status = «Ошибка»

  1. «Уведомления» → найти запись об ошибке команды.
  2. Развернуть контекст → error_code, error_message.
  3. ESP_ERR_INVALID_STATE → повторить позже.
  4. Повторяется → эскалация.
17

Чек-лист смены

Отмечайте пункты — прогресс сохраняется в браузере.

18

CBOR · параметры

Concise Binary Object Representation (RFC 8949). Значения видны в модалке «Отправить команду → Настройки».

🧬
CBOR — «сжатый JSON». Устройство передаёт параметры конфигурации и телеметрию в CBOR. Сервер DTC распаковывает CBOR в JSON, который вы видите в веб-интерфейсе. Компактнее JSON, оптимально для NB-IoT.
🔧 MAIN · CBOR 1–30
#nameJSONtypeunitrangenote
1MSG_TYPEmsguint—3Тип пакета
2MAINmainuint—1–31=NORMAL · 2=SERVICE · 3=VERB
3MODEmodeuint—0–30=IDLE · 1=TEST · 2=NORMAL · 3=LIGHT
4LEDleduint—0–20=OFF · 1=DAILY · 2=AUTO
6LED_MODEled_modeuint—0–31=DAILY · 2=ASTRO · 3=TABLE
7LED_MINled_minuintмА0–1000—
8LED_MAXled_maxuintмА0–1000—
9LATlatint°−720..840UTC+3 = 180 (МСК)
10LONlonint°−180..180—
11SUNSET_OFFsunset_offintмин−240..240Смещение выключения от заката
12SUNRISE_OFFsunrise_offintмин−240..240Смещение включения от рассвета
13ON_Ton_tuintмин0–1439Время включения
14OFF_Toff_tuintмин0–1439Время выключения
15CHARGEchargeuintмА0–1000Ток заряда АКБ
16VBAT_OFFvbat_offuintмВ3500–4200Напряжение отсечки АКБ
🔧 ACCEL · CBOR 20–22
#nameJSONtypeunitrangenote
20ACCELacceluint° × 101–80Порог тревоги наклона
21ACCEL_THRaccel_thruint—1–80Порог удара/вибрации
22ACCEL_SENSaccel_sensuintмГ0–10000Чувствительность
🔧 LED · CBOR 30–45
#namenote
30LED_TYPEТип LED (0–255)
36–43LED_VF_*Напряжения Vf при разных уровнях яркости
🔧 UPS · CBOR 60–68
#namenote
60–68UPS_*Режим UPS · границы AC/DC/АКБ · время заряда/работы
🔧 SERVICE · VMF · BLE

SERVICE (70–74) — ручные тестовые параметры.

VMF (81–87) — частота, температура, период опроса.

BLE (90–92) — управление Bluetooth.

19

Прошивки

Управление версиями ПО устройств.

ПолеОписание
filenameИмя файла прошивки
sha256Контрольная сумма
sizeРазмер файла
uploaded_atДата загрузки
statusАктивна / архив
⚠️
Загрузка и удаление — задача администратора.
Прошивки
Список прошивок с SHA-256 и статусом
20

Пользователи

Управление доступом и ролями.

roleПрава
ROLE_ADMINПолный доступ
ROLE_USERПросмотр · команды · метрики · уведомления
⚠️
Создание и редактирование — задача администратора · vpopov@duotec.ru.
Пользователи
Список пользователей с ролями
21

Настройки

Глобальные параметры системы · влияют на статусы.

paramdefaulteffect
warning_window180 минГраница «В работе» ↔ «Неактивен» (см. раздел 04)
offline_window1440 минГраница «Неактивен» ↔ «Нет данных»
daily_msg_limit30Порог для отчёта
monthly_msg_limit900Порог для отчёта
💡
Изменение влияет на распределение статусов. Меняет только администратор.
Настройки
Системные настройки
22

Типы знаков

Справочник маркеров для карты.

Таблица: icon, code, name, updated_at. Кнопка «+ Добавить» · иконка ✏️ · корзина.

⚠️
Редактирование — задача администратора.
Типы знаков
Справочник типов знаков
23

Контакты

Администратор системы и платформа.

Администратор
vpopov@duotec.ru
Платформа
https://dtc.duotec.ru