diff --git a/docs/control-scripts-guide.md b/docs/control-scripts-guide.md index ae13f9e..3e877c8 100644 --- a/docs/control-scripts-guide.md +++ b/docs/control-scripts-guide.md @@ -212,6 +212,11 @@ | `sync_btn_channels($sync_map, $btn_alias)` | Синхронизировать индикаторы указанной кнопки с реле из sync_map | | `get_sync_entries_by_type($sync_map, $type)` | Получить все записи указанного типа из sync_map | | `prepare_sync_map_by_alias($sync_map, $alias)` | Подготовить sync_map для указанного устройства | +| `get_relay_state($alias, $channel=0)` | Получить состояние канала реле: `true`/`false`/`null` | +| `get_hatch_state($alias)` | Получить состояние люка: `"open"`/`"closed"`/`null` | +| `make_relay_indicator($alias, $channel=0)` | Сформировать `indicator` для реле | +| `make_group_indicators($targets)` | Сформировать массив `indicator`-ов для группы реле | +| `make_hatch_indicator($alias)` | Сформировать `indicator` для люка | ### Пример использования @@ -390,6 +395,72 @@ --- +## Уровень опасности (Danger Level) + +Action-скрипты могут быть помечены одним из трёх уровней опасности. Vue-клиент использует эту метку для визуальной индикации (цвет рамки карточки) и для запроса подтверждения перед запуском. + +| Уровень | Поведение UI | +|---------|-------------| +| `safe` (default) | Запускается сразу, обычная рамка | +| `cautious` | Confirm dialog с `variant="warning"`, оранжевая рамка | +| `dangerous` | Confirm dialog с `variant="dangerous"`, красная рамка | + +### Объявление в Scope + +```php +$this->add_hatch_action("hatch_open", "Открыть люк", "hatch_motor", "open", 100, [ + "danger_level" => "dangerous", +]); +``` + +**Валидация:** неизвестное значение приводит к `safe`. + +--- + +## Индикаторы состояния (State Callback) + +Action-скрипт может декларировать `state_callback` — closure, который вызывается при формировании ответа API `GET /api/v1/scripts/actions/list`. Результат отображается в UI как набор `GnBadge`-ов рядом с карточкой скрипта. + +### Формат возвращаемого значения + +Callback должен вернуть массив элементов: + +```php +[ + ["label" => "On", "variant" => "success"], + ["label" => "Off", "variant" => "secondary"], + ["label" => "Open", "variant" => "warning"], +] +``` + +Поддерживаемые `variant` — те же, что у `GnBadge`: `primary`, `success`, `warning`, `danger`, `secondary`. + +### Объявление в Scope + +```php +$this->add_group_toggle_action("kitchen1_toggle", "Кухня 1", [ + "fisrt_floor_big_relay:0", +], [ + "state_callback" => function() { + return $this->helper()->make_relay_indicator("fisrt_floor_big_relay", 0); + }, +]); +``` + +### Factory-методы в DeviceScriptsHelper + +Для стандартных устройств хелпер предоставляет готовые callback-фабрики: + +| Метод | Описание | +|-------|---------| +| `make_relay_indicator($alias, $channel=0)` | Состояние канала реле: `On`/`Off`/`?` | +| `make_group_indicators($targets)` | Массив индикаторов для группы реле | +| `make_hatch_indicator($alias)` | Состояние люка: `Open`/`Closed`/`?` | + +**Ошибки callback игнорируются сервером** — если устройство недоступно, индикатор просто не попадёт в ответ API. + +--- + ## Хелперы для упрощения написания скриптов Base class `ControlScripts` предоставляет high-level обёртки над повторяющимися паттернами. @@ -404,6 +475,8 @@ | `$this->add_hatch_action($alias, $name, $hatch_alias, $op, $percent=100, $extra_attrs=[])` | Открыть/закрыть люк | | `$this->add_group_toggle_action($alias, $name, $pairs, $extra_attrs=[])` | Групповой toggle нескольких реле | +**`$extra_attrs`** поддерживает любые атрибуты из `add_action_script()`, включая `"danger_level"`, `"state_callback"`, `"description"`, `"author"`, `"icon"`, `"params_schema"`. Неизвестные ключи безопасно игнорируются. Все стандартные хелперы пробрасывают `$extra_attrs` в `add_action_script()` через `array_merge`. Для `group_toggle` и `group_set_state` targets также поддерживают строку `"alias:channel"`. | + Пример — **было / стало**: ```php diff --git a/docs/server-api-v1/scripts.md b/docs/server-api-v1/scripts.md index 08f3442..f0a6c08 100644 --- a/docs/server-api-v1/scripts.md +++ b/docs/server-api-v1/scripts.md @@ -10,10 +10,18 @@ "path": "/srv/http/smart-home-serv.local/automation/Scopes", "state": "enabled", "created_by": "Eugene Sukhodolskiy", - "create_at": "2025-06-02 23:35:11" + "create_at": "2025-06-02 23:35:11", + "danger_level": "safe", + "indicators": [ + {"label": "On", "variant": "success"} + ] } ``` +**`danger_level`** — `safe` | `cautious` | `dangerous`. Задаётся в Scope через `$extra_attrs["danger_level"]`. + +**`indicators`** — массив `{"label": "...", "variant": "..."}`. Формируется сервером через `state_callback` из Scope. Отсутствует, если callback не задан. + --- ### GET `/api/v1/scripts/actions/list` @@ -35,6 +43,10 @@ "filename": "TestScriptsScope.php", "path": "/srv/http/smart-home-serv.local/automation/Scopes", "created_by": "Eugene Sukhodolskiy", + "danger_level": "safe", + "indicators": [ + {"label": "On", "variant": "success"} + ], "params_schema": { "level": { "type": "range",