Synapse
Telegram GitHub →

Прошивка. База данных

АПК Синапс v1.0. ПО. Спецификации на разработку

Последнее изменение: 13.12.2025, 19:20 МСК

erDiagram LOCATIONS ||--o| LUMINAIRES : "LOCATION_ID nullable" LOCATIONS ||--o| GROUPS : "LOCATION_ID nullable" LOCATIONS ||--o| PRES_SENSORS : "LOCATION_ID nullable" LOCATIONS ||--o| BRIGHT_SENSORS : "LOCATION_ID nullable" LOCATIONS ||--o| BUTTON_PANELS : "LOCATION_ID nullable" GROUPS ||--o{ LUMINAIRES : "GROUP_ID" GROUPS ||--o{ BRIGHT_SENSORS : "GROUP_ID" LUMINAIRES ||--o{ SCENE_LUMINAIRES : "LUMINAIRE_ID" BUTTON_PANELS ||--o{ BUTTONS : "BUTTON_PANEL_ID" BUTTONS ||--o{ ACTIONS : "BUTTON_SHORT_ID" BUTTONS ||--o{ ACTIONS : "BUTTON_LONG_ID" ACTIONS ||--o{ PRES_SENSORS : "ACTION_OCCUPANCY_ID" ACTIONS ||--o{ PRES_SENSORS : "ACTION_VACANCY_ID" ACTIONS ||--o{ SUBACTIONS : "ACTION_ID" CONTROLLERS { CHAR20 NAME CHAR4 PASSWORD UINT8 IS_SCHEDULE UINT8 IS_AUTO UINT8 ICO_NUM CHAR1 STATUS UINT8 SCENE_NUM UINT32 TIMESTAMP BLOB IDATA } LOCATIONS { UINT8 EXIST UINT8 IS_AUTO UINT8 SCENE_NUM } GROUPS { UINT8 EXIST SHORT LOCATION_ID UINT8 DALI_NUM UINT8 SCENE_NUM } LUMINAIRES { UINT8 EXIST UINT8 DALI_ADDR SHORT LOCATION_ID SHORT GROUP_ID UINT8 VAL_BRIGHT UINT8 VAL_TW UINT8 VAL_R UINT8 VAL_G UINT8 VAL_B UINT8 VAL_W UINT8 SCENE_NUM UINT8 MIN_LEVEL UINT8 MAX_LEVEL UINT8 FADE_TIME CHAR1 STATUS } SCENE_LUMINAIRES { UINT8 SCENE_NUM UINT8 LUMINAIRE_ID UINT8 VAL_BRIGHT UINT8 VAL_TW UINT8 VAL_R UINT8 VAL_G UINT8 VAL_B UINT8 VAL_W } PRES_SENSORS { UINT8 EXIST UINT8 DALI_ADDR UINT8 DALI_INST SHORT LOCATION_ID SHORT ACTION_OCCUPANCY_ID SHORT ACTION_VACANCY_ID UINT8 HOLD_TIME CHAR1 STATUS } BRIGHT_SENSORS { UINT8 EXIST UINT8 DALI_ADDR UINT8 DALI_INST SHORT LOCATION_ID SHORT GROUP_ID UINT8 SCENE_BRIGHTNESS_0 UINT8 SCENE_BRIGHTNESS_1 UINT8 SCENE_BRIGHTNESS_2 UINT8 SCENE_BRIGHTNESS_3 UINT8 SCENE_BRIGHTNESS_4 CHAR1 STATUS } BUTTON_PANELS { UINT8 EXIST UINT8 DALI_ADDR SHORT LOCATION_ID CHAR1 STATUS } BUTTONS { UINT8 BUTTON_PANEL_ID UINT8 DALI_INST } ACTIONS { SHORT BUTTON_SHORT_ID SHORT BUTTON_LONG_ID UINT8 POS } SUBACTIONS { SHORT ACTION_ID UINT8 OBJECT_TYPE UINT8 OBJECT_NUM UINT8 VALUE } EVENTS { UINT8 EXIST CHAR7 DAYS CHAR4 TIME UINT8 SMOOTH SHORT ACTION_ID }

1. Назначение документа

Описать структуру базы данных (USM, Unit System Model) прошивки контроллера.

2. Термины и определения

1.1. Рабочие данные — необходимые для организации работы освещения и в прошивке, и в приложении. В приложении находятся в таблицах SQLite, в прошивке в виде массивов структур C.

1.2. Интерфейсные данные — используемые только приложением для организации пользовательского интерфейса. Примеры: названия светильников, номера их иконок. В приложении находятся в таблицах SQLite, в прошивке в виде единого блока где-то в постоянной памяти. Для понятности в описании БД прошивки и логики работы прошивки считаем, что блок интерфейсных данных лежит в BLOB-поле единственной записи в таблице CONTROLLERS.

3. Основные положения

2.1. «Таблицы» БД в прошивке разложены в массивы структур C. Тем не менее ниже для простоты они представляются именно как таблицы.

2.2. Индексация записей в таблицах ниже осуществляется по индексам соответствующих структур в массивах. Поэтому отдельных полей ID, как в аналогичных таблицах приложения, здесь нет, но поля с FK на эти индексы (типа LOCATION_ID) есть. LUMINAIRES.LOCATION_ID = 5 означает, что светильник приписан к локации, которая в массиве локаций лежит в 6-м элементе массива с локациями (нумерация индексов массивов начинается с 0).

4. Таблицы

4.1. CONTROLLERS

Таблица с информацией о контроллере. Имеет одну запись. Представлена здесь таблицей для общности с DB приложения. В реальности является просто набором переменных, хранящихся в прошивке.

4.2. LOCATIONS

Локации.

4.3. GROUPS

Группы светильников. Номер группы в DALI совпадает с ID (индексу в массиве) записи.

4.4. LUMINAIRES

Светильники.

4.5. SCENE_LUMINAIRES

Параметры светильников в сценах.

4.6. PRES_SENSORS

Датчики присутствия.

4.7. BRIGHT_SENSORS

Датчики освещённости.

4.8. BUTTON_PANELS

Кнопочные панели.

4.9. BUTTONS

Кнопки.

4.10. ACTIONS

Действия с устройствами.

4.11. SUBACTIONS

Поддействия действий.

4.12. EVENTS

События расписания.

5. Структура БД прошивки (USM прошивки)

CONTROLLERS (1)

LOCATIONS (16)

GROUPS (16)

LUMINAIRES (64)

SCENE_LUMINAIRES (320)

PRES_SENSORS (64)

BRIGHT_SENSORS (64)

BUTTON_PANELS (64)

BUTTONS (512)

ACTIONS (512)

SUBACTIONS (512)

EVENTS (256)

6. Структура БД прошивки в виде JSON (USM прошивки)

ВАЖНО: При любом изменении структуры БД (добавление/удаление полей, изменение размеров, изменение количества записей, изменение порядка таблиц или полей) ОБЯЗАТЕЛЬНО увеличивать VERSION.

{
  "VERSION": 13,
  "CONTROLLERS": {
    "RECORDS": 1,
    "FIELDS": {
      "NAME": 20,
      "PASSWORD": 4,
      "IS_SCHEDULE": 1,
      "IS_AUTO": 1,
      "ICO_NUM": 1,
      "STATUS": 1,
      "SCENE_NUM": 1,
      "TIMESTAMP": 4,
      "IDATA": 50000
    }
  },
  "LOCATIONS": {
    "RECORDS": 16,
    "FIELDS": {
      "EXIST": 1,
      "IS_AUTO": 1,
      "SCENE_NUM": 1
    }
  },
  "GROUPS": {
    "RECORDS": 16,
    "FIELDS": {
      "EXIST": 1,
      "LOCATION_ID": 2,
      "SCENE_NUM": 1
    }
  },
  "LUMINAIRES": {
    "RECORDS": 64,
    "FIELDS": {
      "EXIST": 1,
      "DALI_ADDR": 1,
      "LOCATION_ID": 2,
      "GROUP_ID": 2,
      "VAL_BRIGHT": 1,
      "VAL_TW": 1,
      "VAL_R": 1,
      "VAL_G": 1,
      "VAL_B": 1,
      "VAL_W": 1,
      "SCENE_NUM": 1,
      "MIN_LEVEL": 1,
      "MAX_LEVEL": 1,
      "FADE_TIME": 1,
      "STATUS": 1
    }
  },
  "SCENE_LUMINAIRES": {
    "RECORDS": 320,
    "FIELDS": {
      "SCENE_NUM": 1,
      "LUMINAIRE_ID": 1,
      "VAL_BRIGHT": 1,
      "VAL_TW": 1,
      "VAL_R": 1,
      "VAL_G": 1,
      "VAL_B": 1,
      "VAL_W": 1
    }
  },
  "PRES_SENSORS": {
    "RECORDS": 64,
    "FIELDS": {
      "EXIST": 1,
      "DALI_ADDR": 1,
      "DALI_INST": 1,
      "LOCATION_ID": 2,
      "ACTION_OCCUPANCY_ID": 2,
      "ACTION_VACANCY_ID": 2,
      "HOLD_TIME": 1,
      "STATUS": 1
    }
  },
  "BRIGHT_SENSORS": {
    "RECORDS": 64,
    "FIELDS": {
      "EXIST": 1,
      "DALI_ADDR": 1,
      "DALI_INST": 1,
      "LOCATION_ID": 2,
      "GROUP_ID": 2,
      "SCENE_BRIGHTNESS_0": 1,
      "SCENE_BRIGHTNESS_1": 1,
      "SCENE_BRIGHTNESS_2": 1,
      "SCENE_BRIGHTNESS_3": 1,
      "SCENE_BRIGHTNESS_4": 1,
      "STATUS": 1
    }
  },
  "BUTTON_PANELS": {
    "RECORDS": 64,
    "FIELDS": {
      "EXIST": 1,
      "DALI_ADDR": 1,
      "LOCATION_ID": 2,
      "STATUS": 1
    }
  },
  "BUTTONS": {
    "RECORDS": 512,
    "FIELDS": {
      "BUTTON_PANEL_ID": 2,
      "DALI_INST": 1
    }
  },
  "ACTIONS": {
    "RECORDS": 512,
    "FIELDS": {
      "BUTTON_SHORT_ID": 2,
      "BUTTON_LONG_ID": 2,
      "POS": 1
    }
  },
  "SUBACTIONS": {
    "RECORDS": 512,
    "FIELDS": {
      "ACTION_ID": 2,
      "OBJECT_TYPE": 1,
      "OBJECT_NUM": 1,
      "VALUE": 1
    }
  },
  "EVENTS": {
    "RECORDS": 256,
    "FIELDS": {
      "EXIST": 1,
      "DAYS": 7,
      "TIME": 4,
      "SMOOTH": 1,
      "ACTION_ID": 2
    }
  }
}

7. Структура блока интерфейсных данных (IDATA)

Интерфейсные данные находятся в:

Блок IDATA представляет собой последовательность байтов интерфейсных данных (это поля, которые есть в БД приложения APP-USM, но отсутствуют в БД прошивки FW-USM как отдельные поля). Данные идут строго в следующем порядке:

{
  "VERSION": 1,
  "CONTROLLERS": {
    "RECORDS": 1,
    "FIELDS": {
      "SCALE": 2
    }
  },
  "LOCATIONS": {
    "RECORDS": 16,
    "FIELDS": {
      "NAME": 30,
      "ICO_NUM": 1,
      "SCALE": 2,
      "POS_X": 2,
      "POS_Y": 2
    }
  },
  "GROUPS": {
    "RECORDS": 16,
    "FIELDS": {
      "NAME": 30
    }
  },
  "LUMINAIRES": {
    "RECORDS": 64,
    "FIELDS": {
      "NAME": 30,
      "ICO_NUM": 1,
      "POS_X": 2,
      "POS_Y": 2
    }
  },
  "PRES_SENSORS": {
    "RECORDS": 64,
    "FIELDS": {
      "NAME": 30
    }
  },
  "BRIGHT_SENSORS": {
    "RECORDS": 64,
    "FIELDS": {
      "NAME": 30
    }
  },
  "BUTTON_PANELS": {
    "RECORDS": 64,
    "FIELDS": {
      "NAME": 30
    }
  },
  "BUTTONS": {
    "RECORDS": 512,
    "FIELDS": {
      "NAME": 30
    }
  }
}

Примечания:

7.1. Все текстовые поля (NAME) имеют фиксированную длину с завершающим нулём \0. Если название короче, оставшиеся байты заполняются нулями.

7.2. Порядок данных в блоке IDATA строго соответствует порядку таблиц и записей в структуре БД прошивки (раздел 5).

7.3. При конвертации телег JSON↔USML конвертер приложения распаковывает/упаковывает IDATA в соответствующие поля таблиц APP-USM.

8. Вопросы

9. Идеи