diff --git a/docs/device-spec.md b/docs/device-spec.md index 6454d17..434c68f 100644 --- a/docs/device-spec.md +++ b/docs/device-spec.md @@ -110,6 +110,16 @@ } ``` +#### Пример ошибки + +```json +{ + "status": "error", + "error": "IllegalActionOrParams", + "message": "Device does not support this action or params" +} +``` + --- ### 4. `POST /set_token` diff --git a/docs/server-api-v1/auth.md b/docs/server-api-v1/auth.md new file mode 100644 index 0000000..8139dc5 --- /dev/null +++ b/docs/server-api-v1/auth.md @@ -0,0 +1,26 @@ +### POST `/api/v1/auth` +Для авторизации и получения токена общения с сервером + +### Пример запроса +```json + { + "login": "JohnDoe", + "password": "strong_password" + } + ``` + +### Пример успешного ответа +```json + { + "status": "ok", + "token": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9" + } + ``` + +### Пример НЕ успешного ответа +```json + { + "status": "error", + "message": "Wrong login or password" + } + ``` \ No newline at end of file diff --git a/docs/server-api-v1/devices.md b/docs/server-api-v1/devices.md new file mode 100644 index 0000000..3cb7fe6 --- /dev/null +++ b/docs/server-api-v1/devices.md @@ -0,0 +1,197 @@ +### GET `/api/v1/devices/list` +Получить список устройств о которых знает сервер + +### Пример ответа +```json + { + "status": "ok", + "devices": [ + { + "id": 12, + "device": { + "device_name": "Relay 1", + "device_type": "relay", + "firmware_version": "1.0.3", + "device_id": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9", + "device_ip": "192.168.1.13" + }, + "alias": "alias_name_like_variable", + "name": "Реле помпы септика", + "description": "Управляет помпой, должно периодически включаться и выключаться", + "connection_state": "active", // active | lost + "last_contact": "2025-07-28 18:35", + }, + ... + ] + } + ``` + +--- + +### GET `/api/v1/devices/scan` +Поиск новых устройств в сети + +### Пример ответа +```json + { + "status": "ok", + "devices": [ + { + "device_name": "Relay 1", + "device_type": "relay", + "firmware_version": "1.0.3", + "device_id": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9", + "device_ip": "192.168.1.42" + }, + ... + ] + } + ``` + +--- + +### POST `/api/v1/devices/add_new` +Добавление нового устройства + +### Пример запроса +```json + { + "device_ip": "192.168.1.43", + "device_id": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9", + "alias": "alias_name_like_variable", // Must be uniq + "name": "Реле помпы септика", + "description": "Управляет помпой, должно периодически включаться и выключаться" + } + ``` + +### Пример ответа +```json + { + "status": "ok", + "device": { + "id": 12, + "alias": "alias_name_like_variable", + "device": { + "device_name": "Relay 1", + "device_type": "relay", + "firmware_version": "1.0.3", + "device_id": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9", + "device_ip": "192.168.1.13" + }, + "name": "Реле помпы септика", + "description": "Управляет помпой, должно периодически включаться и выключаться", + "connection_state": "active", // active | lost + "last_contact": "2025-07-28 18:35" + } + } + ``` + +### Пример НЕ успешного ответа +```json + { + "status": "error", + "field": "alias", // alias | name | device_ip | device_id + "message": "Alias already exists" // "Name can`t be empty" | "Device not found by IP" | "Wrong device ID" + } + ``` + +--- + +### GET `/api/v1/devices/id/{{id}}` OR GET `/api/v1/devices/alias/{{alias}}` +Получить статус по отдельному девайсу + +### Пример ответа +```json + { + "status": "ok", + "device": { + "id": 12, + "alias": "...", + "device": { + "device_name": "Relay 1", + "device_type": "relay", + "firmware_version": "1.0.3", + "device_id": "ecf0a1b5c9d74f9a8e294c1f67b0a8b9", + "device_ip": "192.168.1.13" + }, + "name": "Реле помпы септика", + "description": "Управляет помпой, должно периодически включаться и выключаться", + "connection_state": "active", // active | lost + "last_contact": "2025-07-28 18:35" + } + } + ``` + +### Пример НЕ успешного ответа +```json + { + "status": "error", + "message": "Device not exists" // "Permission error" + } + ``` + +--- + +### GET `/api/v1/devices/alias/{{alias}}/status` OR GET `/api/v1/devices/id/{{id}}/status` +Получить отдельный девайс + +### Пример ответа +```json + { + "status": "ok", + "device": { + "id": 12, + "alias": "...", + "device_status": { + ... + } + } + } + ``` + +--- + +### POST `/api/v1/devices/id/{{id}}/action` OR POST `/api/v1/devices/alias/{{alias}}/action` +Выполнить действие для отдельного девайса + +### Пример запроса +```json + { + "action": "action_name", + "params": {...} + } + ``` + +### Пример успешного ответа +В ответе вернётся непосредственно ответ от устройства +```json + { + "status": "ok", + "device": { + "id": 12, + "alias": "alias_name_like_variable", + "response": { + ... + } + } + } + ``` + +### Пример НЕ успешного ответа +```json + { + "status": "error", + "message": "Device does not support this action or params" // "Permission error" + } + ``` + +--- + +### GET `/api/v1/devices/id/{{id}}/forget` OR GET `/api/v1/devices/alias/{{alias}}/forget` +Забыть выбраный девайс. Сам девайс при этом будет ресетнуть + +--- + +### GET `/api/v1/devices/id/{{id}}/reboot` OR GET `/api/v1/devices/alias/{{alias}}/reboot` +Принудительно перезагрузить устройство + diff --git a/docs/server-api-v1/general.md b/docs/server-api-v1/general.md new file mode 100644 index 0000000..533a939 --- /dev/null +++ b/docs/server-api-v1/general.md @@ -0,0 +1,20 @@ +# Спецификация REST API для сервера + +Для доступа к серверу необходимо авторизоваться и получить токен API и передавать его каждый раз в заголовке + ``` + Authorization: Bearer + ``` +Без валидного токена устройство должно возвращать ошибку 401 Unauthorized. + +--- + +### GET `/api/v1/status` +должен вернуть статус сервера, и ссылку на документацию + +### Пример ответа +```json + { + "status": "active", + "docs": "https://git.gnexus.space/root/smart-home-server/tree/master/docs" + } + ``` \ No newline at end of file diff --git a/docs/server-api.md b/docs/server-api.md deleted file mode 100644 index e69de29..0000000 --- a/docs/server-api.md +++ /dev/null