core/api.v1.json

1304 lines
33 KiB
JSON

{
"openapi": "3.0.0",
"info": {
"contact": {
"name": "Tobias Reisinger",
"url": "https://git.serguzim.me/emgauwa/"
},
"title": "Emgauwa API v1",
"version": "0.6.0",
"description": "Server API to manage an Emgauwa system."
},
"tags": [
{
"name": "schedules"
},
{
"name": "relays"
},
{
"name": "controllers"
},
{
"name": "tags"
},
{
"name": "macros"
},
{
"name": "websocket"
}
],
"paths": {
"/api/v1/schedules": {
"get": {
"summary": "get all schedules",
"description": "Receive a list with all available schedules.",
"tags": [
"schedules"
],
"responses": {
"200": {
"description": "OK",
"headers": {},
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/schedule"
}
}
}
}
}
},
"operationId": "get-api-v1-schedules"
},
"post": {
"summary": "add new schedule",
"tags": [
"schedules"
],
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/schedule"
}
}
}
}
},
"operationId": "post-api-v1-schedules",
"description": "Create a new schedule. A new unique id will be returned",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/schedule"
}
}
},
"description": "The \"id\" field will be set by the server."
}
},
"parameters": []
},
"/api/v1/schedules/{schedule_id}": {
"parameters": [
{
"schema": {
"type": "string",
"format": "uuid"
},
"name": "schedule_id",
"in": "path",
"required": true,
"description": ""
}
],
"get": {
"summary": "get single schedule",
"tags": [
"schedules"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/schedule"
}
}
}
}
},
"operationId": "get-schedules-schedule_id",
"description": "Return a single schedule by id."
},
"put": {
"summary": "overwrite single schedule",
"tags": [
"schedules"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/schedule"
}
}
}
}
},
"operationId": "put-schedules-schedule_id",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"periods": {
"type": "array",
"items": {
"$ref": "#/components/schemas/period"
}
},
"tags": {
"type": "array",
"items": {
"$ref": "#/components/schemas/tag"
}
}
}
}
}
},
"description": ""
},
"parameters": [],
"description": "Overwrite the properties for a single schedule. Overwriting periods on \"on\" or \"off\" will fail."
},
"delete": {
"summary": "delete single schedule",
"tags": [
"schedules"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/message"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/error"
}
}
}
}
},
"operationId": "delete-schedules-schedule_id",
"description": "Deletes a single schedule. Deleting \"on\" or \"off\" is forbidden (403)."
}
},
"/api/v1/schedules/tag/{tag}": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "tag",
"in": "path",
"required": true,
"description": ""
},
{
"schema": {
"type": "boolean"
},
"name": "strict",
"in": "query",
"description": "Normally on and off will always be included. When strict is set to true, only schedules with the given tag will be returned."
}
],
"get": {
"summary": "get schedules by tag",
"tags": [
"schedules"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/schedule"
}
}
}
}
}
},
"operationId": "get-schedules-tag-schedule_id",
"description": "Receive a list of schedules which include the given tag."
}
},
"/api/v1/relays": {
"get": {
"summary": "get all relays",
"tags": [
"relays"
],
"responses": {
"200": {
"description": "OK",
"headers": {},
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/relay"
}
}
}
}
}
},
"operationId": "get-relays",
"description": "Return a list with all relays."
},
"parameters": []
},
"/api/v1/relays/tag/{tag}": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "tag",
"in": "path",
"required": true
}
],
"get": {
"summary": "get relays by tag",
"tags": [
"relays"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/relay"
}
}
}
}
}
},
"operationId": "get-relays-tag-tag",
"description": "Return all relays with the given tag."
}
},
"/api/v1/controllers": {
"get": {
"summary": "get all controllers",
"tags": [
"controllers"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/controller"
}
}
}
}
},
"operationId": "get-controllers",
"description": "Return all controllers."
},
"parameters": []
},
"/api/v1/controllers/{controller_id}": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "controller_id",
"in": "path",
"description": "",
"required": true
}
],
"get": {
"summary": "get single controller",
"tags": [
"controllers"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/controller"
}
}
}
}
},
"operationId": "get-controllers-controller_id",
"description": "Return a single controller by id. When no controller with the id is found 404 will be returned."
},
"put": {
"summary": "overwrite single controller",
"tags": [
"controllers"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/controller"
}
}
}
}
},
"operationId": "put-controllers-controller_id",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"ip": {
"type": "string",
"format": "ipv4"
}
}
}
}
}
},
"description": "Overwrite properties of a single controller."
},
"delete": {
"summary": "delete single controller",
"tags": [
"controllers"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/message"
}
}
}
}
},
"operationId": "delete-controllers-controller_id",
"description": "Delete a single controller. To recover the controller you need to use the controllers/discover feature."
}
},
"/api/v1/controllers/{controller_id}/relays": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "controller_id",
"in": "path",
"required": true
}
],
"get": {
"summary": "get all relays for single controller",
"tags": [
"controllers",
"relays"
],
"responses": {
"200": {
"description": "OK",
"headers": {},
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/relay"
}
}
}
}
}
},
"operationId": "get-controllers-controller_id-relays",
"description": "Returns all relays for a single controller."
}
},
"/api/v1/controllers/{controller_id}/relays/{relay_num}": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "controller_id",
"in": "path",
"required": true
},
{
"schema": {
"type": "integer"
},
"name": "relay_num",
"in": "path",
"required": true
}
],
"get": {
"summary": "get single relay for single controller",
"tags": [
"controllers",
"relays"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/relay"
}
}
}
}
},
"operationId": "get-controllers-controller_id-relays-relay_num",
"description": "Return a single relay by number for a controller by id. When either the relay or the controller is not found, 404 will be returned."
},
"put": {
"summary": "overwrite single relay for single controller",
"tags": [
"controllers",
"relays"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/relay"
}
}
}
}
},
"operationId": "put-controllers-controller_id-relays-relay_num",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"override_schedule": {
"type": "object",
"nullable": true,
"description": "NULL will remove the override schedule, missing field will not change the override schedule",
"properties": {
"id": {
"$ref": "#/components/schemas/schedule_id"
}
}
},
"schedules": {
"type": "array",
"maxItems": 7,
"minItems": 7,
"items": {
"type": "object",
"properties": {
"id": {
"$ref": "#/components/schemas/schedule_id"
}
}
}
},
"tags": {
"type": "array",
"items": {
"$ref": "#/components/schemas/tag"
}
}
}
}
}
}
},
"description": "active schedule will overwrite schedules[weekday]"
}
},
"/api/v1/tags": {
"get": {
"summary": "get all tags",
"tags": [
"tags"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/tag"
}
}
}
}
}
},
"operationId": "get-tags",
"description": "Returns a list of tags."
},
"parameters": [],
"post": {
"summary": "add new tag",
"operationId": "post-api-v1-tags",
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/tag_full"
}
}
}
},
"400": {
"description": "Bad Request"
}
},
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"tag": {
"$ref": "#/components/schemas/tag"
}
}
}
}
},
"description": ""
},
"tags": [
"tags"
],
"description": "Add a new tag. Will return 400 when the tag already exits."
}
},
"/api/v1/tags/{tag}": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "tag",
"in": "path",
"required": true
}
],
"get": {
"summary": "get relays and schedules for tag",
"tags": [
"tags"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/tag_full"
}
}
}
}
},
"operationId": "get-tags-tag",
"description": "Return all models with the given tag (relays and schedules)"
},
"delete": {
"summary": "delete tag",
"operationId": "delete-tags-tag",
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/message"
}
}
}
}
},
"description": "delete tag from database and from affected relays and schedules",
"tags": [
"tags"
]
}
},
"/api/v1/controllers/{controller_id}/relays/{relay_num}/pulse": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "controller_id",
"in": "path",
"required": true
},
{
"schema": {
"type": "string"
},
"name": "relay_num",
"in": "path",
"required": true
}
],
"post": {
"summary": "pulse relay on",
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/message"
}
}
}
}
},
"operationId": "post-controllers-controller_id-relays-relay_num-pulse",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"duration": {
"type": "integer"
}
}
}
}
},
"description": ""
},
"description": "Turn a relay on for a short amount of time. The duration can be set in the body in seconds. When no duration is supplied the default for the relay will be used. The default is read from the controller's config.",
"tags": [
"controllers",
"relays"
]
}
},
"/api/v1/ws/relays": {
"get": {
"summary": "get relay status updates",
"tags": [
"websocket"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/relay"
}
}
}
}
}
},
"operationId": "get-ws-relays",
"description": "WEBSOCKET\nThis websocket will send all relays with the most recent status every 10 seconds."
},
"parameters": []
},
"/api/v1/macros": {
"get": {
"summary": "get all macros",
"tags": [
"macros"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/macro"
}
}
}
}
}
},
"operationId": "get-api-v1-macros",
"description": "Receive a list with all available macros."
},
"post": {
"summary": "add new macro",
"tags": [
"macros"
],
"responses": {
"201": {
"description": "Created"
}
},
"operationId": "post-api-v1-macros",
"description": "Create a new macro. A new unique id will be returned",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"actions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weekday": {
"type": "integer",
"minimum": 0,
"maximum": 6
},
"relay": {
"type": "object",
"properties": {
"number": {
"type": "integer"
},
"controller_id": {
"$ref": "#/components/schemas/controller_id"
}
}
},
"schedule": {
"type": "object",
"properties": {
"id": {
"$ref": "#/components/schemas/schedule_id"
}
}
}
}
}
}
}
}
}
}
}
}
},
"/api/v1/macros/{macro_id}": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "macro_id",
"in": "path",
"required": true
}
],
"get": {
"summary": "get a single macro",
"tags": [
"macros"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/macro"
}
}
}
}
},
"operationId": "get-api-v1-macros-macro_id",
"description": "Return a single macro by id."
},
"put": {
"summary": "overwrite a macro",
"tags": [
"macros"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/macro"
}
}
}
}
},
"operationId": "put-api-v1-macros-macro_id",
"description": "Overwrite properties of a single macro.",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"actions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weekday": {
"type": "integer",
"minimum": 0,
"maximum": 6
},
"schedule": {
"type": "object",
"properties": {
"id": {
"$ref": "#/components/schemas/schedule_id"
}
}
},
"relay": {
"type": "object",
"properties": {
"number": {
"type": "integer"
},
"controller_id": {
"$ref": "#/components/schemas/controller_id"
}
}
}
}
}
}
}
}
}
}
}
},
"delete": {
"summary": "delete a macro",
"tags": [
"macros"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/message"
}
}
}
}
},
"operationId": "delete-api-v1-macros-macro_id",
"description": "Delete a single macro."
}
},
"/api/v1/macros/{macro_id}/execute": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "macro_id",
"in": "path",
"required": true
},
{
"schema": {
"type": "integer"
},
"name": "weekday",
"in": "query"
}
],
"put": {
"summary": "execute a macro",
"tags": [
"macros"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/message"
}
}
}
}
},
"operationId": "put-api-v1-macros-macro_id-execute",
"description": "Execute a macro"
}
},
"/api/v1/schedules/list": {
"post": {
"summary": "add new schedule list",
"tags": [
"schedules"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/schedule"
}
}
}
}
}
},
"operationId": "post-schedules-list",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/schedule"
}
}
}
}
},
"description": "Create a list of schedules"
},
"parameters": []
}
},
"components": {
"schemas": {
"message": {
"title": "message",
"type": "object",
"properties": {
"message": {
"type": "string",
"example": "action got handled"
}
}
},
"error": {
"title": "error",
"type": "object",
"properties": {
"message": {
"type": "string",
"example": "bad input data"
},
"code": {
"type": "integer",
"example": 500
}
}
},
"controller": {
"title": "controller",
"type": "object",
"properties": {
"id": {
"$ref": "#/components/schemas/controller_id"
},
"name": {
"type": "string",
"example": "Garden Controller"
},
"active": {
"type": "boolean"
},
"port": {
"type": "integer",
"example": 27480
},
"relay_count": {
"type": "integer",
"minimum": 0,
"example": 10
},
"relays": {
"type": "array",
"items": {
"$ref": "#/components/schemas/relay"
}
}
}
},
"relay": {
"title": "relay",
"type": "object",
"properties": {
"number": {
"type": "integer",
"minimum": 0,
"example": 3
},
"name": {
"type": "string",
"example": "Sprinkling System 1"
},
"controller_id": {
"$ref": "#/components/schemas/controller_id"
},
"active_schedule": {
"nullable": true,
"description": "NULL when unknown (usually because controller is not connected)",
"allOf": [
{
"$ref": "#/components/schemas/schedule_simple"
}
]
},
"override_schedule": {
"nullable": true,
"description": "NULL when unknown (usually because controller is not connected)",
"allOf": [
{
"$ref": "#/components/schemas/schedule_simple"
}
]
},
"schedules": {
"type": "array",
"maxItems": 7,
"minItems": 7,
"items": {
"$ref": "#/components/schemas/schedule_simple"
}
},
"tags": {
"type": "array",
"items": {
"$ref": "#/components/schemas/tag"
}
},
"is_on": {
"type": "boolean",
"nullable": true,
"description": "NULL when unknown (usually because controller is not connected)"
}
}
},
"schedule_simple": {
"title": "schedule (simple)",
"type": "object",
"description": "",
"properties": {
"id": {
"$ref": "#/components/schemas/schedule_id"
},
"name": {
"type": "string",
"example": "Sprinkler Sunny Day"
},
"periods": {
"type": "array",
"items": {
"$ref": "#/components/schemas/period"
}
}
}
},
"schedule": {
"title": "schedule",
"type": "object",
"description": "",
"properties": {
"id": {
"$ref": "#/components/schemas/schedule_id"
},
"name": {
"type": "string",
"example": "Sprinkler Sunny Day"
},
"periods": {
"type": "array",
"items": {
"$ref": "#/components/schemas/period"
}
},
"tags": {
"type": "array",
"items": {
"$ref": "#/components/schemas/tag"
}
}
}
},
"period": {
"title": "period",
"type": "object",
"properties": {
"start": {
"type": "string",
"example": "10:15",
"format": "24-hour"
},
"end": {
"type": "string",
"format": "24-hour",
"example": "14:45"
}
},
"required": [
"start",
"end"
]
},
"controller_id": {
"type": "string",
"title": "controller_id",
"format": "uuid",
"example": "589c0eab-a4b4-4f3a-be97-cf03b1dc8edc"
},
"tag": {
"type": "string",
"title": "tag",
"example": "sprinkler"
},
"tag_full": {
"title": "tag (full)",
"type": "object",
"properties": {
"tag": {
"$ref": "#/components/schemas/tag"
},
"relays": {
"type": "array",
"items": {
"$ref": "#/components/schemas/relay"
}
},
"schedules": {
"type": "array",
"items": {
"$ref": "#/components/schemas/schedule"
}
}
}
},
"schedule_id": {
"type": "string",
"title": "schedule_id",
"format": "uuid",
"example": "6bceb29b-7d2e-4af3-a26e-11f514dc5cc1"
},
"macro": {
"title": "macro",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"example": "a9a4eab4-6c54-4fe4-b755-bdb2a90b3242"
},
"name": {
"type": "string"
},
"actions": {
"type": "array",
"items": {
"$ref": "#/components/schemas/macro_action"
}
}
}
},
"macro_action": {
"title": "macro_action",
"type": "object",
"description": "",
"properties": {
"weekday": {
"type": "integer",
"minimum": 0,
"maximum": 6
},
"schedule": {
"$ref": "#/components/schemas/schedule_simple"
},
"relay": {
"$ref": "#/components/schemas/relay"
}
},
"required": [
"weekday",
"schedule",
"relay"
]
}
}
}
}