Зачем 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_on | standard.turn_on | native.relay_set(value=1) | device:corridor_light:action:set:value:1 |
turn_off | standard.turn_off | native.relay_set(value=0) | device:corridor_light:action:set:value:0 |
dim, 70 | standard.dimmer_set | native.pwm_set(level=70) | device:living_lamp:action:pwm:value:70 |
Native vs Standard
- native — низкоуровневые функции, напрямую превращаются в UDP-команду. «Язык устройств».
- standard — пользовательские сценарии (вкл/выкл/диммер). Маппятся на native. «Язык Алисы и пользователя».
- metadata.pin_code — сервисный пин задаёт пользователь, а не сервер.
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;
Принципы
- Логика — в JSONB и локальном сервере 4DUK, не в облаке.
- Сервисный пин — только по выбору пользователя.
- Обновление сценариев — по запросу и под контролем.
- JSONB — для гибкости и скорости поиска, не для истории (для этого — отдельные таблицы логов).