{ "openapi": "3.1.0", "info": { "title": "Ignis Core API", "version": "0.1.0" }, "paths": { "/devices": { "get": { "tags": [ "Devices & Groups" ], "summary": "Get All Devices", "operationId": "get_all_devices_devices_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } }, "security": [ { "APIKeyHeader": [] } ] } }, "/devices/groups": { "get": { "tags": [ "Devices & Groups" ], "summary": "Get Groups", "operationId": "get_groups_devices_groups_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } }, "security": [ { "APIKeyHeader": [] } ] }, "post": { "tags": [ "Devices & Groups" ], "summary": "Create Group", "operationId": "create_group_devices_groups_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupCreateSchema" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } }, "security": [ { "APIKeyHeader": [] } ] } }, "/devices/scenes": { "get": { "tags": [ "Devices & Groups" ], "summary": "Get Scenes", "operationId": "get_scenes_devices_scenes_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } }, "security": [ { "APIKeyHeader": [] } ] } }, "/devices/groups/{group_id}": { "delete": { "tags": [ "Devices & Groups" ], "summary": "Delete Group", "operationId": "delete_group_devices_groups__group_id__delete", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "group_id", "in": "path", "required": true, "schema": { "type": "string", "title": "Group Id" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/devices/rescan": { "post": { "tags": [ "Devices & Groups" ], "summary": "Rescan Network", "operationId": "rescan_network_devices_rescan_post", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } }, "security": [ { "APIKeyHeader": [] } ] } }, "/control/device/{device_id}": { "post": { "tags": [ "Control" ], "summary": "Control Device", "operationId": "control_device_control_device__device_id__post", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string", "title": "Device Id" } }, { "name": "state", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "State" } }, { "name": "brightness", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Brightness" } }, { "name": "scene", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Scene" } }, { "name": "temp", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Temp" } }, { "name": "r", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "R" } }, { "name": "g", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "G" } }, { "name": "b", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "B" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/control/group/{group_id}": { "post": { "tags": [ "Control" ], "summary": "Control Group", "operationId": "control_group_control_group__group_id__post", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "group_id", "in": "path", "required": true, "schema": { "type": "string", "title": "Group Id" } }, { "name": "state", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "State" } }, { "name": "brightness", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Brightness" } }, { "name": "scene", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Scene" } }, { "name": "temp", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Temp" } }, { "name": "r", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "R" } }, { "name": "g", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "G" } }, { "name": "b", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "B" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/control/device/{device_id}/blink": { "post": { "tags": [ "Control" ], "summary": "Blink Device", "operationId": "blink_device_control_device__device_id__blink_post", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string", "title": "Device Id" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/control/device/{device_id}/status": { "get": { "tags": [ "Control" ], "summary": "Get Device Status", "description": "Опрос реального состояния конкретной лампы.", "operationId": "get_device_status_control_device__device_id__status_get", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string", "title": "Device Id" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/control/group/{group_id}/status": { "get": { "tags": [ "Control" ], "summary": "Get Group Status", "description": "Опрос состояния всей группы (возвращает список статусов).", "operationId": "get_group_status_control_group__group_id__status_get", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "group_id", "in": "path", "required": true, "schema": { "type": "string", "title": "Group Id" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/schedules/once": { "post": { "tags": [ "Schedules" ], "summary": "Schedule Once", "operationId": "schedule_once_schedules_once_post", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "target_id", "in": "query", "required": true, "schema": { "type": "string", "title": "Target Id" } }, { "name": "state", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "State" } }, { "name": "run_at", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Run At" } }, { "name": "hours_from_now", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Hours From Now" } }, { "name": "is_group", "in": "query", "required": false, "schema": { "type": "boolean", "default": true, "title": "Is Group" } }, { "name": "brightness", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Brightness" } }, { "name": "scene", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Scene" } }, { "name": "temp", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Temp" } }, { "name": "r", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "R" } }, { "name": "g", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "G" } }, { "name": "b", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "B" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/schedules/cron": { "post": { "tags": [ "Schedules" ], "summary": "Add Cron Task", "operationId": "add_cron_task_schedules_cron_post", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "target_id", "in": "query", "required": true, "schema": { "type": "string", "title": "Target Id" } }, { "name": "hour", "in": "query", "required": true, "schema": { "type": "string", "title": "Hour" } }, { "name": "minute", "in": "query", "required": true, "schema": { "type": "string", "title": "Minute" } }, { "name": "day_of_week", "in": "query", "required": false, "schema": { "type": "string", "default": "*", "title": "Day Of Week" } }, { "name": "is_group", "in": "query", "required": false, "schema": { "type": "boolean", "default": true, "title": "Is Group" } }, { "name": "state", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "State" } }, { "name": "brightness", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Brightness" } }, { "name": "scene", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Scene" } }, { "name": "temp", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Temp" } }, { "name": "r", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "R" } }, { "name": "g", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "G" } }, { "name": "b", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "B" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/schedules/tasks": { "get": { "tags": [ "Schedules" ], "summary": "Get All Tasks", "operationId": "get_all_tasks_schedules_tasks_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } }, "security": [ { "APIKeyHeader": [] } ] } }, "/schedules/{job_id}": { "delete": { "tags": [ "Schedules" ], "summary": "Cancel Task", "operationId": "cancel_task_schedules__job_id__delete", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "job_id", "in": "path", "required": true, "schema": { "type": "string", "title": "Job Id" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api-keys": { "get": { "tags": [ "API Keys" ], "summary": "List Keys", "description": "Список всех гостевых ключей.\n\nВ ответе поле `key` содержит публичный идентификатор, а не сам секрет.\nЭто сохраняет совместимость с текущим UI и не раскрывает токены повторно.", "operationId": "list_keys_api_keys_get", "security": [ { "APIKeyHeader": [] } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } } }, "post": { "tags": [ "API Keys" ], "summary": "Create Key", "description": "Создать гостевой ключ. Возвращает сгенерированный токен.", "operationId": "create_key_api_keys_post", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "name", "in": "query", "required": true, "schema": { "type": "string", "title": "Name" } }, { "name": "is_admin", "in": "query", "required": false, "schema": { "type": "boolean", "default": false, "title": "Is Admin" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api-keys/revoke": { "post": { "tags": [ "API Keys" ], "summary": "Revoke Key", "description": "Деактивировать (отозвать) гостевой ключ. Ключ передаётся в body, не в URL.", "operationId": "revoke_key_api_keys_revoke_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KeyActionRequest" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } }, "security": [ { "APIKeyHeader": [] } ] } }, "/api-keys/activate": { "post": { "tags": [ "API Keys" ], "summary": "Activate Key", "description": "Повторно активировать ключ. Ключ передаётся в body, не в URL.", "operationId": "activate_key_api_keys_activate_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KeyActionRequest" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } }, "security": [ { "APIKeyHeader": [] } ] } }, "/stats/summary": { "get": { "tags": [ "Stats" ], "summary": "Get Summary", "description": "Сводная статистика за последние N дней.\nВозвращает по каждой группе/устройству:\n- total_commands -- общее количество команд\n- toggles_on / toggles_off -- включений / выключений\n- estimated_hours -- оценка часов работы (по парам on/off)", "operationId": "get_summary_stats_summary_get", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "days", "in": "query", "required": false, "schema": { "type": "integer", "maximum": 365, "minimum": 1, "default": 7, "title": "Days" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/stats/log": { "get": { "tags": [ "Stats" ], "summary": "Get Log", "description": "Последние N событий (для просмотра лога).", "operationId": "get_log_stats_log_get", "security": [ { "APIKeyHeader": [] } ], "parameters": [ { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "maximum": 500, "minimum": 1, "default": 50, "title": "Limit" } } ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/": { "get": { "summary": "Read Index", "operationId": "read_index__get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } } } }, "/auth/me": { "get": { "summary": "Auth Me", "operationId": "auth_me_auth_me_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } }, "security": [ { "APIKeyHeader": [] } ] } } }, "components": { "schemas": { "GroupCreateSchema": { "properties": { "id": { "type": "string", "title": "Id" }, "name": { "type": "string", "title": "Name" }, "macs": { "items": { "type": "string" }, "type": "array", "title": "Macs" } }, "type": "object", "required": [ "id", "name", "macs" ], "title": "GroupCreateSchema" }, "HTTPValidationError": { "properties": { "detail": { "items": { "$ref": "#/components/schemas/ValidationError" }, "type": "array", "title": "Detail" } }, "type": "object", "title": "HTTPValidationError" }, "KeyActionRequest": { "properties": { "key": { "type": "string", "title": "Key" } }, "type": "object", "required": [ "key" ], "title": "KeyActionRequest", "description": "Тело запроса для операций с ключом (чтобы токен не летел в URL)." }, "ValidationError": { "properties": { "loc": { "items": { "anyOf": [ { "type": "string" }, { "type": "integer" } ] }, "type": "array", "title": "Location" }, "msg": { "type": "string", "title": "Message" }, "type": { "type": "string", "title": "Error Type" } }, "type": "object", "required": [ "loc", "msg", "type" ], "title": "ValidationError" } }, "securitySchemes": { "APIKeyHeader": { "type": "apiKey", "in": "header", "name": "X-API-Key" } } } }