JSONB-дерево — 4DUK

Структура описаний устройств и маппинг команд

Зачем JSONB в Postgresql

JSONB-дерево хранит описания устройств, их умений и маппинг на команды. Гибкость: можно добавлять устройства и сценарии без изменения схемы БД, а сервер быстро ищет нужный native/standard.

Степаныч, давай охолаживай: JSONB — это не про «много полей», это про «быстро найти нужную команду».

Пример JSONB-дерева

{
  "device_id": "corridor_light",
  "name": "Коридорный свет",
  "type": "relay",
  "capabilities": ["turn_on", "turn_off"],
  "functions": {
    "native": {
      "relay_set": {
        "input": ["value"],
        "output": "device:{device_id}:action:set:value:{value}"
      }
    },
    "standard": {
      "turn_on": {
        "map_to": "native.relay_set",
        "params": {"value": 1}
      },
      "turn_off": {
        "map_to": "native.relay_set",
        "params": {"value": 0}
      }
    }
  },
  "metadata": {
    "session_owner": null,
    "pin_code": "USER_DEFINED_PIN",
    "transport": "udp_broadcast_9009"
  }
}

Маппинг: от Алисы к UDP-пакету

Алиса (интент)JSONB (standard)JSONB (native)Результат
turn_onstandard.turn_onnative.relay_set(value=1)device:corridor_light:action:set:value:1
turn_offstandard.turn_offnative.relay_set(value=0)device:corridor_light:action:set:value:0
dim, 70standard.dimmer_setnative.pwm_set(level=70)device:living_lamp:action:pwm:value:70

Native vs Standard

SQL-запросы

-- Найти устройство по имени
SELECT * FROM devices WHERE data->>'name' = 'Коридорный свет';

-- Получить native-команду по device_id
SELECT data->'functions'->'native' AS native_func
FROM devices WHERE data->>'device_id' = 'corridor_light';

-- Проверить, поддерживает ли устройство действие
SELECT EXISTS (
  SELECT 1 FROM devices
  WHERE data->'capabilities' @> '["turn_on"]'
  AND data->>'device_id' = 'corridor_light'
) AS supports_turn_on;

Принципы